From 503ae96764676e5e55f44e33d7f7c08348810ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 23 Sep 2023 13:08:58 +0200 Subject: [PATCH 001/405] If SMB Ratio is changed (from default) -> display in enacted pop-up (cherry picked from commit 85cfe64fe93f7735e4960e0b1f6d82261a618451) (cherry picked from commit 9c63d7722ae5c6f775012f98c87e2617081de00b) --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/Views/TagCloudView.swift | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 9d9cad486c..0fa50665a6 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR);var Da="";.5!=i.smb_delivery_ratio&&(Da=", SMB Ratio "+i.smb_delivery_ratio),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i)+Da,oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,He.reason+="; ";var wa=Tt;wa<40&&(wa=Math.min(Ot,wa));var Ga,Ta=U-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;baGa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ua+"minutes");var Oa=Ua,Ra=i.current_basal*N*_t*Oa/60,Aa=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Ra)/csf-Aa;Ra=o(Ra),Ia=o(Ia),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Ra,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(He.carbsReq=Ia,He.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var ja=0,Pa=Je,Ea=0;if(CtRt&&tt>0&&!Ia)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));ja=o(ja=2*Math.min(0,(Ct-ot)/_t),2);var qa=Math.min(0,(Tt-ot)/_t);if(qa=o(qa,2),tt<0&&tt>Rt)ja=o(ja*(tt/Rt),2);Pa=r(Pa=Je+2*ja,i),Ea=t.duration*(t.rate-Je)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",He;if(Pa<=0){if((Fa=o(60*((Ta=ot-Tt)/_t)/i.current_basal*N))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return He.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,He,t)}else He.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));ja=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),ja>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+ja+" U)"),He.reason+="max_iob "+lt+", ",ja=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Pa=r(Pa=Je+2*ja,i),ja=o(ja,3),He.insulinReq=ja;var ka=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/Z,3),Ha=0;void 0===La?(Ha=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*N),Ha=o(i.current_basal*N*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*N*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Je*Fa/30,2),Fa=30),He.reason+=" insulinReq "+ja,Ka>=Ha&&(He.reason+="; maxBolus "+Ha),Fa>0&&(He.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),He.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Tt+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(He.units=Ka,He.reason+="Microbolusing "+Ka+"U. "):He.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return He.rate=Qa,He.duration=Fa,He}var er=u.getMaxSafeBasal(i);return Pa>er&&(He.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Je)/60)>=2*ja?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index 920b1b376c..df49349aaa 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -66,7 +66,8 @@ struct TagCloudView: View { textTag where textTag.contains("AF:"), textTag where textTag.contains("Autosens/Dynamic Limit:"), textTag where textTag.contains("Dynamic ISF/CR"), - textTag where textTag.contains("Basal ratio"): + textTag where textTag.contains("Basal ratio"), + textTag where textTag.contains("SMB Ratio"): return .zt default: return .insulin From 427a66cce9f706afaaa5f3f62c89e16f57a4554c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 23 Sep 2023 13:46:07 +0200 Subject: [PATCH 002/405] Correction. smb ratio. (cherry picked from commit 54e9aa4e6c550cbdb88bb73562b143931423a62e) --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 0fa50665a6..b05a4e8dc3 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR);var Da="";.5!=i.smb_delivery_ratio&&(Da=", SMB Ratio "+i.smb_delivery_ratio),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i)+Da,oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,He.reason+="; ";var wa=Tt;wa<40&&(wa=Math.min(Ot,wa));var Ga,Ta=U-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;baGa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ua+"minutes");var Oa=Ua,Ra=i.current_basal*N*_t*Oa/60,Aa=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Ra)/csf-Aa;Ra=o(Ra),Ia=o(Ia),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Ra,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(He.carbsReq=Ia,He.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var ja=0,Pa=Je,Ea=0;if(CtRt&&tt>0&&!Ia)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));ja=o(ja=2*Math.min(0,(Ct-ot)/_t),2);var qa=Math.min(0,(Tt-ot)/_t);if(qa=o(qa,2),tt<0&&tt>Rt)ja=o(ja*(tt/Rt),2);Pa=r(Pa=Je+2*ja,i),Ea=t.duration*(t.rate-Je)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",He;if(Pa<=0){if((Fa=o(60*((Ta=ot-Tt)/_t)/i.current_basal*N))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return He.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,He,t)}else He.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));ja=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),ja>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+ja+" U)"),He.reason+="max_iob "+lt+", ",ja=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Pa=r(Pa=Je+2*ja,i),ja=o(ja,3),He.insulinReq=ja;var ka=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/Z,3),Ha=0;void 0===La?(Ha=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*N),Ha=o(i.current_basal*N*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*N*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Je*Fa/30,2),Fa=30),He.reason+=" insulinReq "+ja,Ka>=Ha&&(He.reason+="; maxBolus "+Ha),Fa>0&&(He.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),He.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Tt+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(He.units=Ka,He.reason+="Microbolusing "+Ka+"U. "):He.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return He.rate=Qa,He.duration=Fa,He}var er=u.getMaxSafeBasal(i);return Pa>er&&(He.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Je)/60)>=2*ja?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file From 18c53b363257d8cf76c66e80db3c4393b8fe37a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 23 Sep 2023 13:51:49 +0200 Subject: [PATCH 003/405] Format... --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/Views/TagCloudView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index b05a4e8dc3..6ec9f33ce9 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index df49349aaa..f32f70af1b 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -67,7 +67,7 @@ struct TagCloudView: View { textTag where textTag.contains("Autosens/Dynamic Limit:"), textTag where textTag.contains("Dynamic ISF/CR"), textTag where textTag.contains("Basal ratio"), - textTag where textTag.contains("SMB Ratio"): + textTag where textTag.contains("SMB Ratio:"): return .zt default: return .insulin From c04dbd5b644b4ff29f1edf1ad28f06cab958e44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 23 Sep 2023 14:07:37 +0200 Subject: [PATCH 004/405] TDD instead of "Total insulin" --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 6ec9f33ce9..9e9544edff 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); From 11c3a0372f93eb6d48667c2e74e49588b6aa7ccf Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sun, 24 Sep 2023 22:11:27 +0200 Subject: [PATCH 005/405] Some fiddling around to add SMB flag for treatment history --- .../APS/Storage/PumpHistoryStorage.swift | 3 ++- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 6 ++++- .../Modules/DataTable/DataTableDataFlow.swift | 22 ++++++++++++------- .../UserNotificationsManager.swift | 1 + 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index 0a2a5ce252..2ba97a721d 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -44,7 +44,8 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { durationMin: nil, rate: nil, temp: nil, - carbInput: nil + carbInput: nil, + isSMB: dose.automatic )] case .tempBasal: guard let dose = event.dose else { return [] } diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index a13a801b30..bee1daa77a 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -11,6 +11,7 @@ struct PumpHistoryEvent: JSON, Equatable { let temp: TempType? let carbInput: Int? let note: String? + let isSMB: Bool? init( id: String, @@ -22,7 +23,8 @@ struct PumpHistoryEvent: JSON, Equatable { rate: Decimal? = nil, temp: TempType? = nil, carbInput: Int? = nil, - note: String? = nil + note: String? = nil, + isSMB: Bool? = nil ) { self.id = id self.type = type @@ -34,6 +36,7 @@ struct PumpHistoryEvent: JSON, Equatable { self.temp = temp self.carbInput = carbInput self.note = note + self.isSMB = isSMB } } @@ -80,5 +83,6 @@ extension PumpHistoryEvent { case temp case carbInput = "carb_input" case note + case isSMB } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 974ced7e88..f463185b43 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -66,8 +66,9 @@ enum DataTable { let isFPU: Bool? let fpuID: String? let note: String? + let isSMB: Bool? - private var numberFormater: NumberFormatter { + private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.maximumFractionDigits = 2 @@ -92,7 +93,8 @@ enum DataTable { idPumpEvent: String? = nil, isFPU: Bool? = false, fpuID: String? = nil, - note: String? = nil + note: String? = nil, + isSMB: Bool? = nil ) { self.units = units self.type = type @@ -105,6 +107,7 @@ enum DataTable { self.isFPU = isFPU self.fpuID = fpuID self.note = note + self.isSMB = isSMB } static func == (lhs: Treatment, rhs: Treatment) -> Bool { @@ -126,14 +129,17 @@ enum DataTable { switch type { case .carbs: - return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") + return numberFormatter + .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") case .fpus: - return numberFormater + return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: - return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + return numberFormatter + .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + + "\((isSMB ?? true)! ? " SMB" : " Manual")" case .tempBasal: - return numberFormater + return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") case .tempTarget: var converted = amount @@ -142,7 +148,7 @@ enum DataTable { } guard var secondAmount = secondAmount else { - return numberFormater.string(from: converted as NSNumber)! + " \(units.rawValue)" + return numberFormatter.string(from: converted as NSNumber)! + " \(units.rawValue)" } if units == .mmolL { secondAmount = secondAmount.asMmolL @@ -177,7 +183,7 @@ enum DataTable { guard let duration = duration, duration > 0 else { return nil } - return numberFormater.string(from: duration as NSNumber)! + " min" + return numberFormatter.string(from: duration as NSNumber)! + " min" } } diff --git a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift index fd44ef06d3..16e93c11c0 100644 --- a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift +++ b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift @@ -232,6 +232,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In } } } + private func glucoseText(glucoseValue: Int, delta: Int?, direction: BloodGlucose.Direction?) -> String { let units = settingsManager.settings.units let glucoseText = glucoseFormatter From 09e1f509f3b1b6873b7baa003c0bbb227e65ae2e Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 00:17:25 +0200 Subject: [PATCH 006/405] Add SMB flag and robot emoji for SMB boluses --- .../Sources/Modules/DataTable/DataTableDataFlow.swift | 2 +- .../Sources/Modules/DataTable/DataTableStateModel.swift | 9 ++++++++- .../Modules/DataTable/View/DataTableRootView.swift | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index f463185b43..f6d07fa4cf 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -137,7 +137,7 @@ enum DataTable { case .bolus: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - "\((isSMB ?? true)! ? " SMB" : " Manual")" + "\(isSMB ?? false ? " SMB" : "")" case .tempBasal: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index cc80c97a0a..82037886e0 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -66,7 +66,14 @@ extension DataTable { let boluses = self.provider.pumpHistory() .filter { $0.type == .bolus } .map { - Treatment(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount, idPumpEvent: $0.id) + Treatment( + units: units, + type: .bolus, + date: $0.timestamp, + amount: $0.amount, + idPumpEvent: $0.id, + isSMB: $0.isSMB + ) } let tempBasals = self.provider.pumpHistory() diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 351ee5a3f7..0804793347 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -113,8 +113,9 @@ extension DataTable { Image(systemName: "circle.fill").foregroundColor(item.color) Text(dateFormatter.string(from: item.date)) .moveDisabled(true) - Text(item.type.name) + Text((item.isSMB ?? false) ? "🤖" : item.type.name) Text(item.amountText).foregroundColor(.secondary) + if let duration = item.durationText { Text(duration).foregroundColor(.secondary) } From ef56985749b5431bf585fe1aa36e91a09ddb16e6 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 00:36:01 +0200 Subject: [PATCH 007/405] Add IOB and COB to calendar event --- .../Services/Calendar/CalendarManager.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 9c6518be06..8da7b40e6e 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -16,6 +16,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { @Injected() private var settingsManager: SettingsManager! @Injected() private var broadcaster: Broadcaster! @Injected() private var glucoseStorage: GlucoseStorage! + @Injected() private var storage: FileStorage! init(resolver: Resolver) { injectServices(resolver) @@ -74,7 +75,11 @@ final class BaseCalendarManager: CalendarManager, Injectable { .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } ?? "--" - let title = glucoseText + " " + directionText + " " + deltaText + let fetchedSuggestion = storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) + let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" + let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" + + let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + ", COB: " + cobText event.title = title event.notes = "iAPS" @@ -133,6 +138,20 @@ final class BaseCalendarManager: CalendarManager, Injectable { return formatter } + private var iobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + return formatter + } + + private var cobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + func setupGlucose() { let glucose = glucoseStorage.recent() let recentGlucose = glucose.last From ac4bfce9f6d8066fb2aa8cf22b7f6a7348caaa58 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:15:40 +0200 Subject: [PATCH 008/405] Remove comma --- FreeAPS/Sources/Services/Calendar/CalendarManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 8da7b40e6e..abdd1c1b4a 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -79,7 +79,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" - let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + ", COB: " + cobText + let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + " COB: " + cobText event.title = title event.notes = "iAPS" From 4aee0ddede76704ac1e598cf1323423a52f07dff Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:21:22 +0200 Subject: [PATCH 009/405] Clean up workspace; remove comma --- .../Services/Calendar/CalendarManager.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 9c6518be06..abdd1c1b4a 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -16,6 +16,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { @Injected() private var settingsManager: SettingsManager! @Injected() private var broadcaster: Broadcaster! @Injected() private var glucoseStorage: GlucoseStorage! + @Injected() private var storage: FileStorage! init(resolver: Resolver) { injectServices(resolver) @@ -74,7 +75,11 @@ final class BaseCalendarManager: CalendarManager, Injectable { .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } ?? "--" - let title = glucoseText + " " + directionText + " " + deltaText + let fetchedSuggestion = storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) + let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" + let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" + + let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + " COB: " + cobText event.title = title event.notes = "iAPS" @@ -133,6 +138,20 @@ final class BaseCalendarManager: CalendarManager, Injectable { return formatter } + private var iobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + return formatter + } + + private var cobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + func setupGlucose() { let glucose = glucoseStorage.recent() let recentGlucose = glucose.last From 473772db424dedf8fbf92f2413bca28e71e7f719 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:27:57 +0200 Subject: [PATCH 010/405] Clean up workspace; remove comma --- .../APS/Storage/PumpHistoryStorage.swift | 3 +-- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 6 +----- .../Modules/DataTable/DataTableDataFlow.swift | 17 ++++++++--------- .../Modules/DataTable/DataTableStateModel.swift | 3 +-- .../DataTable/View/DataTableRootView.swift | 2 +- .../UserNotificationsManager.swift | 2 +- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index 2ba97a721d..0a2a5ce252 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -44,8 +44,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { durationMin: nil, rate: nil, temp: nil, - carbInput: nil, - isSMB: dose.automatic + carbInput: nil )] case .tempBasal: guard let dose = event.dose else { return [] } diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index bee1daa77a..a13a801b30 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -11,7 +11,6 @@ struct PumpHistoryEvent: JSON, Equatable { let temp: TempType? let carbInput: Int? let note: String? - let isSMB: Bool? init( id: String, @@ -23,8 +22,7 @@ struct PumpHistoryEvent: JSON, Equatable { rate: Decimal? = nil, temp: TempType? = nil, carbInput: Int? = nil, - note: String? = nil, - isSMB: Bool? = nil + note: String? = nil ) { self.id = id self.type = type @@ -36,7 +34,6 @@ struct PumpHistoryEvent: JSON, Equatable { self.temp = temp self.carbInput = carbInput self.note = note - self.isSMB = isSMB } } @@ -83,6 +80,5 @@ extension PumpHistoryEvent { case temp case carbInput = "carb_input" case note - case isSMB } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index f6d07fa4cf..624a8152eb 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -68,7 +68,7 @@ enum DataTable { let note: String? let isSMB: Bool? - private var numberFormatter: NumberFormatter { + private var numberFormater: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.maximumFractionDigits = 2 @@ -129,17 +129,16 @@ enum DataTable { switch type { case .carbs: - return numberFormatter + return numberFormater .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") case .fpus: - return numberFormatter + return numberFormater .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: - return numberFormatter - .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - "\(isSMB ?? false ? " SMB" : "")" + return numberFormater + .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") case .tempBasal: - return numberFormatter + return numberFormater .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") case .tempTarget: var converted = amount @@ -148,7 +147,7 @@ enum DataTable { } guard var secondAmount = secondAmount else { - return numberFormatter.string(from: converted as NSNumber)! + " \(units.rawValue)" + return numberFormater.string(from: converted as NSNumber)! + " \(units.rawValue)" } if units == .mmolL { secondAmount = secondAmount.asMmolL @@ -183,7 +182,7 @@ enum DataTable { guard let duration = duration, duration > 0 else { return nil } - return numberFormatter.string(from: duration as NSNumber)! + " min" + return numberFormater.string(from: duration as NSNumber)! + " min" } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 82037886e0..dc0f465750 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -71,8 +71,7 @@ extension DataTable { type: .bolus, date: $0.timestamp, amount: $0.amount, - idPumpEvent: $0.id, - isSMB: $0.isSMB + idPumpEvent: $0.id ) } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 0804793347..cc5940db9b 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -113,7 +113,7 @@ extension DataTable { Image(systemName: "circle.fill").foregroundColor(item.color) Text(dateFormatter.string(from: item.date)) .moveDisabled(true) - Text((item.isSMB ?? false) ? "🤖" : item.type.name) + Text(item.type.name) Text(item.amountText).foregroundColor(.secondary) if let duration = item.durationText { diff --git a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift index 16e93c11c0..beacab0dd5 100644 --- a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift +++ b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift @@ -232,7 +232,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In } } } - + private func glucoseText(glucoseValue: Int, delta: Int?, direction: BloodGlucose.Direction?) -> String { let units = settingsManager.settings.units let glucoseText = glucoseFormatter From c6ed6fa66056383fd0390469902dfb41ef97b188 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:31:26 +0200 Subject: [PATCH 011/405] Clean up workspace --- FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift | 5 +---- .../Sources/Modules/DataTable/DataTableStateModel.swift | 8 +------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 624a8152eb..fe62e9732c 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -66,7 +66,6 @@ enum DataTable { let isFPU: Bool? let fpuID: String? let note: String? - let isSMB: Bool? private var numberFormater: NumberFormatter { let formatter = NumberFormatter() @@ -93,8 +92,7 @@ enum DataTable { idPumpEvent: String? = nil, isFPU: Bool? = false, fpuID: String? = nil, - note: String? = nil, - isSMB: Bool? = nil + note: String? = nil ) { self.units = units self.type = type @@ -107,7 +105,6 @@ enum DataTable { self.isFPU = isFPU self.fpuID = fpuID self.note = note - self.isSMB = isSMB } static func == (lhs: Treatment, rhs: Treatment) -> Bool { diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index dc0f465750..cc80c97a0a 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -66,13 +66,7 @@ extension DataTable { let boluses = self.provider.pumpHistory() .filter { $0.type == .bolus } .map { - Treatment( - units: units, - type: .bolus, - date: $0.timestamp, - amount: $0.amount, - idPumpEvent: $0.id - ) + Treatment(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount, idPumpEvent: $0.id) } let tempBasals = self.provider.pumpHistory() From e02285dfcf613f3edd0a0adfc18acc9be56ef6b9 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:33:38 +0200 Subject: [PATCH 012/405] Clean up workspace --- FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index fe62e9732c..974ced7e88 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -126,14 +126,12 @@ enum DataTable { switch type { case .carbs: - return numberFormater - .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") + return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") case .fpus: return numberFormater .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: - return numberFormater - .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") case .tempBasal: return numberFormater .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") From d32b5550d3d5d7f03dba16d5fc19ef36bff51227 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 01:35:28 +0200 Subject: [PATCH 013/405] Clean up workspace --- .../Services/UserNotifiactions/UserNotificationsManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift index beacab0dd5..16e93c11c0 100644 --- a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift +++ b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift @@ -232,7 +232,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In } } } - + private func glucoseText(glucoseValue: Int, delta: Int?, direction: BloodGlucose.Direction?) -> String { let units = settingsManager.settings.units let glucoseText = glucoseFormatter From 62c766881c2ddf2cdb080d7a48a405a5a3ba085f Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Mon, 25 Sep 2023 01:41:19 +0200 Subject: [PATCH 014/405] Add IOB and COB to calendar events (#220) * Add IOB and COB to calendar event --- .../DataTable/View/DataTableRootView.swift | 1 + .../Services/Calendar/CalendarManager.swift | 21 ++++++++++++++++++- .../UserNotificationsManager.swift | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 351ee5a3f7..cc5940db9b 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -115,6 +115,7 @@ extension DataTable { .moveDisabled(true) Text(item.type.name) Text(item.amountText).foregroundColor(.secondary) + if let duration = item.durationText { Text(duration).foregroundColor(.secondary) } diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 9c6518be06..abdd1c1b4a 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -16,6 +16,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { @Injected() private var settingsManager: SettingsManager! @Injected() private var broadcaster: Broadcaster! @Injected() private var glucoseStorage: GlucoseStorage! + @Injected() private var storage: FileStorage! init(resolver: Resolver) { injectServices(resolver) @@ -74,7 +75,11 @@ final class BaseCalendarManager: CalendarManager, Injectable { .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } ?? "--" - let title = glucoseText + " " + directionText + " " + deltaText + let fetchedSuggestion = storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) + let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" + let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" + + let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + " COB: " + cobText event.title = title event.notes = "iAPS" @@ -133,6 +138,20 @@ final class BaseCalendarManager: CalendarManager, Injectable { return formatter } + private var iobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + return formatter + } + + private var cobFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + func setupGlucose() { let glucose = glucoseStorage.recent() let recentGlucose = glucose.last diff --git a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift index fd44ef06d3..16e93c11c0 100644 --- a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift +++ b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift @@ -232,6 +232,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In } } } + private func glucoseText(glucoseValue: Int, delta: Int?, direction: BloodGlucose.Direction?) -> String { let units = settingsManager.settings.units let glucoseText = glucoseFormatter From 53ccbfa736065c9cc5d201ea975456a7bead41b1 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Mon, 25 Sep 2023 01:41:54 +0200 Subject: [PATCH 015/405] Add SMB flag for treatment history (#219) * Add SMB flag and robot emoji for SMB boluses --- .../APS/Storage/PumpHistoryStorage.swift | 3 ++- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 6 ++++- .../Modules/DataTable/DataTableDataFlow.swift | 22 ++++++++++++------- .../DataTable/DataTableStateModel.swift | 9 +++++++- .../DataTable/View/DataTableRootView.swift | 2 +- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index 0a2a5ce252..2ba97a721d 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -44,7 +44,8 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { durationMin: nil, rate: nil, temp: nil, - carbInput: nil + carbInput: nil, + isSMB: dose.automatic )] case .tempBasal: guard let dose = event.dose else { return [] } diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index a13a801b30..bee1daa77a 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -11,6 +11,7 @@ struct PumpHistoryEvent: JSON, Equatable { let temp: TempType? let carbInput: Int? let note: String? + let isSMB: Bool? init( id: String, @@ -22,7 +23,8 @@ struct PumpHistoryEvent: JSON, Equatable { rate: Decimal? = nil, temp: TempType? = nil, carbInput: Int? = nil, - note: String? = nil + note: String? = nil, + isSMB: Bool? = nil ) { self.id = id self.type = type @@ -34,6 +36,7 @@ struct PumpHistoryEvent: JSON, Equatable { self.temp = temp self.carbInput = carbInput self.note = note + self.isSMB = isSMB } } @@ -80,5 +83,6 @@ extension PumpHistoryEvent { case temp case carbInput = "carb_input" case note + case isSMB } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 974ced7e88..f6d07fa4cf 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -66,8 +66,9 @@ enum DataTable { let isFPU: Bool? let fpuID: String? let note: String? + let isSMB: Bool? - private var numberFormater: NumberFormatter { + private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.maximumFractionDigits = 2 @@ -92,7 +93,8 @@ enum DataTable { idPumpEvent: String? = nil, isFPU: Bool? = false, fpuID: String? = nil, - note: String? = nil + note: String? = nil, + isSMB: Bool? = nil ) { self.units = units self.type = type @@ -105,6 +107,7 @@ enum DataTable { self.isFPU = isFPU self.fpuID = fpuID self.note = note + self.isSMB = isSMB } static func == (lhs: Treatment, rhs: Treatment) -> Bool { @@ -126,14 +129,17 @@ enum DataTable { switch type { case .carbs: - return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") + return numberFormatter + .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs") case .fpus: - return numberFormater + return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: - return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + return numberFormatter + .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + + "\(isSMB ?? false ? " SMB" : "")" case .tempBasal: - return numberFormater + return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") case .tempTarget: var converted = amount @@ -142,7 +148,7 @@ enum DataTable { } guard var secondAmount = secondAmount else { - return numberFormater.string(from: converted as NSNumber)! + " \(units.rawValue)" + return numberFormatter.string(from: converted as NSNumber)! + " \(units.rawValue)" } if units == .mmolL { secondAmount = secondAmount.asMmolL @@ -177,7 +183,7 @@ enum DataTable { guard let duration = duration, duration > 0 else { return nil } - return numberFormater.string(from: duration as NSNumber)! + " min" + return numberFormatter.string(from: duration as NSNumber)! + " min" } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index cc80c97a0a..82037886e0 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -66,7 +66,14 @@ extension DataTable { let boluses = self.provider.pumpHistory() .filter { $0.type == .bolus } .map { - Treatment(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount, idPumpEvent: $0.id) + Treatment( + units: units, + type: .bolus, + date: $0.timestamp, + amount: $0.amount, + idPumpEvent: $0.id, + isSMB: $0.isSMB + ) } let tempBasals = self.provider.pumpHistory() diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index cc5940db9b..0804793347 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -113,7 +113,7 @@ extension DataTable { Image(systemName: "circle.fill").foregroundColor(item.color) Text(dateFormatter.string(from: item.date)) .moveDisabled(true) - Text(item.type.name) + Text((item.isSMB ?? false) ? "🤖" : item.type.name) Text(item.amountText).foregroundColor(.secondary) if let duration = item.durationText { From fbffdf98118719b62e46239c34bb6cb633410d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 25 Sep 2023 11:07:35 +0200 Subject: [PATCH 016/405] Formatting of data table. And localization of "Manual" --- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift | 2 +- FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 0d76caa4b8..9adb73bb2b 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1112,7 +1112,7 @@ Enact a temp Basal or a temp target */ "Error" = "Fel"; /* Manual temp basal mode */ -"Manual" = "Manuellt"; +"Manual" = "Manuell"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell temporär basal"; diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index f6d07fa4cf..930b09f457 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -137,7 +137,7 @@ enum DataTable { case .bolus: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - "\(isSMB ?? false ? " SMB" : "")" + ((isSMB ?? false) ? " 🤖" : " " + NSLocalizedString("Manual", comment: "Manual Bolus")) case .tempBasal: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 0804793347..7754932c6c 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -113,7 +113,7 @@ extension DataTable { Image(systemName: "circle.fill").foregroundColor(item.color) Text(dateFormatter.string(from: item.date)) .moveDisabled(true) - Text((item.isSMB ?? false) ? "🤖" : item.type.name) + Text((item.isSMB ?? false) ? "SMB" : item.type.name) Text(item.amountText).foregroundColor(.secondary) if let duration = item.durationText { From 24c5abb58ec706024e3e7fc2a9b662e06378421e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 25 Sep 2023 15:14:02 +0200 Subject: [PATCH 017/405] Nighscout fixes * Upload SMB boluses as Entry Type "SMB" in Nightscout. * Change "freeaps-x" to "iAPS" in "Entered By:" * Change from "freeaps-x-remote" to simply "remote" for remote commands (cherry picked from commit 0f8736be187a84909ab139a9107678541e758680) --- FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift | 2 +- .../Localizations/Main/en.lproj/Localizable.strings | 3 +++ FreeAPS/Sources/Models/AlertEntry.swift | 2 +- FreeAPS/Sources/Models/Announcement.swift | 2 +- FreeAPS/Sources/Models/CarbsEntry.swift | 2 +- FreeAPS/Sources/Models/NightscoutTreatment.swift | 2 +- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 1 + FreeAPS/Sources/Models/TempTarget.swift | 2 +- .../Sources/Modules/DataTable/DataTableDataFlow.swift | 9 ++++++--- FreeAPS/Sources/Services/Network/NightscoutAPI.swift | 2 +- 10 files changed, 17 insertions(+), 10 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index 2ba97a721d..16fee07041 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -256,7 +256,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { rawRate: nil, absolute: nil, rate: nil, - eventType: .bolus, + eventType: (event.isSMB ?? false) ? .smb : .bolus, createdAt: event.timestamp, enteredBy: NigtscoutTreatment.local, bolus: event, diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 4228821fb6..303b1ed173 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1115,6 +1115,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Models/AlertEntry.swift b/FreeAPS/Sources/Models/AlertEntry.swift index 4a7b3263e8..8194984fd6 100644 --- a/FreeAPS/Sources/Models/AlertEntry.swift +++ b/FreeAPS/Sources/Models/AlertEntry.swift @@ -15,7 +15,7 @@ struct AlertEntry: JSON, Codable, Hashable { let contentBody: String? var errorMessage: String? - static let manual = "freeaps-x" + static let manual = "iAPS" static func == (lhs: AlertEntry, rhs: AlertEntry) -> Bool { lhs.issuedDate == rhs.issuedDate diff --git a/FreeAPS/Sources/Models/Announcement.swift b/FreeAPS/Sources/Models/Announcement.swift index 62482e5938..7a44bfb752 100644 --- a/FreeAPS/Sources/Models/Announcement.swift +++ b/FreeAPS/Sources/Models/Announcement.swift @@ -5,7 +5,7 @@ struct Announcement: JSON { let enteredBy: String let notes: String - static let remote = "freeaps-x-remote" + static let remote = "remote" var action: AnnouncementAction? { let components = notes.replacingOccurrences(of: " ", with: "").split(separator: ":") diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index 4dd549ca35..3c8f35cc76 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -11,7 +11,7 @@ struct CarbsEntry: JSON, Equatable, Hashable { let isFPU: Bool? let fpuID: String? - static let manual = "freeaps-x" + static let manual = "iAPS" static let appleHealth = "applehealth" static func == (lhs: CarbsEntry, rhs: CarbsEntry) -> Bool { diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index 2818180555..694410e6f5 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -19,7 +19,7 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { let targetTop: Decimal? let targetBottom: Decimal? - static let local = "freeaps-x" + static let local = "iAPS" static let empty = NigtscoutTreatment(from: "{}")! diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index bee1daa77a..11830cbd78 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -42,6 +42,7 @@ struct PumpHistoryEvent: JSON, Equatable { enum EventType: String, JSON { case bolus = "Bolus" + case smb = "SMB" case mealBulus = "Meal Bolus" case correctionBolus = "Correction Bolus" case snackBolus = "Snack Bolus" diff --git a/FreeAPS/Sources/Models/TempTarget.swift b/FreeAPS/Sources/Models/TempTarget.swift index 3e38bfff9f..68fc1c1fd1 100644 --- a/FreeAPS/Sources/Models/TempTarget.swift +++ b/FreeAPS/Sources/Models/TempTarget.swift @@ -10,7 +10,7 @@ struct TempTarget: JSON, Identifiable, Equatable, Hashable { let enteredBy: String? let reason: String? - static let manual = "freeaps-x" + static let manual = "iAPS" static let custom = "Temp target" static let cancel = "Cancel" diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 930b09f457..38c03ef95c 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -91,7 +91,7 @@ enum DataTable { duration: Decimal? = nil, id: String? = nil, idPumpEvent: String? = nil, - isFPU: Bool? = false, + isFPU: Bool? = nil, fpuID: String? = nil, note: String? = nil, isSMB: Bool? = nil @@ -137,7 +137,10 @@ enum DataTable { case .bolus: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - ((isSMB ?? false) ? " 🤖" : " " + NSLocalizedString("Manual", comment: "Manual Bolus")) + ( + (isSMB ?? false) ? " " + NSLocalizedString("Auto", comment: "Automatic delivered bolus (SMB)") : " " + + NSLocalizedString("Manual", comment: "Manual Bolus") + ) case .tempBasal: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") @@ -167,7 +170,7 @@ enum DataTable { case .carbs: return .loopYellow case .fpus: - return .red + return .loopRed case .bolus: return .insulin case .tempBasal: diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 0d712c9332..ec47340bf8 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -33,7 +33,7 @@ extension NightscoutAPI { func checkConnection() -> AnyPublisher { struct Check: Codable, Equatable { var eventType = "Note" - var enteredBy = "freeaps-x" + var enteredBy = "iAPS" var notes = "iAPS connected" } let check = Check() From c36113f91e5ae8020c1724d1c294f40a309009f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 25 Sep 2023 16:50:29 +0200 Subject: [PATCH 018/405] Calendar events. Small formatting. Avoid double separators "5,5,". --- FreeAPS/Sources/Services/Calendar/CalendarManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index abdd1c1b4a..6f32be7ff8 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -79,7 +79,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" - let title = glucoseText + " " + directionText + " " + deltaText + ", IOB: " + iobText + " COB: " + cobText + let title = glucoseText + " " + directionText + " " + deltaText + "; IOB: " + iobText + " COB: " + cobText event.title = title event.notes = "iAPS" From 5be4e5b64d5a14c0b647187383ed162fdccec981 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 17:13:45 +0200 Subject: [PATCH 019/405] Change icon for bolus confirmation from downward arrow to rotating crown --- .../Views/BolusConfirmationView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift b/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift index c141bb508e..23a9d4cc48 100644 --- a/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift +++ b/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift @@ -40,7 +40,7 @@ struct BolusConfirmationView: View { if isCrownLeftOriented { Spacer().frame(width: elementSize / 2) } else { - Image(systemName: "arrow.down") + Image(systemName: "digitalcrown.arrow.counterclockwise.fill") .resizable() .frame(width: elementSize / 2, height: elementSize / 2) .foregroundColor(.primary) @@ -51,7 +51,7 @@ struct BolusConfirmationView: View { .padding() HStack(spacing: 16) { if isCrownLeftOriented { - Image(systemName: "arrow.down") + Image(systemName: "digitalcrown.arrow.counterclockwise.fill") .resizable() .frame(width: elementSize / 2, height: elementSize / 2) .foregroundColor(.primary) From 12711c0e96151bc38fbb5508e6fe556ed600a805 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 22:39:25 +0200 Subject: [PATCH 020/405] Extend CGM calendar settings with toggles for IOB, COB, emoji display; extend calender entry logic --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 10 ++++++++ .../Sources/Modules/CGM/CGMStateModel.swift | 4 ++++ .../Modules/CGM/View/CGMRootView.swift | 4 ++++ .../Services/Calendar/CalendarManager.swift | 24 +++++++++++++++++-- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 1c9a07c2c3..031d9a48b2 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -15,6 +15,8 @@ struct FreeAPSSettings: JSON, Equatable { var cgm: CGMType = .nightscout var uploadGlucose: Bool = true var useCalendar: Bool = false + var displayCalendarIOBandCOB: Bool = false + var displayCalendarEmojis: Bool = false var glucoseBadge: Bool = false var glucoseNotificationsAlways: Bool = false var useAlarmSound: Bool = false @@ -113,6 +115,14 @@ extension FreeAPSSettings: Decodable { settings.useCalendar = useCalendar } + if let displayCalendarIOBandCOB = try? container.decode(Bool.self, forKey: .displayCalendarIOBandCOB) { + settings.displayCalendarIOBandCOB = displayCalendarIOBandCOB + } + + if let displayCalendarEmojis = try? container.decode(Bool.self, forKey: .displayCalendarEmojis) { + settings.displayCalendarEmojis = displayCalendarEmojis + } + if let useAppleHealth = try? container.decode(Bool.self, forKey: .useAppleHealth) { settings.useAppleHealth = useAppleHealth } diff --git a/FreeAPS/Sources/Modules/CGM/CGMStateModel.swift b/FreeAPS/Sources/Modules/CGM/CGMStateModel.swift index cc7190c8b4..be327e95f9 100644 --- a/FreeAPS/Sources/Modules/CGM/CGMStateModel.swift +++ b/FreeAPS/Sources/Modules/CGM/CGMStateModel.swift @@ -16,6 +16,8 @@ extension CGM { @Published var uploadGlucose = true @Published var smoothGlucose = false @Published var createCalendarEvents = false + @Published var displayCalendarIOBandCOB = false + @Published var displayCalendarEmojis = false @Published var calendarIDs: [String] = [] @Published var currentCalendarID: String = "" @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil @@ -28,6 +30,8 @@ extension CGM { cgmTransmitterDeviceAddress = UserDefaults.standard.cgmTransmitterDeviceAddress subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 } + subscribeSetting(\.displayCalendarIOBandCOB, on: $displayCalendarIOBandCOB) { displayCalendarIOBandCOB = $0 } + subscribeSetting(\.displayCalendarEmojis, on: $displayCalendarEmojis) { displayCalendarEmojis = $0 } subscribeSetting(\.smoothGlucose, on: $smoothGlucose, initial: { smoothGlucose = $0 }) $cgm diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 6dddaa0d5c..9ce53667ec 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -61,6 +61,10 @@ extension CGM { Text($0).tag($0) } } + Toggle("Display IOB and COB", isOn: $state.displayCalendarIOBandCOB) + if state.displayCalendarIOBandCOB { + Toggle("Display Emojis", isOn: $state.displayCalendarEmojis) + } } } diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 6f32be7ff8..15f1d51f18 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -63,6 +63,8 @@ final class BaseCalendarManager: CalendarManager, Injectable { // create an event now let event = EKEvent(eventStore: eventStore) + let glucoseIcon = "🟢" // TODO: change icon color on BG range + let glucoseText = glucoseFormatter .string(from: Double( settingsManager.settings.units == .mmolL ?glucoseValue @@ -79,9 +81,27 @@ final class BaseCalendarManager: CalendarManager, Injectable { let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" - let title = glucoseText + " " + directionText + " " + deltaText + "; IOB: " + iobText + " COB: " + cobText + var glucoseDisplayText = settingsManager.settings.displayCalendarEmojis ? glucoseIcon + " " : "" + glucoseDisplayText += glucoseText + " " + directionText + " " + deltaText + + var iobDisplayText = "" + var cobDisplayText = "" + + if settingsManager.settings.displayCalendarIOBandCOB { + if settingsManager.settings.displayCalendarEmojis { + iobDisplayText += "💉" + cobDisplayText += "🍞" + } else { + iobDisplayText += "IOB:" + cobDisplayText += "COB:" + } + iobDisplayText += " " + iobText + cobDisplayText += " " + cobText + + event.location = iobDisplayText + " " + cobDisplayText + } - event.title = title + event.title = glucoseDisplayText event.notes = "iAPS" event.startDate = Date() event.endDate = Date(timeIntervalSinceNow: 60 * 10) From d7a9e9d2d4c7acf69034a7408b78b020f853982e Mon Sep 17 00:00:00 2001 From: dnzxy Date: Mon, 25 Sep 2023 23:41:55 +0200 Subject: [PATCH 021/405] Change setting order; add glucose icon coloring logic based on range --- FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift | 6 ++---- FreeAPS/Sources/Services/Calendar/CalendarManager.swift | 8 +++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 9ce53667ec..29c9f55206 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -54,17 +54,15 @@ extension CGM { Text("Calibrations").navigationLink(to: .calibrations, from: self) } Section(header: Text("Calendar")) { - Toggle("Create events in calendar", isOn: $state.createCalendarEvents) + Toggle("Create Events in Calendar", isOn: $state.createCalendarEvents) if state.calendarIDs.isNotEmpty { Picker("Calendar", selection: $state.currentCalendarID) { ForEach(state.calendarIDs, id: \.self) { Text($0).tag($0) } } + Toggle("Display Emojis as Labels", isOn: $state.displayCalendarEmojis) Toggle("Display IOB and COB", isOn: $state.displayCalendarIOBandCOB) - if state.displayCalendarIOBandCOB { - Toggle("Display Emojis", isOn: $state.displayCalendarEmojis) - } } } diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 15f1d51f18..8897c93591 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -63,7 +63,9 @@ final class BaseCalendarManager: CalendarManager, Injectable { // create an event now let event = EKEvent(eventStore: eventStore) - let glucoseIcon = "🟢" // TODO: change icon color on BG range + var glucoseIcon = "🟢" + glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon + glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon let glucoseText = glucoseFormatter .string(from: Double( @@ -83,14 +85,14 @@ final class BaseCalendarManager: CalendarManager, Injectable { var glucoseDisplayText = settingsManager.settings.displayCalendarEmojis ? glucoseIcon + " " : "" glucoseDisplayText += glucoseText + " " + directionText + " " + deltaText - + var iobDisplayText = "" var cobDisplayText = "" if settingsManager.settings.displayCalendarIOBandCOB { if settingsManager.settings.displayCalendarEmojis { iobDisplayText += "💉" - cobDisplayText += "🍞" + cobDisplayText += "🥨" } else { iobDisplayText += "IOB:" cobDisplayText += "COB:" From a81ffaaa924fd2b166cb9dd4525dc1356596f53c Mon Sep 17 00:00:00 2001 From: dnzxy Date: Tue, 26 Sep 2023 00:29:49 +0200 Subject: [PATCH 022/405] Add defaults for displayCalendarEmojis and displayCalendarIOBandCOB settings --- FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index bec8a8989b..05331cf0f6 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -14,6 +14,8 @@ "cgm" : "nightscout", "uploadGlucose" : true, "useCalendar" : false, + "displayCalendarEmojis" : false, + "displayCalendarIOBandCOB" : false, "glucoseBadge" : false, "glucoseNotificationsAlways" : false, "useAlarmSound" : false, From 6c2426dc9a92d9ef306f2710129b0f0035d01a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 26 Sep 2023 00:44:27 +0200 Subject: [PATCH 023/405] Sync translated strings --- FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-BR.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-PT.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings | 2 +- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 514bce52a0..0b244df3af 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings index d52bdc50c9..617a1f967f 100644 --- a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings @@ -514,7 +514,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 55103c96a4..33a8ae7065 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index f97d5c9325..3784b56360 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibrierungen"; /* */ -"Create events in calendar" = "Kalendereintrag erstellen"; +"Create Events in Calendar" = "Kalendereintrag erstellen"; /* */ "Calendar" = "Kalender"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 303b1ed173..dcf6c9985a 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index ab75bf9613..ce491f5fec 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibraciones"; /* */ -"Create events in calendar" = "Crear eventos en el calendario"; +"Create Events in Calendar" = "Crear eventos en el calendario"; /* */ "Calendar" = "Calendario"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 2107dc8cf4..f38793b424 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index b23990bb47..ce8bd138bd 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Étalonnages"; /* */ -"Create events in calendar" = "Créer des événements dans le calendrier"; +"Create Events in Calendar" = "Créer des événements dans le calendrier"; /* */ "Calendar" = "Calendrier"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 514bce52a0..0b244df3af 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index a634a30b66..a093369dd0 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrazioni"; /* */ -"Create events in calendar" = "Crea eventi nel calendario"; +"Create Events in Calendar" = "Crea eventi nel calendario"; /* */ "Calendar" = "Calendario"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 5654be2482..bfd2ed806a 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibreringer"; /* */ -"Create events in calendar" = "Opprett hendelser i kalenderen"; +"Create Events in Calendar" = "Opprett hendelser i kalenderen"; /* */ "Calendar" = "Kalender"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index d8263fad0c..c9ca115e16 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibraties"; /* */ -"Create events in calendar" = "Voeg gebeurtenissen toe aan de kalender"; +"Create Events in Calendar" = "Voeg gebeurtenissen toe aan de kalender"; /* */ "Calendar" = "Agenda"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 8b80b8b241..a82fe26e0e 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -521,7 +521,7 @@ Połączono z Nightscout!"; "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index a71945d5b2..2aa22b6153 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibragens"; /* */ -"Create events in calendar" = "Criar eventos no calendário"; +"Create Events in Calendar" = "Criar eventos no calendário"; /* */ "Calendar" = "Calendário"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 75c3d88752..a85cca2edf 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ddadb72f51..ed38eba7e2 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Калибровки"; /* */ -"Create events in calendar" = "Создавать событий в календаре"; +"Create Events in Calendar" = "Создавать событий в календаре"; /* */ "Calendar" = "Календарь"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index cc73cbb08c..4e53969c00 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrations"; /* */ -"Create events in calendar" = "Create events in calendar"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendar"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 9adb73bb2b..f9d2b69666 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibreringar"; /* */ -"Create events in calendar" = "Skapa kalenderhändelser"; +"Create Events in Calendar" = "Skapa kalenderhändelser"; /* */ "Calendar" = "Kalender"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 354146aba5..6155539571 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibrasyonlar"; /* */ -"Create events in calendar" = "Takvimde etkinlikler oluşturun"; +"Create Events in Calendar" = "Takvimde etkinlikler oluşturun"; /* */ "Calendar" = "Takvim"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 0e68691321..7f449453b5 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Калібрування"; /* */ -"Create events in calendar" = "Створити подію в календарі"; +"Create Events in Calendar" = "Створити подію в календарі"; /* */ "Calendar" = "Календар"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 117eea2c35..2ed49e1860 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -519,7 +519,7 @@ Enact a temp Basal or a temp target */ "Calibrations" = "校准"; /* */ -"Create events in calendar" = "在日历中创建事件"; +"Create Events in Calendar" = "在日历中创建事件"; /* */ "Calendar" = "日历"; From 32c925a5b91ff2fc61550e482b79b02657bd3288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 26 Sep 2023 01:17:02 +0200 Subject: [PATCH 024/405] Clarify label (cherry picked from commit 344f359a91a677c522a7116068029a9f401f1422) --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index dcf6c9985a..83e5ba109d 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -524,6 +524,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 38c03ef95c..c946e3ddc4 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -138,7 +138,7 @@ enum DataTable { return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + ( - (isSMB ?? false) ? " " + NSLocalizedString("Auto", comment: "Automatic delivered bolus (SMB)") : " " + + (isSMB ?? false) ? " " + NSLocalizedString("Automatic", comment: "Automatic delivered treatments") : " " + NSLocalizedString("Manual", comment: "Manual Bolus") ) case .tempBasal: From c438accf788cc17970a65eb3d0b0a96fd60a5cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 26 Sep 2023 17:44:17 +0200 Subject: [PATCH 025/405] =?UTF-8?q?Calender=20Events=20*=20Get=20IOB=20and?= =?UTF-8?q?=20COB=20for=20Calender=20events=20from=20CoreData.=20*=20If=20?= =?UTF-8?q?loop=20older=20than=2015=20minutes=20display=20a=20=F0=9F=9A=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core_Data.xcdatamodel/contents | 7 +++- FreeAPS/Sources/APS/APSManager.swift | 9 +++++ .../Services/Calendar/CalendarManager.swift | 40 ++++++++++++++----- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index f7d12b0fb8..babd4f4dad 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -38,6 +38,11 @@ + + + + + diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 3ebc18543d..75177bfc21 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -711,6 +711,15 @@ final class BaseAPSManager: APSManager, Injectable { storage.save(enacted, as: OpenAPS.Enact.enacted) + // Save to CoreData also. TO DO: Remove the JSON saving after some testing. + coredataContext.perform { + let saveLastLoop = LastLoop(context: self.coredataContext) + saveLastLoop.iob = (enacted.iob ?? 0) as NSDecimalNumber + saveLastLoop.cob = (enacted.cob ?? 0) as NSDecimalNumber + saveLastLoop.timestamp = (enacted.timestamp ?? .distantPast) as Date + try? self.coredataContext.save() + } + debug(.apsManager, "Suggestion enacted. Received: \(received)") DispatchQueue.main.async { self.broadcaster.notify(EnactedSuggestionObserver.self, on: .main) { diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 8897c93591..25c07a1469 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -1,4 +1,5 @@ import Combine +import CoreData import EventKit import Swinject @@ -24,6 +25,8 @@ final class BaseCalendarManager: CalendarManager, Injectable { setupGlucose() } + let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext() + func requestAccessIfNeeded() -> AnyPublisher { Future { promise in let status = EKEventStore.authorizationStatus(for: .event) @@ -63,9 +66,30 @@ final class BaseCalendarManager: CalendarManager, Injectable { // create an event now let event = EKEvent(eventStore: eventStore) + // Calendar settings + let displeyCOBandIOB = settingsManager.settings.displayCalendarIOBandCOB + let displayEmojis = settingsManager.settings.displayCalendarEmojis + + // Latest Loop data (from CoreData) + var freshLoop: Double = 20 + var lastLoop = [LastLoop]() + if displeyCOBandIOB || displayEmojis { + coredataContext.performAndWait { + let requestLastLoop = LastLoop.fetchRequest() as NSFetchRequest + let sortLoops = NSSortDescriptor(key: "timestamp", ascending: false) + requestLastLoop.sortDescriptors = [sortLoops] + requestLastLoop.fetchLimit = 1 + try? lastLoop = coredataContext.fetch(requestLastLoop) + } + freshLoop = -1 * (lastLoop.first?.timestamp ?? .distantPast).timeIntervalSinceNow.minutes + } + var glucoseIcon = "🟢" - glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon - glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon + if displayEmojis { + glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon + glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon + glucoseIcon = freshLoop > 15 ? "🚫" : glucoseIcon + } let glucoseText = glucoseFormatter .string(from: Double( @@ -79,18 +103,17 @@ final class BaseCalendarManager: CalendarManager, Injectable { .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } ?? "--" - let fetchedSuggestion = storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) - let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? "" - let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? "" + let iobText = iobFormatter.string(from: (lastLoop.first?.iob ?? 0) as NSNumber) ?? "" + let cobText = cobFormatter.string(from: (lastLoop.first?.cob ?? 0) as NSNumber) ?? "" - var glucoseDisplayText = settingsManager.settings.displayCalendarEmojis ? glucoseIcon + " " : "" + var glucoseDisplayText = displayEmojis ? glucoseIcon + " " : "" glucoseDisplayText += glucoseText + " " + directionText + " " + deltaText var iobDisplayText = "" var cobDisplayText = "" - if settingsManager.settings.displayCalendarIOBandCOB { - if settingsManager.settings.displayCalendarEmojis { + if displeyCOBandIOB { + if displayEmojis { iobDisplayText += "💉" cobDisplayText += "🥨" } else { @@ -99,7 +122,6 @@ final class BaseCalendarManager: CalendarManager, Injectable { } iobDisplayText += " " + iobText cobDisplayText += " " + cobText - event.location = iobDisplayText + " " + cobDisplayText } From 581e3e2838f7ee461df8f86c17db06450d49850e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 26 Sep 2023 22:37:35 +0200 Subject: [PATCH 026/405] Respectg Max Bolus setting when adding insulin. Diable buttons when over Max Bolus. Use Max Bolus also for adding insulin wihout bolusing (cherry picked from commit cbeb5a08db0061a0518a9a3c6037300e0aa346d6) --- .../Localizations/Main/en.lproj/Localizable.strings | 3 +++ .../Localizations/Main/sv.lproj/Localizable.strings | 3 +++ FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift | 5 ++++- FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift | 10 +++++++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 83e5ba109d..5acdf0571f 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -962,6 +962,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index f9d2b69666..ed0667f3bb 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -962,6 +962,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Misslyckad eller felaktig bolus. Kontrollera pumpens historik innan du försöker igen."; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Du kan inte ge mer än din maxinställning!"; + /* */ "Carbs" = "Kolhydrater"; diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index c24119b3d8..ea1a1f0144 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -25,6 +25,7 @@ extension Bolus { @Published var expectedDelta: Decimal = 0 @Published var minPredBG: Decimal = 0 @Published var units: GlucoseUnits = .mmolL + @Published var maxBolus: Decimal = 0 var waitForSuggestionInitial: Bool = false @@ -34,6 +35,7 @@ extension Bolus { units = settingsManager.settings.units percentage = settingsManager.settings.insulinReqPercentage threshold = provider.suggestion?.threshold ?? 0 + maxBolus = provider.pumpSettings().maxBolus if waitForSuggestionInitial { apsManager.determineBasal() @@ -55,7 +57,7 @@ extension Bolus { return } - let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus)) + let maxAmount = Double(min(amount, maxBolus)) unlockmanager.unlock() .sink { _ in } receiveValue: { [weak self] _ in @@ -71,6 +73,7 @@ extension Bolus { showModal(for: nil) return } + amount = min(amount, maxBolus) pumpHistoryStorage.storeEvents( [ diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 99dff4a338..0e1c9ed4fa 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -78,8 +78,10 @@ extension Bolus { header: { Text("Bolus") } Section { Button { state.add() } - label: { Text("Enact bolus") } - .disabled(state.amount <= 0) + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } Section { if waitForSuggestion { @@ -88,7 +90,9 @@ extension Bolus { } else { Button { isAddInsulinAlertPresented = true } label: { Text("Add insulin without actually bolusing") } - .disabled(state.amount <= 0) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } } .alert(isPresented: $isAddInsulinAlertPresented) { From 7aeade48d49c319bc508d08d096666c96333a231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 26 Sep 2023 23:05:10 +0200 Subject: [PATCH 027/405] =?UTF-8?q?=F0=9F=98=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 91d4fc79e70985e608287493b28336b97b44a49d) --- FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 0e1c9ed4fa..b94aec3b26 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -72,7 +72,7 @@ extension Bolus { autofocus: true, cleanInput: true ) - Text("U").foregroundColor(.secondary) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } } header: { Text("Bolus") } From 9c5814f3c13ecf2393bb406574d6ab9f9a81f71c Mon Sep 17 00:00:00 2001 From: Liroy van Hoewijk <4643445+LiroyvH@users.noreply.github.com> Date: Thu, 28 Sep 2023 11:57:07 +0200 Subject: [PATCH 028/405] Update APSManager.swift Spelling: succeded -> succeeded --- FreeAPS/Sources/APS/APSManager.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 75177bfc21..ff91b6dffd 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -1246,7 +1246,7 @@ private extension PumpManager { debug(.apsManager, "Temp basal failed: \(unitsPerHour) for: \(duration)") promise(.failure(error)) } else { - debug(.apsManager, "Temp basal succeded: \(unitsPerHour) for: \(duration)") + debug(.apsManager, "Temp basal succeeded: \(unitsPerHour) for: \(duration)") promise(.success(nil)) } } @@ -1265,7 +1265,7 @@ private extension PumpManager { debug(.apsManager, "Bolus failed: \(units)") promise(.failure(error)) } else { - debug(.apsManager, "Bolus succeded: \(units)") + debug(.apsManager, "Bolus succeeded: \(units)") promise(.success(nil)) } } @@ -1279,7 +1279,7 @@ private extension PumpManager { self.cancelBolus { result in switch result { case let .success(dose): - debug(.apsManager, "Cancel Bolus succeded") + debug(.apsManager, "Cancel Bolus succeeded") promise(.success(dose)) case let .failure(error): debug(.apsManager, "Cancel Bolus failed") From 7c7cafecf2c10b377d329559b851e417c02ebe96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 28 Sep 2023 23:24:22 +0200 Subject: [PATCH 029/405] Update Bolus Alerts. Allow 3 X Max Bolus for non-pump insulin, but add alert when over Max Bolus. Localize (tested in Swedish) --- .../Main/en.lproj/Localizable.strings | 3 ++ .../Main/sv.lproj/Localizable.strings | 3 ++ .../Modules/Bolus/BolusStateModel.swift | 2 +- .../Modules/Bolus/View/BolusRootView.swift | 36 ++++++++++++++----- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 5acdf0571f..b20193493d 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index ed0667f3bb..7506b0f846 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Fortsätt utan bolus"; +/* Alert when adding large amount without bolusing. Don't remove the " " */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDetta är mer insulin än din maxdos-inställning! \nÄr du säker på att du vill lägga till "; + /* Header */ "Enact Bolus" = "Ge bolus"; diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index ea1a1f0144..a8f22abdb9 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -73,7 +73,7 @@ extension Bolus { showModal(for: nil) return } - amount = min(amount, maxBolus) + amount = min(amount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin pumpHistoryStorage.storeEvents( [ diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index b94aec3b26..0f1f38b06f 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -90,18 +90,36 @@ extension Bolus { } else { Button { isAddInsulinAlertPresented = true } label: { Text("Add insulin without actually bolusing") } - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) + .disabled(state.amount <= 0 || state.amount > state.maxBolus * 3) } } .alert(isPresented: $isAddInsulinAlertPresented) { - Alert( - title: Text("Are you sure?"), - message: Text( - NSLocalizedString("Add", comment: "Add insulin without bolusing alert") + " " + formatter - .string(from: state.amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - NSLocalizedString(" without bolusing", comment: "Add insulin without bolusing alert") + let isOverMax = state.amount > state.maxBolus ? true : false + let secondParagrap1 = "Add" + let secondParagraph2 = " U" + let secondParagraph3 = " without bolusing" + let insulinAmount = formatter.string(from: state.amount as NSNumber)! + + // Actual alert + return Alert( + title: Text( + isOverMax ? "Warning" : "Are you sure?" + ), + message: + Text( + isOverMax ? ( + NSLocalizedString( + "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add ", + comment: "Alert" + ) + insulinAmount + + NSLocalizedString(secondParagraph2, comment: "Insulin unit") + + NSLocalizedString(secondParagraph3, comment: "Add insulin without bolusing alert") + "?" + ) : + NSLocalizedString(secondParagrap1, comment: "Add insulin without bolusing alert") + + " " + + insulinAmount + + NSLocalizedString(secondParagraph2, comment: "Insulin unit") + + NSLocalizedString(secondParagraph3, comment: "Add insulin without bolusing alert") ), primaryButton: .destructive( Text("Add"), From c7ecfbace753497a1cb1f4c3de964293841c9e2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:26:46 +0200 Subject: [PATCH 030/405] Crowdin updates (#224) --- .../CGMBLEKit/de.lproj/Localizable.strings | 8 +- .../G7SensorKit/da.lproj/Localizable.strings | 6 +- .../da.lproj/Localizable.strings | 26 +- .../Main/ar.lproj/Localizable.strings | 12 + .../Main/da.lproj/Localizable.strings | 274 +++++++++--------- .../Main/de.lproj/Localizable.strings | 20 +- .../Main/es.lproj/Localizable.strings | 14 +- .../Main/fi.lproj/Localizable.strings | 12 + .../Main/fr.lproj/Localizable.strings | 14 +- .../Main/he.lproj/Localizable.strings | 12 + .../Main/it.lproj/Localizable.strings | 14 +- .../Main/nb.lproj/Localizable.strings | 14 +- .../Main/nl.lproj/Localizable.strings | 12 + .../Main/pl.lproj/Localizable.strings | 12 + .../Main/pt-BR.lproj/Localizable.strings | 14 +- .../Main/pt-PT.lproj/Localizable.strings | 12 + .../Main/ru.lproj/Localizable.strings | 14 +- .../Main/sk.lproj/Localizable.strings | 12 + .../Main/sv.lproj/Localizable.strings | 13 +- .../Main/tr.lproj/Localizable.strings | 14 +- .../Main/uk.lproj/Localizable.strings | 14 +- .../Main/zh-Hans.lproj/Localizable.strings | 14 +- 22 files changed, 391 insertions(+), 166 deletions(-) diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings index 18e510d3b7..79b76dae03 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings @@ -5,10 +5,10 @@ "Dexcom G6" = "Dexcom G6"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Blutzuckerdaten sind nicht verfügbar"; +"Glucose data is unavailable" = "Glukosedaten nicht verfügbar"; /* Describes a low battery */ -"Low Battery" = "Niedriger Batteriestatus"; +"Low Battery" = "Batterie schwach"; /* Describes a functioning transmitter */ "OK" = "OK"; @@ -23,13 +23,13 @@ "Peripheral isnʼt connected" = "Peripherie ist nicht verbunden"; /* The description of sensor calibration state when sensor calibration is ok. */ -"Sensor calibration is OK" = "Sensorkalibrierung ist OK"; +"Sensor calibration is OK" = "Sensorkalibrierung OK"; /* The description of sensor calibration state when raw value is unknown. (1: missing data details) */ "Sensor is in unknown state %1$d" = "Sensor befindet sich in unbekanntem Zustand %1$d"; /* The description of sensor calibration state when sensor sensor is stopped. */ -"Sensor is stopped" = "Sensor ist gestoppt"; +"Sensor is stopped" = "Sensor gestoppt"; /* The description of sensor calibration state when sensor sensor is warming up. */ "Sensor is warming up" = "Sensor befindet sich in der Aufwärmphase"; diff --git a/Dependencies/G7SensorKit/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/da.lproj/Localizable.strings index b1e74525f1..eef2c767b9 100644 --- a/Dependencies/G7SensorKit/da.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/da.lproj/Localizable.strings @@ -8,7 +8,7 @@ "Continue" = "Fortsæt"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Annuller"; /* Error description for unreliable state */ "Glucose data is unavailable" = "Glucose data is unavailable"; @@ -41,7 +41,7 @@ "Grace Period End" = "Grace Period End"; /* Field label */ -"Glucose" = "Glucose"; +"Glucose" = "Glukose"; "Last Reading" = "Last Reading"; @@ -67,7 +67,7 @@ "Last Connect" = "Last Connect"; /* Configuration */ -"Configuration" = "Configuration"; +"Configuration" = "Konfiguration"; /* title for g7 config settings to upload readings */ "Upload Readings" = "Upload Readings"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 804053dcee..8568f3f16c 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -93,7 +93,7 @@ "No Pod" = "No Pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Par Pod"; /* Pairing action button accessibility label while ready to pair */ "Pair pod." = "Pair pod."; @@ -117,13 +117,13 @@ "day" = "day"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "dage"; /* Unit for singular hour in pod life remaining */ "hour" = "hour"; /* Unit for plural hours in pod life remaining */ -"hours" = "hours"; +"hours" = "timer"; /* Unit for singular minute in pod life remaining */ "minute" = "minute"; @@ -147,7 +147,7 @@ "Device Details" = "Device Details"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Konfiguration"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; @@ -324,7 +324,7 @@ "Activity" = "Aktivitet"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Konfiguration"; /* Title for previous pod page */ "Previous Pod" = "Previous Pod"; @@ -427,7 +427,7 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; /* Insulin Unit */ -"U" = "U"; +"U" = "E"; /* The action string on pod status page when pod expired */ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; @@ -442,7 +442,7 @@ "Paired" = "Paired"; /* Cancel button text in navigation bar on pair pod UI */ -"Cancel" = "Cancel"; +"Cancel" = "Annuller"; /* Alert title for cancel pairing modal */ "Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; @@ -590,13 +590,13 @@ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Deaktiveret"; /* Title string for BeepPreference.manualCommands */ "Enabled" = "Aktiveret"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Forlænget"; /* Description for BeepPreference.silent */ "No confidence reminders are used." = "No confidence reminders are used."; @@ -622,7 +622,7 @@ "Set Temporary Basal" = "Set Temporary Basal"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Midlertidig Basal"; /* Alert title for a failure to set temporary basal */ "Temporary Basal Failed" = "Temporary Basal Failed"; @@ -643,7 +643,7 @@ "Expiration Reminder Default" = "Expiration Reminder Default"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Forringe Pod Information"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ "No\nDelivery" = "No\nDelivery"; @@ -688,7 +688,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Annuller"; /* Text for continue button on PodSetupView */ "Continue" = "Fortsæt"; @@ -712,7 +712,7 @@ "Low Reservoir" = "Low Reservoir"; /* */ -"Save" = "Save"; +"Save" = "Gem"; /* hr (short for hour) */ "hr" = "hr"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 0b244df3af..0e38b4165c 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 33a8ae7065..befd2ee618 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -4,56 +4,59 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; +"Add insulin without actually bolusing" = "Tilføj insulin uden faktisk bolus"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Add %@ without bolusing"; +"Add %@ without bolusing" = "Tilføj %@ uden bolus"; "Bolus" = "Bolus"; -"Close" = "Close"; +"Close" = "Luk"; /* Continue after added carbs without bolus */ -"Continue without bolus" = "Continue without bolus"; +"Continue without bolus" = "Fortsæt uden bolus"; + +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; /* Header */ -"Enact Bolus" = "Enact Bolus"; +"Enact Bolus" = "Udfør Bolus"; /* Button */ -"Enact bolus" = "Enact bolus"; +"Enact bolus" = "Udfør bolus"; /* */ -"Insulin recommended" = "Insulin recommended"; +"Insulin recommended" = "Anbefalet insulin"; /* */ -"Insulin required" = "Insulin required"; +"Insulin required" = "Insulinbehov"; /* Bolus screen */ -"Recommendation" = "Recommendation"; +"Recommendation" = "Anbefaling"; /* Button */ -"Clear" = "Clear"; +"Clear" = "Ryd"; /* Button */ -"Done" = "Done"; +"Done" = "OK"; /* */ -"Wait please" = "Wait please"; +"Wait please" = "Vent venligst"; /* */ -"Agree and continue" = "Agree and Continue"; +"Agree and continue" = "Godkend og fortsæt"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Enacted at"; +"Enacted at" = "Udført"; /* Headline in suggested pop up (at: at what time) */ -"Suggested at" = "Suggested at"; +"Suggested at" = "Anbefalet"; /* Headline in enacted pop up (at: at what time) */ -"Error at" = "Error at"; +"Error at" = "Fejl ved"; /* Home title */ -"Home" = "Home"; +"Home" = "Hjem"; /* Looping in progress */ "looping" = "looping"; @@ -62,61 +65,61 @@ "min ago" = "min"; /* Status Title */ -"No suggestion" = "No suggestion"; +"No suggestion" = "Ingen forslag"; /* Replace pod text in Header */ -"Replace pod" = "Replace pod"; +"Replace pod" = "Udskift pod"; /* Add carbs screen */ -"Add Carbs" = "Add Carbs"; +"Add Carbs" = "Tilføj Kulhydrater"; /* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ -"Add Carbs " = "Add Carbs "; +"Add Carbs " = "Tilføj Kulhydrater "; /* */ -"Amount Carbs" = "Amount Carbs"; +"Amount Carbs" = "Antal Kulhydrater"; /* Grams unit */ -"grams" = "grams"; +"grams" = "gram"; /* */ -"Carbs required" = "Carbs required"; +"Carbs required" = "Krævede kulhydrater"; /* */ -"Are you sure?" = "Are you sure?"; +"Are you sure?" = "Er du sikker?"; /* Bottom target temp */ -"Bottom target" = "Bottom target"; +"Bottom target" = "Laveste mål"; /* Cancel preset name */ -"Cancel" = "Cancel"; +"Cancel" = "Annuller"; /* */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Annuller Midlertidigt Mål"; /* Custom temp target */ -"Custom" = "Custom"; +"Custom" = "Brugerdefineret"; /* */ -"Date" = "Date"; +"Date" = "Dato"; /* */ -"Delete" = "Delete"; +"Delete" = "Slet"; /* Delete preset temp target */ -"Delete preset \"%@\"" = "Delete preset \"%@\""; +"Delete preset \"%@\"" = "Slet forudindstilling \\\"%@\\\""; /* Duration of target temp or temp basal */ -"Duration" = "Duration"; +"Duration" = "Varighed"; /* */ -"Enact Temp Target" = "Enact Temp Target"; +"Enact Temp Target" = "Udfør Midlertidigt Mål"; /* */ -"Target" = "Target"; +"Target" = "Mål"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Basal insulin og følsomhedsforhold"; /* */ "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; @@ -140,10 +143,10 @@ "Presets" = "Presets"; /* Save preset name */ -"Save" = "Save"; +"Save" = "Gem"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Gem som forudindstilling"; /* Delete Meal Preset */ "Delete Preset" = "Delete Preset"; @@ -312,28 +315,28 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Add Medtronic pump */ -"Add Medtronic" = "Add Medtronic"; +"Add Medtronic" = "Tilføj Medtronic"; /* Add Omnipod pump */ -"Add Omnipod" = "Add Omnipod"; +"Add Omnipod" = "Tilføj Omnipod"; /* Add Simulator pump */ -"Add Simulator" = "Add Simulator"; +"Add Simulator" = "Tilføj Simulator"; /* Insulin model */ "Model" = "Model"; /* */ -"Pump config" = "Pump config"; +"Pump config" = "Pumpe konfiguration"; /* */ -"Delivery limits" = "Delivery limits"; +"Delivery limits" = "Insulingrænser"; /* */ "Duration of Insulin Action" = "Duration of Insulin Action"; /* hours of duration of insulin activity */ -"hours" = "hours"; +"hours" = "timer"; /* Max setting */ "Max Basal" = "Max Basal"; @@ -342,10 +345,10 @@ Enact a temp Basal or a temp target */ "Max Bolus" = "Max Bolus"; /* Max setting */ -"Max Carbs" = "Max Carbs"; +"Max Carbs" = "Maks Kulhydrater"; /* */ -"Pump Settings" = "Pump Settings"; +"Pump Settings" = "Pumpe Indstillinger"; /* Insulin unit per hour */ "U/hr" = "E/t"; @@ -357,16 +360,16 @@ Enact a temp Basal or a temp target */ "/U" = "/E"; /* Insulin unit */ -"U" = "U"; +"U" = "E"; /* Unit per hour with space */ " U/hr" = " E/t"; /* Number of units per hour*/ -"%@ U/hr" = "%@ U/hr"; +"%@ U/hr" = "%@ E/t"; /* Number of units insulin delivered */ -"%@ U" = "%@ U"; +"%@ U" = "%@ E"; /*Carb ratio unit */ "g/U" = "g/E"; @@ -378,55 +381,55 @@ Enact a temp Basal or a temp target */ "g" = "g"; /* when 0 U/hr */ -"0 U/hr" = "0 U/hr"; +"0 U/hr" = "0 E/t"; /* abbreviation for days */ "d" = "d"; /* abbreviation for hours */ -"h" = "h"; +"h" = "t"; /* abbreviation for minutes */ -"m" = "m"; +"m" = "n"; /* */ -"Closed loop" = "Closed loop"; +"Closed loop" = "Lukket Loop"; /* */ -"Configuration" = "Configuration"; +"Configuration" = "Konfiguration"; /* */ -"Devices" = "Devices"; +"Devices" = "Enheder"; /* */ -"Pump" = "Pump"; +"Pump" = "Pumpe"; /* */ -"Watch" = "Watch"; +"Watch" = "Ur"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Ur Indstillinger"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Vis på Ur"; /* */ -"Garmin Watch" = "Garmin Watch"; +"Garmin Watch" = "Garmin Ur"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Tilføj enheder"; /* */ -"Glucose Target" = "Glucose Target"; +"Glucose Target" = "Glukose mål"; /* */ -"Heart Rate" = "Heart Rate"; +"Heart Rate" = "Hjerterytme"; /* */ -"Steps" = "Steps"; +"Steps" = "Skridt"; /* */ "ISF" = "ISF"; @@ -435,19 +438,19 @@ Enact a temp Basal or a temp target */ "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin er ikke tilgængelig"; /* */ -"Services" = "Services"; +"Services" = "Tjenester"; /* */ -"Settings" = "Settings"; +"Settings" = "Indstillinger"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Anbefalet Bolus Procent"; /* 2 log files to share */ -"Share logs" = "Share logs"; +"Share logs" = "Del logs"; /* Upper target */ "High target" = "High target"; @@ -459,7 +462,7 @@ Enact a temp Basal or a temp target */ "Bolusing" = "Bolusing"; /* */ -"Pump suspended" = "Pump suspended"; +"Pump suspended" = "Pumpe suspenderet"; /* */ "Middleware" = "Middleware"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -600,22 +606,22 @@ Enact a temp Basal or a temp target */ "Unknown" = "Ukendt"; /* */ -"Not paired yet" = "Not paired yet"; +"Not paired yet" = "Endnu ikke parret"; /* */ -"Pair Sensor & connect" = "Pair Sensor & connect"; +"Pair Sensor & connect" = "Par Sensor & Forbind"; /* */ "Phone NFC required!" = "Phone NFC required!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Din telefon eller app er ikke aktiveret til NFC-kommunikation, som er nødvendig for at parre til libre2 sensorer"; /* Bluetooth Power Off */ "Bluetooth Power Off" = "Bluetooth Power Off"; /* Please turn on Bluetooth */ -"Please turn on Bluetooth" = "Please turn on Bluetooth"; +"Please turn on Bluetooth" = "Slå Bluetooth til"; /* No Libre Transmitter Selected */ "No Libre Transmitter Selected" = "No Libre Transmitter Selected"; @@ -630,7 +636,7 @@ Enact a temp Basal or a temp target */ "Libre sensor was incorrectly read, CRCs were not valid" = "Libre sensor was incorrectly read, CRCs were not valid"; /* Glucose */ -"Glucose" = "Glucose"; +"Glucose" = "Glukose"; /* LOWALERT! */ "LOWALERT!" = "LOWALERT!"; @@ -648,46 +654,46 @@ Enact a temp Basal or a temp target */ "Transmitter: %@%%" = "Transmitter: %@%%"; /* No Sensor Detected */ -"No Sensor Detected" = "No Sensor Detected"; +"No Sensor Detected" = "Ingen Sensor Fundet"; /* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; /* New Sensor Detected */ -"New Sensor Detected" = "New Sensor Detected"; +"New Sensor Detected" = "Ny Sensor Fundet"; /* Please wait up to 30 minutes before glucose readings are available! */ -"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; +"Please wait up to 30 minutes before glucose readings are available!" = "Vent op til 30 minutter før der er gluokoseaflæsninger tilgængelige!"; /* Invalid Glucose sample detected, try again later */ -"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; +"Invalid Glucose sample detected, try again later" = "Ugyldig glukoseprøve opdaget, prøv igen senere"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensoren er muligvis midlertidigt stoppet, faldet af eller er for kold eller for varm"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Invalid Sensor Detected"; +"Invalid Sensor Detected" = "Ugyldig Sensor Detekteret"; /* Detected sensor seems not to be a libre 1 sensor! */ -"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; +"Detected sensor seems not to be a libre 1 sensor!" = "Detekteret sensor synes ikke at være en libre 1 sensor!"; /* Detected sensor is invalid: %@ */ -"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; +"Detected sensor is invalid: %@" = "Detekteret sensor er ugyldig: %@"; /* Low Battery */ -"Low battery" = "Low battery"; +"Low battery" = "Lavt batteri"; /* */ -"Invalid sensor" = "Invalid sensor"; +"Invalid sensor" = "Ugyldig sensor"; /* */ -"Sensor change" = "Sensor change"; +"Sensor change" = "Sensor skifte"; /* */ -"Sensor expires soon" = "Sensor expires soon"; +"Sensor expires soon" = "Sensor udløber snart"; /* Battery is running low %@, consider charging your %@ device as soon as possible */ -"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Lavt batteriniveau %@, lad venligst din %@ enhed snarest muligt"; /* Extracting calibrationdata from sensor */ "Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; @@ -834,10 +840,10 @@ Enact a temp Basal or a temp target */ "Unit override" = "Unit override"; /* */ -"Low" = "Low"; +"Low" = "Lav"; /* */ -"High" = "High"; +"High" = "Høj"; /* */ "glucose" = "glucose"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; @@ -1239,7 +1251,7 @@ Enact a temp Basal or a temp target */ "This will change settings back to your normal profile." = "This will change settings back to your normal profile."; /* Start Profile Alert */ -"Start Profile" = "Start Profile"; +"Start Profile" = "Start Profil"; /* */ "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; @@ -1257,10 +1269,10 @@ Enact a temp Basal or a temp target */ " infinite duration." = " infinite duration."; /* Service Section */ -"App Icons" = "App Icons"; +"App Icons" = "Appikoner"; /* */ -"iAPS Icon" = "iAPS Icon"; +"iAPS Icon" = "iAPS Ikon"; /* Service Section */ "Statistics and Home View" = "Statistics and Home View"; @@ -1272,7 +1284,7 @@ Enact a temp Basal or a temp target */ "Meal Presets" = "Meal Presets"; /* */ -"Empty" = "Empty"; +"Empty" = "Tom"; /* */ "Delete Selected Preset" = "Delete Selected Preset"; @@ -1281,24 +1293,24 @@ Enact a temp Basal or a temp target */ "Enter Meal Preset Name" = "Enter Meal Preset Name"; /* */ -"Name Of Dish" = "Name Of Dish"; +"Name Of Dish" = "Navn på ret"; /* Save Carbs and continue to bolus recommendation */ -"Save and continue" = "Save and continue"; +"Save and continue" = "Gem og fortsæt"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Gem som forudindstilling"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ -"Warning!" = "Warning!"; +"Warning!" = "Advarsel!"; /* Alert to confirm bolus amount to add */ -"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; +"\n\nTap 'Add' to continue with selected amount." = "\n\nTryk 'Tilføj' for at fortsætte med den valgte mængde."; /* */ -"Eventual Glucose" = "Eventual Glucose"; +"Eventual Glucose" = "Eventuelt Glukoseniveau"; /* */ "Target Glucose" = "Target Glucose"; @@ -1319,7 +1331,7 @@ Enact a temp Basal or a temp target */ "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; /* Hide pop-up */ -"Hide" = "Hide"; +"Hide" = "Skjul"; /* Bolus pop-up / Alert string. Make translations concise! */ "Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; @@ -1358,10 +1370,10 @@ Enact a temp Basal or a temp target */ /* */ "Deactivating..." = "Deactivating..."; -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Par Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Forringe Pod Information"; /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; @@ -1372,25 +1384,25 @@ Enact a temp Basal or a temp target */ "Saving..." = "Gemmer..."; /* button title for saving low reservoir reminder */ -"Save" = "Save"; +"Save" = "Gem"; /* Alert title for error when updating confidence reminder preference */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; /* */ -"No Error" = "No Error"; +"No Error" = "Ingen fejl"; /* description label for active time pod details row */ "Active Time" = "Aktiv Tid"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Deaktiveret"; /* Title string for BeepPreference.manualCommands */ "Enabled" = "Aktiveret"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Forlænget"; /* Description for BeepPreference.silent */ "No confidence reminders are used." = "No confidence reminders are used."; @@ -1436,7 +1448,7 @@ Enact a temp Basal or a temp target */ "Set Temporary Basal" = "Set Temporary Basal"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Midlertidig Basal"; /* Alert title for a failure to set temporary basal */ "Temporary Basal Failed" = "Temporary Basal Failed"; @@ -1494,34 +1506,34 @@ Enact a temp Basal or a temp target */ "Today" = "Today"; /* */ -"Day" = "Day"; +"Day" = "Dag"; /* */ -"Week" = "Week"; +"Week" = "Uge"; /* */ -"Month" = "Month"; +"Month" = "Måned"; /* */ "Total" = "Total"; /* Headline Statistics */ -"Statistics" = "Statistics"; +"Statistics" = "Statistik"; /* Option in preferences */ -"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; +"Allow Upload of Statistics to NS" = "Tillad Upload af Statistik til NS"; /* Low Glucose Threshold in Statistics settings */ -"Low" = "Low"; +"Low" = "Lav"; /* High Glucose Threshold in Statistics settings */ -"High" = "High"; +"High" = "Høj"; /* In Range */ "In Range" = "In Range"; /* Display % */ -"Change HbA1c Unit" = "Change HbA1c Unit"; +"Change HbA1c Unit" = "Skift HbA1c Enhed"; /* */ "Display Chart X - Grid lines" = "Display Chart X - Grid lines"; @@ -1551,19 +1563,19 @@ Enact a temp Basal or a temp target */ "Readings / 24h" = "Readings / 24h"; /* Days of saved readings*/ -"Days" = "Days"; +"Days" = "Dage"; /* Normal BG (within TIR) */ "Normal" = "Normal"; /* Title High BG in statPanel */ -"High (>" = "High (>"; +"High (>" = "Høj (>"; /* Title Low BG in statPanel */ -"Low (<" = "Low (<"; +"Low (<" = "Lav (<"; /* SD */ -"SD" = "SD"; +"SD" = "SA"; /* CV */ "CV" = "CV"; @@ -1572,22 +1584,22 @@ Enact a temp Basal or a temp target */ "HbA1c" = "HbA1c"; /* Total number of days of data for HbA1c estimation, part 1/2*/ -"All" = "All"; +"All" = "Alle"; /* Total number of days of data for HbA1c estimation, part 2/2*/ -"days" = "days"; +"days" = "dage"; /* Nr of Loops in statPanel */ -"Loops" = "Loops"; +"Loops" = "Looper"; /* Loop Errors in statPanel */ -"Errors" = "Errors"; +"Errors" = "Fejl"; /* Average loop interval */ "Interval" = "Interval"; /* Median loop interval */ -"Duration" = "Duration"; +"Duration" = "Varighed"; /* "Display SD */ "Display SD instead of CV" = "Display SD instead of CV"; @@ -1596,25 +1608,25 @@ Enact a temp Basal or a temp target */ "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; /* How often to update the statistics */ -"Update every number of minutes:" = "Update every number of minutes:"; +"Update every number of minutes:" = "Opdater hvert antal minutter:"; /* Description for update interval for statistics */ "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "Past 24 Hours "; +"Past 24 Hours " = "Sidste 24 Timer "; /* Duration displayed in statPanel */ -"Past Week " = "Past Week "; +"Past Week " = "Sidste Uge "; /* Duration displayed in statPanel */ -"Past Month " = "Past Month "; +"Past Month " = "Sidste Måned "; /* Duration displayed in statPanel */ -"Past 90 Days " = "Past 90 Days "; +"Past 90 Days " = "Sidste 90 Dage "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "All Past Days of Data "; +"All Past Days of Data " = "Alle Tidligere Dages Data "; /* "Display Loop statistics in statPanel */ "Display Loop Cycle statistics" = "Display Loop Cycle statistics"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 3784b56360..8de5b24421 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -4,10 +4,10 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Insulin ohne tatsächliche Bolusabgabe erfassen"; +"Add insulin without actually bolusing" = "Insulin ohne Bolusabgabe erfassen"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Hinzufügen von %@ ohne tatsächliche Bolusabgabe"; +"Add %@ without bolusing" = "Hinzufügen von %@ ohne Bolusabgabe"; "Bolus" = "Bolus"; @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Ohne Bolusabgabe fortfahren"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nEingegebener Bolus ist größer als Max Bolus Einstellung! Sind Sie sicher, dass er hinzugefügt werden soll "; + /* Header */ "Enact Bolus" = "Bolus abgeben"; @@ -74,7 +77,7 @@ "Add Carbs " = "Kohlenhydrate hinzufügen "; /* */ -"Amount Carbs" = "Kohlenhydratmenge"; +"Amount Carbs" = "Menge Kohlenhydrate"; /* Grams unit */ "grams" = "Gramm"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibrierungen"; /* */ -"Create Events in Calendar" = "Kalendereintrag erstellen"; +"Create Events in Calendar" = "Ereignisse im Kalender erstellen"; /* */ "Calendar" = "Kalender"; +/* Automatic delivered treatments */ +"Automatic" = "Automatisch"; + /* */ "Other" = "Sonstiges"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus fehlgeschlagen"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Maximaler Bolus überschritten!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus ist fehlgeschlagen oder ungenau. Prüfe den Pumpenverlauf vor einer erneuten Abgabe."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "manuell"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuelle Temporäre Basalrate"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index ce491f5fec..c9f3996654 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continuar sin administrar bolo"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Administrar Bolo"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibraciones"; /* */ -"Create Events in Calendar" = "Crear eventos en el calendario"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendario"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Otro"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index f38793b424..f97ffee40b 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index ce8bd138bd..7ebc10fdb9 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continuer sans bonus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Injecter bolus"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Étalonnages"; /* */ -"Create Events in Calendar" = "Créer des événements dans le calendrier"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendrier"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Autre"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Échec du Bolus"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus échoué ou imprécis. Vérifier l’historique de la pompe avant recommencer."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 0b244df3af..0e38b4165c 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index a093369dd0..32689f4342 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continua senza eseguire un bolo"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Esegui bolo"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrazioni"; /* */ -"Create Events in Calendar" = "Crea eventi nel calendario"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendario"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Altro"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolo fallito"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolo fallito o impreciso. Controlla la cronologia del microinfusore prima di ripetere."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manuale"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Basale manuale temporanea"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index bfd2ed806a..7a579b92bd 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Fortsett uten å gi bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nMengden er høyere enn din Maks bolus-innstilling! \nEr du sikker på at du vil legge til "; + /* Header */ "Enact Bolus" = "Gi bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Kalender"; +/* Automatic delivered treatments */ +"Automatic" = "Automatisk"; + /* */ "Other" = "Annet"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus mislyktes"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus overskredet!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus mislyktes eller var upresis. Kontroller bolus-historikken før du gjentar."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manuell"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell basal"; @@ -1913,7 +1925,7 @@ Enact a temp Basal or a temp target */ /* Headline "Use Sigmoid Function" */ -"Use Sigmoid Function" = "Bruk signmoid-funksjon"; +"Use Sigmoid Function" = "Bruk sigmoid-funksjon"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index c9ca115e16..299410814e 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Verdergaan zonder bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Bolus geven"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Agenda"; +/* Automatic delivered treatments */ +"Automatic" = "Automatisch"; + /* */ "Other" = "Anders"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus is mislukt"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Maximale bolus overschreden!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus mislukt of onjuist. Controleer de pompgeschiedenis voordat je herhaalt."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Handmatig"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index a82fe26e0e..0e7014406f 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Kontynuuj bez bolusa"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -526,6 +529,9 @@ Połączono z Nightscout!"; /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -961,6 +967,9 @@ Połączono z Nightscout!"; /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1116,6 +1125,9 @@ Połączono z Nightscout!"; /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 2aa22b6153..5d2b50df0f 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continuar sem tomar bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Aplicar Bolus"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibragens"; /* */ -"Create Events in Calendar" = "Criar eventos no calendário"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Calendário"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Outros"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index a85cca2edf..603e3e2261 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continuar sem tomar bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Aplicar Bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Outro"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ed38eba7e2..be36b12b1d 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Продолжить без болюса"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Ввод болюса"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Калибровки"; /* */ -"Create Events in Calendar" = "Создавать событий в календаре"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Календарь"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Прочее"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Болюс не выполнен"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Болюс не выполнен или неточный. Перед повторением проверьте историю помпы."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Ручной режим"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручная ВБС"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 4e53969c00..65fe95c5c3 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -524,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Calendar"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Other"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus failed"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7506b0f846..fd3cef0d0a 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -16,8 +16,8 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Fortsätt utan bolus"; -/* Alert when adding large amount without bolusing. Don't remove the " " */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDetta är mer insulin än din maxdos-inställning! \nÄr du säker på att du vill lägga till "; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDetta är mer insulin än maxdos-inställning!\nÄr du säker på att du vill lägga till "; /* Header */ "Enact Bolus" = "Ge bolus"; @@ -527,6 +527,9 @@ Enact a temp Basal or a temp target */ /* */ "Calendar" = "Kalender"; +/* Automatic delivered treatments */ +"Automatic" = "Automatisk"; + /* */ "Other" = "Annan"; @@ -962,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus misslyckades"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Du kan inte dosera mer än din maxinställning!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Misslyckad eller felaktig bolus. Kontrollera pumpens historik innan du försöker igen."; @@ -1120,6 +1126,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manuell"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell temporär basal"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 6155539571..8411e89bbd 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Bolus yapmadan devam edin"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "Bolus Gönder"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Kalibrasyonlar"; /* */ -"Create Events in Calendar" = "Takvimde etkinlikler oluşturun"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "Takvim"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "Diğer"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Bolus başarısız"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus başarısız veya hatalı. Tekrarlamadan önce pompa geçmişini kontrol edin."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manuel"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuel Bazal"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 7f449453b5..16034cb209 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "Продовжити без болюсу"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nКількість перевищує ваш максимальний болюс! \nВи впевнені, що хочете додати"; + /* Header */ "Enact Bolus" = "Подати Болюс"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Калібрування"; /* */ -"Create Events in Calendar" = "Створити подію в календарі"; +"Create Events in Calendar" = "Створення подій у календарі"; /* */ "Calendar" = "Календар"; +/* Automatic delivered treatments */ +"Automatic" = "Автоматично"; + /* */ "Other" = "Інше"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "Болюс не вдався"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Максимальний болюс перевищено!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Болюс не пройшов або неточний. Перевір історію помпи, перш ніж повторити."; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Інструкція"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручна тимчасова базальна швидкість (ТБШ)"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 2ed49e1860..6b9394d9f7 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -16,6 +16,9 @@ /* Continue after added carbs without bolus */ "Continue without bolus" = "不输注胰岛素并继续"; +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + /* Header */ "Enact Bolus" = "执行大剂量"; @@ -519,11 +522,14 @@ Enact a temp Basal or a temp target */ "Calibrations" = "校准"; /* */ -"Create Events in Calendar" = "在日历中创建事件"; +"Create Events in Calendar" = "Create Events in Calendar"; /* */ "Calendar" = "日历"; +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + /* */ "Other" = "其他"; @@ -959,6 +965,9 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed" = "大剂量输注失败"; +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "大剂量失败或者不准确,请在重复操作前检查胰岛素泵历史"; @@ -1114,6 +1123,9 @@ Enact a temp Basal or a temp target */ /* Manual temp basal mode */ "Manual" = "Manual"; +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; From 1bea3baca4549031dd58851322acd77e05e307ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 2 Oct 2023 14:58:11 +0200 Subject: [PATCH 031/405] Minutes ago fix for G7 sensors. (cherry picked from commit 0605328a02dd4598770fadafff4f566b6b8f5174) --- .../Modules/Home/View/Header/CurrentGlucoseView.swift | 6 +++--- FreeAPS/Sources/Shortcuts/State/ListStateView.swift | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index acc8363006..a49d711114 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -59,10 +59,10 @@ struct CurrentGlucoseView: View { image } HStack { - let minutes = (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 - let text = timaAgoFormatter.string(for: Double(minutes)) ?? "" + let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 + let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" Text( - text == "0" ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( + minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( text + " " + NSLocalizedString("min", comment: "Short form for minutes") + " " ) diff --git a/FreeAPS/Sources/Shortcuts/State/ListStateView.swift b/FreeAPS/Sources/Shortcuts/State/ListStateView.swift index 25595cbe39..3c80d85a71 100644 --- a/FreeAPS/Sources/Shortcuts/State/ListStateView.swift +++ b/FreeAPS/Sources/Shortcuts/State/ListStateView.swift @@ -76,10 +76,10 @@ struct ListStateView: View { image } HStack { - let minutes = state.date.timeIntervalSinceNow / 60 + let minutes = -1 * state.date.timeIntervalSinceNow / 60 let text = timaAgoFormatter.string(for: Double(minutes)) ?? "" Text( - text == "0" ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( + minutes <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( text + " " + NSLocalizedString("min", comment: "Short form for minutes") + " " ) From 80563215fde62781aa2d0034e23aebd5bca6489f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:44:18 +0200 Subject: [PATCH 032/405] Dutch (#230) --- FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 299410814e..bb63f906ae 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Verdergaan zonder bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDeze hoeveelheid is meer dan je instelling van je maximale bolus! \nWeet je zeker dat je deze hoeveelheid wilt toedienen? \nDeze hoeveelheid is meer dan je instelling van je maximale bolus! \nWaarschuw bij toedienen van een hoge hoeveelheid zonder te bolussen "; /* Header */ "Enact Bolus" = "Bolus geven"; From 533aaaf0fc7311a9919f714e56f5689c9c4b2a66 Mon Sep 17 00:00:00 2001 From: Andreas Stokholm Date: Fri, 6 Oct 2023 17:34:15 +0200 Subject: [PATCH 033/405] Change permissions required for calendar in iOS 17+ (#234) * Change permissions required for calendar in iOS 17+ --- FreeAPS/Resources/Info.plist | 4 ++ .../Modules/CGM/View/CGMRootView.swift | 13 +++++ .../Services/Calendar/CalendarManager.swift | 47 +++++++++++++++++-- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index 44136aefa3..81083064a3 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -110,6 +110,10 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown + NSCalendarsFullAccessUsageDescription + To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay + LSApplicationCategoryType + UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 29c9f55206..8b8ac87a84 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -63,6 +63,19 @@ extension CGM { } Toggle("Display Emojis as Labels", isOn: $state.displayCalendarEmojis) Toggle("Display IOB and COB", isOn: $state.displayCalendarIOBandCOB) + } else if state.createCalendarEvents { + if #available(iOS 17.0, *) { + Text( + "If you are not seeing calendars to choose here, please go to Settings -> iAPS -> Calendars and change permissions to \"Full Access\"" + ).font(.footnote) + + Button("Open Settings") { + // Get the settings URL and open it + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(url) + } + } + } } } diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index 25c07a1469..cf8e011478 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -32,17 +32,54 @@ final class BaseCalendarManager: CalendarManager, Injectable { let status = EKEventStore.authorizationStatus(for: .event) switch status { case .notDetermined: - EKEventStore().requestAccess(to: .event) { granted, error in - if let error = error { - warning(.service, "Calendar access not granded", error: error) + #if swift(>=5.9) + if #available(iOS 17.0, *) { + EKEventStore().requestFullAccessToEvents(completion: { (granted: Bool, error: Error?) -> Void in + if let error = error { + warning(.service, "Calendar access not granted", error: error) + } + promise(.success(granted)) + }) + } else { + EKEventStore().requestAccess(to: .event) { granted, error in + if let error = error { + warning(.service, "Calendar access not granted", error: error) + } + promise(.success(granted)) + } } - promise(.success(granted)) - } + #else + EKEventStore().requestAccess(to: .event) { granted, error in + if let error = error { + warning(.service, "Calendar access not granted", error: error) + } + promise(.success(granted)) + } + #endif case .denied, .restricted: promise(.success(false)) case .authorized: promise(.success(true)) + + #if swift(>=5.9) + case .fullAccess: + promise(.success(true)) + #endif + + case .writeOnly: + #if swift(>=5.9) + if #available(iOS 17.0, *) { + EKEventStore().requestFullAccessToEvents(completion: { (granted: Bool, error: Error?) -> Void in + if let error = error { + print("Calendar access not upgraded") + warning(.service, "Calendar access not upgraded", error: error) + } + promise(.success(granted)) + }) + } + #endif + @unknown default: warning(.service, "Unknown calendar access status") promise(.success(false)) From 0a1f1dcabc7e1a813b544c24935d29850fd2dbbb Mon Sep 17 00:00:00 2001 From: Andreas Stokholm Date: Sat, 7 Oct 2023 00:05:21 +0200 Subject: [PATCH 034/405] Fix compile issue in Xcode 14 (#235) --- FreeAPS/Sources/Services/Calendar/CalendarManager.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift index cf8e011478..bfe0afea46 100644 --- a/FreeAPS/Sources/Services/Calendar/CalendarManager.swift +++ b/FreeAPS/Sources/Services/Calendar/CalendarManager.swift @@ -65,10 +65,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { #if swift(>=5.9) case .fullAccess: promise(.success(true)) - #endif - - case .writeOnly: - #if swift(>=5.9) + case .writeOnly: if #available(iOS 17.0, *) { EKEventStore().requestFullAccessToEvents(completion: { (granted: Bool, error: Error?) -> Void in if let error = error { @@ -78,7 +75,7 @@ final class BaseCalendarManager: CalendarManager, Injectable { promise(.success(granted)) }) } - #endif + #endif @unknown default: warning(.service, "Unknown calendar access status") From 440be770f7d3e9b071b39daa65ca31b643a07b4d Mon Sep 17 00:00:00 2001 From: Pierre L Date: Sun, 8 Oct 2023 22:22:38 +0200 Subject: [PATCH 035/405] Improve the update of the date of Glucose View Header. --- .../Sources/Modules/Home/View/Header/CurrentGlucoseView.swift | 1 + FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index a49d711114..c36e28684a 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -2,6 +2,7 @@ import SwiftUI struct CurrentGlucoseView: View { @Binding var recentGlucose: BloodGlucose? + @Binding var timerDate: Date @Binding var delta: Int? @Binding var units: GlucoseUnits @Binding var alarm: GlucoseAlarm? diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 3dbaf244d1..9ed7273106 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -122,6 +122,7 @@ extension Home { var glucoseView: some View { CurrentGlucoseView( recentGlucose: $state.recentGlucose, + timerDate: $state.timerDate, delta: $state.glucoseDelta, units: $state.units, alarm: $state.alarm, From ee787b29389257355bbedb28c275893715735e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 9 Oct 2023 01:17:05 +0200 Subject: [PATCH 036/405] Import Profile Settings from Nightcsout (#238) Import Basal settings, carb ratios, sensitivities and glucose targets from Nightscout manually when tapping "Import Settings from Nightcsout"in the iAPS Nightscout settings. co-author @dnzxy --- .../Core_Data.xcdatamodel/contents | 4 + FreeAPS.xcodeproj/project.pbxproj | 4 + .../javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/APS/OpenAPS/Constants.swift | 3 +- .../Main/en.lproj/Localizable.strings | 30 ++++ .../Main/sv.lproj/Localizable.strings | 30 ++++ FreeAPS/Sources/Models/FetchedProfile.swift | 24 +++ FreeAPS/Sources/Models/NightscoutStatus.swift | 2 +- .../Sources/Models/RawFetchedProfile.swift | 24 +++ .../NightscoutConfigStateModel.swift | 161 ++++++++++++++++++ .../View/NightscoutConfigRootView.swift | 64 ++++++- .../Services/Network/NightscoutAPI.swift | 4 + .../Services/Network/NightscoutManager.swift | 4 +- FreeAPS/Sources/Views/TagCloudView.swift | 2 +- 14 files changed, 350 insertions(+), 8 deletions(-) create mode 100644 FreeAPS/Sources/Models/FetchedProfile.swift create mode 100644 FreeAPS/Sources/Models/RawFetchedProfile.swift diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index babd4f4dad..41aaab7962 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -31,6 +31,10 @@ + + + + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 681cc4eb3c..f6ccc5a7c7 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -302,6 +302,7 @@ BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */; }; C967DACD3B1E638F8B43BE06 /* ManualTempBasalStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFCFE0781F9074C2917890E8 /* ManualTempBasalStateModel.swift */; }; CA370FC152BC98B3D1832968 /* BasalProfileEditorRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */; }; + CC6C406E2ACDD69E009B8058 /* RawFetchedProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */; }; CD78BB94E43B249D60CC1A1B /* NotificationsConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22963BD06A9C83959D4914E4 /* NotificationsConfigRootView.swift */; }; CE2FAD38297D69E1001A872C /* ShareClient.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CE398D1A297D69A900DF218F /* ShareClient.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CE2FAD3A297D93F0001A872C /* BloodGlucoseExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2FAD39297D93F0001A872C /* BloodGlucoseExtensions.swift */; }; @@ -816,6 +817,7 @@ C19984D62EFC0035A9E9644D /* BolusProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusProvider.swift; sourceTree = ""; }; C377490C77661D75E8C50649 /* ManualTempBasalRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalRootView.swift; sourceTree = ""; }; C8D1A7CA8C10C4403D4BBFA7 /* BolusDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusDataFlow.swift; sourceTree = ""; }; + CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawFetchedProfile.swift; sourceTree = ""; }; CE2FAD39297D93F0001A872C /* BloodGlucoseExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BloodGlucoseExtensions.swift; sourceTree = ""; }; CE398D012977349800DF218F /* CryptoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoKit.framework; path = System/Library/Frameworks/CryptoKit.framework; sourceTree = SDKROOT; }; CE398D15297C9D1D00DF218F /* dexcomSourceG7.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dexcomSourceG7.swift; sourceTree = ""; }; @@ -1603,6 +1605,7 @@ 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */, 19A910352A24D6D700C8951B /* DateFilter.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, + CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, ); path = Models; sourceTree = ""; @@ -2689,6 +2692,7 @@ 63E890B4D951EAA91C071D5C /* BasalProfileEditorStateModel.swift in Sources */, CE398D16297C9D1D00DF218F /* dexcomSourceG7.swift in Sources */, 38FEF3FA2737E42000574A46 /* BaseStateModel.swift in Sources */, + CC6C406E2ACDD69E009B8058 /* RawFetchedProfile.swift in Sources */, 385CEA8225F23DFD002D6D5B /* NightscoutStatus.swift in Sources */, F90692AA274B7AAE0037068D /* HealthKitManager.swift in Sources */, 38887CCE25F5725200944304 /* IOBEntry.swift in Sources */, diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 9e9544edff..e3a315bbdb 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR);var Da="";.5!=i.smb_delivery_ratio&&(Da=", SMB Ratio "+i.smb_delivery_ratio),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i)+Da,oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,He.reason+="; ";var wa=Tt;wa<40&&(wa=Math.min(Ot,wa));var Ga,Ta=U-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;baGa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ua+"minutes");var Oa=Ua,Ra=i.current_basal*N*_t*Oa/60,Aa=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Ra)/csf-Aa;Ra=o(Ra),Ia=o(Ia),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Ra,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(He.carbsReq=Ia,He.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var ja=0,Pa=Je,Ea=0;if(CtRt&&tt>0&&!Ia)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));ja=o(ja=2*Math.min(0,(Ct-ot)/_t),2);var qa=Math.min(0,(Tt-ot)/_t);if(qa=o(qa,2),tt<0&&tt>Rt)ja=o(ja*(tt/Rt),2);Pa=r(Pa=Je+2*ja,i),Ea=t.duration*(t.rate-Je)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",He;if(Pa<=0){if((Fa=o(60*((Ta=ot-Tt)/_t)/i.current_basal*N))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return He.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,He,t)}else He.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));ja=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),ja>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+ja+" U)"),He.reason+="max_iob "+lt+", ",ja=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Pa=r(Pa=Je+2*ja,i),ja=o(ja,3),He.insulinReq=ja;var ka=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/Z,3),Ha=0;void 0===La?(Ha=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*N),Ha=o(i.current_basal*N*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*N*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Je*Fa/30,2),Fa=30),He.reason+=" insulinReq "+ja,Ka>=Ha&&(He.reason+="; maxBolus "+Ha),Fa>0&&(He.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),He.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Tt+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(He.units=Ka,He.reason+="Microbolusing "+Ka+"U. "):He.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return He.rate=Qa,He.duration=Fa,He}var er=u.getMaxSafeBasal(i);return Pa>er&&(He.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Je)/60)>=2*ja?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); diff --git a/FreeAPS/Sources/APS/OpenAPS/Constants.swift b/FreeAPS/Sources/APS/OpenAPS/Constants.swift index 9f3873dabc..f096f66a9d 100644 --- a/FreeAPS/Sources/APS/OpenAPS/Constants.swift +++ b/FreeAPS/Sources/APS/OpenAPS/Constants.swift @@ -54,7 +54,6 @@ extension OpenAPS { static let iob = "monitor/iob.json" static let cgmState = "monitor/cgm-state.json" static let podAge = "monitor/pod-age.json" - // static let tdd = "monitor/tdd.json" static let oref2_variables = "monitor/oref2_variables.json" static let alertHistory = "monitor/alerthistory.json" static let statistics = "monitor/statistics.json" @@ -86,6 +85,8 @@ extension OpenAPS { static let uploadedCGMState = "upload/uploaded-cgm-state.json" static let uploadedPodAge = "upload/uploaded-pod-age.json" static let uploadedProfile = "upload/uploaded-profile.json" + static let profile = "fetched/profile.json" + static let test = "upload/test.json" } enum FreeAPS { diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index b20193493d..3bb172ada6 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -314,6 +314,36 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Failed Profile Import Alert */ +"\nImport failed:\n\n*" = "\nImport failed:\n\n*"; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index fd3cef0d0a..76f39fcca4 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -314,6 +314,36 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Fjärrstyrning"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nKontrollera nu alla dina nya pumpinställningar noga:\n\n* Basalinställningar\n * Insulinkvoter\n * Målvärden\n * Insulinkänslighet\n\n i Inställningar > Konfiguration.\n\nDåliga eller ogiltiga pumpinställningar kan gå katastrofala följder."; + +/* Failed Profile Import Alert */ +"\nImport failed:\n\n*" = "\nImport misslyckades:\n\n*"; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Detta kommer att ersätta alla eller vissa av dina pumpinställningar. Är du säker att du vill fortsätta med import av inställningar?"; + +/* */ +"Yes, Import" = "Ja, importera"; + +/* */ +"Import settings from Nightscout" = "Importera inställningar från Nightscout"; + +/* */ +"Import settings?" = "Importera inställningar?"; + +/* */ +"Import from Nightscout" = "Import från Nightscout"; + +/* */ +"Settings imported" = "Inställningar importerade"; + +/* Import Error */ +"Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "Du har olika inställningar för blodsockernehet i Nightscout och iAPS. Import därför avbruten."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Kan inte hitta en profil i Nightcsout"; + /* Add Medtronic pump */ "Add Medtronic" = "Lägg till Medtronic"; diff --git a/FreeAPS/Sources/Models/FetchedProfile.swift b/FreeAPS/Sources/Models/FetchedProfile.swift new file mode 100644 index 0000000000..8411ea979c --- /dev/null +++ b/FreeAPS/Sources/Models/FetchedProfile.swift @@ -0,0 +1,24 @@ +import Foundation + +struct FetchedNightscoutProfileStore: JSON { + let _id: String + let defaultProfile: String + let startDate: String + let mills: Decimal + let enteredBy: String + let store: [String: ScheduledNightscoutProfile] + let created_at: String +} + +struct FetchedNightscoutProfile: JSON { + let dia: Decimal + let carbs_hr: Int + let delay: Decimal + let timezone: String + let target_low: [NightscoutTimevalue] + let target_high: [NightscoutTimevalue] + let sens: [NightscoutTimevalue] + let basal: [NightscoutTimevalue] + let carbratio: [NightscoutTimevalue] + let units: String +} diff --git a/FreeAPS/Sources/Models/NightscoutStatus.swift b/FreeAPS/Sources/Models/NightscoutStatus.swift index ca58c90964..057e876a32 100644 --- a/FreeAPS/Sources/Models/NightscoutStatus.swift +++ b/FreeAPS/Sources/Models/NightscoutStatus.swift @@ -29,7 +29,7 @@ struct Uploader: JSON { struct NightscoutTimevalue: JSON { let time: String let value: Decimal - let timeAsSeconds: Int + let timeAsSeconds: Int? } struct ScheduledNightscoutProfile: JSON { diff --git a/FreeAPS/Sources/Models/RawFetchedProfile.swift b/FreeAPS/Sources/Models/RawFetchedProfile.swift new file mode 100644 index 0000000000..8411ea979c --- /dev/null +++ b/FreeAPS/Sources/Models/RawFetchedProfile.swift @@ -0,0 +1,24 @@ +import Foundation + +struct FetchedNightscoutProfileStore: JSON { + let _id: String + let defaultProfile: String + let startDate: String + let mills: Decimal + let enteredBy: String + let store: [String: ScheduledNightscoutProfile] + let created_at: String +} + +struct FetchedNightscoutProfile: JSON { + let dia: Decimal + let carbs_hr: Int + let delay: Decimal + let timezone: String + let target_low: [NightscoutTimevalue] + let target_high: [NightscoutTimevalue] + let sens: [NightscoutTimevalue] + let basal: [NightscoutTimevalue] + let carbratio: [NightscoutTimevalue] + let units: String +} diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index f3c1997c09..29a7315c57 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -1,5 +1,6 @@ import CGMBLEKit import Combine +import CoreData import G7SensorKit import SwiftDate import SwiftUI @@ -11,6 +12,9 @@ extension NightscoutConfig { @Injected() private var glucoseStorage: GlucoseStorage! @Injected() private var healthKitManager: HealthKitManager! @Injected() private var cgmManager: FetchGlucoseManager! + @Injected() private var storage: FileStorage! + + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @Published var url = "" @Published var secret = "" @@ -22,10 +26,12 @@ extension NightscoutConfig { @Published var uploadGlucose = true // Upload Glucose @Published var useLocalSource = false @Published var localPort: Decimal = 0 + @Published var units: GlucoseUnits = .mmolL override func subscribe() { url = keychain.getValue(String.self, forKey: Config.urlKey) ?? "" secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? "" + units = settingsManager.settings.units subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled) { isUploadEnabled = $0 } subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource) { useLocalSource = $0 } @@ -68,6 +74,161 @@ extension NightscoutConfig { .store(in: &lifetime) } + private var nightscoutAPI: NightscoutAPI? { + guard let urlString = keychain.getValue(String.self, forKey: NightscoutConfig.Config.urlKey), + let url = URL(string: urlString), + let secret = keychain.getValue(String.self, forKey: NightscoutConfig.Config.secretKey) + else { + return nil + } + return NightscoutAPI(url: url, secret: secret) + } + + func importSettings() { + guard let nightscout = nightscoutAPI else { + saveError("Can't access nightscoutAPI") + return + } + let group = DispatchGroup() + group.enter() + var error = "" + let path = "/api/v1/profile.json" + let timeout: TimeInterval = 60 + + var components = URLComponents() + components.scheme = nightscout.url.scheme + components.host = nightscout.url.host + components.port = nightscout.url.port + components.path = path + components.queryItems = [ + URLQueryItem(name: "count", value: "1") + ] + var url = URLRequest(url: components.url!) + url.allowsConstrainedNetworkAccess = false + url.timeoutInterval = timeout + + if let secret = nightscout.secret { + url.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") + } + let task = URLSession.shared.dataTask(with: url) { data, response, error_ in + if let error_ = error_ { + print("Error occured: " + error_.localizedDescription) + // handle error + self.saveError("Error occured: " + error_.localizedDescription) + error = error_.localizedDescription + return + } + guard let httpResponse = response as? HTTPURLResponse, + (200 ... 299).contains(httpResponse.statusCode) + else { + print("Error occured! " + error_.debugDescription) + // handle error + self.saveError(error_.debugDescription) + return + } + let jsonDecoder = JSONCoding.decoder + + if let mimeType = httpResponse.mimeType, mimeType == "application/json", + let data = data + { + do { + let fetchedProfileStore = try jsonDecoder.decode([FetchedNightscoutProfileStore].self, from: data) + guard let fetchedProfile: ScheduledNightscoutProfile = fetchedProfileStore.first?.store["default"] + else { + error = "Can't find the default Nightscout Profile." + group.leave() + return + } + + guard fetchedProfile.units.contains(self.units.rawValue.prefix(4)) else { + debug( + .nightscout, + "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." + ) + error = "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." + group.leave() + return + } + + let carbratios = fetchedProfile.carbratio + .map { carbratio -> CarbRatioEntry in + CarbRatioEntry( + start: carbratio.time, + offset: (carbratio.timeAsSeconds ?? self.offset(carbratio.time)) / 60, + ratio: carbratio.value + ) } + let carbratiosProfile = CarbRatios(units: CarbUnit.grams, schedule: carbratios) + + let basals = fetchedProfile.basal + .map { basal -> BasalProfileEntry in + BasalProfileEntry( + start: basal.time, + minutes: (basal.timeAsSeconds ?? self.offset(basal.time)) / 60, + rate: basal.value + ) } + + let sensitivities = fetchedProfile.sens.map { sensitivity -> InsulinSensitivityEntry in + InsulinSensitivityEntry( + sensitivity: self.units == .mmolL ? sensitivity.value : sensitivity.value.asMgdL, + offset: (sensitivity.timeAsSeconds ?? self.offset(sensitivity.time)) / 60, + start: sensitivity.time + ) } + let sensitivitiesProfile = InsulinSensitivities( + units: self.units, + userPrefferedUnits: self.units, + sensitivities: sensitivities + ) + + let targets = fetchedProfile.target_low + .map { target -> BGTargetEntry in + BGTargetEntry( + low: self.units == .mmolL ? target.value : target.value.asMgdL, + high: self.units == .mmolL ? target.value : target.value.asMgdL, + start: target.time, + offset: (target.timeAsSeconds ?? self.offset(target.time)) / 60 + ) } + let targetsProfile = BGTargets( + units: self.units, + userPrefferedUnits: self.units, + targets: targets + ) + + self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) + self.storage.save(basals, as: OpenAPS.Settings.basalProfile) + self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) + self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) + + group.leave() + + } catch let parsingError { + print(parsingError) + } + } + } + task.resume() + group.wait(wallTimeout: .now() + 5) + group.notify(queue: .global(qos: .background)) { + self.saveError(error) + } + } + + func offset(_ string: String) -> Int { + let hours = Int(string.prefix(2)) ?? 0 + let minutes = Int(string.suffix(2)) ?? 0 + return hours * 60 + minutes * 60 + } + + func saveError(_ string: String) { + coredataContext.performAndWait { + let saveToCoreData = ImportError(context: self.coredataContext) + saveToCoreData.date = Date() + saveToCoreData.error = string + if coredataContext.hasChanges { + try? coredataContext.save() + } + } + } + func backfillGlucose() { backfilling = true nightscoutManager.fetchGlucose(since: Date().addingTimeInterval(-1.days.timeInterval)) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 80eda96111..2e54515a11 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -1,3 +1,4 @@ +import CoreData import SwiftUI import Swinject @@ -5,6 +6,16 @@ extension NightscoutConfig { struct RootView: BaseView { let resolver: Resolver @StateObject var state = StateModel() + @State var importAlert: Alert? + @State var isImportAlertPresented = false + @State var importedHasRun = false + + @FetchRequest( + entity: ImportError.entity(), + sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)], predicate: NSPredicate( + format: "date > %@", Date().addingTimeInterval(-1.minutes.timeInterval) as NSDate + ) + ) var fetchedErrors: FetchedResults private var portFormater: NumberFormatter { let formatter = NumberFormatter() @@ -53,14 +64,58 @@ extension NightscoutConfig { Text("Allow Uploads") } - Section(header: Text("Local glucose source")) { + Section { + Button("Import settings from Nightscout") { + importAlert = Alert( + title: Text("Import settings?"), + message: Text( + "\n" + + NSLocalizedString( + "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?", + comment: "Profile Import Alert" + ) + + "\n" + ), + primaryButton: .destructive( + Text("Yes, Import"), + action: { + state.importSettings() + importedHasRun = true + } + ), + secondaryButton: .cancel() + ) + isImportAlertPresented.toggle() + }.disabled(state.url.isEmpty || state.connecting) + + } header: { Text("Import from Nightscout") } + + .alert(isPresented: $importedHasRun) { + Alert( + title: Text("Settings imported"), + message: Text( + (fetchedErrors.first?.error ?? "").count < 4 ? + NSLocalizedString( + "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects.", + comment: "Imported Profiles Alert" + ) : + NSLocalizedString("\nImport failed:\n\n*", comment: "Failed Profile Import Alert") + + NSLocalizedString(fetchedErrors.first?.error ?? "", comment: "Import Error") + ), + primaryButton: .destructive( + Text("OK") + ), + secondaryButton: .cancel() + ) + } + + Section { Toggle("Use local glucose server", isOn: $state.useLocalSource) HStack { Text("Port") DecimalTextField("", value: $state.localPort, formatter: portFormater) } - } - + } header: { Text("Local glucose source") } Section { Button("Backfill glucose") { state.backfillGlucose() } .disabled(state.url.isEmpty || state.connecting || state.backfilling) @@ -69,6 +124,9 @@ extension NightscoutConfig { .onAppear(perform: configureView) .navigationBarTitle("Nightscout Config") .navigationBarTitleDisplayMode(.automatic) + .alert(isPresented: $isImportAlertPresented) { + importAlert! + } } } } diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index ec47340bf8..f34f9fa8ae 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -1,6 +1,8 @@ import Combine import CommonCrypto import Foundation +import JavaScriptCore +import Swinject class NightscoutAPI { init(url: URL, secret: String? = nil) { @@ -27,6 +29,8 @@ class NightscoutAPI { let secret: String? private let service = NetworkService() + + @Injected() private var settingsManager: SettingsManager! } extension NightscoutAPI { diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 436267dc5c..069f31b8eb 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -12,9 +12,9 @@ protocol NightscoutManager: GlucoseSource { func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) func deleteInsulin(at date: Date) func uploadStatus() + func uploadGlucose() func uploadStatistics(dailystat: Statistics) func uploadPreferences() - func uploadGlucose() func uploadProfile() var cgmURL: URL? { get } } @@ -557,6 +557,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { switch completion { case .finished: self.storage.save(glucose, as: fileToSave) + debug(.nightscout, "Glucose uploaded") case let .failure(error): debug(.nightscout, error.localizedDescription) } @@ -586,6 +587,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { switch completion { case .finished: self.storage.save(treatments, as: fileToSave) + debug(.nightscout, "Treatments uploaded") case let .failure(error): debug(.nightscout, error.localizedDescription) } diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index f32f70af1b..df49349aaa 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -67,7 +67,7 @@ struct TagCloudView: View { textTag where textTag.contains("Autosens/Dynamic Limit:"), textTag where textTag.contains("Dynamic ISF/CR"), textTag where textTag.contains("Basal ratio"), - textTag where textTag.contains("SMB Ratio:"): + textTag where textTag.contains("SMB Ratio"): return .zt default: return .insulin From 729adae92b6fe9627b64790d09686adfbb33a676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 9 Oct 2023 01:22:51 +0200 Subject: [PATCH 037/405] Clean --- FreeAPS/Sources/APS/OpenAPS/Constants.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/FreeAPS/Sources/APS/OpenAPS/Constants.swift b/FreeAPS/Sources/APS/OpenAPS/Constants.swift index f096f66a9d..f82faa0ad7 100644 --- a/FreeAPS/Sources/APS/OpenAPS/Constants.swift +++ b/FreeAPS/Sources/APS/OpenAPS/Constants.swift @@ -85,8 +85,6 @@ extension OpenAPS { static let uploadedCGMState = "upload/uploaded-cgm-state.json" static let uploadedPodAge = "upload/uploaded-pod-age.json" static let uploadedProfile = "upload/uploaded-profile.json" - static let profile = "fetched/profile.json" - static let test = "upload/test.json" } enum FreeAPS { From ff36ad34cf6d43d9bafd9dfb9754f5e82f3d833e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 9 Oct 2023 02:37:52 +0200 Subject: [PATCH 038/405] Face-ID for import (cherry picked from commit c31995dd5635b106b56adffae359125bd4fb5624) --- .../NightscoutConfigStateModel.swift | 12 ++++++++++++ .../View/NightscoutConfigRootView.swift | 6 ++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 29a7315c57..69fdbefe71 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -13,6 +13,7 @@ extension NightscoutConfig { @Injected() private var healthKitManager: HealthKitManager! @Injected() private var cgmManager: FetchGlucoseManager! @Injected() private var storage: FileStorage! + @Injected() var unlockmanager: UnlockManager! let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -27,6 +28,7 @@ extension NightscoutConfig { @Published var useLocalSource = false @Published var localPort: Decimal = 0 @Published var units: GlucoseUnits = .mmolL + @Published var importedHasRun = false override func subscribe() { url = keychain.getValue(String.self, forKey: Config.urlKey) ?? "" @@ -84,6 +86,16 @@ extension NightscoutConfig { return NightscoutAPI(url: url, secret: secret) } + func startImport() { + unlockmanager.unlock() + .sink { _ in } receiveValue: { [weak self] _ in + guard let self = self else { return } + importSettings() + importedHasRun = true + } + .store(in: &lifetime) + } + func importSettings() { guard let nightscout = nightscoutAPI else { saveError("Can't access nightscoutAPI") diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 2e54515a11..66706d29ff 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -8,7 +8,6 @@ extension NightscoutConfig { @StateObject var state = StateModel() @State var importAlert: Alert? @State var isImportAlertPresented = false - @State var importedHasRun = false @FetchRequest( entity: ImportError.entity(), @@ -79,8 +78,7 @@ extension NightscoutConfig { primaryButton: .destructive( Text("Yes, Import"), action: { - state.importSettings() - importedHasRun = true + state.startImport() } ), secondaryButton: .cancel() @@ -90,7 +88,7 @@ extension NightscoutConfig { } header: { Text("Import from Nightscout") } - .alert(isPresented: $importedHasRun) { + .alert(isPresented: $state.importedHasRun) { Alert( title: Text("Settings imported"), message: Text( From b5e74a0563c3cb4756b7eda0190c6b098d8a6e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 9 Oct 2023 02:37:52 +0200 Subject: [PATCH 039/405] Revert "Face-ID for import" This reverts commit ff36ad34cf6d43d9bafd9dfb9754f5e82f3d833e. --- .../NightscoutConfigStateModel.swift | 12 ------------ .../View/NightscoutConfigRootView.swift | 6 ++++-- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 69fdbefe71..29a7315c57 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -13,7 +13,6 @@ extension NightscoutConfig { @Injected() private var healthKitManager: HealthKitManager! @Injected() private var cgmManager: FetchGlucoseManager! @Injected() private var storage: FileStorage! - @Injected() var unlockmanager: UnlockManager! let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -28,7 +27,6 @@ extension NightscoutConfig { @Published var useLocalSource = false @Published var localPort: Decimal = 0 @Published var units: GlucoseUnits = .mmolL - @Published var importedHasRun = false override func subscribe() { url = keychain.getValue(String.self, forKey: Config.urlKey) ?? "" @@ -86,16 +84,6 @@ extension NightscoutConfig { return NightscoutAPI(url: url, secret: secret) } - func startImport() { - unlockmanager.unlock() - .sink { _ in } receiveValue: { [weak self] _ in - guard let self = self else { return } - importSettings() - importedHasRun = true - } - .store(in: &lifetime) - } - func importSettings() { guard let nightscout = nightscoutAPI else { saveError("Can't access nightscoutAPI") diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 66706d29ff..2e54515a11 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -8,6 +8,7 @@ extension NightscoutConfig { @StateObject var state = StateModel() @State var importAlert: Alert? @State var isImportAlertPresented = false + @State var importedHasRun = false @FetchRequest( entity: ImportError.entity(), @@ -78,7 +79,8 @@ extension NightscoutConfig { primaryButton: .destructive( Text("Yes, Import"), action: { - state.startImport() + state.importSettings() + importedHasRun = true } ), secondaryButton: .cancel() @@ -88,7 +90,7 @@ extension NightscoutConfig { } header: { Text("Import from Nightscout") } - .alert(isPresented: $state.importedHasRun) { + .alert(isPresented: $importedHasRun) { Alert( title: Text("Settings imported"), message: Text( From 19020b9d0a162768f98c32a2c54e7cd8d500edc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 9 Oct 2023 14:01:25 +0200 Subject: [PATCH 040/405] Import DIA from NS. (cherry picked from commit a6d9fa4dbd7e678fcea1b9bf2a542d56f914206b) --- .../NightscoutConfigStateModel.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 29a7315c57..35aa9f9d36 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -27,11 +27,17 @@ extension NightscoutConfig { @Published var useLocalSource = false @Published var localPort: Decimal = 0 @Published var units: GlucoseUnits = .mmolL + @Published var dia: Decimal = 6 + @Published var maxBasal: Decimal = 2 + @Published var maxBolus: Decimal = 10 override func subscribe() { url = keychain.getValue(String.self, forKey: Config.urlKey) ?? "" secret = keychain.getValue(String.self, forKey: Config.secretKey) ?? "" units = settingsManager.settings.units + dia = settingsManager.pumpSettings.insulinActionCurve + maxBasal = settingsManager.pumpSettings.maxBasal + maxBolus = settingsManager.pumpSettings.maxBolus subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled) { isUploadEnabled = $0 } subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource) { useLocalSource = $0 } @@ -197,6 +203,13 @@ extension NightscoutConfig { self.storage.save(basals, as: OpenAPS.Settings.basalProfile) self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) + // DIA. Save if changed. + let dia = fetchedProfile.dia + if dia != self.dia { + let file = PumpSettings(insulinActionCurve: dia, maxBolus: self.maxBolus, maxBasal: self.maxBolus) + self.storage.save(file, as: OpenAPS.Settings.settings) + debug(.nightscout, "DIA setting updated to " + dia.description + " after a NS import.") + } group.leave() From 6688d3bbaf0e676cea91383547404403b7463296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 9 Oct 2023 14:09:19 +0200 Subject: [PATCH 041/405] Oops. Bad typo! --- .../Modules/NightscoutConfig/NightscoutConfigStateModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 35aa9f9d36..5b324dd4fc 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -206,7 +206,7 @@ extension NightscoutConfig { // DIA. Save if changed. let dia = fetchedProfile.dia if dia != self.dia { - let file = PumpSettings(insulinActionCurve: dia, maxBolus: self.maxBolus, maxBasal: self.maxBolus) + let file = PumpSettings(insulinActionCurve: dia, maxBolus: self.maxBolus, maxBasal: self.maxBasal) self.storage.save(file, as: OpenAPS.Settings.settings) debug(.nightscout, "DIA setting updated to " + dia.description + " after a NS import.") } From ab761b94630c6bc34daf50e926944e86f04b5d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 9 Oct 2023 22:46:57 +0200 Subject: [PATCH 042/405] Save Autotuned basal rates as normal basal rates and to pump. * Button in Autotune settings. Hidden at the very bottom. --- .../AutotuneConfigStateModel.swift | 32 +++++++++++++++++++ .../View/AutotuneConfigRootView.swift | 17 ++++++++++ 2 files changed, 49 insertions(+) diff --git a/FreeAPS/Sources/Modules/AutotuneConfig/AutotuneConfigStateModel.swift b/FreeAPS/Sources/Modules/AutotuneConfig/AutotuneConfigStateModel.swift index ed1786cdb0..1e41bc8716 100644 --- a/FreeAPS/Sources/Modules/AutotuneConfig/AutotuneConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/AutotuneConfig/AutotuneConfigStateModel.swift @@ -1,9 +1,11 @@ import Combine +import LoopKit import SwiftUI extension AutotuneConfig { final class StateModel: BaseStateModel { @Injected() var apsManager: APSManager! + @Injected() private var storage: FileStorage! @Published var useAutotune = false @Published var onlyAutotuneBasals = false @Published var autotune: Autotune? @@ -59,5 +61,35 @@ extension AutotuneConfig { .cancellable() .store(in: &lifetime) } + + func replace() { + if let autotunedBasals = autotune { + let basals = autotunedBasals.basalProfile + .map { basal -> BasalProfileEntry in + BasalProfileEntry( + start: String(basal.start.prefix(5)), + minutes: basal.minutes, + rate: basal.rate + ) + } + guard let pump = apsManager.pumpManager else { + storage.save(basals, as: OpenAPS.Settings.basalProfile) + debug(.service, "Basals have been replaced with Autotuned Basals by user.") + return + } + let syncValues = basals.map { + RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate)) + } + pump.syncBasalRateSchedule(items: syncValues) { result in + switch result { + case .success: + self.storage.save(basals, as: OpenAPS.Settings.basalProfile) + debug(.service, "Basals saved to pump!") + case .failure: + debug(.service, "Basals couldn't be save to pump") + } + } + } + } } } diff --git a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift index c725ee5392..de262946f3 100644 --- a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift +++ b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift @@ -5,6 +5,7 @@ extension AutotuneConfig { struct RootView: BaseView { let resolver: Resolver @StateObject var state = StateModel() + @State var replaceAlert = false private var isfFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -94,11 +95,27 @@ extension AutotuneConfig { label: { Text("Delete autotune data") } .foregroundColor(.red) } + + Section { + Button { + replaceAlert = true + } + label: { Text("Save as your Normal Basal Rates") } + } header: { + Text("Replace Normal Basal") + } } } .onAppear(perform: configureView) .navigationTitle("Autotune") .navigationBarTitleDisplayMode(.automatic) + .alert(Text("Are you sure?"), isPresented: $replaceAlert) { + Button("Yes", action: { + state.replace() + replaceAlert.toggle() + }) + Button("No", action: { replaceAlert.toggle() }) + } } } } From bb0d395ae47988a1d4739da630302169dbe50fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 15:40:19 +0200 Subject: [PATCH 043/405] Hard limit of 55 for insulinPeakTime to avoid endless logs and errors in oref0 --- FreeAPS.xcodeproj/project.pbxproj | 2 +- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- FreeAPS/Resources/javascript/prepare/profile.js | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index f6ccc5a7c7..da3df29c3a 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -2473,7 +2473,7 @@ B99D8B8E295F34DB00420AB8 /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 2147483647; + buildActionMask = 12; files = ( ); inputFileListPaths = ( diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index e3a315bbdb..2a98a3f4ed 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", Total insulin: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=h.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR);var Da="";.5!=i.smb_delivery_ratio&&(Da=", SMB Ratio "+i.smb_delivery_ratio),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i)+Da,oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,He.reason+="; ";var wa=Tt;wa<40&&(wa=Math.min(Ot,wa));var Ga,Ta=U-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;baGa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*Ga+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ua+"minutes");var Oa=Ua,Ra=i.current_basal*N*_t*Oa/60,Aa=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Ra)/csf-Aa;Ra=o(Ra),Ia=o(Ia),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Ra,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(He.carbsReq=Ia,He.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var ja=0,Pa=Je,Ea=0;if(CtRt&&tt>0&&!Ia)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));ja=o(ja=2*Math.min(0,(Ct-ot)/_t),2);var qa=Math.min(0,(Tt-ot)/_t);if(qa=o(qa,2),tt<0&&tt>Rt)ja=o(ja*(tt/Rt),2);Pa=r(Pa=Je+2*ja,i),Ea=t.duration*(t.rate-Je)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",He;if(Pa<=0){if((Fa=o(60*((Ta=ot-Tt)/_t)/i.current_basal*N))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return He.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,He,t)}else He.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));ja=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),ja>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+ja+" U)"),He.reason+="max_iob "+lt+", ",ja=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Pa=r(Pa=Je+2*ja,i),ja=o(ja,3),He.insulinReq=ja;var ka=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/Z,3),Ha=0;void 0===La?(Ha=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*N),Ha=o(i.current_basal*N*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*N*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Je*Fa/30,2),Fa=30),He.reason+=" insulinReq "+ja,Ka>=Ha&&(He.reason+="; maxBolus "+Ha),Fa>0&&(He.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),He.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Tt+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(He.units=Ka,He.reason+="Microbolusing "+Ka+"U. "):He.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return He.rate=Qa,He.duration=Fa,He}var er=u.getMaxSafeBasal(i);return Pa>er&&(He.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Je)/60)>=2*ja?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/FreeAPS/Resources/javascript/prepare/profile.js b/FreeAPS/Resources/javascript/prepare/profile.js index 91568bcb2d..b3dd938696 100644 --- a/FreeAPS/Resources/javascript/prepare/profile.js +++ b/FreeAPS/Resources/javascript/prepare/profile.js @@ -13,7 +13,7 @@ function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data return { "error" : 'BG Target data is expected to be expressed in mg/dL or mmol/L. Found '+ bgtargets_data.units }; } } - + if (isf_data.units !== 'mg/dL') { if (isf_data.units === 'mmol/L') { for (var i = 0, len = isf_data.sensitivities.length; i < len; i++) { @@ -63,6 +63,7 @@ function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data var preferences = { }; if (preferences_input) { preferences = preferences_input; + preferences.insulinPeakTime = Math.max(preferences.insulinPeakTime, 55); } var inputs = { }; From 4cd9752e88578e3e5a02d2635bef3f0cb0e66415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 16:52:12 +0200 Subject: [PATCH 044/405] adjust min/max insulinPeakTime depending on type of insulin. --- FreeAPS/Resources/javascript/prepare/profile.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Resources/javascript/prepare/profile.js b/FreeAPS/Resources/javascript/prepare/profile.js index b3dd938696..23bb667c08 100644 --- a/FreeAPS/Resources/javascript/prepare/profile.js +++ b/FreeAPS/Resources/javascript/prepare/profile.js @@ -13,7 +13,7 @@ function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data return { "error" : 'BG Target data is expected to be expressed in mg/dL or mmol/L. Found '+ bgtargets_data.units }; } } - + if (isf_data.units !== 'mg/dL') { if (isf_data.units === 'mmol/L') { for (var i = 0, len = isf_data.sensitivities.length; i < len; i++) { @@ -63,7 +63,18 @@ function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data var preferences = { }; if (preferences_input) { preferences = preferences_input; - preferences.insulinPeakTime = Math.max(preferences.insulinPeakTime, 55); + if (preferences.curve === "rapid-acting") { + if (preferences.useCustomPeakTime) { + preferences.insulinPeakTime = + Math.max(50, Math.min(preferences.insulinPeakTime, 120)); + } else { preferences.insulinPeakTime = 75; } + } + else if (preferences.curve === "ultra-rapid") { + if (preferences.useCustomPeakTime) { + preferences.insulinPeakTime = + Math.max(35, Math.min(preferences.insulinPeakTime, 100)); + } else { preferences.insulinPeakTime = 55; } + } } var inputs = { }; From 03ea51731995075c60433d2d551e6846c1deccfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 17:24:08 +0200 Subject: [PATCH 045/405] Save imported settings also to pump (basals). (cherry picked from commit 7fc8aa56d0b31374ef6b1671ee7353fbbc784b0c) --- .../NightscoutConfigStateModel.swift | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 5b324dd4fc..60fc6eb769 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -2,6 +2,7 @@ import CGMBLEKit import Combine import CoreData import G7SensorKit +import LoopKit import SwiftDate import SwiftUI @@ -13,6 +14,7 @@ extension NightscoutConfig { @Injected() private var healthKitManager: HealthKitManager! @Injected() private var cgmManager: FetchGlucoseManager! @Injected() private var storage: FileStorage! + @Injected() var apsManager: APSManager! let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -199,10 +201,29 @@ extension NightscoutConfig { targets: targets ) - self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) - self.storage.save(basals, as: OpenAPS.Settings.basalProfile) - self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) - self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) + // SAVE TO STORAGE + guard let pump = self.apsManager.pumpManager else { + self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) + self.storage.save(basals, as: OpenAPS.Settings.basalProfile) + self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) + self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) + debug(.service, "Setings have been imported and saved by user.") + return + } + let syncValues = basals.map { + RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate)) + } + // SAVE TO PUMP (LoopKit) + pump.syncBasalRateSchedule(items: syncValues) { result in + switch result { + case .success: + self.storage.save(basals, as: OpenAPS.Settings.basalProfile) + debug(.service, "Basals saved to pump!") + case .failure: + debug(.service, "Basals couldn't be save to pump") + } + } + // DIA. Save if changed. let dia = fetchedProfile.dia if dia != self.dia { @@ -210,9 +231,7 @@ extension NightscoutConfig { self.storage.save(file, as: OpenAPS.Settings.settings) debug(.nightscout, "DIA setting updated to " + dia.description + " after a NS import.") } - group.leave() - } catch let parsingError { print(parsingError) } From fb672cbf6517137c9931fa7b29053c080ffe9885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 17:40:43 +0200 Subject: [PATCH 046/405] Update error message etc. --- .../NightscoutConfigStateModel.swift | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 60fc6eb769..82d0dd9402 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -201,25 +201,34 @@ extension NightscoutConfig { targets: targets ) - // SAVE TO STORAGE + // IS THERE A PUMP? guard let pump = self.apsManager.pumpManager else { self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) self.storage.save(basals, as: OpenAPS.Settings.basalProfile) self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) - debug(.service, "Setings have been imported and saved by user.") + debug( + .service, + "Settings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" + ) return } let syncValues = basals.map { RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate)) } + // SAVE TO STORAGE // SAVE TO PUMP (LoopKit) pump.syncBasalRateSchedule(items: syncValues) { result in switch result { case .success: self.storage.save(basals, as: OpenAPS.Settings.basalProfile) - debug(.service, "Basals saved to pump!") + self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) + self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) + self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) + debug(.service, "Settings have been imported and the Basals saved to pump!") case .failure: + error = + "Settings were imported but the Basals couldn't be saved to pump (communication error). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" debug(.service, "Basals couldn't be save to pump") } } From 0120c7262b5128ba3bfa76949f01586a762f4ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 21:15:03 +0200 Subject: [PATCH 047/405] Import errors (cherry picked from commit 207f6e7508a789f6c51799ad7809ecf7ddf6a3ba) --- .../Main/en.lproj/Localizable.strings | 14 ++++-- .../Main/sv.lproj/Localizable.strings | 14 ++++-- .../NightscoutConfigStateModel.swift | 50 ++++++++++++------- .../View/NightscoutConfigRootView.swift | 3 +- 4 files changed, 54 insertions(+), 27 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 3bb172ada6..15126e3dbd 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -317,12 +317,18 @@ Enact a temp Basal or a temp target */ /* Imported Profiles Alert */ "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; -/* Failed Profile Import Alert */ -"\nImport failed:\n\n*" = "\nImport failed:\n\n*"; - /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + /* */ "Yes, Import" = "Yes, Import"; @@ -339,7 +345,7 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Settings imported"; /* Import Error */ -"Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 76f39fcca4..2515871d61 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -317,12 +317,18 @@ Enact a temp Basal or a temp target */ /* Imported Profiles Alert */ "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nKontrollera nu alla dina nya pumpinställningar noga:\n\n* Basalinställningar\n * Insulinkvoter\n * Målvärden\n * Insulinkänslighet\n\n i Inställningar > Konfiguration.\n\nDåliga eller ogiltiga pumpinställningar kan gå katastrofala följder."; -/* Failed Profile Import Alert */ -"\nImport failed:\n\n*" = "\nImport misslyckades:\n\n*"; - /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Detta kommer att ersätta alla eller vissa av dina pumpinställningar. Är du säker att du vill fortsätta med import av inställningar?"; +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nDu har ogiltiga basalinställningar i Nightscouts profilinställningar . \n\nImport avbruten. Du behöver kontrollera dina Nightcoutinställningar."; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nDina inställningar blev importerade men kunde inte sparas till pump (Ingen pump). Kontrollera dina pumpinstälningar och klicka därefter på ´Spara på pump´ för att programmera din pump med de nya basalinställningarna"; + +/* Import Error Headline */ +"Import Error" = "Fel vd import av inställningar"; + /* */ "Yes, Import" = "Ja, importera"; @@ -339,7 +345,7 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Inställningar importerade"; /* Import Error */ -"Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "Du har olika inställningar för blodsockernehet i Nightscout och iAPS. Import därför avbruten."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nDu har olika inställningar för blodsockernehet i Nightscout och iAPS. Import därför avbruten."; /* Import Error */ "Can't find the default Nightscout Profile." = "Kan inte hitta en profil i Nightcsout"; diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 82d0dd9402..cb6a329b70 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -143,7 +143,7 @@ extension NightscoutConfig { let fetchedProfileStore = try jsonDecoder.decode([FetchedNightscoutProfileStore].self, from: data) guard let fetchedProfile: ScheduledNightscoutProfile = fetchedProfileStore.first?.store["default"] else { - error = "Can't find the default Nightscout Profile." + error = "\nCan't find the default Nightscout Profile." group.leave() return } @@ -153,7 +153,7 @@ extension NightscoutConfig { .nightscout, "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." ) - error = "Mismatching glucose units in Nightscout and Pump Settings. Import settings aborted." + error = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." group.leave() return } @@ -167,14 +167,23 @@ extension NightscoutConfig { ) } let carbratiosProfile = CarbRatios(units: CarbUnit.grams, schedule: carbratios) + var areBasalsOK = true let basals = fetchedProfile.basal .map { basal -> BasalProfileEntry in - BasalProfileEntry( + if basal.value <= 0 || basal.value >= self.maxBasal { + error = + "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" + areBasalsOK = false + } + return BasalProfileEntry( start: basal.time, minutes: (basal.timeAsSeconds ?? self.offset(basal.time)) / 60, rate: basal.value ) } - + guard areBasalsOK else { + group.leave() + return + } let sensitivities = fetchedProfile.sens.map { sensitivity -> InsulinSensitivityEntry in InsulinSensitivityEntry( sensitivity: self.units == .mmolL ? sensitivity.value : sensitivity.value.asMgdL, @@ -200,7 +209,6 @@ extension NightscoutConfig { userPrefferedUnits: self.units, targets: targets ) - // IS THERE A PUMP? guard let pump = self.apsManager.pumpManager else { self.storage.save(carbratiosProfile, as: OpenAPS.Settings.carbRatios) @@ -211,13 +219,15 @@ extension NightscoutConfig { .service, "Settings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" ) + error = + "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" + group.leave() return } let syncValues = basals.map { RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate)) } - // SAVE TO STORAGE - // SAVE TO PUMP (LoopKit) + // SSAVE TO STORAGE. SAVE TO PUMP (LoopKit) pump.syncBasalRateSchedule(items: syncValues) { result in switch result { case .success: @@ -226,23 +236,29 @@ extension NightscoutConfig { self.storage.save(sensitivitiesProfile, as: OpenAPS.Settings.insulinSensitivities) self.storage.save(targetsProfile, as: OpenAPS.Settings.bgTargets) debug(.service, "Settings have been imported and the Basals saved to pump!") + // DIA. Save if changed. + let dia = fetchedProfile.dia + if dia != self.dia { + let file = PumpSettings( + insulinActionCurve: dia, + maxBolus: self.maxBolus, + maxBasal: self.maxBasal + ) + self.storage.save(file, as: OpenAPS.Settings.settings) + debug(.nightscout, "DIA setting updated to " + dia.description + " after a NS import.") + } + group.leave() case .failure: error = - "Settings were imported but the Basals couldn't be saved to pump (communication error). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" + "\nSettings were imported but the Basals couldn't be saved to pump (communication error). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" debug(.service, "Basals couldn't be save to pump") + group.leave() } } - - // DIA. Save if changed. - let dia = fetchedProfile.dia - if dia != self.dia { - let file = PumpSettings(insulinActionCurve: dia, maxBolus: self.maxBolus, maxBasal: self.maxBasal) - self.storage.save(file, as: OpenAPS.Settings.settings) - debug(.nightscout, "DIA setting updated to " + dia.description + " after a NS import.") - } - group.leave() } catch let parsingError { print(parsingError) + error = parsingError.localizedDescription + group.leave() } } } diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 2e54515a11..7df3bfa506 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -92,14 +92,13 @@ extension NightscoutConfig { .alert(isPresented: $importedHasRun) { Alert( - title: Text("Settings imported"), + title: Text((fetchedErrors.first?.error ?? "").count < 4 ? "Settings imported" : "Import Error"), message: Text( (fetchedErrors.first?.error ?? "").count < 4 ? NSLocalizedString( "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects.", comment: "Imported Profiles Alert" ) : - NSLocalizedString("\nImport failed:\n\n*", comment: "Failed Profile Import Alert") + NSLocalizedString(fetchedErrors.first?.error ?? "", comment: "Import Error") ), primaryButton: .destructive( From c7aae38716d3bd34612c04434707fef69e601a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 10 Oct 2023 22:08:52 +0200 Subject: [PATCH 048/405] Localize Autotune settings --- .../Localizations/Main/en.lproj/Localizable.strings | 6 ++++++ .../Localizations/Main/sv.lproj/Localizable.strings | 10 ++++++++-- .../AutotuneConfig/View/AutotuneConfigRootView.swift | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 15126e3dbd..fb69987b14 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1094,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 2515871d61..7896bc0b09 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -321,7 +321,7 @@ Enact a temp Basal or a temp target */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Detta kommer att ersätta alla eller vissa av dina pumpinställningar. Är du säker att du vill fortsätta med import av inställningar?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nDu har ogiltiga basalinställningar i Nightscouts profilinställningar . \n\nImport avbruten. Du behöver kontrollera dina Nightcoutinställningar."; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nDu har ogiltiga basalinställningar i Nightscouts profilinställningar.\n\nImport avbruten. Du behöver kontrollera dina Nightcoutinställningar."; /* Import Error */ "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nDina inställningar blev importerade men kunde inte sparas till pump (Ingen pump). Kontrollera dina pumpinstälningar och klicka därefter på ´Spara på pump´ för att programmera din pump med de nya basalinställningarna"; @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Import settings?" = "Importera inställningar?"; /* */ -"Import from Nightscout" = "Import från Nightscout"; +"Import from Nightscout" = "Importera från Nightscout"; /* */ "Settings imported" = "Inställningar importerade"; @@ -1094,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Insulin sensitivity config header */ "Dynamic Sensitivity" = "Dynamisk insulinkänslighet"; +/* */ +"Save as your Normal Basal Rates" = "Spara som dina vanliga basalinställningar"; + +/* */ +"Save on Pump" = "Spara till pump"; + /* Autotune config */ "Only Autotune Basal Insulin" = "Autojustera endast basalinställningar"; diff --git a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift index de262946f3..fce80922a1 100644 --- a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift +++ b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift @@ -102,7 +102,7 @@ extension AutotuneConfig { } label: { Text("Save as your Normal Basal Rates") } } header: { - Text("Replace Normal Basal") + Text("Save on Pump") } } } From 806106d8e78536333fe614d768b752f90fc7fc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 11 Oct 2023 14:54:20 +0200 Subject: [PATCH 049/405] Upload preferences and settings. * Upload preferences when changed or when tapping button. * Upload the iAPS specific settings when changed or when tapping button (FreeAPSSettings). * Fix to only upload the profiles, settings and preferences when actually changed and not every time you exit settings. --- FreeAPS.xcodeproj/project.pbxproj | 4 ++ FreeAPS/Sources/APS/APSManager.swift | 14 ++-- FreeAPS/Sources/APS/OpenAPS/Constants.swift | 3 + .../Models/NightscoutPreferences.swift | 2 +- .../Sources/Models/NightscoutSettings.swift | 6 ++ .../Modules/Settings/SettingsStateModel.swift | 6 +- .../Settings/View/SettingsRootView.swift | 6 +- .../Services/Network/NightscoutAPI.swift | 24 +++++++ .../Services/Network/NightscoutManager.swift | 64 ++++++++++++++++--- 9 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 FreeAPS/Sources/Models/NightscoutSettings.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index da3df29c3a..3a08add0da 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 190EBCC629FF138000BA767D /* StatConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCC529FF138000BA767D /* StatConfigProvider.swift */; }; 190EBCC829FF13AA00BA767D /* StatConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCC729FF13AA00BA767D /* StatConfigStateModel.swift */; }; 190EBCCB29FF13CB00BA767D /* StatConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */; }; + 191F62682AD6B05A004D7911 /* NightscoutSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */; }; 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; }; 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; }; 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193F6CDC2A512C8F001240FD /* Loops.swift */; }; @@ -492,6 +493,7 @@ 190EBCC729FF13AA00BA767D /* StatConfigStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatConfigStateModel.swift; sourceTree = ""; }; 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatConfigRootView.swift; sourceTree = ""; }; 1918333A26ADA46800F45722 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; + 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutSettings.swift; sourceTree = ""; }; 1927C8E92744611700347C69 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EA2744611800347C69 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EB2744611900347C69 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; @@ -1601,6 +1603,7 @@ 19012CDB291D2CB900FB8210 /* LoopStats.swift */, FE41E4D329463C660047FD55 /* NightscoutStatistics.swift */, FE41E4D529463EE20047FD55 /* NightscoutPreferences.swift */, + 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */, 19A910352A24D6D700C8951B /* DateFilter.swift */, @@ -2618,6 +2621,7 @@ 38A9260525F012D8009E3739 /* CarbRatios.swift in Sources */, 38FCF3D625E8FDF40078B0D1 /* MD5.swift in Sources */, 3871F39C25ED892B0013ECB5 /* TempTarget.swift in Sources */, + 191F62682AD6B05A004D7911 /* NightscoutSettings.swift in Sources */, FEFA5C11299F814A00765C17 /* CoreDataStack.swift in Sources */, 3811DEAB25C9D88300A708ED /* HTTPResponseStatus.swift in Sources */, 3811DE5F25C9D4D500A708ED /* ProgressBar.swift in Sources */, diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index ff91b6dffd..7b8cd57ffc 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -993,6 +993,14 @@ final class BaseAPSManager: APSManager, Injectable { requestGFS.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.total) requestGFS.sortDescriptors = [sortGlucose] try? glucose = coredataContext.fetch(requestGFS) + // Today + /* + let requestGFS_1 = Readings.fetchRequest() as NSFetchRequest + requestGFS_1.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.today) + let sortGlucose_1 = NSSortDescriptor(key: "date", ascending: false) + requestGFS_1.sortDescriptors = [sortGlucose_1] + try? glucose_1 = coredataContext.fetch(requestGFS_1) + */ // First date let previous = glucose.last?.date ?? Date() @@ -1176,19 +1184,15 @@ final class BaseAPSManager: APSManager, Injectable { ) storage.save(dailystat, as: file) nightscout.uploadStatistics(dailystat: dailystat) - nightscout.uploadPreferences() let saveStatsCoreData = StatsData(context: self.coredataContext) saveStatsCoreData.lastrun = Date() try? self.coredataContext.save() - print("Test time of statistics computation: \(-1 * now.timeIntervalSinceNow) s") } } } private func loopStats(loopStatRecord: LoopStats) { - let LoopStatsStartedAt = Date() - coredataContext.perform { let nLS = LoopStatRecord(context: self.coredataContext) @@ -1200,8 +1204,6 @@ final class BaseAPSManager: APSManager, Injectable { try? self.coredataContext.save() } - print("LoopStatRecords: \(loopStatRecord)") - print("Test time of LoopStats computation: \(-1 * LoopStatsStartedAt.timeIntervalSinceNow) s") } private func processError(_ error: Error) { diff --git a/FreeAPS/Sources/APS/OpenAPS/Constants.swift b/FreeAPS/Sources/APS/OpenAPS/Constants.swift index f82faa0ad7..0b5c161583 100644 --- a/FreeAPS/Sources/APS/OpenAPS/Constants.swift +++ b/FreeAPS/Sources/APS/OpenAPS/Constants.swift @@ -85,6 +85,9 @@ extension OpenAPS { static let uploadedCGMState = "upload/uploaded-cgm-state.json" static let uploadedPodAge = "upload/uploaded-pod-age.json" static let uploadedProfile = "upload/uploaded-profile.json" + static let profile = "fetched/profile.json" + static let uploadedPreferences = "upload/uploaded-preferences.json" + static let uploadedSettings = "upload/uploaded-settings.json" } enum FreeAPS { diff --git a/FreeAPS/Sources/Models/NightscoutPreferences.swift b/FreeAPS/Sources/Models/NightscoutPreferences.swift index 1d7fcd0e2d..e6291e9338 100644 --- a/FreeAPS/Sources/Models/NightscoutPreferences.swift +++ b/FreeAPS/Sources/Models/NightscoutPreferences.swift @@ -1,6 +1,6 @@ import Foundation struct NightscoutPreferences: JSON { - let report = "preferences" + var report = "preferences" let preferences: Preferences? } diff --git a/FreeAPS/Sources/Models/NightscoutSettings.swift b/FreeAPS/Sources/Models/NightscoutSettings.swift new file mode 100644 index 0000000000..1ed366aa2b --- /dev/null +++ b/FreeAPS/Sources/Models/NightscoutSettings.swift @@ -0,0 +1,6 @@ +import Foundation + +struct NightscoutSettings: JSON { + let report = "settings" + let settings: FreeAPSSettings? +} diff --git a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift index 64eab12ccc..c36317b531 100644 --- a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift +++ b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift @@ -46,13 +46,13 @@ extension Settings { return items } - func uploadProfile() { + func uploadProfileAndSettings() { NSLog("SettingsState Upload Profile") - nightscoutManager.uploadProfile() + nightscoutManager.uploadProfileAndSettings() } func hideSettingsModal() { - nightscoutManager.uploadProfile() + nightscoutManager.uploadProfileAndSettings() hideModal() } } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 7fd1e92f5c..e2690b9c80 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -49,11 +49,9 @@ extension Settings { Toggle("Debug options", isOn: $state.debugOptions) if state.debugOptions { Group { - Text("NS Upload Profile").onTapGesture { - state.uploadProfile() + Text("NS Upload Profile and Settings").onTapGesture { + state.uploadProfileAndSettings() } - Text("NS Uploaded Profile") - .navigationLink(to: .configEditor(file: OpenAPS.Nightscout.uploadedProfile), from: self) } Group { Text("Preferences") diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index f34f9fa8ae..619ea92750 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -398,6 +398,30 @@ extension NightscoutAPI { .eraseToAnyPublisher() } + func uploadSettings(_ settings: NightscoutSettings) -> AnyPublisher { + var components = URLComponents() + components.scheme = url.scheme + components.host = url.host + components.port = url.port + components.path = Config.statusPath + + var request = URLRequest(url: components.url!) + request.allowsConstrainedNetworkAccess = false + request.timeoutInterval = Config.timeout + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + + if let secret = secret { + request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") + } + request.httpBody = try! JSONCoding.encoder.encode(settings) + request.httpMethod = "POST" + + return service.run(request) + .retry(Config.retryCount) + .map { _ in () } + .eraseToAnyPublisher() + } + func uploadProfile(_ profile: NightscoutProfileStore) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 069f31b8eb..f397596cd2 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -14,8 +14,8 @@ protocol NightscoutManager: GlucoseSource { func uploadStatus() func uploadGlucose() func uploadStatistics(dailystat: Statistics) - func uploadPreferences() - func uploadProfile() + func uploadPreferences(_ preferences: Preferences) + func uploadProfileAndSettings() var cgmURL: URL? { get } } @@ -274,7 +274,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } } - func uploadPreferences() { + func uploadPreferences(_ preferences: Preferences) { let prefs = NightscoutPreferences( preferences: settingsManager.preferences ) @@ -289,6 +289,31 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { switch completion { case .finished: debug(.nightscout, "Preferences uploaded") + self.storage.save(preferences, as: OpenAPS.Nightscout.uploadedPreferences) + case let .failure(error): + debug(.nightscout, error.localizedDescription) + } + } receiveValue: {} + .store(in: &self.lifetime) + } + } + + func uploadSettings(_ settings: FreeAPSSettings) { + let sets = NightscoutSettings( + settings: settingsManager.settings + ) + + guard let nightscout = nightscoutAPI, isUploadEnabled else { + return + } + + processQueue.async { + nightscout.uploadSettings(sets) + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Settings uploaded") + self.storage.save(settings, as: OpenAPS.Nightscout.uploadedSettings) case let .failure(error): debug(.nightscout, error.localizedDescription) } @@ -401,12 +426,14 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } } - func uploadProfile() { + func uploadProfileAndSettings() { // These should be modified anyways and not the defaults guard let sensitivities = storage.retrieve(OpenAPS.Settings.insulinSensitivities, as: InsulinSensitivities.self), let basalProfile = storage.retrieve(OpenAPS.Settings.basalProfile, as: [BasalProfileEntry].self), let carbRatios = storage.retrieve(OpenAPS.Settings.carbRatios, as: CarbRatios.self), - let targets = storage.retrieve(OpenAPS.Settings.bgTargets, as: BGTargets.self) + let targets = storage.retrieve(OpenAPS.Settings.bgTargets, as: BGTargets.self), + let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self), + let settings = storage.retrieve(OpenAPS.FreeAPS.settings, as: FreeAPSSettings.self) else { NSLog("NightscoutManager uploadProfile Not all settings found to build profile!") return @@ -471,6 +498,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { // No, Decimal has no rounding function. carbs_hr = Decimal(round(Double(carbs_hr) * 10.0)) / 10 } + let ps = ScheduledNightscoutProfile( dia: settingsManager.pumpSettings.insulinActionCurve, carbs_hr: Int(carbs_hr), @@ -484,6 +512,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { units: nsUnits ) let defaultProfile = "default" + let now = Date() let p = NightscoutProfileStore( defaultProfile: defaultProfile, @@ -494,15 +523,31 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { store: [defaultProfile: ps] ) + guard let nightscout = nightscoutAPI, isNetworkReachable, isUploadEnabled else { + return + } + + // UPLOAD PREFERNCES WHEN CHANGED + if let uploadedPreferences = storage.retrieve(OpenAPS.Nightscout.uploadedPreferences, as: Preferences.self), + uploadedPreferences.rawJSON.sorted() == preferences.rawJSON.sorted() + { + NSLog("NightscoutManager Preferences, preferences unchanged") + } else { uploadPreferences(preferences) } + + // UPLOAD FreeAPS Settings WHEN CHANGED + if let uploadedSettings = storage.retrieve(OpenAPS.Nightscout.uploadedSettings, as: FreeAPSSettings.self), + uploadedSettings.rawJSON.sorted() == settings.rawJSON.sorted() + { + NSLog("NightscoutManager Settings, settings unchanged") + } else { uploadSettings(settings) } + if let uploadedProfile = storage.retrieve(OpenAPS.Nightscout.uploadedProfile, as: NightscoutProfileStore.self), - (uploadedProfile.store[defaultProfile]?.rawJSON ?? "") == ps.rawJSON + (uploadedProfile.store["default"]?.rawJSON ?? "").sorted() == ps.rawJSON.sorted() { NSLog("NightscoutManager uploadProfile, no profile change") return } - guard let nightscout = nightscoutAPI, isNetworkReachable, isUploadEnabled else { - return - } + processQueue.async { nightscout.uploadProfile(p) .sink { completion in @@ -520,7 +565,6 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { func uploadGlucose() { uploadGlucose(glucoseStorage.nightscoutGlucoseNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedGlucose) - uploadTreatments(glucoseStorage.nightscoutCGMStateNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedCGMState) } From 228bb99b3947c36f9ac6b0b2acff03eedc9fa1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 11 Oct 2023 15:01:54 +0200 Subject: [PATCH 050/405] Clean --- FreeAPS/Sources/APS/APSManager.swift | 8 -------- FreeAPS/Sources/APS/OpenAPS/Constants.swift | 1 - 2 files changed, 9 deletions(-) diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 7b8cd57ffc..e795af9fb1 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -993,14 +993,6 @@ final class BaseAPSManager: APSManager, Injectable { requestGFS.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.total) requestGFS.sortDescriptors = [sortGlucose] try? glucose = coredataContext.fetch(requestGFS) - // Today - /* - let requestGFS_1 = Readings.fetchRequest() as NSFetchRequest - requestGFS_1.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.today) - let sortGlucose_1 = NSSortDescriptor(key: "date", ascending: false) - requestGFS_1.sortDescriptors = [sortGlucose_1] - try? glucose_1 = coredataContext.fetch(requestGFS_1) - */ // First date let previous = glucose.last?.date ?? Date() diff --git a/FreeAPS/Sources/APS/OpenAPS/Constants.swift b/FreeAPS/Sources/APS/OpenAPS/Constants.swift index 0b5c161583..99ff9a025f 100644 --- a/FreeAPS/Sources/APS/OpenAPS/Constants.swift +++ b/FreeAPS/Sources/APS/OpenAPS/Constants.swift @@ -85,7 +85,6 @@ extension OpenAPS { static let uploadedCGMState = "upload/uploaded-cgm-state.json" static let uploadedPodAge = "upload/uploaded-pod-age.json" static let uploadedProfile = "upload/uploaded-profile.json" - static let profile = "fetched/profile.json" static let uploadedPreferences = "upload/uploaded-preferences.json" static let uploadedSettings = "upload/uploaded-settings.json" } From 435379698daf337c503d5fb28374701f735b781e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 11 Oct 2023 16:11:33 +0200 Subject: [PATCH 051/405] New Crowdin updates (#246) --- .../Main/ar.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/da.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/de.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/es.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/fi.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/fr.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/he.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/it.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/nb.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/nl.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/pl.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/pt-BR.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/pt-PT.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/ru.lproj/Localizable.strings | 50 +++++++++++++++++-- .../Main/sk.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/sv.lproj/Localizable.strings | 17 ++++--- .../Main/tr.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/uk.lproj/Localizable.strings | 42 ++++++++++++++++ .../Main/zh-Hans.lproj/Localizable.strings | 42 ++++++++++++++++ 19 files changed, 770 insertions(+), 11 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 0e38b4165c..cfa76a0a0d 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index befd2ee618..a0a593ffa2 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Tilføj Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Gem på Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 8de5b24421..e6260c768d 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Fernbedienung"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic-Pumpe hinzufügen"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Nur Autotune Basalinsulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Auf Pumpe speichern"; + /* Debug option view Pump History */ "Pump History" = "Insulinpumpen-Speicher"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index c9f3996654..67d4c75448 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Control a distancia"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Añadir Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Guardar en Bomba"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index f97ffee40b..125068fbf0 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 7ebc10fdb9..b0396303d4 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Contrôle à distance"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Ajouter une pompe Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Enregistrer sur la pompe"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 0e38b4165c..cfa76a0a0d 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 32689f4342..914080e2fe 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Controllo remoto"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Aggiungi microinfusore Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Salva sul microinfusore"; + /* Debug option view Pump History */ "Pump History" = "Cronologia Micro"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 7a579b92bd..cf4ae19a2e 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Fjernstyring"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nGå nøye gjennom alle de nye innstillingene:\n\n* Basalprofil\n * Karbohydratforhold\n * Blodsukkermål\n * Insulinfølsomhet\n\n i iAPS Innstillinger > Oppsett.\n\nFeil eller ugyldige profilinnstillinger kan ha katastrofale følger."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dette vil erstatte alle eller deler av dine nåværende pumpeinnstillinger. Er du sikker på at du vil importere profilinnstillinger fra Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nUgyldig Basalprofil fra Nightscout. \n\nImport avbrutt. Sjekk Basalprofil i Nightscout!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nInnstillinger ble importert men Basalprofilen kunne ikke lagres til pumpen (ingen pumpe). Sjekk din Basalprofil og trykk ´Lagre på pumpen´ for å sende den nye basalprofilen til pumpen."; + +/* Import Error Headline */ +"Import Error" = "Feil ved import"; + +/* */ +"Yes, Import" = "Ja, importer"; + +/* */ +"Import settings from Nightscout" = "Importer innstillinger fra Nightscout"; + +/* */ +"Import settings?" = "Importere innstillinger?"; + +/* */ +"Import from Nightscout" = "Import fra Nightscout"; + +/* */ +"Settings imported" = "Innstillinger importert"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nBlodsukkerenhet i Nightscout samsvarer ikke med blodsukkerenhet i Pumpeinnstillinger. Import av innstillinger er avbrutt."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Finner ikke standard profil i Nightscout."; + /* Add Medtronic pump */ "Add Medtronic" = "Legge til Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Bare bruk Autotune på basalinsulin"; +/* */ +"Save as your Normal Basal Rates" = "Lagre som standard basalprofil"; + +/* */ +"Save on Pump" = "Lagre på pumpen"; + /* Debug option view Pump History */ "Pump History" = "Pumpehistorikk"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index bb63f906ae..2faa3ab221 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Afstandsbediening"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic toevoegen"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Alleen Autotune basale insuline"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Opslaan op pomp"; + /* Debug option view Pump History */ "Pump History" = "Pomp geschiedenis"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 0e7014406f..d4650a772a 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -316,6 +316,42 @@ Połączono z Nightscout!"; /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -1060,6 +1096,12 @@ Połączono z Nightscout!"; /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Zapisz na pompie"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 5d2b50df0f..d7c00bbbe6 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Controle remoto"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Adicionar Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Salvar na Bomba"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 603e3e2261..df14b17721 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Controle remoto"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Adicionar Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Salvar na Bomba"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index be36b12b1d..eeb665bf02 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Продолжить без болюса"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nКоличество превышает максимальную дозу болюса! \nВы уверены, что хотите добавить "; /* Header */ "Enact Bolus" = "Ввод болюса"; @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Удаленное управление"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nПожалуйста, проверьте все ваши новые настройки:\n\n* Настройки базала\n * Углеводные коэффициенты\n * Целевой диапазон\n * Чувствительность к инсулину\n\n в настройках iAPS Настройки > Конфигурация.\n\nНекорректные настройки профиля могут привести к катастрофическим последствиям."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Это заменит некоторые или все ваши текущие настройки помпы. Вы уверены, что хотите импортировать настройки профиля из Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nНедопустимые настройки базы в Nightcsout. \n\nИмпорт прерван. Пожалуйста, проверьте настройки профиля в Nightscout!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nНастройки были импортированы, но базальный профиль не удалось сохранить в помпе (нет помпы). Проверьте свои настройки базы и нажмите \"Сохранить на помпу\", чтобы синхронизировать новый базальный профиль"; + +/* Import Error Headline */ +"Import Error" = "Ошибка импорта"; + +/* */ +"Yes, Import" = "Да, импортировать"; + +/* */ +"Import settings from Nightscout" = "Импортировать настройки из Nightscout"; + +/* */ +"Import settings?" = "Импорт настроек?"; + +/* */ +"Import from Nightscout" = "Импорт из Nightscout"; + +/* */ +"Settings imported" = "Настройки импортированы"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nНесоответствие единиц измерения глюкозы в настройках Nightscout и помпы. Импорт настроек прерван."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Не удается найти профиль Nightscout по умолчанию."; + /* Add Medtronic pump */ "Add Medtronic" = "Добавить Medtronic"; @@ -522,13 +558,13 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Калибровки"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Создавать события в календаре"; /* */ "Calendar" = "Календарь"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Автоматически"; /* */ "Other" = "Прочее"; @@ -966,7 +1002,7 @@ Enact a temp Basal or a temp target */ "Bolus failed" = "Болюс не выполнен"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Максимальный болюс превышен!"; /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Болюс не выполнен или неточный. Перед повторением проверьте историю помпы."; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Автотюн только Базального инсулина"; +/* */ +"Save as your Normal Basal Rates" = "Сохранить как Ваш нормальный базальный профиль"; + +/* */ +"Save on Pump" = "Сохранить на помпу"; + /* Debug option view Pump History */ "Pump History" = "История помпы"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 65fe95c5c3..ae4e0ac369 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7896bc0b09..51bf90ef73 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Fortsätt utan bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDetta är mer insulin än maxdos-inställning!\nÄr du säker på att du vill lägga till "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDetta är mer insulin än din maxdos-inställning!\nÄr du säker på att du vill lägga till "; /* Header */ "Enact Bolus" = "Ge bolus"; @@ -321,10 +321,10 @@ Enact a temp Basal or a temp target */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Detta kommer att ersätta alla eller vissa av dina pumpinställningar. Är du säker att du vill fortsätta med import av inställningar?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nDu har ogiltiga basalinställningar i Nightscouts profilinställningar.\n\nImport avbruten. Du behöver kontrollera dina Nightcoutinställningar."; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nDu har ogiltiga basalinställningar i Nightscouts profilinställningar. \n\nImport avbruten. Du behöver kontrollera dina Nightcoutinställningar."; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nDina inställningar blev importerade men kunde inte sparas till pump (Ingen pump). Kontrollera dina pumpinstälningar och klicka därefter på ´Spara på pump´ för att programmera din pump med de nya basalinställningarna"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nDina inställningar blev importerade men kunde inte sparas till pump (Ingen pump). Kontrollera dina pumpinstälningar och klicka därefter på ´Spara på pump´ för att programmera din pump med de nya basalinställningarna"; /* Import Error Headline */ "Import Error" = "Fel vd import av inställningar"; @@ -1007,9 +1007,6 @@ Enact a temp Basal or a temp target */ /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Misslyckad eller felaktig bolus. Kontrollera pumpens historik innan du försöker igen."; -/* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Du kan inte ge mer än din maxinställning!"; - /* */ "Carbs" = "Kolhydrater"; @@ -1103,6 +1100,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Autojustera endast basalinställningar"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Spara på pump"; + /* Debug option view Pump History */ "Pump History" = "Pumphistorik"; @@ -1166,7 +1169,7 @@ Enact a temp Basal or a temp target */ "Error" = "Fel"; /* Manual temp basal mode */ -"Manual" = "Manuell"; +"Manual" = "Manuellt"; /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 8411e89bbd..ae2bf12e62 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Uzaktan kontrol"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic Pompa ekle"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Pompa'ya Kaydet"; + /* Debug option view Pump History */ "Pump History" = "Pompa geçmişi"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 16034cb209..c4271b3deb 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Віддалене керування"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nТепер уважно перевірте всі ваші нові налаштування:\n\n* Базальні параметри\n * Вуглеводні співвідношення\n * Цільові показники глюкози\n * Чутливість до інсуліну\n\n у меню «Налаштування iAPS» > «Конфігурація».\n\nПоганий або недійсний профіль налаштування можуть мати згубні наслідки."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Це замінить деякі або всі поточні налаштування Помпи. Ви впевнені, що бажаєте імпортувати налаштування профілю з Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nНедійсні базальні налаштування Nightcsout. \n\nІмпорт перервано. Будь ласка, перевірте базальні налаштування свого профілю Nightscout!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nНалаштування було імпортовано, але Базал не вдалося зберегти для помпи (немає помпи). Перевірте свої базальні налаштування та натисніть «Зберегти на помпі», щоб синхронізувати нові базальні налаштування"; + +/* Import Error Headline */ +"Import Error" = "Помилка імпорту"; + +/* */ +"Yes, Import" = "Так, імпортувати"; + +/* */ +"Import settings from Nightscout" = "Імпортуйте налаштування з Nightscout"; + +/* */ +"Import settings?" = "Імпортувати налаштування?"; + +/* */ +"Import from Nightscout" = "ІМПОРТ З NIGHTSCOUT"; + +/* */ +"Settings imported" = "Налаштування імпортовано"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nНевідповідність одиниць глюкози в налаштуваннях Nightscout та Помпи. Імпорт налаштувань скасовано."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Не вдається знайти профіль Nightscout за замовчуванням."; + /* Add Medtronic pump */ "Add Medtronic" = "Додати Medtronic"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Тільки Autotune Базал Інсулін"; +/* */ +"Save as your Normal Basal Rates" = "Зберегти як Нормальний Базальний Профіль"; + +/* */ +"Save on Pump" = "Зберегти на Помпі"; + /* Debug option view Pump History */ "Pump History" = "Історія Помпи"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 6b9394d9f7..a83c9fa4d4 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -314,6 +314,42 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "远程控制"; +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + /* Add Medtronic pump */ "Add Medtronic" = "添加美敦力泵"; @@ -1058,6 +1094,12 @@ Enact a temp Basal or a temp target */ /* Autotune config */ "Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "在泵上保存"; + /* Debug option view Pump History */ "Pump History" = "Pump History"; From bb0d24880ea41360cce024e145bf2851e03236ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 11 Oct 2023 17:11:52 +0200 Subject: [PATCH 052/405] Make button prominent (cherry picked from commit ceb34e4b1561e12610aa3200d2bca90d483f3d24) --- .../Sources/Modules/Settings/View/SettingsRootView.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index e2690b9c80..53bb3c63d0 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -49,8 +49,11 @@ extension Settings { Toggle("Debug options", isOn: $state.debugOptions) if state.debugOptions { Group { - Text("NS Upload Profile and Settings").onTapGesture { - state.uploadProfileAndSettings() + HStack { + Text("NS Upload Profile and Settings") + Button("Upload") { state.uploadProfileAndSettings() } + .frame(maxWidth: .infinity, alignment: .trailing) + .buttonStyle(.borderedProminent) } } Group { From 99a6073f454b21b36d86cb66071386219d3ae7c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 12 Oct 2023 23:24:03 +0200 Subject: [PATCH 053/405] New strings --- FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-BR.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-PT.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings | 2 +- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 2 +- .../NightscoutConfig/View/NightscoutConfigRootView.swift | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index cfa76a0a0d..daf5e9c1f0 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index a0a593ffa2..24fe70b286 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index e6260c768d..8f1d65b69f 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Fernbedienung"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index fb69987b14..d5411e8908 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 67d4c75448..65fa811e6d 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Control a distancia"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 125068fbf0..b34ab36792 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index b0396303d4..8e8490bfeb 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Contrôle à distance"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index cfa76a0a0d..daf5e9c1f0 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 914080e2fe..55635b473b 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Controllo remoto"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index cf4ae19a2e..7d6d7ed55b 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Fjernstyring"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nGå nøye gjennom alle de nye innstillingene:\n\n* Basalprofil\n * Karbohydratforhold\n * Blodsukkermål\n * Insulinfølsomhet\n\n i iAPS Innstillinger > Oppsett.\n\nFeil eller ugyldige profilinnstillinger kan ha katastrofale følger."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nGå nøye gjennom alle de nye innstillingene:\n\n* Basalprofil\n * Karbohydratforhold\n * Blodsukkermål\n * Insulinfølsomhet\n\n i iAPS Innstillinger > Oppsett.\n\nFeil eller ugyldige profilinnstillinger kan ha katastrofale følger."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dette vil erstatte alle eller deler av dine nåværende pumpeinnstillinger. Er du sikker på at du vil importere profilinnstillinger fra Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 2faa3ab221..1890243bf2 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Afstandsbediening"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index d4650a772a..cc8f68a061 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -317,7 +317,7 @@ Połączono z Nightscout!"; "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index d7c00bbbe6..72095619dc 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Controle remoto"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index df14b17721..c115dbd101 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Controle remoto"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index eeb665bf02..3f6d123e4b 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Удаленное управление"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nПожалуйста, проверьте все ваши новые настройки:\n\n* Настройки базала\n * Углеводные коэффициенты\n * Целевой диапазон\n * Чувствительность к инсулину\n\n в настройках iAPS Настройки > Конфигурация.\n\nНекорректные настройки профиля могут привести к катастрофическим последствиям."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nПожалуйста, проверьте все ваши новые настройки:\n\n* Настройки базала\n * Углеводные коэффициенты\n * Целевой диапазон\n * Чувствительность к инсулину\n\n в настройках iAPS Настройки > Конфигурация.\n\nНекорректные настройки профиля могут привести к катастрофическим последствиям."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Это заменит некоторые или все ваши текущие настройки помпы. Вы уверены, что хотите импортировать настройки профиля из Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index ae4e0ac369..54fc1f76f6 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Remote control"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 51bf90ef73..846252827c 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Fjärrstyrning"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nKontrollera nu alla dina nya pumpinställningar noga:\n\n* Basalinställningar\n * Insulinkvoter\n * Målvärden\n * Insulinkänslighet\n\n i Inställningar > Konfiguration.\n\nDåliga eller ogiltiga pumpinställningar kan gå katastrofala följder."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nKontrollera nu alla dina nya pumpinställningar noga:\n\n* Basalinställningar\n * Insulinkvoter\n * Målvärden\n * Insulinkänslighet\n\n i Inställningar > Konfiguration.\n\nDåliga eller ogiltiga pumpinställningar kan gå katastrofala följder."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Detta kommer att ersätta alla eller vissa av dina pumpinställningar. Är du säker att du vill fortsätta med import av inställningar?"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index ae2bf12e62..1d73a4d269 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Uzaktan kontrol"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index c4271b3deb..8a346bce65 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Віддалене керування"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nТепер уважно перевірте всі ваші нові налаштування:\n\n* Базальні параметри\n * Вуглеводні співвідношення\n * Цільові показники глюкози\n * Чутливість до інсуліну\n\n у меню «Налаштування iAPS» > «Конфігурація».\n\nПоганий або недійсний профіль налаштування можуть мати згубні наслідки."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nТепер уважно перевірте всі ваші нові налаштування:\n\n* Базальні параметри\n * Вуглеводні співвідношення\n * Цільові показники глюкози\n * Чутливість до інсуліну\n\n у меню «Налаштування iAPS» > «Конфігурація».\n\nПоганий або недійсний профіль налаштування можуть мати згубні наслідки."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Це замінить деякі або всі поточні налаштування Помпи. Ви впевнені, що бажаєте імпортувати налаштування профілю з Nightscout?"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index a83c9fa4d4..ce451e52aa 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -315,7 +315,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "远程控制"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 7df3bfa506..157f5a773b 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -96,7 +96,7 @@ extension NightscoutConfig { message: Text( (fetchedErrors.first?.error ?? "").count < 4 ? NSLocalizedString( - "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects.", + "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects.", comment: "Imported Profiles Alert" ) : NSLocalizedString(fetchedErrors.first?.error ?? "", comment: "Import Error") From 8a4b47dc68ae43a99296a3e28945a8589960d42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 13 Oct 2023 13:13:24 +0200 Subject: [PATCH 054/405] Validate also CR and ISF on import. Don't allow 0 or lower vallues (cherry picked from commit aecd32067559c21a0f34cb63e221b9c4e0afde99) --- .../NightscoutConfigStateModel.swift | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index cb6a329b70..7b8d764af9 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -158,14 +158,24 @@ extension NightscoutConfig { return } + var areCRsOK = true let carbratios = fetchedProfile.carbratio .map { carbratio -> CarbRatioEntry in - CarbRatioEntry( + if carbratio.value <= 0 { + error = + "\nInvalid Carb Ratio settings in Nightscout.\n\nImport aborted. Please check your Nightscout Profile Carb Ratios Settings!" + areCRsOK = false + } + return CarbRatioEntry( start: carbratio.time, offset: (carbratio.timeAsSeconds ?? self.offset(carbratio.time)) / 60, ratio: carbratio.value ) } let carbratiosProfile = CarbRatios(units: CarbUnit.grams, schedule: carbratios) + guard areCRsOK else { + group.leave() + return + } var areBasalsOK = true let basals = fetchedProfile.basal @@ -184,12 +194,21 @@ extension NightscoutConfig { group.leave() return } + let sensitivities = fetchedProfile.sens.map { sensitivity -> InsulinSensitivityEntry in InsulinSensitivityEntry( sensitivity: self.units == .mmolL ? sensitivity.value : sensitivity.value.asMgdL, offset: (sensitivity.timeAsSeconds ?? self.offset(sensitivity.time)) / 60, start: sensitivity.time - ) } + ) + } + if sensitivities.filter({ $0.sensitivity <= 0 }).isNotEmpty { + error = + "\nInvalid Nightcsout Sensitivities Settings. \n\nImport aborted. Please check your Nightscout Profile Sensitivities Settings!" + group.leave() + return + } + let sensitivitiesProfile = InsulinSensitivities( units: self.units, userPrefferedUnits: self.units, From 5aaf3c2fe3374bc3ed722406598353c6fa1517cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 13 Oct 2023 13:23:31 +0200 Subject: [PATCH 055/405] Don't allow DIA of 0 or lower --- .../Modules/NightscoutConfig/NightscoutConfigStateModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 7b8d764af9..bdc143193a 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -257,7 +257,7 @@ extension NightscoutConfig { debug(.service, "Settings have been imported and the Basals saved to pump!") // DIA. Save if changed. let dia = fetchedProfile.dia - if dia != self.dia { + if dia != self.dia, dia <= 0 { let file = PumpSettings( insulinActionCurve: dia, maxBolus: self.maxBolus, From ba336fdb83db24bbb9b0c73fcc142e02990114e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 14 Oct 2023 15:35:38 +0200 Subject: [PATCH 056/405] More logging --- FreeAPS/Sources/Services/Network/NightscoutManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index f397596cd2..a418304da2 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -603,7 +603,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { self.storage.save(glucose, as: fileToSave) debug(.nightscout, "Glucose uploaded") case let .failure(error): - debug(.nightscout, error.localizedDescription) + debug(.nightscout, "Upload of glucose failed: " + error.localizedDescription) } } receiveValue: {} .store(in: &self.lifetime) From e56875d349683540dc444c9e68ac15d171bfe850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 15 Oct 2023 01:48:32 +0200 Subject: [PATCH 057/405] Allow DASH pumps to have 0U/h basal entries upon import, but total basal insulin (24h) still needs to be over 0U. Don't allow other pumps to have 0U/h entries upon import. --- .../NightscoutConfigStateModel.swift | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index bdc143193a..b244ff11bb 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -178,11 +178,13 @@ extension NightscoutConfig { } var areBasalsOK = true + let pumpName = self.apsManager.pumpName.value let basals = fetchedProfile.basal .map { basal -> BasalProfileEntry in - if basal.value <= 0 || basal.value >= self.maxBasal { + if pumpName != "Omnipod DASH", basal.value <= 0 + { error = - "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" + "\nInvalid Nightcsout Basal Settings. Some or all of your basal settings are 0 U/h.\n\nImport aborted. Please check your Nightscout Profile Basal Settings before trying to import again. Import has been aborted.)" areBasalsOK = false } return BasalProfileEntry( @@ -190,6 +192,13 @@ extension NightscoutConfig { minutes: (basal.timeAsSeconds ?? self.offset(basal.time)) / 60, rate: basal.value ) } + // DASH pumps can have 0U/h basal rates but don't import if total basals (24 hours) amount to 0 U. + if pumpName == "Omnipod DASH", basals.map({ each in each.rate }).reduce(0, +) <= 0 + { + error = + "\nYour total Basal insulin amount to 0 U or lower in Nightscout Profile settings.\n\n Please check your Nightscout Profile Basal Settings before trying to import again. Import has been aborted.)" + areBasalsOK = false + } guard areBasalsOK else { group.leave() return From cc158e2660e2b307bb527a2e3766801f6a8432c7 Mon Sep 17 00:00:00 2001 From: Pierre L Date: Sun, 15 Oct 2023 15:23:47 +0200 Subject: [PATCH 058/405] Fix healthkit issue for Insulin treatment Fix the healthKit sync when stopped before the end #231 Fix the 0U basal in healthKit #149 --- FreeAPS/Sources/APS/APSManager.swift | 5 -- .../Services/HealthKit/HealthKitManager.swift | 47 +++++++++++++++++-- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index e795af9fb1..106ce42522 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -72,7 +72,6 @@ final class BaseAPSManager: APSManager, Injectable { @Injected() private var nightscout: NightscoutManager! @Injected() private var settingsManager: SettingsManager! @Injected() private var broadcaster: Broadcaster! - @Injected() private var healthKitManager: HealthKitManager! @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() @Persisted(key: "lastStartLoopDate") private var lastStartLoopDate: Date = .distantPast @Persisted(key: "lastLoopDate") var lastLoopDate: Date = .distantPast { @@ -268,10 +267,6 @@ final class BaseAPSManager: APSManager, Injectable { private func loopCompleted(error: Error? = nil, loopStatRecord: LoopStats) { isLooping.send(false) - // save AH events - let events = pumpHistoryStorage.recent() - healthKitManager.saveIfNeeded(pumpEvents: events) - if let error = error { warning(.apsManager, "Loop failed with error: \(error.localizedDescription)") if let backgroundTask = backGroundTaskID { diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index e098713b59..0b043b018a 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -31,7 +31,7 @@ protocol HealthKitManager: GlucoseSource { func deleteInsulin(syncID: String) } -final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { +final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, PumpHistoryObserver { private enum Config { // unwraped HKObjects static var readPermissions: Set { @@ -68,7 +68,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { } get { guard let data = persistedBGAnchor else { return nil } - return try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? HKQueryAnchor + return try? NSKeyedUnarchiver.unarchivedObject(ofClass: HKQueryAnchor.self, from: data) } } @@ -115,6 +115,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { enableBackgroundDelivery() broadcaster.register(CarbsObserver.self, observer: self) + broadcaster.register(PumpHistoryObserver.self, observer: self) debug(.service, "HealthKitManager did create") } @@ -226,6 +227,21 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { events.isNotEmpty else { return } + func delete(syncIds: [String]?) { + syncIds?.forEach { syncID in + let predicate = HKQuery.predicateForObjects( + withMetadataKey: HKMetadataKeySyncIdentifier, + operatorType: .equalTo, + value: syncID + ) + + self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in + guard let error = error else { return } + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } + } + } + func save(bolus: [InsulinBolus], basal: [InsulinBasal]) { let bolusSamples = bolus .map { @@ -264,6 +280,26 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { healthKitStore.save(bolusSamples + basalSamples) { _, _ in } } + // delete existing event in HK where the amount is not the last value in the pumphistory + loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) + .receive(on: processQueue) + .compactMap { samples -> [String] in + let sampleIDs = samples.compactMap(\.syncIdentifier) + let bolusToDelete = events + .filter { $0.type == .bolus && sampleIDs.contains($0.id) } + .compactMap { event -> String? in + guard let amount = event.amount else { return nil } + guard let sampleAmount = samples.first(where: { $0.syncIdentifier == event.id }) as? HKQuantitySample + else { return nil } + if Double(amount) != sampleAmount.quantity.doubleValue(for: .internationalUnit()) { + return sampleAmount.syncIdentifier + } else { return nil } + } + return bolusToDelete + } + .sink(receiveValue: delete) + .store(in: &lifetime) + loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) .receive(on: processQueue) .compactMap { samples -> ([InsulinBolus], [InsulinBasal]) in @@ -276,6 +312,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { } let basalEvents = events .filter { $0.type == .tempBasal && !sampleIDs.contains($0.id) } + .sorted(by: { $0.timestamp < $1.timestamp }) let basal = basalEvents.enumerated() .compactMap { item -> InsulinBasal? in let nextElementEventIndex = item.offset + 1 @@ -300,7 +337,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { } let id = String(item.element.id.dropFirst()) - guard amountRounded >= 0, + guard amountRounded > 0, id != "" else { return nil } @@ -317,6 +354,10 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver { .store(in: &lifetime) } + func pumpHistoryDidUpdate(_ events: [PumpHistoryEvent]) { + saveIfNeeded(pumpEvents: events) + } + func createBGObserver() { guard settingsManager.settings.useAppleHealth else { return } From 0a47ccf0a6df0fe82694a710d7689aa53c3b1df2 Mon Sep 17 00:00:00 2001 From: Pierre L Date: Sun, 15 Oct 2023 19:09:14 +0200 Subject: [PATCH 059/405] Add carbs shortcuts Add shortcuts to add carbs with a specific date and fat/protein information. --- FreeAPS.xcodeproj/project.pbxproj | 16 ++++ FreeAPS/Sources/Shortcuts/AppShortcuts.swift | 7 ++ .../Shortcuts/BaseIntentsRequest.swift | 3 + .../Shortcuts/Carbs/AddCarbPresetIntent.swift | 94 +++++++++++++++++++ .../Carbs/CarbPresetIntentRequest.swift | 36 +++++++ .../Shortcuts/State/StateIntentRequest.swift | 4 - 6 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 FreeAPS/Sources/Shortcuts/Carbs/AddCarbPresetIntent.swift create mode 100644 FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 3a08add0da..54bdb94ff3 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -305,6 +305,8 @@ CA370FC152BC98B3D1832968 /* BasalProfileEditorRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */; }; CC6C406E2ACDD69E009B8058 /* RawFetchedProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */; }; CD78BB94E43B249D60CC1A1B /* NotificationsConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22963BD06A9C83959D4914E4 /* NotificationsConfigRootView.swift */; }; + CE1856F52ADC4858007E39C7 /* AddCarbPresetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1856F42ADC4858007E39C7 /* AddCarbPresetIntent.swift */; }; + CE1856F72ADC4869007E39C7 /* CarbPresetIntentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1856F62ADC4869007E39C7 /* CarbPresetIntentRequest.swift */; }; CE2FAD38297D69E1001A872C /* ShareClient.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CE398D1A297D69A900DF218F /* ShareClient.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CE2FAD3A297D93F0001A872C /* BloodGlucoseExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2FAD39297D93F0001A872C /* BloodGlucoseExtensions.swift */; }; CE398D16297C9D1D00DF218F /* dexcomSourceG7.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE398D15297C9D1D00DF218F /* dexcomSourceG7.swift */; }; @@ -820,6 +822,8 @@ C377490C77661D75E8C50649 /* ManualTempBasalRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalRootView.swift; sourceTree = ""; }; C8D1A7CA8C10C4403D4BBFA7 /* BolusDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusDataFlow.swift; sourceTree = ""; }; CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawFetchedProfile.swift; sourceTree = ""; }; + CE1856F42ADC4858007E39C7 /* AddCarbPresetIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCarbPresetIntent.swift; sourceTree = ""; }; + CE1856F62ADC4869007E39C7 /* CarbPresetIntentRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarbPresetIntentRequest.swift; sourceTree = ""; }; CE2FAD39297D93F0001A872C /* BloodGlucoseExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BloodGlucoseExtensions.swift; sourceTree = ""; }; CE398D012977349800DF218F /* CryptoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoKit.framework; path = System/Library/Frameworks/CryptoKit.framework; sourceTree = SDKROOT; }; CE398D15297C9D1D00DF218F /* dexcomSourceG7.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dexcomSourceG7.swift; sourceTree = ""; }; @@ -2058,9 +2062,19 @@ path = Bolus; sourceTree = ""; }; + CE1856F32ADC4835007E39C7 /* Carbs */ = { + isa = PBXGroup; + children = ( + CE1856F42ADC4858007E39C7 /* AddCarbPresetIntent.swift */, + CE1856F62ADC4869007E39C7 /* CarbPresetIntentRequest.swift */, + ); + path = Carbs; + sourceTree = ""; + }; CE7CA3422A064973004BE681 /* Shortcuts */ = { isa = PBXGroup; children = ( + CE1856F32ADC4835007E39C7 /* Carbs */, CE7CA3432A064973004BE681 /* AppShortcuts.swift */, CE7CA3442A064973004BE681 /* BaseIntentsRequest.swift */, CE7CA3452A064973004BE681 /* TempPresets */, @@ -2590,6 +2604,7 @@ 388358C825EEF6D200E024B2 /* BasalProfileEntry.swift in Sources */, 3811DE0B25C9D32F00A708ED /* BaseView.swift in Sources */, 3811DE3225C9D49500A708ED /* HomeDataFlow.swift in Sources */, + CE1856F52ADC4858007E39C7 /* AddCarbPresetIntent.swift in Sources */, 38569347270B5DFB0002C50D /* CGMType.swift in Sources */, 3821ED4C25DD18BA00BC42AD /* Constants.swift in Sources */, 384E803425C385E60086DB71 /* JavaScriptWorker.swift in Sources */, @@ -2664,6 +2679,7 @@ CE7CA3532A064973004BE681 /* tempPresetIntent.swift in Sources */, D6DEC113821A7F1056C4AA1E /* NightscoutConfigDataFlow.swift in Sources */, 38E98A3025F52FF700C0CED0 /* Config.swift in Sources */, + CE1856F72ADC4869007E39C7 /* CarbPresetIntentRequest.swift in Sources */, BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */, 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, diff --git a/FreeAPS/Sources/Shortcuts/AppShortcuts.swift b/FreeAPS/Sources/Shortcuts/AppShortcuts.swift index 1a20c7b812..026ba87999 100644 --- a/FreeAPS/Sources/Shortcuts/AppShortcuts.swift +++ b/FreeAPS/Sources/Shortcuts/AppShortcuts.swift @@ -17,5 +17,12 @@ import Foundation "\(.applicationName) state" ] ) + AppShortcut( + intent: AddCarbPresentIntent(), + phrases: [ + "Add carbs in \(.applicationName)", + "\(.applicationName) allows to add carbs" + ] + ) } } diff --git a/FreeAPS/Sources/Shortcuts/BaseIntentsRequest.swift b/FreeAPS/Sources/Shortcuts/BaseIntentsRequest.swift index e2b574222e..34224ed335 100644 --- a/FreeAPS/Sources/Shortcuts/BaseIntentsRequest.swift +++ b/FreeAPS/Sources/Shortcuts/BaseIntentsRequest.swift @@ -10,6 +10,9 @@ import Swinject @Injected() var settingsManager: SettingsManager! @Injected() var storage: TempTargetsStorage! @Injected() var fileStorage: FileStorage! + @Injected() var carbsStorage: CarbsStorage! + @Injected() var glucoseStorage: GlucoseStorage! + @Injected() var apsManager: APSManager! let resolver: Resolver diff --git a/FreeAPS/Sources/Shortcuts/Carbs/AddCarbPresetIntent.swift b/FreeAPS/Sources/Shortcuts/Carbs/AddCarbPresetIntent.swift new file mode 100644 index 0000000000..db42f304cb --- /dev/null +++ b/FreeAPS/Sources/Shortcuts/Carbs/AddCarbPresetIntent.swift @@ -0,0 +1,94 @@ +import AppIntents +import Foundation +import Intents +import Swinject + +@available(iOS 16.0,*) struct AddCarbPresentIntent: AppIntent { + // Title of the action in the Shortcuts app + static var title: LocalizedStringResource = "Add carbs" + + // Description of the action in the Shortcuts app + static var description = IntentDescription("Allow to add carbs in iAPS.") + + internal var carbRequest: CarbPresetIntentRequest + + init() { + carbRequest = CarbPresetIntentRequest() + dateAdded = Date() + } + + @Parameter( + title: "Quantity Carbs", + description: "Quantity of carbs in g", + controlStyle: .field, + inclusiveRange: (lowerBound: 0, upperBound: 200), + requestValueDialog: IntentDialog("What is the numeric value of the carb to add") + ) var carbQuantity: Double? + + @Parameter( + title: "Quantity fat", + description: "Quantity of fat in g", + default: 0.0, + inclusiveRange: (0, 200) + ) var fatQuantity: Double + + @Parameter( + title: "Quantity Protein", + description: "Quantity of Protein in g", + default: 0.0, + inclusiveRange: (0, 200) + ) var proteinQuantity: Double + + @Parameter( + title: "Date", + description: "Date of adding" + ) var dateAdded: Date + + @Parameter( + title: "Confirm Before applying", + description: "If toggled, you will need to confirm before applying", + default: true + ) var confirmBeforeApplying: Bool + + static var parameterSummary: some ParameterSummary { + When(\.$confirmBeforeApplying, .equalTo, true, { + Summary("Applying \(\.$carbQuantity) at \(\.$dateAdded)") { + \.$fatQuantity + \.$proteinQuantity + \.$confirmBeforeApplying + } + }, otherwise: { + Summary("Immediately applying \(\.$carbQuantity) at \(\.$dateAdded)") { + \.$fatQuantity + \.$proteinQuantity + \.$confirmBeforeApplying + } + }) + } + + @MainActor func perform() async throws -> some ProvidesDialog { + do { + let quantityCarbs: Double + if let cq = carbQuantity { + quantityCarbs = cq + } else { + quantityCarbs = try await $carbQuantity.requestValue("How many carbs ?") + } + + let quantityCarbsName = quantityCarbs.toString() + if confirmBeforeApplying { + try await requestConfirmation( + result: .result(dialog: "Are you sure to add \(quantityCarbsName) g of carbs ?") + ) + } + + let finalQuantityCarbsDisplay = try carbRequest.addCarbs(quantityCarbs, fatQuantity, proteinQuantity, dateAdded) + return .result( + dialog: IntentDialog(stringLiteral: finalQuantityCarbsDisplay) + ) + + } catch { + throw error + } + } +} diff --git a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift new file mode 100644 index 0000000000..e891f3012a --- /dev/null +++ b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift @@ -0,0 +1,36 @@ +import CoreData +import Foundation + +@available(iOS 16.0,*) final class CarbPresetIntentRequest: BaseIntentsRequest { + func addCarbs(_ quantityCarbs: Double, _ quantityFat: Double, _ quantityProtein: Double, _ dateAdded: Date) throws -> String { + guard quantityCarbs >= 0.0 || quantityFat >= 0.0 || quantityProtein >= 0.0 else { + return "no adding carbs in iAPS" + } + + let carbs = min(Decimal(quantityCarbs), settingsManager.settings.maxCarbs) + + carbsStorage.storeCarbs( + [CarbsEntry( + id: UUID().uuidString, + createdAt: dateAdded, + carbs: carbs, + fat: Decimal(quantityFat), + protein: Decimal(quantityProtein), + note: "add with shortcuts", + enteredBy: CarbsEntry.manual, + isFPU: false, fpuID: nil + )] + ) + var resultDisplay: String + resultDisplay = "\(carbs) g carbs" + if quantityFat > 0.0 { + resultDisplay = "\(resultDisplay) and \(quantityFat) g fats" + } + if quantityProtein > 0.0 { + resultDisplay = "\(resultDisplay) and \(quantityProtein) g protein" + } + let dateName = dateAdded.formatted() + resultDisplay = "\(resultDisplay) added at \(dateName)" + return resultDisplay + } +} diff --git a/FreeAPS/Sources/Shortcuts/State/StateIntentRequest.swift b/FreeAPS/Sources/Shortcuts/State/StateIntentRequest.swift index 11933b8a9a..1e7560d1e5 100644 --- a/FreeAPS/Sources/Shortcuts/State/StateIntentRequest.swift +++ b/FreeAPS/Sources/Shortcuts/State/StateIntentRequest.swift @@ -54,10 +54,6 @@ enum StateIntentError: Error { } @available(iOS 16.0, *) final class StateIntentRequest: BaseIntentsRequest { - @Injected() private var glucoseStorage: GlucoseStorage! - @Injected() private var carbsStorage: CarbsStorage! - @Injected() private var apsManager: APSManager! - func getLastBG() throws -> (dateGlucose: Date, glucose: String, trend: String, delta: String) { let glucose = glucoseStorage.recent() guard let lastGlucose = glucose.last, let glucoseValue = lastGlucose.glucose else { throw StateIntentError.NoBG } From 5628ca9499836c248c9ef46c4b70caee857acc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 15 Oct 2023 22:17:48 +0200 Subject: [PATCH 060/405] Update Crowdin configuration file --- crowdin.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crowdin.yml b/crowdin.yml index 84bfebfd5e..dcad207805 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -44,3 +44,5 @@ files: translation: /Dependencies/CGMBLEKit/CGMBLEKit/%osx_locale%.lproj/Localizable.strings - source: //Dependencies/CGMBLEKit/CGMBLEKitUI/en.lproj/TransmitterManagerSetup.strings translation: /Dependencies/CGMBLEKit/CGMBLEKitUI/%osx_locale%.lproj/TransmitterManagerSetup.strings + - source: /Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings + translation: /Dependencies/G7SensorKit/G7SensorKitUI/%osx_locale%.lproj/Localizable.strings From 8eeaeb343d0fde2ee778017fb412e27cda32800a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 15 Oct 2023 22:41:27 +0200 Subject: [PATCH 061/405] New missing strings G7 --- .../G7SensorKitUI/Views/G7StartupView.swift | 2 +- .../da.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 2 +- .../en.lproj/Localizable.strings | 119 +++++++++++++++++- .../es.lproj/Localizable.strings | 2 +- .../fr.lproj/Localizable.strings | 2 +- .../hi.lproj/Localizable.strings | 2 +- .../it.lproj/Localizable.strings | 2 +- .../nb.lproj/Localizable.strings | 2 +- .../nl.lproj/Localizable.strings | 2 +- .../pl.lproj/Localizable.strings | 2 +- .../ro.lproj/Localizable.strings | 2 +- .../ru.lproj/Localizable.strings | 2 +- .../sk.lproj/Localizable.strings | 2 +- .../tr.lproj/Localizable.strings | 2 +- 15 files changed, 132 insertions(+), 15 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift index edc999c4cb..af76fb0da2 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift +++ b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift @@ -26,7 +26,7 @@ struct G7StartupView: View { .frame(height: 120) .padding(.horizontal) }.frame(maxWidth: .infinity) - Text(LocalizedString("Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.", comment: "Descriptive text on G7StartupView")) + Text(LocalizedString("iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.", comment: "Descriptive text on G7StartupView")) .fixedSize(horizontal: false, vertical: true) .foregroundColor(.secondary) Spacer() diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings index 6640a318a5..6687027447 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Seneste aflæsning"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan aflæse data fra en G7 sensor, men du skal stadig benytte Dexcoms egen G7 App til at parre, kalibrere og administrere G7-sensoren."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan aflæse data fra en G7 sensor, men du skal stadig benytte Dexcoms egen G7 App til at parre, kalibrere og administrere G7-sensoren."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LAV"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index 6b569427f9..5fa005bbe5 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Letzter Wert"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kann Dexcom G7 CGM-Daten lesen, aber Du musst trotzdem die Dexcom G7 App für die Kopplung, Kalibrierung und andere Sensorverwaltung verwenden."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kann Dexcom G7 CGM-Daten lesen, aber Du musst trotzdem die Dexcom G7 App für die Kopplung, Kalibrierung und andere Sensorverwaltung verwenden."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NIEDRIG"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings index 40a8c178f1..8fb5899d15 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings @@ -1 +1,118 @@ -/* empty */ +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Cancel"; + +/* No comment provided by engineer. */ +"Configuration" = "Configuration"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Connected"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Connecting"; + +/* Button title for starting setup */ +"Continue" = "Continue"; + +/* Button label for removing CGM */ +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "Done"; + +/* Field label */ +"Glucose" = "Glucose"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Name"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "Time"; + +/* Field label */ +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings index 904eb6d0e1..e42cfe3371 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Último dato"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop puede leer los datos de monitor continuo de glucosa Dexcom G7, pero Usted debe seguir usando la aplicación de Dexcom G7 para emparejar, calibrar y administrar otros comandos del sensor."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop puede leer los datos de monitor continuo de glucosa Dexcom G7, pero Usted debe seguir usando la aplicación de Dexcom G7 para emparejar, calibrar y administrar otros comandos del sensor."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "BAJO"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings index 81523539e8..d6e9adcd70 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Dernière lecture"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop peut lire les données du CGM G7, mais vous devrez continuer à utiliser l'application Dexcom G7 pour l'appairage, l'étalonnage et d'autres opérations de gestion du capteur."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop peut lire les données du CGM G7, mais vous devrez continuer à utiliser l'application Dexcom G7 pour l'appairage, l'étalonnage et d'autres opérations de gestion du capteur."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "BAS"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings index 01933538ae..e99df8c7f8 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings @@ -36,7 +36,7 @@ "Last Connect" = "लास्ट कनेक्ट"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "लूप G7 सीजीएम की रीडिंग्स पढ़ सकता है लेकिन सीजीएम सेन्सर के मैनज्मेंट, सेन्सर पैरिंग और कैलिब्रेशन की लिए dexcom का G7 ऐप ही इस्तेमाल करना चाहिए।"; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "लूप G7 सीजीएम की रीडिंग्स पढ़ सकता है लेकिन सीजीएम सेन्सर के मैनज्मेंट, सेन्सर पैरिंग और कैलिब्रेशन की लिए dexcom का G7 ऐप ही इस्तेमाल करना चाहिए।"; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LOW"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings index 5768c74d4a..9a94f2c932 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Ultima Lettura"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop può leggere i dati del G7, ma è comunque sempre necessario usare la App Dexcom G7 per fare l'abbinamento, la calibrazione e le altre operazioni di gestione del sensore."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop può leggere i dati del G7, ma è comunque sempre necessario usare la App Dexcom G7 per fare l'abbinamento, la calibrazione e le altre operazioni di gestione del sensore."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "BASSO"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings index 1a923bc2b8..643511c6c5 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Forrige avlesning"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan lese G7 CGM data, men du må fortsatt bruke Dexcom G7-appen for sammenkobling, kalibrering, og annen sensoradministrasjon."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan lese G7 CGM data, men du må fortsatt bruke Dexcom G7-appen for sammenkobling, kalibrering, og annen sensoradministrasjon."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LAV"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings index 1094e17502..9b92ae5676 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Laatste Meting"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan G7 CGM waarden lezen, maar je moet nog steeds de Dexcom G7 App gebruiken om te koppelen, te kalibreren en voor andere sensorinstellingen."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan G7 CGM waarden lezen, maar je moet nog steeds de Dexcom G7 App gebruiken om te koppelen, te kalibreren en voor andere sensorinstellingen."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LAAG"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings index 369cfc930d..ef2fa9da0f 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Ostatnie czytanie"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Pętla może odczytywać dane G7 CGM, ale nadal musisz używać aplikacji Dexcom G7 do parowania, kalibracji i zarządzania innymi czujnikami."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Pętla może odczytywać dane G7 CGM, ale nadal musisz używać aplikacji Dexcom G7 do parowania, kalibracji i zarządzania innymi czujnikami."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NISKI"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings index 68ebde457a..17af25cd93 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Ultima citire"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop poate citi datele G7 CGM, dar pentru cuplare, calibrare și alte activități de gestionare a senzorului, va trebui să folosiți aplicația Dexcom G7."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop poate citi datele G7 CGM, dar pentru cuplare, calibrare și alte activități de gestionare a senzorului, va trebui să folosiți aplicația Dexcom G7."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "HIPO"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings index ec89117fc4..04bfaad109 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Последние данные"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop может считывать данные G7, но Вы должны использовать приложение Dexcom G7 для сопряжения, калибровки и других действий с сенсором."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop может считывать данные G7, но Вы должны использовать приложение Dexcom G7 для сопряжения, калибровки и других действий с сенсором."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "НИЗКИЙ"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings index 24137a92ac..87f7050229 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Posledné čítanie"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop dokáže čítať údaje G7 CGM, ale na párovanie, kalibráciu a ďalšiu správu senzora musíte stále používať aplikáciu Dexcom G7."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop dokáže čítať údaje G7 CGM, ale na párovanie, kalibráciu a ďalšiu správu senzora musíte stále používať aplikáciu Dexcom G7."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NÍZKA"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings index 4f5f83a8c9..fcbd499ed7 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Son Okuma"; /* Descriptive text on G7StartupView */ -"Loop can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop, G7 CGM verilerini okuyabilir, ancak eşleştirme, kalibrasyon ve diğer sensör yönetimi için yine de Dexcom G7 Uygulamasını kullanmanız gerekir."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop, G7 CGM verilerini okuyabilir, ancak eşleştirme, kalibrasyon ve diğer sensör yönetimi için yine de Dexcom G7 Uygulamasını kullanmanız gerekir."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "DÜŞÜK"; From fb54472cedf957acf6e3e3589ec253ebac0dccdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:34:02 +0200 Subject: [PATCH 062/405] Merge pull request #252 from Artificial-Pancreas/crowdin_generated New Crowdin updates --- .../ar.lproj/Localizable.strings | 111 ++++++++++++++++- .../da.lproj/Localizable.strings | 55 ++++---- .../de.lproj/Localizable.strings | 33 +++-- .../es.lproj/Localizable.strings | 61 +++++---- .../fi.lproj/Localizable.strings | 90 ++++++++++++-- .../fr.lproj/Localizable.strings | 53 ++++---- .../he.lproj/Localizable.strings | 76 +++++++++--- .../it.lproj/Localizable.strings | 49 ++++---- .../nb.lproj/Localizable.strings | 39 +++--- .../nl.lproj/Localizable.strings | 49 ++++---- .../pl.lproj/Localizable.strings | 59 +++++---- .../pt-BR.lproj/Localizable.strings | 91 +++++++++++++- .../pt-PT.lproj/Localizable.strings | 117 ++++++++++++++++++ .../ru.lproj/Localizable.strings | 45 ++++--- .../sk.lproj/Localizable.strings | 66 +++++----- .../sv.lproj/Localizable.strings | 72 ++++++++++- .../tr.lproj/Localizable.strings | 51 ++++---- .../uk.lproj/Localizable.strings | 117 ++++++++++++++++++ .../zh-Hans.lproj/Localizable.strings | 108 ++++++++++++++++ .../uk.lproj/Localizable.strings | 8 +- .../Main/nl.lproj/Localizable.strings | 26 ++-- .../Main/sv.lproj/Localizable.strings | 14 +-- .../Main/uk.lproj/Localizable.strings | 4 +- 23 files changed, 1038 insertions(+), 356 deletions(-) create mode 100644 Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings create mode 100644 Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings index 25133b1904..9b9a6b9523 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings @@ -1,18 +1,117 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "---"; +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "هل أنت متأكد أنك تريد حذف هذا CGM؟"; +"Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "إلغاء"; +"Cancel" = "Cancel"; /* No comment provided by engineer. */ -"Configuration" = "المعطيات"; +"Configuration" = "Configuration"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Connected"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Connecting"; + +/* Button title for starting setup */ +"Continue" = "Continue"; /* Button label for removing CGM */ -"Delete CGM" = "حذف CGM"; +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "Done"; + +/* Field label */ +"Glucose" = "Glucose"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Name"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "Time"; /* Field label */ -"Glucose" = "قراءات السكر"; +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings index 6687027447..bd0edb7c8b 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Er du sikker på, at du vil slette denne CGM?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -26,93 +26,92 @@ "Continue" = "Fortsæt"; /* Button label for removing CGM */ -"Delete CGM" = "Slet CGM"; +"Delete CGM" = "Delete CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Udført"; +"Done" = "OK"; /* Field label */ "Glucose" = "Glukose"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace period slut"; +"Grace Period End" = "Grace Period End"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period tilbage"; +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HØJ"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Sidst tilsluttet"; +"Last Connect" = "Last Connect"; /* No comment provided by engineer. */ -"Last Reading" = "Seneste aflæsning"; +"Last Reading" = "Last Reading"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan aflæse data fra en G7 sensor, men du skal stadig benytte Dexcoms egen G7 App til at parre, kalibrere og administrere G7-sensoren."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LAV"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ -"Name" = "Navn"; +"Name" = "Name"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan efter ny sensor"; +"Scan for new sensor" = "Scan for new sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Skanner"; +"Scanning" = "Scanning"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Søger efter sensor"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Søger efter sensor"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor udløbet"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensorfejl"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensorproblem"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor opvarmning"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor udløb"; +"Sensor Expiration" = "Sensor Expiration"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor udløbet"; +"Sensor expired" = "Sensor expired"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor udløber"; +"Sensor expires" = "Sensor expires"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensorfejl"; +"Sensor failed" = "Sensor failed"; /* title for g7 settings row showing sensor start time */ "Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signaltab"; +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "Tid"; +"Time" = "Time"; /* Field label */ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload aflæsninger"; +"Upload Readings" = "Upload Readings"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Opvarmning afsluttes"; - +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index 5fa005bbe5..cce909e92f 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Sind Sie sicher, dass Sie dieses CGM löschen wollen?"; +"Are you sure you want to delete this CGM?" = "Möchten Sie das CGM wirklich löschen?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -23,7 +23,7 @@ "Connecting" = "Verbinden"; /* Button title for starting setup */ -"Continue" = "Weiter"; +"Continue" = "Fortsetzen"; /* Button label for removing CGM */ "Delete CGM" = "CGM löschen"; @@ -39,10 +39,10 @@ "Glucose" = "Blutzucker"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Ende der Toleranzzeit"; +"Grace Period End" = "Ende der Karenzfrist"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Verbleibende Toleranzzeit"; +"Grace period remaining" = "Verbleibende Karenzfrist"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "HOCH"; @@ -51,10 +51,10 @@ "Last Connect" = "Letzte Verbindung"; /* No comment provided by engineer. */ -"Last Reading" = "Letzter Wert"; +"Last Reading" = "Letzte Messung"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kann Dexcom G7 CGM-Daten lesen, aber Du musst trotzdem die Dexcom G7 App für die Kopplung, Kalibrierung und andere Sensorverwaltung verwenden."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten vom G7 direkt lesen. Zum Verbinden, Kalibrieren und weiteres Sensor Management braucht man die G7 App."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NIEDRIG"; @@ -66,7 +66,7 @@ "Scan for new sensor" = "Nach neuem Sensor suchen"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scannen"; +"Scanning" = "Scannt"; /* G7 Status highlight text for searching for sensor */ "Searching for\nSensor" = "Suche nach\nSensor"; @@ -78,41 +78,40 @@ "Sensor\nExpired" = "Sensor\nabgelaufen"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensorfehler"; +"Sensor\nFailed" = "Sensorverbindung\nfehlfeschlagen"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nProblem"; +"Sensor\nIssue" = "Sensor\nFehler"; /* G7 Status highlight text for sensor warmup */ "Sensor\nWarmup" = "Sensor\nAufwärmphase"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor-Ablaufzeitpunkt"; +"Sensor Expiration" = "Sensor Ablaufdatum"; /* G7 Progress bar label when sensor expired */ "Sensor expired" = "Sensor abgelaufen"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor-Ablaufzeitpunkt"; +"Sensor expires" = "Sensor abgelaufen"; /* G7 Progress bar label when sensor failed */ "Sensor failed" = "Sensorfehler"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensor gestartet"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signalverlust"; +"Signal\nLoss" = "Signal\nVerlust"; /* Field label */ -"Time" = "Zeit"; +"Time" = "Uhrzeit"; /* Field label */ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Werte hochladen"; +"Upload Readings" = "Upload von Messwerten"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Aufwärmen abgeschlossen"; - +"Warmup completes" = "Aufwärmphase abgeschlossen"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings index e42cfe3371..4b41e6d168 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "¿Está seguro de que quiere eliminar este MCG?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -14,7 +14,7 @@ "Cancel" = "Cancelar"; /* No comment provided by engineer. */ -"Configuration" = "Configuración"; +"Configuration" = "Configuracion"; /* title for g7 settings connection status when connected */ "Connected" = "Conectado"; @@ -26,93 +26,92 @@ "Continue" = "Continuar"; /* Button label for removing CGM */ -"Delete CGM" = "Eliminar MCG"; +"Delete CGM" = "Delete CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Completado"; +"Done" = "Hecho"; /* Field label */ -"Glucose" = "Glucosa"; +"Glucose" = "Glucose"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Fin del período de gracia"; +"Grace Period End" = "Grace Period End"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Período de gracia restante"; +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "ALTO"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Última conexión"; +"Last Connect" = "Last Connect"; /* No comment provided by engineer. */ -"Last Reading" = "Último dato"; +"Last Reading" = "Last Reading"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop puede leer los datos de monitor continuo de glucosa Dexcom G7, pero Usted debe seguir usando la aplicación de Dexcom G7 para emparejar, calibrar y administrar otros comandos del sensor."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "BAJO"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ "Name" = "Nombre"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Escanear nuevo sensor"; +"Scan for new sensor" = "Scan for new sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Escaneando"; +"Scanning" = "Scanning"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Buscando sensor"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Buscando sensor"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor caducado"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Fallo del sensor"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Error de sensor"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Preparación del sensor"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Caducación de sensor"; +"Sensor Expiration" = "Sensor Expiration"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor caducado"; +"Sensor expired" = "Sensor expired"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor caduca"; +"Sensor expires" = "Sensor expires"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Fallo del sensor"; +"Sensor failed" = "Sensor failed"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensor comienza"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Pérdida de señal"; +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "Hora"; +"Time" = "Tiempo"; /* Field label */ -"Trend" = "Tendencia"; +"Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Subir Datos"; +"Upload Readings" = "Upload Readings"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Tiempo de calentamiento completado"; - +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings index 2179d8b684..3b24a01c10 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings @@ -5,13 +5,16 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Haluatko varmasti poistaa CGM:n?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Kumoa"; +"Cancel" = "Cancel"; /* No comment provided by engineer. */ -"Configuration" = "Määritykset"; +"Configuration" = "Configuration"; /* title for g7 settings connection status when connected */ "Connected" = "Yhdistetty"; @@ -23,29 +26,92 @@ "Continue" = "Jatka"; /* Button label for removing CGM */ -"Delete CGM" = "Poista CGM"; +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Valmis"; +"Done" = "Done"; /* Field label */ -"Glucose" = "Glukoosi"; +"Glucose" = "Glucose"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "KORKEA"; +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "MATALA"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ -"Name" = "Nimi"; +"Name" = "Name"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "Aika"; +"Time" = "Time"; /* Field label */ -"Trend" = "Suunta"; +"Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Lataa lukemat"; +"Upload Readings" = "Upload Readings"; +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings index d6e9adcd70..eaae1154aa 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Voulez-vous vraiment supprimer ce CGM?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -26,7 +26,7 @@ "Continue" = "Continuer"; /* Button label for removing CGM */ -"Delete CGM" = "Effacer le CGM"; +"Delete CGM" = "Supprimer CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ @@ -39,80 +39,79 @@ "Glucose" = "Glycémie"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Fin du délai de grâce"; +"Grace Period End" = "Grace Period End"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Délai de grâce restant"; +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HAUT"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Dernière connexion"; +"Last Connect" = "Last Connect"; /* No comment provided by engineer. */ -"Last Reading" = "Dernière lecture"; +"Last Reading" = "Last Reading"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop peut lire les données du CGM G7, mais vous devrez continuer à utiliser l'application Dexcom G7 pour l'appairage, l'étalonnage et d'autres opérations de gestion du capteur."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "BAS"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ "Name" = "Nom"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Recherche du nouveau capteur"; +"Scan for new sensor" = "Scan for new sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Recherche..."; +"Scanning" = "Scanning"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Recherche de capteur"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Recherche de capteur"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Capteur expiré"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Capteur\nDéfaillant"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Problème de capteur"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Préchauffage du capteur"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Expiration du capteur"; +"Sensor Expiration" = "Sensor Expiration"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Capteur expiré"; +"Sensor expired" = "Sensor expired"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Capteur expire"; +"Sensor expires" = "Sensor expires"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Erreur de capteur"; +"Sensor failed" = "Sensor failed"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Démarrage du capteur"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Perte de signal"; +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ "Time" = "Heure"; /* Field label */ -"Trend" = "Tendance"; +"Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Envoyer les données"; +"Upload Readings" = "Upload Readings"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Préchauffage terminé"; - +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings index b85a290a54..53ce1a9b46 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings @@ -1,11 +1,11 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "---"; +"– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "האם למחוק את מד הסוכר הרציף?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -14,7 +14,7 @@ "Cancel" = "Cancel"; /* No comment provided by engineer. */ -"Configuration" = "הגדרות"; +"Configuration" = "Configuration"; /* title for g7 settings connection status when connected */ "Connected" = "מחובר"; @@ -26,50 +26,92 @@ "Continue" = "Continue"; /* Button label for removing CGM */ -"Delete CGM" = "מחק מד סוכר רציף"; +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "בוצע"; +"Done" = "Done"; /* Field label */ "Glucose" = "Glucose"; +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "גבוה"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "חיבור אחרון"; +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "נמוך"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ "Name" = "Name"; +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "מחפש חיישן"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "מחפש חיישן"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "חיישן פג"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "כשל בחיישן"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "בעיה בחיישן"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "חיישן מתחמם"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "תוקף חיישן"; +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "שעה"; +"Time" = "Time"; /* Field label */ -"Trend" = "מגמה"; +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings index 9a94f2c932..0e7c629332 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings @@ -1,20 +1,20 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "---"; +"– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/min"; +"%@/min" = "%@/minuto"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Sei sicuro di voler eliminare questo CGM?"; +"Are you sure you want to delete this CGM?" = "Sei sicuro di voler cancellare questo CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Annulla"; +"Cancel" = "Cancella"; /* No comment provided by engineer. */ -"Configuration" = "Configurazione"; +"Configuration" = "Impostazioni"; /* title for g7 settings connection status when connected */ "Connected" = "Connesso"; @@ -26,7 +26,7 @@ "Continue" = "Continua"; /* Button label for removing CGM */ -"Delete CGM" = "Elimina CGM"; +"Delete CGM" = "Cancella CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ @@ -36,13 +36,13 @@ "Done" = "Fine"; /* Field label */ -"Glucose" = "Glicemia"; +"Glucose" = "Glicemie"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Fine Periodo supplementare"; +"Grace Period End" = "Fine periodo di tolleranza"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Residuo Periodo supplementare"; +"Grace period remaining" = "Periodo di tolleranza residuo"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "ALTO"; @@ -51,10 +51,10 @@ "Last Connect" = "Ultima Connessione"; /* No comment provided by engineer. */ -"Last Reading" = "Ultima Lettura"; +"Last Reading" = "Ultima lettura"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop può leggere i dati del G7, ma è comunque sempre necessario usare la App Dexcom G7 per fare l'abbinamento, la calibrazione e le altre operazioni di gestione del sensore."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS è in grado di leggere i dati CGM di G7, ma è comunque necessario utilizzare l'App Dexcom G7 per l'accoppiamento, la calibrazione e la gestione di altri sensori."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "BASSO"; @@ -63,28 +63,28 @@ "Name" = "Nome"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scansiona un nuovo sensore"; +"Scan for new sensor" = "Scansiona per nuovo sensore"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scansione in corso"; +"Scanning" = "Lettura"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Scansione del Sensore"; +"Searching for\nSensor" = "Ricerca del sensore \n"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Scansione del Sensore"; +"Searching for sensor" = "Ricerca del sensore in corso"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensore Scaduto"; +"Sensor\nExpired" = "Sensore \n scaduto"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Il Sensore ha Fallito"; +"Sensor\nFailed" = "Sensore \n Fallito"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Problema del Sensore"; +"Sensor\nIssue" = "Problema al sensore \n"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Riscaldamento Sensore"; +"Sensor\nWarmup" = "Riscaldamento sensore \n"; /* title for g7 settings row showing sensor expiration time */ "Sensor Expiration" = "Scadenza Sensore"; @@ -93,16 +93,16 @@ "Sensor expired" = "Sensore scaduto"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Il Sensore Scade"; +"Sensor expires" = "Il sensore scade"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensore Fallito"; +"Sensor failed" = "Sensore fallito"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Inizializzazione Sensore"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Perdita del Segnale"; +"Signal\nLoss" = "Perdita segnale \n"; /* Field label */ "Time" = "Tempo"; @@ -114,5 +114,4 @@ "Upload Readings" = "Carica Letture"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Riscaldamento completato"; - +"Warmup completes" = "Avvio completato"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings index 643511c6c5..e1e1b0148e 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings @@ -5,16 +5,16 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Er du sikker på at du vil slette CGM?"; +"Are you sure you want to delete this CGM?" = "Sikker på at du vil slette denne CGM?"; /* No comment provided by engineer. */ -"Bluetooth" = "blåtann"; +"Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ "Cancel" = "Avbryt"; /* No comment provided by engineer. */ -"Configuration" = "Konfigurasjon"; +"Configuration" = "Oppsett"; /* title for g7 settings connection status when connected */ "Connected" = "Tilkoblet"; @@ -39,34 +39,34 @@ "Glucose" = "Blodsukker"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Oppvarming ferdig"; +"Grace Period End" = "Slutt på utsettelsesperiode"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Gjenstående oppvarmingsperiode"; +"Grace period remaining" = "Utsettelsesperiode som gjenstår"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HØY"; +"HIGH" = "HØYT"; /* title for g7 settings row showing sensor last connect time */ "Last Connect" = "Siste tilkobling"; /* No comment provided by engineer. */ -"Last Reading" = "Forrige avlesning"; +"Last Reading" = "Siste måling"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan lese G7 CGM data, men du må fortsatt bruke Dexcom G7-appen for sammenkobling, kalibrering, og annen sensoradministrasjon."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan lese data fra Dexcom G7, men du må fremdeles bruke Dexcom G7-appen for å koble til sender, kalibrere og andre innstillinger for sensoren."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LAV"; +"LOW" = "LAVT"; /* title for g7 settings row showing BLE Name */ "Name" = "Navn"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Skann etter ny sensor"; +"Scan for new sensor" = "Søk etter ny sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Søker"; +"Scanning" = "Skanner"; /* G7 Status highlight text for searching for sensor */ "Searching for\nSensor" = "Søker etter\nSensor"; @@ -81,31 +81,31 @@ "Sensor\nFailed" = "Sensor\nFeilet"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nProblem"; +"Sensor\nIssue" = "Sensor\nFeil"; /* G7 Status highlight text for sensor warmup */ "Sensor\nWarmup" = "Sensor\nOppvarming"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor utløpsdato"; +"Sensor Expiration" = "Sensor utløper"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor utløpt"; +"Sensor expired" = "Sensoren er utløpt"; /* G7 Progress bar label when sensor lifetime progress showing */ "Sensor expires" = "Sensor utløper"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor feilet"; +"Sensor failed" = "Sensoren feilet"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensorstart"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nTap"; +"Signal\nLoss" = "Signal\nTapt"; /* Field label */ -"Time" = "Tid"; +"Time" = "Tidspunkt"; /* Field label */ "Trend" = "Trend"; @@ -114,5 +114,4 @@ "Upload Readings" = "Last opp avlesninger"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Fullfører oppvarming"; - +"Warmup completes" = "Oppvarming fullført"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings index 9b92ae5676..f8f5607cde 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings @@ -1,20 +1,20 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "– –"; +"– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Weet je zeker dat je deze CGM wilt verwijderen"; +"Are you sure you want to delete this CGM?" = "Weet je zeker dat je deze CGM wilt vewijderen?"; /* No comment provided by engineer. */ -"Bluetooth" = "Bluetooth"; +"Bluetooth" = "Bluethooth"; /* Button text to cancel G7 setup */ "Cancel" = "Annuleer"; /* No comment provided by engineer. */ -"Configuration" = "Configuratie"; +"Configuration" = "Instellingen"; /* title for g7 settings connection status when connected */ "Connected" = "Verbonden"; @@ -23,7 +23,7 @@ "Connecting" = "Bezig met verbinden"; /* Button title for starting setup */ -"Continue" = "Ga Verder"; +"Continue" = "Vervolg"; /* Button label for removing CGM */ "Delete CGM" = "Verwijder CGM"; @@ -36,25 +36,25 @@ "Done" = "Gereed"; /* Field label */ -"Glucose" = "Glucose"; +"Glucose" = "Glucosewaarde"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Einde Verlenging"; +"Grace Period End" = "Einde coulance periode"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Verlenging resterend"; +"Grace period remaining" = "Resterende coulance periode"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "HOOG"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Laatste Verbinding"; +"Last Connect" = "Laatste connectie"; /* No comment provided by engineer. */ -"Last Reading" = "Laatste Meting"; +"Last Reading" = "Laatste stand"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop kan G7 CGM waarden lezen, maar je moet nog steeds de Dexcom G7 App gebruiken om te koppelen, te kalibreren en voor andere sensorinstellingen."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan G7 CGM-gegevens lezen, maar je moet nog steeds de Dexcom G7 App gebruiken voor koppeling, kalibratie en ander sensorbeheer."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LAAG"; @@ -63,31 +63,31 @@ "Name" = "Naam"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Zoeken naar nieuwe sensor"; +"Scan for new sensor" = "Nieuwe sensor aan het scannen"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scannen"; +"Scanning" = "Aan het scannen"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Zoekt naar\nSensor"; +"Searching for\nSensor" = "Zoeken naar\nsensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Zoekt naar sensor"; +"Searching for sensor" = "Sensor aan het zoeken"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nVerlopen"; +"Sensor\nExpired" = "Sensor\nverlopen"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nMislukt"; +"Sensor\nFailed" = "Sensor\nmislukt"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensorprobleem"; +"Sensor\nIssue" = "Sensor\nprobleem"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensoropwarming"; +"Sensor\nWarmup" = "Sensor\nopwarmen"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Vervaldatum "; +"Sensor Expiration" = "Sensor verloopt"; /* G7 Progress bar label when sensor expired */ "Sensor expired" = "Sensor verlopen"; @@ -99,10 +99,10 @@ "Sensor failed" = "Sensor mislukt"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensorstart"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signaalverlies"; +"Signal\nLoss" = "Signaal\nverlies"; /* Field label */ "Time" = "Tijd"; @@ -111,8 +111,7 @@ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Metingen"; +"Upload Readings" = "Lezingen uploaden"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Opwarmen voltooien"; - +"Warmup completes" = "Opwarmen voltooid"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings index ef2fa9da0f..b20033e2ff 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Czy na pewno chcesz usunąć ten CGM?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -14,7 +14,7 @@ "Cancel" = "Anuluj"; /* No comment provided by engineer. */ -"Configuration" = "Konfiguracja"; +"Configuration" = "Configuration"; /* title for g7 settings connection status when connected */ "Connected" = "Połączono"; @@ -26,83 +26,83 @@ "Continue" = "Kontynuuj"; /* Button label for removing CGM */ -"Delete CGM" = "Usuń CGM"; +"Delete CGM" = "Delete CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Gotowe"; +"Done" = "Done"; /* Field label */ -"Glucose" = "Glukoza"; +"Glucose" = "Glucose"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Sensor zakończy działanie"; +"Grace Period End" = "Grace Period End"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Wiek sensora"; +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "WYSOKI"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Ostatnie połączenie"; +"Last Connect" = "Last Connect"; /* No comment provided by engineer. */ -"Last Reading" = "Ostatnie czytanie"; +"Last Reading" = "Last Reading"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Pętla może odczytywać dane G7 CGM, ale nadal musisz używać aplikacji Dexcom G7 do parowania, kalibracji i zarządzania innymi czujnikami."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "NISKI"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ -"Name" = "Nazwa"; +"Name" = "Name"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Wyszukaj nowy sensor"; +"Scan for new sensor" = "Scan for new sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Skanowanie"; +"Scanning" = "Scanning"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Wyszukiwanie sensora"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Wyszukiwanie sensora"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor stracił ważność"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Błąd sensora"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Błąd Sensora"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Rozgrzewanie sensora"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor ważny do"; +"Sensor Expiration" = "Sensor Expiration"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor stracił ważność"; +"Sensor expired" = "Sensor expired"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Ważność sensora"; +"Sensor expires" = "Sensor expires"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Błąd sensora"; +"Sensor failed" = "Sensor failed"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensor uruchomiony"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Utracono sygnał"; +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ "Time" = "Czas"; @@ -111,8 +111,7 @@ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Wysyłaj odczyty"; +"Upload Readings" = "Upload Readings"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Rozgrzewanie G7 zakończone"; - +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings index 2cb92b0860..a5dbae60d6 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings @@ -1,17 +1,20 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "---"; +"– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Você está certo que quer remover este CGM?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ "Cancel" = "Cancelar"; /* No comment provided by engineer. */ -"Configuration" = "Configuração"; +"Configuration" = "Ajustes"; /* title for g7 settings connection status when connected */ "Connected" = "Conectado"; @@ -23,14 +26,92 @@ "Continue" = "Continuar"; /* Button label for removing CGM */ -"Delete CGM" = "Remover CGM"; +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "OK"; /* Field label */ "Glucose" = "Glicose"; +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + /* title for g7 settings row showing BLE Name */ "Name" = "Nome"; +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + /* Field label */ -"Trend" = "Tendência"; +"Time" = "Hora"; + +/* Field label */ +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings new file mode 100644 index 0000000000..71efa13172 --- /dev/null +++ b/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings @@ -0,0 +1,117 @@ +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Cancelar"; + +/* No comment provided by engineer. */ +"Configuration" = "Ajustes"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Connected"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Connecting"; + +/* Button title for starting setup */ +"Continue" = "Continue"; + +/* Button label for removing CGM */ +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "OK"; + +/* Field label */ +"Glucose" = "Glucose"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Nome"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "Hora"; + +/* Field label */ +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings index 04bfaad109..585bf0bf08 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/мин"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Вы уверены, что хотите удалить этот CGM?"; +"Are you sure you want to delete this CGM?" = "Вы уверены, что хотите удалить текущий CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -39,70 +39,70 @@ "Glucose" = "Глюкоза"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Конец срока"; +"Grace Period End" = "Период отсрочки"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Оставшийся срок"; +"Grace period remaining" = "Оставшийся период отсрочки"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "ВЫСОКИЙ"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Последнее соединение"; +"Last Connect" = "Последнее подключение"; /* No comment provided by engineer. */ -"Last Reading" = "Последние данные"; +"Last Reading" = "Последнее считывание"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop может считывать данные G7, но Вы должны использовать приложение Dexcom G7 для сопряжения, калибровки и других действий с сенсором."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS может считывать G7 CGM данные, но Вы все равно должны использовать Dexcom G7 App для сопряжения, калибровки и управления датчиком."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "НИЗКИЙ"; /* title for g7 settings row showing BLE Name */ -"Name" = "Имя"; +"Name" = "Название"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Сканировать новый сенсор"; +"Scan for new sensor" = "Сканирование нового датчика"; /* title for g7 settings connection status when scanning */ "Scanning" = "Сканирование"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Поиск сенсора"; +"Searching for\nSensor" = "Поиск\nДатчика"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Поиск сенсора"; +"Searching for sensor" = "Поиск датчика"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Сенсор истек"; +"Sensor\nExpired" = "Датчик\nИстек"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Ошибка сенсора"; +"Sensor\nFailed" = "Датчик\nСбой"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Проблема с сенсором"; +"Sensor\nIssue" = "Датчик\nПроблема"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Сенсор прогревается"; +"Sensor\nWarmup" = "Датчик\nПрогрев"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Сенсор истекает"; +"Sensor Expiration" = "Датчик истекает"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Сенсор истек"; +"Sensor expired" = "Срок действия датчика истек"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Сенсор заканчивается"; +"Sensor expires" = "Датчик заканчивается"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Ошибка сенсора"; +"Sensor failed" = "Сбой датчика"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Сенсор запущен"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Сигнал потерян"; +"Signal\nLoss" = "Сигнал\nПотерян"; /* Field label */ "Time" = "Время"; @@ -111,8 +111,7 @@ "Trend" = "Тенденция"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Загрузить показания"; +"Upload Readings" = "Выгружать данные"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Прогрев окончен"; - +"Warmup completes" = "Прогрев завершается"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings index 87f7050229..74628ca310 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings @@ -2,19 +2,19 @@ "– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@ /min"; +"%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Naozaj chcete odstrániť toto CGM?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Zrušiť"; +"Cancel" = "Cancel"; /* No comment provided by engineer. */ -"Configuration" = "Konfigurácia"; +"Configuration" = "Configuration"; /* title for g7 settings connection status when connected */ "Connected" = "Pripojené"; @@ -26,90 +26,92 @@ "Continue" = "Pokračovať"; /* Button label for removing CGM */ -"Delete CGM" = "Odstrániť CGM"; +"Delete CGM" = "Delete CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Hotovo"; +"Done" = "Done"; /* Field label */ -"Glucose" = "Glykémia"; +"Glucose" = "Glucose"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Koniec ochrannej lehoty"; +"Grace Period End" = "Grace Period End"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Zostávajúca ochranná lehota"; +"Grace period remaining" = "Grace period remaining"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "VYSOKÁ"; +"HIGH" = "HIGH"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Posledné spojenie"; +"Last Connect" = "Last Connect"; /* No comment provided by engineer. */ -"Last Reading" = "Posledné čítanie"; +"Last Reading" = "Last Reading"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop dokáže čítať údaje G7 CGM, ale na párovanie, kalibráciu a ďalšiu správu senzora musíte stále používať aplikáciu Dexcom G7."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "NÍZKA"; +"LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ -"Name" = "Názov"; +"Name" = "Name"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Skenovanie"; +"Scanning" = "Scanning"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Hľadá sa senzor"; +"Searching for\nSensor" = "Searching for\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Hľadá sa senzor"; +"Searching for sensor" = "Searching for sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Platnosť senzora vypršala"; +"Sensor\nExpired" = "Sensor\nExpired"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Senzor zlyhal"; +"Sensor\nFailed" = "Sensor\nFailed"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Chyba senzora"; +"Sensor\nIssue" = "Sensor\nIssue"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Zahrievanie senzora"; +"Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Vypršanie platnosti senzora"; +"Sensor Expiration" = "Sensor Expiration"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Platnosť senzora vypršala"; +"Sensor expired" = "Sensor expired"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Platnosť senzora vyprší"; +"Sensor expires" = "Sensor expires"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Senzor zlyhal"; +"Sensor failed" = "Sensor failed"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Spustenie senzora"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Strata signálu"; +"Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "Čas"; +"Time" = "Time"; /* Field label */ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Načítať údaje"; +"Upload Readings" = "Upload Readings"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Zahrieva sa"; - +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings index f759fc92cc..a5ffc0790f 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings @@ -5,7 +5,10 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Är du säker på att du vill radera denna CGM?"; +"Are you sure you want to delete this CGM?" = "År du säker på att du vill ta bort denna CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ "Cancel" = "Avbryt"; @@ -25,21 +28,82 @@ /* Button label for removing CGM */ "Delete CGM" = "Radera CGM"; +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + /* No comment provided by engineer. */ -"Done" = "Färdig"; +"Done" = "Klar"; /* Field label */ "Glucose" = "Glukos"; +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Reservperiod slutar"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Tid kvar av reservtid"; + /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "HÖGT"; +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Senaste anslutning"; + +/* No comment provided by engineer. */ +"Last Reading" = "Senaste avläsning"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan läsa G7 CGM-värden, men du måste alltjämt använda Dexcom G7-appen för parkoppling, kalibrering samt hantering av sensorn."; + /* String displayed instead of a glucose value below the CGM range */ "LOW" = "LÅGT"; /* title for g7 settings row showing BLE Name */ "Name" = "Namn"; +/* No comment provided by engineer. */ +"Scan for new sensor" = "Skanna efter ny sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Skannar"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Söker efter\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Söker efter sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nUtgått"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nmisslyckades"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensorproblem"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nUppvärmning"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensorns utgångsdatum"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensorns livslängd är slut"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensorn går ut"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensorn misslyckades"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Starta Sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal-\nförlust"; + /* Field label */ "Time" = "Tid"; @@ -47,5 +111,7 @@ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Ladda upp avläsningar"; +"Upload Readings" = "Ladda upp blodsocker"; +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Uppvärming av sensor"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings index fcbd499ed7..54bf4b59ea 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings @@ -2,19 +2,19 @@ "– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/dk"; +"%@/min" = "%@/dak"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Bu CGM'i silmek istediğinizden emin misiniz?"; +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "İptal"; +"Cancel" = "Vazgeç"; /* No comment provided by engineer. */ -"Configuration" = "Konfigürasyon"; +"Configuration" = "Yapılandırma"; /* title for g7 settings connection status when connected */ "Connected" = "Bağlandı"; @@ -26,20 +26,20 @@ "Continue" = "Devam et"; /* Button label for removing CGM */ -"Delete CGM" = "CGM Sil"; +"Delete CGM" = "CGM'i Sil"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Tamamlandı"; +"Done" = "Tamam"; /* Field label */ -"Glucose" = "Kan şekeri"; +"Glucose" = "Glikoz"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Ek süre sonu"; +"Grace Period End" = "Yetkisiz Kullanım Sonu"; /* G7 Progress bar label when sensor grace period progress showing */ "Grace period remaining" = "Kalan ek süre"; @@ -48,13 +48,13 @@ "HIGH" = "YÜKSEK"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Son bağlantı"; +"Last Connect" = "Son Bağlantı"; /* No comment provided by engineer. */ -"Last Reading" = "Son Okuma"; +"Last Reading" = "Son Okuma Değeri"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop, G7 CGM verilerini okuyabilir, ancak eşleştirme, kalibrasyon ve diğer sensör yönetimi için yine de Dexcom G7 Uygulamasını kullanmanız gerekir."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS, G7 CGM verilerini okuyabilir ancak yine de eşleştirme, kalibrasyon ve diğer sensör yönetimi için Dexcom G7 Uygulamasını kullanmanız gerekir."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "DÜŞÜK"; @@ -63,49 +63,49 @@ "Name" = "İsim"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Yeni sensör için tarama"; +"Scan for new sensor" = "Yeni sensör için tara"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Aranıyor"; +"Scanning" = "Taranıyor"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Sensör aranıyor"; +"Searching for\nSensor" = "Sensör\nAranıyor"; /* G7 Progress bar label when searching for sensor */ "Searching for sensor" = "Sensör aranıyor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensörün süresi doldu"; +"Sensor\nExpired" = "Sensör\nSüresi Doldu"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensör Hatası"; +"Sensor\nFailed" = "Sensör\nArızalı"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensör problemi"; +"Sensor\nIssue" = "Sensör\nSorunu"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensör ısınma"; +"Sensor\nWarmup" = "Sensör\nIsınıyor"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensör ömrü"; +"Sensor Expiration" = "Sensör Süre Sonu"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensörün süresi doldu"; +"Sensor expired" = "Sensör süresi doldu"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensörün süresi doluyor"; +"Sensor expires" = "Sensör süresi doluyor"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensör hatası"; +"Sensor failed" = "Sensör arızalı"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensör başlangıcı"; +"Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Sinyal\nKayıp"; +"Signal\nLoss" = "Sinyal\nKaybı"; /* Field label */ -"Time" = "Zaman"; +"Time" = "Saat"; /* Field label */ "Trend" = "Eğilim"; @@ -115,4 +115,3 @@ /* G7 Progress bar label when sensor in warmup */ "Warmup completes" = "Isınma tamamlandı"; - diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..d22dc14d90 --- /dev/null +++ b/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings @@ -0,0 +1,117 @@ +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/хв"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Ви впевнені, що хочете видалити цей CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Відмінити"; + +/* No comment provided by engineer. */ +"Configuration" = "Налаштування"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Під'єднаний"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Під'єднання"; + +/* Button title for starting setup */ +"Continue" = "Продовжити"; + +/* Button label for removing CGM */ +"Delete CGM" = "Видалити CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "Готово"; + +/* Field label */ +"Glucose" = "Глюкоза"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Час до блокування"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Період витонченості, що залишився"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "ВИСОКИЙ"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Останнє підключення"; + +/* No comment provided by engineer. */ +"Last Reading" = "Останнє читання"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS може читати дані G7 CGM, але ви все одно повинні використовувати додаток Dexcom G7 для парування, калібрування та іншого управління сенсором."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "НИЗЬКИЙ"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Ім’я"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Сканувати новий Сенсор"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Сканування"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Пошук\nСенсору"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Пошук Сенсору"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Сенсор\nЗакінчився"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Сенсори\nНе вдалося"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Сенсор\nПроблема"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Сенсор\nПрогрів"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Термін дії Сенсору"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Термін Сенсору закінчився"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Сенсор закінчується"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Не вдалося встановити Сенсор"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Запустити сенсор"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Сигнал\nВтрата"; + +/* Field label */ +"Time" = "Час"; + +/* Field label */ +"Trend" = "Тренди"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Вивантажити читання"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Прогрів виконано"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings index 35e0192b99..2111b941b1 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings @@ -1,9 +1,117 @@ +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + /* Button text to cancel G7 setup */ "Cancel" = "取消"; /* No comment provided by engineer. */ "Configuration" = "配置"; +/* title for g7 settings connection status when connected */ +"Connected" = "已连接"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "正在连接"; + /* Button title for starting setup */ "Continue" = "继续"; +/* Button label for removing CGM */ +"Delete CGM" = "删除CGM数据源"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "完成"; + +/* Field label */ +"Glucose" = "葡萄糖"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "设备名称"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "时间"; + +/* Field label */ +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 617751f0f7..e4c70e1ec5 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -15,7 +15,7 @@ "Pod Expired" = "Термін дії Podʼу минув"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Пустий резервуар"; +"Low Reservoir" = "Пустий Резервуар"; /* Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Нагадування про призупинення Podʼу"; @@ -520,7 +520,7 @@ "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Ваш Pod готовий до використання.\n\n%1$@ нагадає вам змінити Pod до закінчення терміну його дії. Ви можете змінити це на зручний для вас час."; /* */ -"Scheduled Reminder" = "Заплановане нагадування"; +"Scheduled Reminder" = "Заплановане Нагадування"; /* Label for expiration reminder row */ "Time" = "Час"; @@ -532,7 +532,7 @@ "Setup Complete" = "Налаштування завершено"; /* Value text for no expiration reminder */ -"No Reminder" = "Немає нагадувань"; +"No Reminder" = "Немає Нагадувань"; /* Error message description for PeripheralManagerError.notReady */ "Peripheral Not Ready" = "Периферійний пристрій не готовий"; @@ -649,7 +649,7 @@ "No\nDelivery" = "Без\nПодачи"; /* description label for active time pod details row */ -"Active Time" = "Активний час"; +"Active Time" = "Активний Час"; /* description label for total delivery pod details row */ "Total Delivery" = "Усього подано"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 1890243bf2..c1a7fb7107 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -315,40 +315,40 @@ Enact a temp Basal or a temp target */ "Remote control" = "Afstandsbediening"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nCheck nu al je nieuwe instellingen:\n\n* Basaal instellingen\n * Koolhydraat ratio's\n * Doel glucose waarde\n * Insuline sensitiviteit\n * DIA\n\n in iAPS instellingen > Configuratie.\n\nSlechte of ongeldige profielinstellingen kunnen desastreuze effecten hebben!"; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dit zal enkele of al je huidige pomp instellingen vervangen. Weet je zeker dat je de profielinstellingen uit Nightscout wilt importeren?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nOngeldige Nightscout basaal instellingen. \n\nImport afgebroken. Check je Nightscout Profiel basaal instellingen!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\ninstellingen zijn geïmporteerd maar de basaalstanden konden niet worden opgeslagen in de pomp (geen pomp). Controleer je basaalstanden en tik op' Opslaan op pomp' om de nieuwe basaalstanden te synchroniseren"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Fout bij importeren"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Ja, importeer"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importeer instellingen van Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Importeer instellingen?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importeer instellingen van Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Instellingen geïmporteerd"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatch van glucoseeenheden in Nightscout en pomp instellingen. Importeer instellingen is afgebroken."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Kan Nightscout profiel niet vinden."; /* Add Medtronic pump */ "Add Medtronic" = "Medtronic toevoegen"; @@ -1095,7 +1095,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Alleen Autotune basale insuline"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Bewaar als je normale basaalstanden"; /* */ "Save on Pump" = "Opslaan op pomp"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 846252827c..65df7d82c2 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -209,7 +209,7 @@ "Rate" = "Värde"; /* */ -"Save on Pump" = "Spara på pump"; +"Save on Pump" = "Spara till pump"; /* */ "Saving..." = "Sparar..."; @@ -1091,20 +1091,14 @@ Enact a temp Basal or a temp target */ /* Insulin sensitivity config header */ "Dynamic Sensitivity" = "Dynamisk insulinkänslighet"; -/* */ -"Save as your Normal Basal Rates" = "Spara som dina vanliga basalinställningar"; - -/* */ -"Save on Pump" = "Spara till pump"; - /* Autotune config */ "Only Autotune Basal Insulin" = "Autojustera endast basalinställningar"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Spara som dina vanliga basalinställningar"; /* */ -"Save on Pump" = "Spara på pump"; +"Save on Pump" = "Spara till pump"; /* Debug option view Pump History */ "Pump History" = "Pumphistorik"; @@ -1862,7 +1856,7 @@ Enact a temp Basal or a temp target */ "Max COB" = "Max mängd aktiva kolhydrater (COB)"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Standardvärdet för maximal mängd av aktiva kolhdrater (COB) är 120."; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Bolus \"snooze\" - nämnare"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 8a346bce65..ddeb24aaa3 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1939,7 +1939,7 @@ Enact a temp Basal or a temp target */ // Dynamic ISF + CR Settings: /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Налаштувати онстанту Динамічного ISF"; +"Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; @@ -1960,7 +1960,7 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Використовувати Dynamic CR. Dynamic ratio також впливатиме на CR:\n\n Коли ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКоли ratio <1: dynCR = CR/dynCR.\n\nНе використовуйте спільно з високим Insulin Fraction (> 2)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Налаштувати онстанту Динамічного ISF"; +"Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Налаштуйте динамічні коефіцієнти за константою. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF для високого або низького рівня ГК. Максимальна корекція визначається параметрами min/max Автосенс. Для сигмоподібної функції спочатку рекомендується коригуючий коефіцієнт 0,4 - 0,5. Для логарифмічної формули threre є менш узгодженим, але починати з 0,5 - 0,8 є більш прийнятним для більшості користувачів"; From 5e5ef590d260afae43c627e48d2124f4fbef3072 Mon Sep 17 00:00:00 2001 From: Eugene Bashmakov Date: Thu, 19 Oct 2023 10:35:45 +0300 Subject: [PATCH 063/405] ISSUE-257 | Fix typo in 'Last loop was more than' message --- FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-BR.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-PT.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings | 2 +- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 2 +- .../Services/UserNotifiactions/UserNotificationsManager.swift | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index daf5e9c1f0..58c56960d2 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings index 617a1f967f..715cccca8c 100644 --- a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings @@ -940,7 +940,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 24fe70b286..56a6de0907 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 8f1d65b69f..6a7c145084 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS ist nicht aktiv"; /* */ -"Last loop was more then %d min ago" = "Letzter Loop vor mehr als %d Minuten"; +"Last loop was more than %d min ago" = "Letzter Loop vor mehr als %d Minuten"; /* Glucose badge */ "Show glucose on the app badge" = "Zeige Glucosewert auf dem App Symbol"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index d5411e8908..1262de9da8 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ - "Last loop was more then %d min ago" = "Last loop was more then %d min ago"; + "Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 65fa811e6d..25695e08ab 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index b34ab36792..3a03df7a1a 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 8e8490bfeb..be7bcde6eb 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS pas actif"; /* */ -"Last loop was more then %d min ago" = "Dernier bouclage depuis plus de %d min"; +"Last loop was more than %d min ago" = "Dernier bouclage depuis plus de %d min"; /* Glucose badge */ "Show glucose on the app badge" = "Afficher glycémie en tant que badge"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index daf5e9c1f0..58c56960d2 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 55635b473b..d48bb3d8ed 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS non attivo"; /* */ -"Last loop was more then %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; +"Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; /* Glucose badge */ "Show glucose on the app badge" = "Mostra il glicemie sul badge dell'app"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 7d6d7ed55b..14b790b85d 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS ikke aktiv"; /* */ -"Last loop was more then %d min ago" = "Siste loop var mer enn %d min siden"; +"Last loop was more than %d min ago" = "Siste loop var mer enn %d min siden"; /* Glucose badge */ "Show glucose on the app badge" = "Vis blodsukker på app-ikonet"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index c1a7fb7107..911babf9e6 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS is niet actief!"; /* */ -"Last loop was more then %d min ago" = "Laatste loop was meer dan %d min geleden"; +"Last loop was more than %d min ago" = "Laatste loop was meer dan %d min geleden"; /* Glucose badge */ "Show glucose on the app badge" = "Toon glucosewaarde op de app icoon"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index cc8f68a061..38309697f8 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -989,7 +989,7 @@ Połączono z Nightscout!"; "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 72095619dc..ba596afa70 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index c115dbd101..ef5d999009 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 3f6d123e4b..4ff8f0aa89 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS неактивен"; /* */ -"Last loop was more then %d min ago" = "Последний цикл был более %d минут назад"; +"Last loop was more than %d min ago" = "Последний цикл был более %d минут назад"; /* Glucose badge */ "Show glucose on the app badge" = "Показывать глюкозу на значке приложения"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 54fc1f76f6..f9ed39f9e8 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 65df7d82c2..b9429e2345 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS är inte aktiv"; /* */ -"Last loop was more then %d min ago" = "Senaste loopen var mer än %d min sedan"; +"Last loop was more than %d min ago" = "Senaste loopen var mer än %d min sedan"; /* Glucose badge */ "Show glucose on the app badge" = "Visa glukosvärde på app-ikon"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 1d73a4d269..6cd705e181 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS etkin değil"; /* */ -"Last loop was more then %d min ago" = "Son döngü %d dak kadar önceydi"; +"Last loop was more than %d min ago" = "Son döngü %d dak kadar önceydi"; /* Glucose badge */ "Show glucose on the app badge" = "Uygulama rozetinde glikozu göster"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index ddeb24aaa3..67e1081851 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS не активний"; /* */ -"Last loop was more then %d min ago" = "Останній цикл був більше, ніж %d хв тому"; +"Last loop was more than %d min ago" = "Останній цикл був більше, ніж %d хв тому"; /* Glucose badge */ "Show glucose on the app badge" = "Показувати глюкозу на значку додатку"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index ce451e52aa..3df716397e 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -987,7 +987,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS 未激活"; /* */ -"Last loop was more then %d min ago" = "上次闭环成功在 %d 分钟前"; +"Last loop was more than %d min ago" = "上次闭环成功在 %d 分钟前"; /* Glucose badge */ "Show glucose on the app badge" = "在应用图表上显示葡萄糖。"; diff --git a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift index 16e93c11c0..da3f1cbfb9 100644 --- a/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift +++ b/FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift @@ -127,7 +127,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In private func scheduleMissingLoopNotifiactions(date _: Date) { ensureCanSendNotification { let title = NSLocalizedString("iAPS not active", comment: "iAPS not active") - let body = NSLocalizedString("Last loop was more then %d min ago", comment: "Last loop was more then %d min ago") + let body = NSLocalizedString("Last loop was more than %d min ago", comment: "Last loop was more than %d min ago") let firstInterval = 20 // min let secondInterval = 40 // min From 5f4e1a958ef122fc0ab838ed76bdad8d73b8cd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:29:09 +0200 Subject: [PATCH 064/405] Allow looping when HIGH (#259) **Allow looping when HIGH** * Allow lflat glucose when CGM readings are HIGH (but disable SM and high temps) for IOB computations etc. * Display HIGH when CGM reading is HIGH. * Display real glucose when entering capillary glucose. * Allow (capillary readings over HIGH for normal looping. * Display in Enacted pop-up. * Display warning in same pop-up * Disable SMB and high temps in oref2 code when reading is HIGH (potential invalid CGM reading). --- .../Resources/javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/APS/APSManager.swift | 11 +++++++---- .../Modules/DataTable/View/DataTableRootView.swift | 2 +- .../Modules/Home/View/Header/CurrentGlucoseView.swift | 2 +- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 3 +++ 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 2a98a3f4ed..f043c3b32d 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta)return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&Ye<400&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):Ye<400&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&Ye<400&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 106ce42522..46a7c03379 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -342,10 +342,13 @@ final class BaseAPSManager: APSManager, Injectable { return Just(false).eraseToAnyPublisher() } - guard glucoseStorage.isGlucoseNotFlat() else { - debug(.apsManager, "Glucose data is too flat") - processError(APSError.glucoseError(message: "Glucose data is too flat")) - return Just(false).eraseToAnyPublisher() + // Only let glucose be flat when 400 mg/dl + if (glucoseStorage.recent().last?.glucose ?? 100) != 400 { + guard glucoseStorage.isGlucoseNotFlat() else { + debug(.apsManager, "Glucose data is too flat") + processError(APSError.glucoseError(message: "Glucose data is too flat")) + return Just(false).eraseToAnyPublisher() + } } let now = Date() diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 7754932c6c..282a6304e9 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -76,7 +76,7 @@ extension DataTable { } label: { Text("Save") } .frame(maxWidth: .infinity, alignment: .trailing) - .disabled(state.manualGlcuose < limitLow || state.manualGlcuose > limitHigh) + // .disabled(state.manualGlcuose < limitLow || state.manualGlcuose > limitHigh) }.padding(20) } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index c36e28684a..584c8b467d 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -48,7 +48,7 @@ struct CurrentGlucoseView: View { VStack(alignment: .center) { HStack { Text( - recentGlucose?.glucose + (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose .map { glucoseFormatter .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 9ed7273106..a3f4fd215e 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -618,6 +618,9 @@ extension Home { .padding(.bottom, 4) .padding(.top, 8) Text(errorMessage).font(.caption).foregroundColor(.loopRed) + } else if let suggestion = state.suggestion, (suggestion.bg ?? 100) == 400 { + Text("Invalid CGM reading (HIGH).").font(.callout).bold().foregroundColor(.loopRed).padding(.top, 8) + Text("SMBs and High Temps Disabled.").font(.caption).foregroundColor(.white).padding(.bottom, 4) } } } From cb6e1fcc4bfcbd2a6fa08dbcc83c6ac6b85cf5ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 20 Oct 2023 20:02:44 +0200 Subject: [PATCH 065/405] Manual glucose updates (#261) * Display manual glucose entries in iAPS similar to Nightscout and xDrip. * Upload to NIghtscout when created. * Delete from Nightcsout when deleted in iAPS. * Change colour of FPUs to work with the Nightscout format of manual glucose entries. * Remove amounts of carb equivalents in Chart to make view less busy. This is a temporary fix until removed entirely when we have Fat and Protein models instead. * Make pop-up for new glucose cleaner and more prominent. Using both layers and shadow. This is a work in progress and in the future the oref0 info alerts will be replaced with same pop-ups, with images and charts etc. * Make glucose data table cleaner. Remove IDs and add when manual instead. --- FreeAPS/Sources/APS/OpenAPS/Constants.swift | 1 + FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 1 - .../Sources/APS/Storage/GlucoseStorage.swift | 36 ++++++- FreeAPS/Sources/Models/BloodGlucose.swift | 2 - FreeAPS/Sources/Models/Glucose.swift | 1 + .../Sources/Models/NightscoutTreatment.swift | 6 ++ FreeAPS/Sources/Models/PumpHistoryEvent.swift | 1 + .../Modules/DataTable/DataTableDataFlow.swift | 2 +- .../Modules/DataTable/DataTableProvider.swift | 4 + .../DataTable/DataTableStateModel.swift | 11 +- .../DataTable/View/DataTableRootView.swift | 100 +++++++++++------- .../Sources/Modules/Home/HomeProvider.swift | 7 ++ .../Sources/Modules/Home/HomeStateModel.swift | 2 + .../Home/View/Chart/MainChartView.swift | 94 ++++++++++++++-- .../Modules/Home/View/HomeRootView.swift | 1 + .../Services/Network/NightscoutAPI.swift | 53 ++++++++++ .../Services/Network/NightscoutManager.swift | 32 ++++++ 17 files changed, 293 insertions(+), 61 deletions(-) diff --git a/FreeAPS/Sources/APS/OpenAPS/Constants.swift b/FreeAPS/Sources/APS/OpenAPS/Constants.swift index 99ff9a025f..9aa815715b 100644 --- a/FreeAPS/Sources/APS/OpenAPS/Constants.swift +++ b/FreeAPS/Sources/APS/OpenAPS/Constants.swift @@ -87,6 +87,7 @@ extension OpenAPS { static let uploadedProfile = "upload/uploaded-profile.json" static let uploadedPreferences = "upload/uploaded-preferences.json" static let uploadedSettings = "upload/uploaded-settings.json" + static let uploadedManualGlucose = "upload/uploaded-manual-readings.json" } enum FreeAPS { diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index 30acaa9318..ca0a7df66c 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -267,7 +267,6 @@ final class OpenAPS { uamMinutes: (overrideArray.first?.uamMinutes ?? uamMinutes) as Decimal ) storage.save(averages, as: OpenAPS.Monitor.oref2_variables) - print("Test time for oref2_variables: \(-now.timeIntervalSinceNow) seconds") return self.loadFileFromStorage(name: Monitor.oref2_variables) } else { diff --git a/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift b/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift index 567aa71bce..d731e9fd56 100644 --- a/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift +++ b/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift @@ -16,6 +16,7 @@ protocol GlucoseStorage { func isGlucoseNotFlat() -> Bool func nightscoutGlucoseNotUploaded() -> [BloodGlucose] func nightscoutCGMStateNotUploaded() -> [NigtscoutTreatment] + func nightscoutManualGlucoseNotUploaded() -> [NigtscoutTreatment] var alarm: GlucoseAlarm? { get } } @@ -35,9 +36,18 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable { injectServices(resolver) } - func storeGlucose(_ glucose: [BloodGlucose]) { - let storeGlucoseStarted = Date() + private var glucoseFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + if settingsManager.settings.units == .mmolL { + formatter.maximumFractionDigits = 1 + } + formatter.decimalSeparator = "." + return formatter + } + func storeGlucose(_ glucose: [BloodGlucose]) { processQueue.sync { debug(.deviceManager, "start storage glucose") let file = OpenAPS.Monitor.glucose @@ -136,7 +146,6 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable { } } } - print("Test time of glucoseStorage: \(-1 * storeGlucoseStarted.timeIntervalSinceNow) s") } func removeGlucose(ids: [String]) { @@ -212,10 +221,29 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable { func nightscoutCGMStateNotUploaded() -> [NigtscoutTreatment] { let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCGMState, as: [NigtscoutTreatment].self) ?? [] let recent = storage.retrieve(OpenAPS.Monitor.cgmState, as: [NigtscoutTreatment].self) ?? [] - return Array(Set(recent).subtracting(Set(uploaded))) } + func nightscoutManualGlucoseNotUploaded() -> [NigtscoutTreatment] { + let uploaded = (storage.retrieve(OpenAPS.Nightscout.uploadedGlucose, as: [BloodGlucose].self) ?? []) + .filter({ $0.type == GlucoseType.manual.rawValue }) + let recent = recent().filter({ $0.type == GlucoseType.manual.rawValue }) + let filtered = Array(Set(recent).subtracting(Set(uploaded))) + let manualReadings = filtered.map { item -> NigtscoutTreatment in + NigtscoutTreatment( + duration: nil, rawDuration: nil, rawRate: nil, absolute: nil, rate: nil, eventType: .capillaryGlucose, + createdAt: item.dateString, enteredBy: "iAPS", bolus: nil, insulin: nil, notes: "iAPS User", carbs: nil, + fat: nil, + protein: nil, foodType: nil, targetTop: nil, targetBottom: nil, glucoseType: "Manual", + glucose: settingsManager.settings + .units == .mgdL ? (glucoseFormatter.string(from: Int(item.glucose ?? 100) as NSNumber) ?? "") + : (glucoseFormatter.string(from: Decimal(item.glucose ?? 100).asMmolL as NSNumber) ?? ""), + units: settingsManager.settings.units == .mmolL ? "mmol" : "mg/dl" + ) + } + return manualReadings + } + var alarm: GlucoseAlarm? { guard let glucose = recent().last, glucose.dateString.addingTimeInterval(20.minutes.timeInterval) > Date(), let glucoseValue = glucose.glucose else { return nil } diff --git a/FreeAPS/Sources/Models/BloodGlucose.swift b/FreeAPS/Sources/Models/BloodGlucose.swift index aa99c62849..ad4307f40c 100644 --- a/FreeAPS/Sources/Models/BloodGlucose.swift +++ b/FreeAPS/Sources/Models/BloodGlucose.swift @@ -29,9 +29,7 @@ struct BloodGlucose: JSON, Identifiable, Hashable { let filtered: Decimal? let noise: Int? var glucose: Int? - let type: String? - var activationDate: Date? = nil var sessionStartDate: Date? = nil var transmitterID: String? = nil diff --git a/FreeAPS/Sources/Models/Glucose.swift b/FreeAPS/Sources/Models/Glucose.swift index 339c0cbce0..aa6927c5a6 100644 --- a/FreeAPS/Sources/Models/Glucose.swift +++ b/FreeAPS/Sources/Models/Glucose.swift @@ -13,6 +13,7 @@ struct Glucose: JSON { enum GlucoseType: String, JSON { case sgv case cal + case manual = "Manual" } enum Direction: String, JSON { diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index 694410e6f5..5c9e867d1a 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -18,6 +18,9 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { var foodType: String? let targetTop: Decimal? let targetBottom: Decimal? + var glucoseType: String? + var glucose: String? + var units: String? static let local = "iAPS" @@ -51,5 +54,8 @@ extension NigtscoutTreatment { case foodType case targetTop case targetBottom + case glucoseType + case glucose + case units } } diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index 11830cbd78..b7a06a2996 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -65,6 +65,7 @@ enum EventType: String, JSON { case nsBatteryChange = "Pump Battery Change" case nsAnnouncement = "Announcement" case nsSensorChange = "Sensor Start" + case capillaryGlucose = "BG Check" } enum TempType: String, JSON { diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index c946e3ddc4..39185b734b 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -170,7 +170,7 @@ enum DataTable { case .carbs: return .loopYellow case .fpus: - return .loopRed + return .orange.opacity(0.5) case .bolus: return .insulin case .tempBasal: diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index 3bd4bd98b4..62f8a4a7c2 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -49,5 +49,9 @@ extension DataTable { glucoseStorage.removeGlucose(ids: [id]) healthkitManager.deleteGlucose(syncID: id) } + + func deleteManualGlucose(date: Date?) { + nightscoutManager.deleteManualGlucose(at: date ?? .distantPast) + } } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 82037886e0..2286a2dc84 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -147,7 +147,7 @@ extension DataTable { func deleteGlucose(at index: Int) { let id = glucose[index].id provider.deleteGlucose(id: id) - + // CoreData let fetchRequest: NSFetchRequest fetchRequest = NSFetchRequest(entityName: "Readings") fetchRequest.predicate = NSPredicate(format: "id == %@", id) @@ -163,10 +163,11 @@ extension DataTable { into: [coredataContext] ) } - } catch { - // To do: handle any thrown errors. + } catch { /* To do: handle any thrown errors. */ } + // Manual Glucose + if (glucose[index].glucose.type ?? "") == GlucoseType.manual.rawValue { + provider.deleteManualGlucose(date: glucose[index].glucose.dateString) } - // try? coredataContext.save() } func addManualGlucose() { @@ -183,7 +184,7 @@ extension DataTable { filtered: nil, noise: nil, glucose: Int(glucose), - type: "Manual" + type: GlucoseType.manual.rawValue ) provider.glucoseStorage.storeGlucose([saveToJSON]) debug(.default, "Manual Glucose saved to glucose.json") diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 282a6304e9..39b3e642f9 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -12,6 +12,8 @@ extension DataTable { @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? @State private var newGlucose = false + @State private var isLayered = false + @FocusState private var isFocused: Bool @Environment(\.colorScheme) var colorScheme @@ -51,40 +53,12 @@ extension DataTable { } } .onAppear(perform: configureView) - .navigationTitle("History") + .navigationTitle(isLayered ? "" : "History") + .blur(radius: isLayered ? 3.0 : 0) .navigationBarTitleDisplayMode(.automatic) - .navigationBarItems( - leading: Button("Close", action: state.hideModal), - trailing: state.mode == .glucose ? EditButton().asAny() : EmptyView().asAny() - ) - .popup(isPresented: newGlucose, alignment: .top, direction: .bottom) { - VStack(spacing: 20) { - HStack { - Text("New Glucose") - DecimalTextField(" ... ", value: $state.manualGlcuose, formatter: glucoseFormatter) - Text(state.units.rawValue) - }.padding(.horizontal, 20) - HStack { - let limitLow: Decimal = state.units == .mmolL ? 2.2 : 40 - let limitHigh: Decimal = state.units == .mmolL ? 21 : 380 - Button { newGlucose = false } - label: { Text("Cancel") }.frame(maxWidth: .infinity, alignment: .leading) - - Button { - state.addManualGlucose() - newGlucose = false - } - label: { Text("Save") } - .frame(maxWidth: .infinity, alignment: .trailing) - // .disabled(state.manualGlcuose < limitLow || state.manualGlcuose > limitHigh) - - }.padding(20) - } - .frame(maxHeight: 140) - .background( - RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(colorScheme == .dark ? UIColor.systemGray2 : UIColor.systemGray6)) - ) + .navigationBarItems(leading: Button(isLayered ? "" : "Close", action: state.hideModal)) + .popup(isPresented: newGlucose, alignment: .center, direction: .top) { + addGlucose } } @@ -98,16 +72,63 @@ extension DataTable { private var glucoseList: some View { List { - Button { newGlucose = true } + Button { + newGlucose = true + isFocused = true + isLayered.toggle() + } label: { Text("Add") }.frame(maxWidth: .infinity, alignment: .trailing) .padding(.trailing, 20) ForEach(state.glucose) { item in - glucoseView(item) + glucoseView(item, isManual: item.glucose) }.onDelete(perform: deleteGlucose) } } + private var addGlucose: some View { + VStack { + Form { + Section { + HStack { + Text("Glucose").font(.custom("popup", fixedSize: 18)) + DecimalTextField(" ... ", value: $state.manualGlcuose, formatter: glucoseFormatter) + .focused($isFocused).font(.custom("glucose", fixedSize: 22)) + Text(state.units.rawValue).foregroundStyle(.secondary) + } + } + header: { + Text("Blood Glucose Test").foregroundColor(.secondary).font(.custom("popupHeader", fixedSize: 12)) + .padding(.top) + } + HStack { + Button { + newGlucose = false + isLayered = false + } + label: { Text("Cancel").foregroundColor(.red) } + .frame(maxWidth: .infinity, alignment: .leading) + Spacer() + Button { + state.addManualGlucose() + newGlucose = false + isLayered = false + } + label: { Text("Save") } + .frame(maxWidth: .infinity, alignment: .trailing) + .disabled(state.manualGlcuose <= 0) + } + .buttonStyle(BorderlessButtonStyle()) + .font(.custom("popupButtons", fixedSize: 16)) + } + } + .frame(maxHeight: 220) + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color(.tertiarySystemBackground)) + ).border(.gray).shadow(radius: 40) + } + @ViewBuilder private func treatmentView(_ item: Treatment) -> some View { HStack { Image(systemName: "circle.fill").foregroundColor(item.color) @@ -192,7 +213,7 @@ extension DataTable { } } - @ViewBuilder private func glucoseView(_ item: Glucose) -> some View { + @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View { VStack(alignment: .leading, spacing: 4) { HStack { Text(dateFormatter.string(from: item.glucose.dateString)) @@ -203,9 +224,12 @@ extension DataTable { ) as NSNumber)! } ?? "--") Text(state.units.rawValue) - Text(item.glucose.direction?.symbol ?? "--") + if isManual.type == GlucoseType.manual.rawValue { + Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red) + } else { + Text(item.glucose.direction?.symbol ?? "--") + } } - Text("ID: " + item.glucose.id).font(.caption2).foregroundColor(.secondary) } } diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index caef9d847f..90f40e6080 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -28,6 +28,13 @@ extension Home { } } + func manualGlucose(hours: Int) -> [BloodGlucose] { + glucoseStorage.recent().filter { + $0.type == GlucoseType.manual.rawValue && + $0.dateString.addingTimeInterval(hours.hours.timeInterval) > Date() + } + } + func pumpHistory(hours: Int) -> [PumpHistoryEvent] { pumpHistoryStorage.recent().filter { $0.timestamp.addingTimeInterval(hours.hours.timeInterval) > Date() diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index ce2f41af0a..85c2edf47b 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -12,6 +12,7 @@ extension Home { private let timer = DispatchTimer(timeInterval: 5) private(set) var filteredHours = 24 @Published var glucose: [BloodGlucose] = [] + @Published var isManual: [BloodGlucose] = [] @Published var suggestion: Suggestion? @Published var uploadStats = false @Published var enactedSuggestion: Suggestion? @@ -216,6 +217,7 @@ extension Home { private func setupGlucose() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } + self.isManual = self.provider.manualGlucose(hours: self.filteredHours) self.glucose = self.provider.filteredGlucose(hours: self.filteredHours) self.recentGlucose = self.glucose.last if self.glucose.count >= 2 { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index dc70707ee8..f752fd1f7c 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -30,10 +30,13 @@ struct MainChartView: View { static let bolusSize: CGFloat = 8 static let bolusScale: CGFloat = 2.5 static let carbsSize: CGFloat = 10 + static let fpuSize: CGFloat = 5 static let carbsScale: CGFloat = 0.3 + static let fpuScale: CGFloat = 1 } @Binding var glucose: [BloodGlucose] + @Binding var isManual: [BloodGlucose] @Binding var suggestion: Suggestion? @Binding var tempBasals: [PumpHistoryEvent] @Binding var boluses: [PumpHistoryEvent] @@ -56,6 +59,8 @@ struct MainChartView: View { @State var didAppearTrigger = false @State private var glucoseDots: [CGRect] = [] + @State private var manualGlucoseDots: [CGRect] = [] + @State private var manualGlucoseDotsCenter: [CGRect] = [] @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @State private var bolusDots: [DotInfo] = [] @@ -270,6 +275,8 @@ struct MainChartView: View { bolusView(fullSize: fullSize) if smooth { unSmoothedGlucoseView(fullSize: fullSize) } glucoseView(fullSize: fullSize) + manualGlucoseView(fullSize: fullSize) + manualGlucoseCenterView(fullSize: fullSize) predictionsView(fullSize: fullSize) } timeLabelsView(fullSize: fullSize) @@ -342,6 +349,46 @@ struct MainChartView: View { } } + private func manualGlucoseView(fullSize: CGSize) -> some View { + Path { path in + for rect in manualGlucoseDots { + path.addEllipse(in: rect) + } + } + .fill(Color.gray) + .onChange(of: isManual) { _ in + update(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + update(fullSize: fullSize) + } + .onReceive(Foundation.NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in + update(fullSize: fullSize) + } + } + + private func manualGlucoseCenterView(fullSize: CGSize) -> some View { + Path { path in + for rect in manualGlucoseDotsCenter { + path.addEllipse(in: rect) + } + } + .fill(Color.red) + + .onChange(of: isManual) { _ in + update(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + update(fullSize: fullSize) + } + .onReceive( + Foundation.NotificationCenter.default + .publisher(for: UIApplication.willEnterForegroundNotification) + ) { _ in + update(fullSize: fullSize) + } + } + private func unSmoothedGlucoseView(fullSize: CGSize) -> some View { Path { path in var lines: [CGPoint] = [] @@ -410,16 +457,9 @@ struct MainChartView: View { private func fpuView(fullSize: CGSize) -> some View { ZStack { fpuPath - .fill(Color.red) + .fill(.orange.opacity(0.5)) fpuPath - .stroke(Color.primary, lineWidth: 0.5) - - ForEach(fpuDots, id: \.rect.minX) { info -> AnyView in - let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) - return Text(fpuFormatter.string(from: info.value as NSNumber)!).font(.caption2) - .position(position) - .asAny() - } + .stroke(Color.primary, lineWidth: 0.2) } .onChange(of: carbs) { _ in calculateFPUsDots(fullSize: fullSize) @@ -488,6 +528,8 @@ extension MainChartView { calculatePredictionDots(fullSize: fullSize, type: .zt) calculatePredictionDots(fullSize: fullSize, type: .uam) calculateGlucoseDots(fullSize: fullSize) + calculateManualGlucoseDots(fullSize: fullSize) + calculateManualGlucoseDotsCenter(fullSize: fullSize) calculateUnSmoothedGlucoseDots(fullSize: fullSize) calculateBolusDots(fullSize: fullSize) calculateCarbsDots(fullSize: fullSize) @@ -513,6 +555,38 @@ extension MainChartView { } } + private func calculateManualGlucoseDots(fullSize: CGSize) { + calculationQueue.async { + let dots = isManual.concurrentMap { value -> CGRect in + let position = glucoseToCoordinate(value, fullSize: fullSize) + return CGRect(x: position.x - 2, y: position.y - 2, width: 14, height: 14) + } + + let range = self.getGlucoseYRange(fullSize: fullSize) + + DispatchQueue.main.async { + glucoseYRange = range + manualGlucoseDots = dots + } + } + } + + private func calculateManualGlucoseDotsCenter(fullSize: CGSize) { + calculationQueue.async { + let dots = isManual.concurrentMap { value -> CGRect in + let position = glucoseToCoordinate(value, fullSize: fullSize) + return CGRect(x: position.x, y: position.y, width: 10, height: 10) + } + + let range = self.getGlucoseYRange(fullSize: fullSize) + + DispatchQueue.main.async { + glucoseYRange = range + manualGlucoseDotsCenter = dots + } + } + } + private func calculateUnSmoothedGlucoseDots(fullSize: CGSize) { calculationQueue.async { let dots = glucose.concurrentMap { value -> CGRect in @@ -579,7 +653,7 @@ extension MainChartView { let fpus = carbs.filter { $0.isFPU ?? false } let dots = fpus.map { value -> DotInfo in let center = timeToInterpolatedPoint(value.createdAt.timeIntervalSince1970, fullSize: fullSize) - let size = Config.carbsSize + CGFloat(value.carbs) * Config.carbsScale + let size = Config.fpuSize + CGFloat(value.carbs) * Config.fpuScale let rect = CGRect(x: center.x - size / 2, y: center.y - size / 2, width: size, height: size) return DotInfo(rect: rect, value: value.carbs) } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a3f4fd215e..4d00283cab 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -384,6 +384,7 @@ extension Home { MainChartView( glucose: $state.glucose, + isManual: $state.isManual, suggestion: $state.suggestion, tempBasals: $state.tempBasals, boluses: $state.boluses, diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 619ea92750..7dd504a1cb 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -170,6 +170,35 @@ extension NightscoutAPI { .eraseToAnyPublisher() } + func deleteManualGlucose(at date: Date) -> AnyPublisher { + var components = URLComponents() + components.scheme = url.scheme + components.host = url.host + components.port = url.port + components.path = Config.treatmentsPath + components.queryItems = [ + URLQueryItem(name: "find[glucose][$exists]", value: "true"), + URLQueryItem( + name: "find[created_at][$eq]", + value: Formatter.iso8601withFractionalSeconds.string(from: date) + ) + ] + + var request = URLRequest(url: components.url!) + request.allowsConstrainedNetworkAccess = false + request.timeoutInterval = Config.timeout + request.httpMethod = "DELETE" + + if let secret = secret { + request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") + } + + return service.run(request) + .retry(Config.retryCount) + .map { _ in () } + .eraseToAnyPublisher() + } + func deleteInsulin(at date: Date) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme @@ -445,6 +474,30 @@ extension NightscoutAPI { .map { _ in () } .eraseToAnyPublisher() } + + func uploadPreferences(_ preferences: Preferences) -> AnyPublisher { + var components = URLComponents() + components.scheme = url.scheme + components.host = url.host + components.port = url.port + components.path = Config.profilePath + + var request = URLRequest(url: components.url!) + request.allowsConstrainedNetworkAccess = false + request.timeoutInterval = Config.timeout + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + + if let secret = secret { + request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") + } + request.httpBody = try! JSONCoding.encoder.encode(preferences) + request.httpMethod = "POST" + + return service.run(request) + .retry(Config.retryCount) + .map { _ in () } + .eraseToAnyPublisher() + } } private extension String { diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index a418304da2..80ce54c582 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -11,8 +11,10 @@ protocol NightscoutManager: GlucoseSource { func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) func deleteInsulin(at date: Date) + func deleteManualGlucose(at: Date) func uploadStatus() func uploadGlucose() + func uploadManualGlucose() func uploadStatistics(dailystat: Statistics) func uploadPreferences(_ preferences: Preferences) func uploadProfileAndSettings() @@ -68,6 +70,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { broadcaster.register(PumpHistoryObserver.self, observer: self) broadcaster.register(CarbsObserver.self, observer: self) broadcaster.register(TempTargetsObserver.self, observer: self) + broadcaster.register(GlucoseObserver.self, observer: self) _ = reachabilityManager.startListening(onQueue: processQueue) { status in debug(.nightscout, "Network status: \(status)") } @@ -251,6 +254,22 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .store(in: &lifetime) } + func deleteManualGlucose(at date: Date) { + guard let nightscout = nightscoutAPI, isUploadEnabled else { + return + } + nightscout.deleteManualGlucose(at: date) + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Manual Glucose entry deleted") + case let .failure(error): + debug(.nightscout, error.localizedDescription) + } + } receiveValue: {} + .store(in: &lifetime) + } + func uploadStatistics(dailystat: Statistics) { let stats = NightscoutStatistics( dailystats: dailystat @@ -568,6 +587,13 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { uploadTreatments(glucoseStorage.nightscoutCGMStateNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedCGMState) } + func uploadManualGlucose() { + uploadTreatments( + glucoseStorage.nightscoutManualGlucoseNotUploaded(), + fileToSave: OpenAPS.Nightscout.uploadedManualGlucose + ) + } + private func uploadPumpHistory() { uploadTreatments(pumpHistoryStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedPumphistory) } @@ -658,3 +684,9 @@ extension BaseNightscoutManager: TempTargetsObserver { uploadTempTargets() } } + +extension BaseNightscoutManager: GlucoseObserver { + func glucoseDidUpdate(_: [BloodGlucose]) { + uploadManualGlucose() + } +} From f1f62eb77287773150067a5e7cf30f5288a74382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 21 Oct 2023 00:27:23 +0200 Subject: [PATCH 066/405] Fix rounding issue with manaul glucose entries. --- FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 39b3e642f9..7b59ce6f3e 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -22,10 +22,9 @@ extension DataTable { formatter.numberStyle = .decimal formatter.maximumFractionDigits = 0 if state.units == .mmolL { - formatter.minimumFractionDigits = 1 formatter.maximumFractionDigits = 1 + formatter.roundingMode = .ceiling } - formatter.roundingMode = .halfUp return formatter } From 6c440eb86b0e3d40b0ee948ccbebc17247e86153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 21 Oct 2023 00:40:36 +0200 Subject: [PATCH 067/405] Add missing localization for G7 Manager --- .../G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift index 9add43d559..322fc78fbe 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift +++ b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift @@ -72,7 +72,7 @@ struct G7SettingsView: View { } } - Section("Last Reading") { + Section(LocalizedString("Last Reading", comment: "")) { LabeledValueView(label: LocalizedString("Glucose", comment: "Field label"), value: viewModel.lastGlucoseString) LabeledDateView(label: LocalizedString("Time", comment: "Field label"), @@ -82,7 +82,7 @@ struct G7SettingsView: View { value: viewModel.lastGlucoseTrendString) } - Section("Bluetooth") { + Section(LocalizedString("Bluetooth", comment: "")) { if let name = viewModel.sensorName { HStack { Text(LocalizedString("Name", comment: "title for g7 settings row showing BLE Name")) @@ -114,7 +114,7 @@ struct G7SettingsView: View { } } - Section("Configuration") { + Section(LocalizedString("Configuration", comment: "")) { HStack { Toggle(LocalizedString("Upload Readings", comment: "title for g7 config settings to upload readings"), isOn: $viewModel.uploadReadings) } @@ -122,7 +122,7 @@ struct G7SettingsView: View { Section () { if !self.viewModel.scanning { - Button("Scan for new sensor", action: { + Button(LocalizedString("Scan for new sensor", comment: ""), action: { self.viewModel.scanForNewSensor() }) } From bca0d389c0e277054148f8eaf612d02b6b4f5256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 21 Oct 2023 01:06:52 +0200 Subject: [PATCH 068/405] Save Manual Glucose entries to Health (cherry picked from commit e02f4bc3d84c00c5b3674b6b901e93ab1cae62d4) --- FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 2286a2dc84..7021a84df0 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -6,6 +6,7 @@ extension DataTable { @Injected() var broadcaster: Broadcaster! @Injected() var unlockmanager: UnlockManager! @Injected() private var storage: FileStorage! + @Injected() var healthKitManager: HealthKitManager! let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -188,6 +189,10 @@ extension DataTable { ) provider.glucoseStorage.storeGlucose([saveToJSON]) debug(.default, "Manual Glucose saved to glucose.json") + // Save to Health + var saveToHealth = [BloodGlucose]() + saveToHealth.append(saveToJSON) + healthKitManager.saveIfNeeded(bloodGlucose: saveToHealth) } } } From e112991cb3743770fa8b730d1c5a010a4dadd6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 21 Oct 2023 01:48:42 +0200 Subject: [PATCH 069/405] Add string (cherry picked from commit a261b6a0f6f4a6fe4c403e21255f7c42a555dced) --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 1262de9da8..05b03384c6 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; From 3cda9efe2d2d693580727bf35a120461d1fdb31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:21 +0200 Subject: [PATCH 070/405] New translations localizable.strings (Dutch) --- .../Sources/Localizations/Main/nl.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index c1a7fb7107..b153d2473c 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Kan Nightscout profiel niet vinden."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic toevoegen"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS is niet actief!"; /* */ -"Last loop was more then %d min ago" = "Laatste loop was meer dan %d min geleden"; +"Last loop was more than %d min ago" = "Laatste loop was meer dan %d min geleden"; /* Glucose badge */ "Show glucose on the app badge" = "Toon glucosewaarde op de app icoon"; From fb670322d2cbeb52f1d5c36b47641dfd699a5eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:22 +0200 Subject: [PATCH 071/405] New translations localizable.strings (French) --- .../Sources/Localizations/Main/fr.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 8e8490bfeb..8ecc9dcb13 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Ajouter une pompe Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS pas actif"; /* */ -"Last loop was more then %d min ago" = "Dernier bouclage depuis plus de %d min"; +"Last loop was more than %d min ago" = "Dernier bouclage depuis plus de %d min"; /* Glucose badge */ "Show glucose on the app badge" = "Afficher glycémie en tant que badge"; From 30a57f8444be15ef1b233d05460ee260e04b846a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:23 +0200 Subject: [PATCH 072/405] New translations localizable.strings (Spanish) --- .../Sources/Localizations/Main/es.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 65fa811e6d..4c33b986fe 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Añadir Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 81121acedf518af1a766e3cac57b16b54469255d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:24 +0200 Subject: [PATCH 073/405] New translations localizable.strings (Arabic) --- .../Sources/Localizations/Main/ar.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index daf5e9c1f0..c96f3f8406 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From ccebbce8f5df1929ff9fc03c85a70a01863d7170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:25 +0200 Subject: [PATCH 074/405] New translations localizable.strings (Danish) --- .../Sources/Localizations/Main/da.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 24fe70b286..3649d64403 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Tilføj Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 895f2f01beeea5359cae7a6d25c2afdd98fed51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:26 +0200 Subject: [PATCH 075/405] New translations localizable.strings (German) --- .../Sources/Localizations/Main/de.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 8f1d65b69f..c64bac88bb 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic-Pumpe hinzufügen"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS ist nicht aktiv"; /* */ -"Last loop was more then %d min ago" = "Letzter Loop vor mehr als %d Minuten"; +"Last loop was more than %d min ago" = "Letzter Loop vor mehr als %d Minuten"; /* Glucose badge */ "Show glucose on the app badge" = "Zeige Glucosewert auf dem App Symbol"; From d9440be351a71b3c8be59aac007df993798a7501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:28 +0200 Subject: [PATCH 076/405] New translations localizable.strings (Finnish) --- .../Sources/Localizations/Main/fi.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index b34ab36792..70c9d5b995 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 2795ce7d3f948e622e516b6341b01c096a828266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:29 +0200 Subject: [PATCH 077/405] New translations localizable.strings (Hebrew) --- .../Sources/Localizations/Main/he.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index daf5e9c1f0..c96f3f8406 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From b7f2bba52f8636c9ce71902c33799a3288be3876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:30 +0200 Subject: [PATCH 078/405] New translations localizable.strings (Italian) --- .../Sources/Localizations/Main/it.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 55635b473b..65092af189 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Aggiungi microinfusore Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS non attivo"; /* */ -"Last loop was more then %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; +"Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; /* Glucose badge */ "Show glucose on the app badge" = "Mostra il glicemie sul badge dell'app"; From dc57a921d6fca845c829e5ccaf37d8d138c0d0e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:31 +0200 Subject: [PATCH 079/405] New translations localizable.strings (Polish) --- .../Sources/Localizations/Main/pl.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index cc8f68a061..9ce06bcdf2 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -352,6 +352,9 @@ Połączono z Nightscout!"; /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -989,7 +992,7 @@ Połączono z Nightscout!"; "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 4074d34dd84ad0a247070da7b5e56af24dfdda23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:32 +0200 Subject: [PATCH 080/405] New translations localizable.strings (Portuguese) --- .../Localizations/Main/pt-PT.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index c115dbd101..26e055217c 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Adicionar Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From bc15348628b4f12c7a881d17236cc3806276bc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:33 +0200 Subject: [PATCH 081/405] New translations localizable.strings (Russian) --- .../Sources/Localizations/Main/ru.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 3f6d123e4b..bba6524a0b 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Не удается найти профиль Nightscout по умолчанию."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Добавить Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS неактивен"; /* */ -"Last loop was more then %d min ago" = "Последний цикл был более %d минут назад"; +"Last loop was more than %d min ago" = "Последний цикл был более %d минут назад"; /* Glucose badge */ "Show glucose on the app badge" = "Показывать глюкозу на значке приложения"; From c5a14ba3cecb0e33ec1cb0032fea0bf9e819b726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:34 +0200 Subject: [PATCH 082/405] New translations localizable.strings (Slovak) --- .../Sources/Localizations/Main/sk.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 54fc1f76f6..e2af781755 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Add Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 8ed6e8c7c29c38760ed72dd4bfddce226eacaf74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:35 +0200 Subject: [PATCH 083/405] New translations localizable.strings (Swedish) --- .../Sources/Localizations/Main/sv.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 65df7d82c2..e8e6b52a96 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Kan inte hitta en profil i Nightcsout"; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blodsockerprov"; + /* Add Medtronic pump */ "Add Medtronic" = "Lägg till Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS är inte aktiv"; /* */ -"Last loop was more then %d min ago" = "Senaste loopen var mer än %d min sedan"; +"Last loop was more than %d min ago" = "Senaste loop var för mer än %d min sedan"; /* Glucose badge */ "Show glucose on the app badge" = "Visa glukosvärde på app-ikon"; From eb5457966785ec46cb9a6e56ee897acfb31dea2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:36 +0200 Subject: [PATCH 084/405] New translations localizable.strings (Turkish) --- .../Sources/Localizations/Main/tr.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 1d73a4d269..b7b15c1cd5 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Medtronic Pompa ekle"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS etkin değil"; /* */ -"Last loop was more then %d min ago" = "Son döngü %d dak kadar önceydi"; +"Last loop was more than %d min ago" = "Son döngü %d dak kadar önceydi"; /* Glucose badge */ "Show glucose on the app badge" = "Uygulama rozetinde glikozu göster"; From af434e9ee169c3d29e577b89899940e8c198f992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:38 +0200 Subject: [PATCH 085/405] New translations localizable.strings (Ukrainian) --- .../Sources/Localizations/Main/uk.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index ddeb24aaa3..44e32e8801 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Не вдається знайти профіль Nightscout за замовчуванням."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Додати Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS не активний"; /* */ -"Last loop was more then %d min ago" = "Останній цикл був більше, ніж %d хв тому"; +"Last loop was more than %d min ago" = "Останній цикл був більше, ніж %d хв тому"; /* Glucose badge */ "Show glucose on the app badge" = "Показувати глюкозу на значку додатку"; From 7340e62b04b34bc6de21a11e22985ae5e9474a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:39 +0200 Subject: [PATCH 086/405] New translations localizable.strings (Chinese Simplified) --- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index ce451e52aa..e731371bcc 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "添加美敦力泵"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS 未激活"; /* */ -"Last loop was more then %d min ago" = "上次闭环成功在 %d 分钟前"; +"Last loop was more than %d min ago" = "上次闭环成功在 %d 分钟前"; /* Glucose badge */ "Show glucose on the app badge" = "在应用图表上显示葡萄糖。"; From fd7141add643788e9753c79ea282e1a4ad6712e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:40 +0200 Subject: [PATCH 087/405] New translations localizable.strings (Portuguese, Brazilian) --- .../Localizations/Main/pt-BR.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 72095619dc..354d643043 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Adicionar Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS not active"; /* */ -"Last loop was more then %d min ago" = "Last loop was more then %d min ago"; +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; From 72231c39f03690a27e9f552ada2a789cc67d3e6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 01:55:41 +0200 Subject: [PATCH 088/405] New translations localizable.strings (Norwegian Bokmal) --- .../Sources/Localizations/Main/nb.lproj/Localizable.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 7d6d7ed55b..029fdfe1b4 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -350,6 +350,9 @@ Enact a temp Basal or a temp target */ /* Import Error */ "Can't find the default Nightscout Profile." = "Finner ikke standard profil i Nightscout."; +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + /* Add Medtronic pump */ "Add Medtronic" = "Legge til Medtronic"; @@ -987,7 +990,7 @@ Enact a temp Basal or a temp target */ "iAPS not active" = "iAPS ikke aktiv"; /* */ -"Last loop was more then %d min ago" = "Siste loop var mer enn %d min siden"; +"Last loop was more than %d min ago" = "Siste loop var mer enn %d min siden"; /* Glucose badge */ "Show glucose on the app badge" = "Vis blodsukker på app-ikonet"; From 4465b8fee8ca17849d4b2e551f46cbd08e5759a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 21 Oct 2023 12:28:13 +0200 Subject: [PATCH 089/405] Manual Glucose. Use rounded corners (after feedback) --- .../Modules/DataTable/View/DataTableRootView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 7b59ce6f3e..9ff129d7bf 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -53,7 +53,7 @@ extension DataTable { } .onAppear(perform: configureView) .navigationTitle(isLayered ? "" : "History") - .blur(radius: isLayered ? 3.0 : 0) + .blur(radius: isLayered ? 4.0 : 0) .navigationBarTitleDisplayMode(.automatic) .navigationBarItems(leading: Button(isLayered ? "" : "Close", action: state.hideModal)) .popup(isPresented: newGlucose, alignment: .center, direction: .top) { @@ -121,11 +121,11 @@ extension DataTable { .font(.custom("popupButtons", fixedSize: 16)) } } - .frame(maxHeight: 220) + .frame(minHeight: 220, maxHeight: 260).cornerRadius(20) .background( - RoundedRectangle(cornerRadius: 8, style: .continuous) + RoundedRectangle(cornerRadius: 20, style: .continuous) .fill(Color(.tertiarySystemBackground)) - ).border(.gray).shadow(radius: 40) + ).shadow(radius: 40) } @ViewBuilder private func treatmentView(_ item: Treatment) -> some View { From cce037f66a256e0a7bb3cb1bb8862c3a981f13c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 12:46:48 +0200 Subject: [PATCH 090/405] New translations localizable.strings (Norwegian Bokmal) --- FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 029fdfe1b4..677ba08ab7 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -351,7 +351,7 @@ Enact a temp Basal or a temp target */ "Can't find the default Nightscout Profile." = "Finner ikke standard profil i Nightscout."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Blodsukkermåling"; /* Add Medtronic pump */ "Add Medtronic" = "Legge til Medtronic"; From 7cd6130ec8a4df982a5fe6f6e70bcb96e51906c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 16:22:08 +0200 Subject: [PATCH 091/405] New translations localizable.strings (Dutch) --- FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index b153d2473c..0525c489c3 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -351,7 +351,7 @@ Enact a temp Basal or a temp target */ "Can't find the default Nightscout Profile." = "Kan Nightscout profiel niet vinden."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Bloedglucose test"; /* Add Medtronic pump */ "Add Medtronic" = "Medtronic toevoegen"; From ce6d7de71fce051198c5190f32ee0b7713f84095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 17:27:42 +0200 Subject: [PATCH 092/405] New translations localizable.strings (Russian) --- FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index bba6524a0b..0c6cbc2533 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -351,7 +351,7 @@ Enact a temp Basal or a temp target */ "Can't find the default Nightscout Profile." = "Не удается найти профиль Nightscout по умолчанию."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Тест на глюкозу в крови"; /* Add Medtronic pump */ "Add Medtronic" = "Добавить Medtronic"; From d11c091bcdefebbc62c6da468d360bd5307c3425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 21 Oct 2023 17:27:43 +0200 Subject: [PATCH 093/405] New translations localizable.strings (Russian) --- .../G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings index 585bf0bf08..1fca7ed023 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings @@ -99,7 +99,7 @@ "Sensor failed" = "Сбой датчика"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Запуск датчика"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Сигнал\nПотерян"; From 331ee475638b97d32830e4551eac40b232c47338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 22 Oct 2023 00:21:03 +0200 Subject: [PATCH 094/405] Dexcom G7 SAGE Upload activation and session start date to NS. --- FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift b/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift index 0d35538a7c..1b585ef217 100644 --- a/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift +++ b/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift @@ -135,6 +135,15 @@ extension DexcomSourceG7: CGMManagerDelegate { debug(.deviceManager, "DEXCOMG7 - Process CGM Reading Result launched") switch readingResult { case let .newData(values): + + var activationDate: Date = .distantPast + var sessionStart: Date = .distantPast + if let cgmG7Manager = cgmManager as? G7CGMManager { + activationDate = cgmG7Manager.sensorActivatedAt ?? .distantPast + sessionStart = cgmG7Manager.sensorFinishesWarmupAt ?? .distantPast + print("Activastion date: " + activationDate.description) + } + let bloodGlucose = values.compactMap { newGlucoseSample -> BloodGlucose? in let quantity = newGlucoseSample.quantity let value = Int(quantity.doubleValue(for: .milligramsPerDeciliter)) @@ -148,7 +157,9 @@ extension DexcomSourceG7: CGMManagerDelegate { filtered: nil, noise: nil, glucose: value, - type: "sgv" + type: "sgv", + activationDate: activationDate, + sessionStartDate: sessionStart ) } From 4a39fba4390b5e8e39eb45eda252cc753281f39f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 22 Oct 2023 12:20:37 +0200 Subject: [PATCH 095/405] Force push Profiles and settings when using button --- .../Modules/Settings/SettingsStateModel.swift | 6 +++--- .../Modules/Settings/View/SettingsRootView.swift | 2 +- .../Sources/Services/Network/NightscoutManager.swift | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift index c36317b531..d2c8e4a8fe 100644 --- a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift +++ b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift @@ -46,13 +46,13 @@ extension Settings { return items } - func uploadProfileAndSettings() { + func uploadProfileAndSettings(_: Bool) { NSLog("SettingsState Upload Profile") - nightscoutManager.uploadProfileAndSettings() + nightscoutManager.uploadProfileAndSettings(true) } func hideSettingsModal() { - nightscoutManager.uploadProfileAndSettings() + nightscoutManager.uploadProfileAndSettings(false) hideModal() } } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 53bb3c63d0..4698551020 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -51,7 +51,7 @@ extension Settings { Group { HStack { Text("NS Upload Profile and Settings") - Button("Upload") { state.uploadProfileAndSettings() } + Button("Upload") { state.uploadProfileAndSettings(true) } .frame(maxWidth: .infinity, alignment: .trailing) .buttonStyle(.borderedProminent) } diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 80ce54c582..c5267af953 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -17,7 +17,7 @@ protocol NightscoutManager: GlucoseSource { func uploadManualGlucose() func uploadStatistics(dailystat: Statistics) func uploadPreferences(_ preferences: Preferences) - func uploadProfileAndSettings() + func uploadProfileAndSettings(_: Bool) var cgmURL: URL? { get } } @@ -445,7 +445,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } } - func uploadProfileAndSettings() { + func uploadProfileAndSettings(_ force: Bool) { // These should be modified anyways and not the defaults guard let sensitivities = storage.retrieve(OpenAPS.Settings.insulinSensitivities, as: InsulinSensitivities.self), let basalProfile = storage.retrieve(OpenAPS.Settings.basalProfile, as: [BasalProfileEntry].self), @@ -454,7 +454,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self), let settings = storage.retrieve(OpenAPS.FreeAPS.settings, as: FreeAPSSettings.self) else { - NSLog("NightscoutManager uploadProfile Not all settings found to build profile!") + debug(.nightscout, "NightscoutManager uploadProfile Not all settings found to build profile!") return } @@ -548,20 +548,20 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { // UPLOAD PREFERNCES WHEN CHANGED if let uploadedPreferences = storage.retrieve(OpenAPS.Nightscout.uploadedPreferences, as: Preferences.self), - uploadedPreferences.rawJSON.sorted() == preferences.rawJSON.sorted() + uploadedPreferences.rawJSON.sorted() == preferences.rawJSON.sorted(), !force { NSLog("NightscoutManager Preferences, preferences unchanged") } else { uploadPreferences(preferences) } // UPLOAD FreeAPS Settings WHEN CHANGED if let uploadedSettings = storage.retrieve(OpenAPS.Nightscout.uploadedSettings, as: FreeAPSSettings.self), - uploadedSettings.rawJSON.sorted() == settings.rawJSON.sorted() + uploadedSettings.rawJSON.sorted() == settings.rawJSON.sorted(), !force { NSLog("NightscoutManager Settings, settings unchanged") } else { uploadSettings(settings) } if let uploadedProfile = storage.retrieve(OpenAPS.Nightscout.uploadedProfile, as: NightscoutProfileStore.self), - (uploadedProfile.store["default"]?.rawJSON ?? "").sorted() == ps.rawJSON.sorted() + (uploadedProfile.store["default"]?.rawJSON ?? "").sorted() == ps.rawJSON.sorted(), !force { NSLog("NightscoutManager uploadProfile, no profile change") return From 6011575963a9564286fdbe4530652b43377c76b0 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 22 Oct 2023 17:09:10 +0200 Subject: [PATCH 096/405] Add "non-pump insulin" as treatment type (#267) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jonas Björkert --- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../APS/Storage/PumpHistoryStorage.swift | 16 ++++++++++-- .../Main/de.lproj/Localizable.strings | 3 +++ .../Main/en.lproj/Localizable.strings | 6 +++++ FreeAPS/Sources/Models/PumpHistoryEvent.swift | 9 +++++-- .../Modules/Bolus/BolusStateModel.swift | 3 ++- .../Modules/DataTable/DataTableDataFlow.swift | 25 +++++++++++++------ .../DataTable/DataTableStateModel.swift | 3 ++- 8 files changed, 52 insertions(+), 15 deletions(-) diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 142d983415..2cfe78ebfa 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index 16fee07041..b3b034f0de 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -45,7 +45,8 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { rate: nil, temp: nil, carbInput: nil, - isSMB: dose.automatic + isSMB: dose.automatic, + isNonPumpInsulin: dose.manuallyEntered )] case .tempBasal: guard let dose = event.dose else { return [] } @@ -210,6 +211,16 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { } } + func determineBolusEventType(for event: PumpHistoryEvent) -> EventType { + if event.isSMB ?? false { + return .smb + } + if event.isNonPumpInsulin ?? false { + return .nonPumpInsulin + } + return event.type + } + func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] { let events = recent() guard !events.isEmpty else { return [] } @@ -250,13 +261,14 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { let bolusesAndCarbs = events.compactMap { event -> NigtscoutTreatment? in switch event.type { case .bolus: + let eventType = determineBolusEventType(for: event) return NigtscoutTreatment( duration: event.duration, rawDuration: nil, rawRate: nil, absolute: nil, rate: nil, - eventType: (event.isSMB ?? false) ? .smb : .bolus, + eventType: eventType, createdAt: event.timestamp, enteredBy: NigtscoutTreatment.local, bolus: event, diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index c64bac88bb..e7b8112ce7 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1171,6 +1171,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of non-pump insulin */ +"Non-pump Insulin" = "Externes Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuelle Temporäre Basalrate"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 05b03384c6..8cd859d1b3 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -569,6 +569,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* Non-pump insulin treatments */ +"Non-Pump" = "Non-Pump"; + /* */ "Other" = "Other"; @@ -1172,6 +1175,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of non-pump insulin */ +"Non-pump Insulin" = "Non-pump Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index b7a06a2996..c53362d3d9 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -12,6 +12,7 @@ struct PumpHistoryEvent: JSON, Equatable { let carbInput: Int? let note: String? let isSMB: Bool? + let isNonPumpInsulin: Bool? init( id: String, @@ -24,7 +25,8 @@ struct PumpHistoryEvent: JSON, Equatable { temp: TempType? = nil, carbInput: Int? = nil, note: String? = nil, - isSMB: Bool? = nil + isSMB: Bool? = nil, + isNonPumpInsulin: Bool? = nil ) { self.id = id self.type = type @@ -37,13 +39,15 @@ struct PumpHistoryEvent: JSON, Equatable { self.carbInput = carbInput self.note = note self.isSMB = isSMB + self.isNonPumpInsulin = isNonPumpInsulin } } enum EventType: String, JSON { case bolus = "Bolus" case smb = "SMB" - case mealBulus = "Meal Bolus" + case nonPumpInsulin = "Non-pump Insulin" + case mealBolus = "Meal Bolus" case correctionBolus = "Correction Bolus" case snackBolus = "Snack Bolus" case bolusWizard = "BolusWizard" @@ -86,5 +90,6 @@ extension PumpHistoryEvent { case carbInput = "carb_input" case note case isSMB + case isNonPumpInsulin } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index a8f22abdb9..72a53a01a6 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -86,7 +86,8 @@ extension Bolus { durationMin: nil, rate: nil, temp: nil, - carbInput: nil + carbInput: nil, + isNonPumpInsulin: true ) ] ) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 39185b734b..41f448f414 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -67,6 +67,7 @@ enum DataTable { let fpuID: String? let note: String? let isSMB: Bool? + let isNonPump: Bool? private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -94,7 +95,8 @@ enum DataTable { isFPU: Bool? = nil, fpuID: String? = nil, note: String? = nil, - isSMB: Bool? = nil + isSMB: Bool? = nil, + isNonPump: Bool? = nil ) { self.units = units self.type = type @@ -108,6 +110,7 @@ enum DataTable { self.fpuID = fpuID self.note = note self.isSMB = isSMB + self.isNonPump = isNonPump } static func == (lhs: Treatment, rhs: Treatment) -> Bool { @@ -135,12 +138,18 @@ enum DataTable { return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: + var bolusText = " " + + if isSMB ?? false { + bolusText += NSLocalizedString("Automatic", comment: "Automatic delivered treatments") + } else if isNonPump ?? false { + bolusText += NSLocalizedString("Non-Pump", comment: "Non-pump Insulin") + } else { + bolusText += NSLocalizedString("Manual", comment: "Manual Bolus") + } + return numberFormatter - .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + - ( - (isSMB ?? false) ? " " + NSLocalizedString("Automatic", comment: "Automatic delivered treatments") : " " + - NSLocalizedString("Manual", comment: "Manual Bolus") - ) + .string(from: amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") + bolusText case .tempBasal: return numberFormatter .string(from: amount as NSNumber)! + NSLocalizedString(" U/hr", comment: "Unit insulin per hour") @@ -172,9 +181,9 @@ enum DataTable { case .fpus: return .orange.opacity(0.5) case .bolus: - return .insulin + return Color.insulin case .tempBasal: - return Color.insulin.opacity(0.5) + return Color.insulin.opacity(0.4) case .resume, .suspend, .tempTarget: diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 7021a84df0..f23b5fd910 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -73,7 +73,8 @@ extension DataTable { date: $0.timestamp, amount: $0.amount, idPumpEvent: $0.id, - isSMB: $0.isSMB + isSMB: $0.isSMB, + isNonPump: $0.isNonPumpInsulin ) } From 8f1f21cdb2d95b9c0c7b90deb857aee66cf5b63f Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:11:26 +0200 Subject: [PATCH 097/405] Decrease opacity for temp basals in darkmode (#268) --- .../Assets.xcassets/Colors/Basal.colorset/Contents.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json index 7aae3ba200..cfddd9cc6f 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json @@ -22,10 +22,10 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" + "alpha" : "0.500", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" } }, "idiom" : "universal" From 824be7a212b42bd4ee9fffa19aae3e07ce32cc1f Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sun, 22 Oct 2023 21:13:45 +0200 Subject: [PATCH 098/405] Add non-pump insulin dialog * New entry dialog to add non-pump insulin in history view * Removes `Add bolus without actually bolusing` functionality from the bolus entry dialog * New dialog adds ability to back-date insulin entries * Backdating is limited to past dates up to current date --- .../Modules/Bolus/View/BolusRootView.swift | 51 +------- .../Modules/DataTable/DataTableProvider.swift | 6 + .../DataTable/DataTableStateModel.swift | 39 ++++++ .../DataTable/View/DataTableRootView.swift | 122 +++++++++++++++++- 4 files changed, 169 insertions(+), 49 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 0f1f38b06f..cfa5d4e000 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -59,7 +59,6 @@ extension Bolus { } } header: { Text("Recommendation") } - if !state.waitForSuggestion { Section { HStack { @@ -79,58 +78,18 @@ extension Bolus { Section { Button { state.add() } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) .disabled( state.amount <= 0 || state.amount > state.maxBolus ) } - Section { - if waitForSuggestion { + + if waitForSuggestion { + Section { Button { state.showModal(for: nil) } - label: { Text("Continue without bolus") } - } else { - Button { isAddInsulinAlertPresented = true } - label: { Text("Add insulin without actually bolusing") } - .disabled(state.amount <= 0 || state.amount > state.maxBolus * 3) + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } - .alert(isPresented: $isAddInsulinAlertPresented) { - let isOverMax = state.amount > state.maxBolus ? true : false - let secondParagrap1 = "Add" - let secondParagraph2 = " U" - let secondParagraph3 = " without bolusing" - let insulinAmount = formatter.string(from: state.amount as NSNumber)! - - // Actual alert - return Alert( - title: Text( - isOverMax ? "Warning" : "Are you sure?" - ), - message: - Text( - isOverMax ? ( - NSLocalizedString( - "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add ", - comment: "Alert" - ) + insulinAmount + - NSLocalizedString(secondParagraph2, comment: "Insulin unit") + - NSLocalizedString(secondParagraph3, comment: "Add insulin without bolusing alert") + "?" - ) : - NSLocalizedString(secondParagrap1, comment: "Add insulin without bolusing alert") + - " " + - insulinAmount + - NSLocalizedString(secondParagraph2, comment: "Insulin unit") + - NSLocalizedString(secondParagraph3, comment: "Add insulin without bolusing alert") - ), - primaryButton: .destructive( - Text("Add"), - action: { - state.addWithoutBolus() - isAddInsulinAlertPresented = false - } - ), - secondaryButton: .cancel() - ) - } } } .alert(isPresented: $displayError) { diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index 62f8a4a7c2..f5a8e50ddd 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -13,6 +13,12 @@ extension DataTable { pumpHistoryStorage.recent() } + func pumpSettings() -> PumpSettings { + storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self) + ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings)) + ?? PumpSettings(insulinActionCurve: 6, maxBolus: 10, maxBasal: 2) + } + func tempTargets() -> [TempTarget] { tempTargetsStorage.recent() } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index f23b5fd910..40050be969 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -6,6 +6,7 @@ extension DataTable { @Injected() var broadcaster: Broadcaster! @Injected() var unlockmanager: UnlockManager! @Injected() private var storage: FileStorage! + @Injected() var pumpHistoryStorage: PumpHistoryStorage! @Injected() var healthKitManager: HealthKitManager! let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -14,11 +15,15 @@ extension DataTable { @Published var treatments: [Treatment] = [] @Published var glucose: [Glucose] = [] @Published var manualGlcuose: Decimal = 0 + @Published var maxBolus: Decimal = 0 + @Published var nonPumpInsulinAmount: Decimal = 0 + @Published var nonPumpInsulinDate = Date() var units: GlucoseUnits = .mmolL override func subscribe() { units = settingsManager.settings.units + maxBolus = provider.pumpSettings().maxBolus setupTreatments() setupGlucose() broadcaster.register(SettingsObserver.self, observer: self) @@ -195,6 +200,40 @@ extension DataTable { saveToHealth.append(saveToJSON) healthKitManager.saveIfNeeded(bloodGlucose: saveToHealth) } + + func addNonPumpInsulin() { + guard nonPumpInsulinAmount > 0 else { + showModal(for: nil) + return + } + + nonPumpInsulinAmount = min(nonPumpInsulinAmount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin + unlockmanager.unlock() + .sink { _ in } receiveValue: { [weak self] _ in + guard let self = self else { return } + pumpHistoryStorage.storeEvents( + [ + PumpHistoryEvent( + id: UUID().uuidString, + type: .bolus, + timestamp: nonPumpInsulinDate, + amount: nonPumpInsulinAmount, + duration: nil, + durationMin: nil, + rate: nil, + temp: nil, + carbInput: nil, + isNonPumpInsulin: true + ) + ] + ) + debug(.default, "Non-pump insulin saved to pumphistory.json") + + // Reset amount to 0 for next entry. + nonPumpInsulinAmount = 0 + } + .store(in: &lifetime) + } } } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9ff129d7bf..0eeabbb77a 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -11,12 +11,21 @@ extension DataTable { @State private var removeCarbsAlert: Alert? @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? + @State private var showNonPumpInsulin: Bool = false + @State private var isAmountUnconfirmed: Bool = true @State private var newGlucose = false @State private var isLayered = false @FocusState private var isFocused: Bool @Environment(\.colorScheme) var colorScheme + private var insulinFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -59,12 +68,49 @@ extension DataTable { .popup(isPresented: newGlucose, alignment: .center, direction: .top) { addGlucose } + .sheet(isPresented: $showNonPumpInsulin, onDismiss: { if isAmountUnconfirmed { state.nonPumpInsulinAmount = 0 + state.nonPumpInsulinDate = Date() } }) { + addNonPumpInsulinView + } } private var treatmentsList: some View { - List { - ForEach(state.treatments) { item in - treatmentView(item) + Section( + header: VStack { + Spacer() + Button(action: { showNonPumpInsulin = true + state.nonPumpInsulinDate = Date() }, label: { + HStack { + Text( + NSLocalizedString("Non-Pump Insulin", comment: "Non-Pump Insulin button text") + ) + .foregroundColor(Color.gray) + .font(.body).textCase(.none) + + Image(systemName: "plus.circle.fill") + .resizable() + .frame(width: 24, height: 24) + .foregroundColor(Color.gray) + }.frame(maxWidth: .infinity, alignment: .trailing) + + }).buttonStyle(.borderless) + + Spacer() + } + ) { + List { + if !state.treatments.isEmpty { + ForEach(state.treatments) { item in + treatmentView(item) + } + } else { + HStack { + Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) + } + } + } + .alert(isPresented: $isRemoveInsulinAlertPresented) { + removeInsulinAlert! } } } @@ -212,6 +258,76 @@ extension DataTable { } } + var addNonPumpInsulinView: some View { + NavigationView { + VStack { + Form { + Section { + HStack { + Text(NSLocalizedString("Amount", comment: "")) + Spacer() + DecimalTextField( + "0", + value: $state.nonPumpInsulinAmount, + formatter: insulinFormatter, + autofocus: true, + cleanInput: true + ) + Text("U").foregroundColor(.secondary) + } + } + + Section { + DatePicker("Date", selection: $state.nonPumpInsulinDate, in: ...Date()) + } + + let amountWarningCondition = (state.nonPumpInsulinAmount > state.maxBolus) && + (state.nonPumpInsulinAmount <= state.maxBolus * 3) + + Section { + HStack { + Button { + state.addNonPumpInsulin() + isAmountUnconfirmed = false + showNonPumpInsulin = false + } + label: { + Text(NSLocalizedString( + "Log non-pump insulin", + comment: "Log non-pump insulin button text" + )) + } + .foregroundColor(amountWarningCondition ? Color.white : Color.accentColor) + .frame(maxWidth: .infinity, alignment: .center) + .disabled( + state.nonPumpInsulinAmount <= 0 || state.nonPumpInsulinAmount > state + .maxBolus * 3 + ) + } + } + header: { + if amountWarningCondition + { + Text(NSLocalizedString( + "⚠️ Warning! The entered insulin amount is greater than your Max Bolus setting!", + comment: "Non-pump insulin maxBolus * 3 alert text" + )) + } + } + .listRowBackground( + amountWarningCondition ? Color + .red : colorScheme == .dark ? Color(UIColor.secondarySystemBackground) : Color.white + ) + } + } + .onAppear(perform: configureView) + .navigationTitle("Non-Pump Insulin") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: { showNonPumpInsulin = false + state.nonPumpInsulinAmount = 0 })) + } + } + @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View { VStack(alignment: .leading, spacing: 4) { HStack { From 674cbce6e8b2bf1f38b1f949de64ffba6075d313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:04:33 +0200 Subject: [PATCH 099/405] Danish Crowdin updates (#270) --- .../da.lproj/Localizable.strings | 50 +- .../G7SensorKit/da.lproj/Localizable.strings | 64 +-- .../Resources/da.lproj/Localizable.strings | 6 +- .../Resources/da.lproj/Localizable.strings | 4 +- .../da.lproj/Localizable.strings | 436 +++++++++--------- .../Resources/da.lproj/Localizable.strings | 6 +- .../da.lproj/Localizable.strings | 2 +- FreeAPS/Resources/da.lproj/InfoPlist.strings | 14 +- .../Main/da.lproj/Localizable.strings | 340 +++++++------- 9 files changed, 461 insertions(+), 461 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings index bd0edb7c8b..25ddad8adc 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Er du sikker på, at du vil slette denne CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -26,7 +26,7 @@ "Continue" = "Fortsæt"; /* Button label for removing CGM */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Slet CGM"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ @@ -39,79 +39,79 @@ "Glucose" = "Glukose"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Nådeperiodens Slut"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Tilbageværende nådeperiode"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "HØJ"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Sidste Forbindelse"; /* No comment provided by engineer. */ -"Last Reading" = "Last Reading"; +"Last Reading" = "Sidste Aflæsning"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan læse G7 CGM-data, men du skal stadig bruge Dexcom G7-appen til parring, kalibrering og anden sensorkontrol."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "LAV"; /* title for g7 settings row showing BLE Name */ -"Name" = "Name"; +"Name" = "Navn"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan efter ny sensor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Scanner"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Søger efter\nSensor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Søger efter sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\nUdløbet"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\nFejlede"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\nProblem"; /* G7 Status highlight text for sensor warmup */ "Sensor\nWarmup" = "Sensor\nWarmup"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Sensor Udløber"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Sensor udløbet"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor udløber"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Sensor fejlede"; /* title for g7 settings row showing sensor start time */ "Sensor Start" = "Start sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Signaltab"; /* Field label */ -"Time" = "Time"; +"Time" = "Tid"; /* Field label */ "Trend" = "Trend"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Upload Aflæsninger"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Warmup fuldfører"; diff --git a/Dependencies/G7SensorKit/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/da.lproj/Localizable.strings index eef2c767b9..d5a287e65f 100644 --- a/Dependencies/G7SensorKit/da.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/da.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan læse G7 CGM-data, men du skal stadig bruge Dexcom G7-appen til parring, kalibrering og anden sensorkontrol."; /* Button title for starting setup */ "Continue" = "Fortsæt"; @@ -11,51 +11,51 @@ "Cancel" = "Annuller"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Glucose data is unavailable"; +"Glucose data is unavailable" = "Glukosedata ikke tilgængeligt"; /* The description of sensor algorithm state when sensor is ok. */ -"Sensor is OK" = "Sensor is OK"; +"Sensor is OK" = "Sensor er OK"; /* The description of sensor algorithm state when sensor is stopped." */ -"Sensor is stopped" = "Sensor is stopped"; +"Sensor is stopped" = "Sensor er stoppet"; /* The description of sensor algorithm state when sensor is warming up. */ -"Sensor is warming up" = "Sensor is warming up"; +"Sensor is warming up" = "Sensor varmer op"; /* The description of sensor algorithm state when sensor is expired. */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Sensor udløbet"; /* The description of sensor algorithm state when sensor failed. */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Sensor fejlede"; /* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */ -"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d"; +"Sensor is in unknown state %1$d" = "Sensor i ukendt tilstand %1$d"; /* title for g7 settings row showing sensor start time */ "Sensor Start" = "Sensor Start"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Sensor Udløber"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Nådeperiodens Slut"; /* Field label */ "Glucose" = "Glukose"; -"Last Reading" = "Last Reading"; +"Last Reading" = "Sidste Aflæsning"; -"Time" = "Time"; +"Time" = "Tid"; "Trend" = "Trend"; "Bluetooth" = "Bluetooth"; /* title for g7 settings row showing BLE Name */ -"Name" = "Name"; +"Name" = "Navn"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Scanner"; /* title for g7 settings connection status when connected */ "Connected" = "Tilsluttet"; @@ -64,66 +64,66 @@ "Connecting" = "Tilslutter"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Sidste Forbindelse"; /* Configuration */ "Configuration" = "Konfiguration"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Upload Aflæsninger"; /* Button */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan efter ny sensor"; /* Button label for removing CGM */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Slet CGM"; /* No glucose value representation (3 dashes for mg/dL) */ "– – –" = "– – –"; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "LAV"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "HØJ"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Søger efter sensor"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Sensor udløbet"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Warmup fuldfører"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Warmup fuldfører"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Sensor fejlede"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor udløber"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Tilbageværende nådeperiode"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Søger efter\nSensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\nUdløbet"; /* G7 Status highlight text for signal loss */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\nFejlede"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Signaltab"; /*G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\nProblem"; /* G7 Status highlight text for sensor warmup */ "Sensor\nWarmup" = "Sensor\nWarmup"; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/da.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/da.lproj/Localizable.strings index 7f882df1e0..90c331c35c 100644 --- a/Dependencies/MinimedKit/MinimedKit/Resources/da.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKit/Resources/da.lproj/Localizable.strings @@ -5,7 +5,7 @@ "AlarmClockReminder" = "AlarmUrPåmindelse"; /* The description of AlarmSensorPumpEvent */ -"AlarmSensor" = "AlarmSensor"; +"AlarmSensor" = "Alarm Sensor"; /* Describing the battery chemistry as Alkaline */ "Alkaline" = "Alkaline"; @@ -38,7 +38,7 @@ "Invalid response during %1$@: %2$@" = "Fejlagtigt svar ved %1$@: %2$@"; /* Describing the battery chemistry as Lithium */ -"Lithium" = "Lithium"; +"Lithium" = "Litium"; /* Recovery suggestion */ "Make sure your RileyLink is nearby and powered on" = "Sørg for, at din RileyLink er i nærheden og tændt"; @@ -95,4 +95,4 @@ "Unknown response during %1$@: %2$@" = "Ukendt svar under %1$@: %2$@"; /* Describing the worldwide pump region */ -"World-Wide" = "World-Wide"; +"World-Wide" = "Verdensomspændende"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/da.lproj/Localizable.strings index 0be21bd0b1..3b45b1f8cf 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/da.lproj/Localizable.strings @@ -130,7 +130,7 @@ "Preferred Data Source" = "Foretruken data kilde"; /* Text for medtronic pump battery percent remaining */ -"Pump Battery Remaining" = "Pump Battery Remaining"; +"Pump Battery Remaining" = "Resterende Pumpe Batteri"; /* navigation title for pump battery type selection Text for medtronic pump battery type */ @@ -203,7 +203,7 @@ "U/hr" = "E/t"; /* Text to indicate battery percentage is unknown */ -"unknown" = "unknown"; +"unknown" = "ukendt"; /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Ukendt"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 8568f3f16c..a07179ec83 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -6,151 +6,151 @@ */ /* Alert content title for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "Advarsel om flere kommandoer"; /* Alert content title for userPodExpiration pod alert */ -"Pod Expiration Reminder" = "Pod Expiration Reminder"; +"Pod Expiration Reminder" = "Påmindelse om udløb"; /* Alert content title for podExpiring pod alert */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod udløbet"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Lavt reservoir"; /* Alert content title for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "Påmindelse om igangværende suspension"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Genoptag insulin"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod-parring ufuldstændig"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Tidsændring registreret"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "Advarsel om flere kommandoer"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod udløber om %1$@."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Skift Pod nu. Pod har været aktiv i 72 timer."; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Skift Pod nu. Insulintilførsel stopper om 1 time."; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin eller mindre tilbage i Pod. Skift Pod snart."; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "Påmindelse om igangværende suspension"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Perioden for suspension af insulin er afsluttet.\n\nDu kan genoptage afgivelsen fra den øverste del af startskærmen eller fra skærmen med pumpeindstillinger. Du vil blive mindet om dette igen om 15 minutter."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Færdiggør venligst parring af din pod."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Tiden på din pumpe er forskellig fra den aktuelle tid. Du kan gennemgå pumpetiden og synkronisere til den aktuelle tid i indstillinger."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Suspensionstiden er udløbet. Åbn appen, og genoptag."; /* Action button default text for PodAlerts */ "Ok" = "Ok"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Uafsluttet aktivering"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod udløber om"; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod Udløber"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod Aktiveret"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Notifikationsindstillinger"; /* */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Tillidspåmindelser"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Suspenderer Insulinlevering"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod udløbet"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Uafsluttet deaktivering"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Ingen Pod"; /* Settings page link description when next lifecycle action is to pair new pod */ "Pair Pod" = "Par Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Par pod."; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Parrer."; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Klargør. Vent venligst."; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod'en blev parret med succes. Fortsæt."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Afslut deaktivering"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "Udskift Pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "dag"; /* Unit for plural days in pod life remaining */ "days" = "dage"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "time"; /* Unit for plural hours in pod life remaining */ "hours" = "timer"; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "minut"; /* Unit for plural minutes in pod life remaining */ -"minutes" = "minutes"; +"minutes" = "minutter"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Insulintilførsel"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "Planlagt Basal"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Resterende Insulin"; /* Section header for activity section */ "Activity" = "Aktivitet"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Enhedsdetaljer"; /* Section header for configuration section */ "Configuration" = "Konfiguration"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Afslut deaktivering"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "Udskift Pod"; @@ -159,19 +159,19 @@ "Replace Pod" = "Udskift Pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Uafsluttet aktivering"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod udløber om"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod udløbet"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Uafsluttet deaktivering"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Ingen Pod"; /* Pod life HUD view label */ "Fault" = "Fejl"; @@ -186,139 +186,139 @@ "Replace Pod" = "Udskift Pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "Ingen Pod parret"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod allerede parret"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Insulintype ikke konfigureret"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; +"Pod is not in a state ready for cannula insertion." = "Pod er ikke klar til kanyleindførsel."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Ugyldig indstilling"; /* Recovery suggestion shown when no pod is paired */ -"Please pair a new pod" = "Please pair a new pod"; +"Please pair a new pod" = "Venligst par med en ny Pod"; /* Generic title of the OmniBLE pump manager */ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Kommunikationsproblem"; /* */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Afslut parring"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Afslut deaktivering"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Ingen Pod"; /* Status highlight message for emptyReservoir alarm. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Ingen insulin"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod udløbet"; /* Status highlight message for occlusion alarm. */ -"Pod Occlusion" = "Pod Occlusion"; +"Pod Occlusion" = "Pod er blokeret"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Pod-fejl"; /* Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Ingen insulin"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Insulin suspenderet"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Signaltab"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Manuel Basal"; /* */ "Insert Cannula" = "Indfør kanyle"; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Indsætter..."; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "Prøv igen"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Kontrollerer..."; /* */ -"Check cannula insertion finished" = "Check cannula insertion finished"; +"Check cannula insertion finished" = "Kontroller indsættelse af kanyle færdig"; /* */ -"Get pod status" = "Get pod status"; +"Get pod status" = "Pod status"; /* */ -"Save Basal Profile" = "Save Basal Profile"; +"Save Basal Profile" = "Indstil Basal Profil"; /* */ -"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; +"Save basal profile failed: %{public}@" = "Kunne ikke gemme basal profil: %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; +"Skipping Play Test Beeps due to bolus still in progress." = "Springer over Spil Test Bip på grund af at en bolus stadig er i gang."; /* */ "Play Test Beeps" = "Afspil Test Bip"; /* */ -"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; +"Skipping Read Pulse Log due to bolus still in progress." = "Springer over Spil Test Bip på grund af at en bolus stadig er i gang."; /* */ -"Read Pulse Log" = "Read Pulse Log"; +"Read Pulse Log" = "Læs Pulslog"; /* */ -"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; +"Set Confirmation Beeps to %s" = "Sæt bekræftelsesbip til %s"; /* */ -"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; +"Set Confirmation Beeps Preference" = "Sæt Bekræftelse Bip Præference"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Suspender"; /* */ -"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; +"Failed to suspend: %{public}@" = "Kunne ikke suspendere %{public}@"; /* */ -"Resume" = "Resume"; +"Resume" = "Genoptag"; /* */ "Bolus" = "Bolus"; /* */ -"Cancel Bolus" = "Cancel Bolus"; +"Cancel Bolus" = "Annuller bolus"; /* Alert acknowledgment OK button */ "OK" = "OK"; /* The title for Empty Reservoir alarm notification */ -"Empty Reservoir" = "Empty Reservoir"; +"Empty Reservoir" = "Tomt Reservoir"; /* The title for Occlusion alarm notification */ -"Occlusion Detected" = "Occlusion Detected"; +"Occlusion Detected" = "Blokering Opdaget"; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Kritisk Pod-fejl"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulintilførslen er stoppet. Skift Pod nu."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Resterende Insulin"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Indstil Midlertidig Basalrate"; /* Section header for activity section */ "Activity" = "Aktivitet"; @@ -327,267 +327,267 @@ "Configuration" = "Konfiguration"; /* Title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Forrige Pod"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Pumpetid"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Justerer pumpetid..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synkroniser til aktuel tid"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Skift til en anden insulintilførselsenhed"; /* Title for pod sync time action sheet. */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Tiden på din pumpe er forskellig fra den aktuelle tid. Vil du opdatere tiden på din pumpe til det aktuelle tidspunkt?"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Ja, synkroniser til aktuel tid"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Nej, behold pumpen som den er"; /* Title for Omnipod DASH PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Fjern pumpe"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; +"Are you sure you want to stop using Omnipod DASH?" = "Er du sikker på at du vil stoppe med at bruge Omnipod DASH?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Delete Omnipod DASH"; +"Delete Omnipod DASH" = "Slet Omnipod DASH"; /* Text for confidence reminders navigation link" */ -"Insulin Type" = "Insulin Type"; +"Insulin Type" = "Insulintype"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synkroniser til aktuel tid"; /* Title for suspend duration selection action sheet */ "Suspend Delivery" = "Pause Indgivelse"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulintilførsel vil blive stoppet, indtil du genoptager manuelt. Hvornår vil du have iAPS til at minde dig om at genoptage leveringen?"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 minutter"; /* Button text for 1 hour suspend duration" */ -"1 hour" = "1 hour"; +"1 hour" = "1 time"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 time 30 minutter"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 timer"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Kunne ikke suspendere insulintilførsel"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Kunne ikke genoptage insulintilførsel"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Kunne ikke indstille pumpetid"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Mislykkedes at annullere Manuel Basal"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Deaktiver Poden. Når deaktiveringen er fuldført, kan du fjerne den og parre en ny Pod."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Deaktiver Poden. Når deaktiveringen er fuldført, kan du parre en ny Pod."; /* Deactivate pod action button */ "Deactivate Pod" = "Deaktiver Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Deaktiverer."; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod deaktiveret med succes. Fortsæt."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "Prøv igen"; /* Action button description when deactivated */ "Continue" = "Fortsæt"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Kunne ikke kommunikere med Pod'en. Hvis problemet fortsætter, tryk Afbryd og kassér Pod'en. Du kan herefter aktivere en ny Pod."; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Kassér Pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Fjern Pod fra kroppen"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Din Pod leverer muligvis stadig insulin.\nFjern den fra din krop og tryk derefter på \"Fortsæt\"."; /* Insulin Unit */ "U" = "E"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Skift Pod nu. Insulintilførsel stopper 8 timer efter, at Pod'en er udløbet, eller når der ikke er mere insulin tilbage."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; /* Label text for step 2 of pair pod instructions */ -"Listen for 2 beeps." = "Listen for 2 beeps."; +"Listen for 2 beeps." = "Lyt efter 2 bip."; /* Label text indicating pairing finished.*/ -"Paired" = "Paired"; +"Paired" = "Parret"; /* Cancel button text in navigation bar on pair pod UI */ "Cancel" = "Annuller"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Er du sikker på, at du vil annullere Pod-opsætningen?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Hvis du annullerer Pod-opsætningen, deaktiveres den aktuelle Pod og den vil være ubrugelig."; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Ja, deaktiver Pod"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Nej, fortsæt med Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Forbered pumpested."; /* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Tjek Pod, sæt på kroppen og bekræft derefter Pod er sat korrekt på."; /* Action button title for attach pod view */ "Continue" = "Fortsæt"; /* */ -"Attach Pod" = "Attach Pod"; +"Attach Pod" = "Påsæt Pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Bekræft fastgørelse af Pod"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Bekræft venligst, at Pod er sikkert fastgjort til din krop.\n\nKanyaen kan kun indsættes én gang med hver side. Tryk på “Bekræft”, når Pod er fastgjort."; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Bekræft"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Tryk nedenfor for at starte kanyleindsættelse."; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Vent, indtil indsættelsen er afsluttet."; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Indsat"; /* Check Cannula */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kontroller kanylen"; /* */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Er kanylen indsat korrekt?"; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Vinduet på toppen af Pod'en skal være farvet pink, når kanylen er korrekt indsat i huden."; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "Ja"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "Nej"; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Parrer..."; /* Pod pairing action button text while priming */ -"Priming..." = "Priming..."; +"Priming..." = "Klargør..."; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Deaktiverer..."; /* Pod state when pod has been deactivated */ -"Deactivated" = "Deactivated"; +"Deactivated" = "Deaktiveret"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Din pod er klar til brug.\n\n%1$@ minder dig om, at du skal skifte din pod, inden den udløber. Du kan ændre dette til et tidspunkt, der passer dig."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Planlagt Påmindelse"; /* Label for expiration reminder row */ -"Time" = "Time"; +"Time" = "Tid"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Afslut opsætning"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Opsætning fuldført"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Ingen påmindelse"; /* Error message description for PeripheralManagerError.notReady */ -"Peripheral Not Ready" = "Peripheral Not Ready"; +"Peripheral Not Ready" = "Perifer Enhed Ikke Klar"; /* Error message description for PeripheralManagerError.incorrectResponse */ -"Incorrect Response" = "Incorrect Response"; +"Incorrect Response" = "Ukorrekt Respons"; /* Error message description for PeripheralManagerError.timeout */ "Timeout" = "Timeout"; /* Error message description for PeripheralManagerError.emptyValue */ -"Empty Value" = "Empty Value"; +"Empty Value" = "Tom Værdi"; /* Error message description for PeripheralManagerError.unknownCharacteristic */ -"Unknown Characteristic" = "Unknown Characteristic"; +"Unknown Characteristic" = "Ukendt Karakteristik"; /* Error message description for PeripheralManagerError.nack */ "Nack" = "Nack"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Omnipod-påmindelser"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Appen konfigurerer en påmindelse på Pod'en for at give dig besked inden Pod-udløb. Indstil antallet af timer i forvejen, du vil konfigurere, når du parrer en ny Pod."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Dette er en påmindelse om, at du planlagde, hvornår du parrede din nuværende Pod."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Planlagt Påmindelse"; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau."; /* Description text for critical alerts */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Kritiske Advarsler"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Påmindelserne ovenfor vil ikke lyde, hvis din enhed er i lydløs tilstand eller Forstyr ikke.\n\nDer er andre kritiske Pod alarmer og alarmer, der vil lyde, selvom din enhed er indstillet til Lydløs eller Forstyr ikke."; /* navigation title for notification settings */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Notifikationsindstillinger"; /* Label for scheduled reminder value row */ -"Time" = "Time"; +"Time" = "Tid"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Ingen Påmindelse"; /* Label for low reservoir reminder row */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Påmindelse om lavt reservoir"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Sørg for, at din telefon og Pod er tæt på hinanden. Hvis der fortsat er kommunikationsproblemer, skal du flytte til et nyt område."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Skift Pod nu. Insulintilførsel stopper om %1$@, eller når der ikke er mere insulin tilbage."; /* Title string for BeepPreference.silent */ "Disabled" = "Deaktiveret"; @@ -599,13 +599,13 @@ "Extended" = "Forlænget"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Der anvendes ingen tillidspåmindelser."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når iAPS automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når iAPS automatisk justerer tilførslen og de kommandoer, du sætter igang."; /* Label text for temporary basal rate summary */ "Rate" = "Værdi"; @@ -614,78 +614,78 @@ "U/hr" = "E/t"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ i %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "iAPS justerer ikke automatisk din insulindosering, før den midlertidige basalrate er afsluttet eller annulleret."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Sæt Midlertidig Basal"; /* Navigation Title for ManualTempBasalEntryView */ "Temporary Basal" = "Midlertidig Basal"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Midlertidig Basal Mislykkedes"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Kan ikke indstille en midlertidig basalrate: %1$@\n\n%2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Kan ikke indstille en midlertidig basalrate: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Manglende Konfiguration"; /* Alert format string for missing temp basal configuration. */ "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Standard for udløbspåmindelse"; /* Text for previous pod information row */ "Previous Pod Information" = "Forringe Pod Information"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Ingen\nlevering"; /* description label for active time pod details row */ "Active Time" = "Aktiv Tid"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Total Levering"; /* description label for device name pod details row */ -"Device Name" = "Device Name"; +"Device Name" = "Enhedsnavn"; /* description label for lot number pod details row */ -"Lot Number" = "Lot Number"; +"Lot Number" = "Lot-nummer"; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Sekvensnummer"; /* description label for firmware version pod details row */ -"Firmware Version" = "Firmware Version"; +"Firmware Version" = "Firmware-version"; /* description label for ble firmware version pod details row */ "BLE Firmware Version" = "BLE Firmware Version"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod Aktiveret"; /* description label for active time pod details row */ "Active Time" = "Aktiv Tid"; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Sidste Status"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Pod Fejldetaljer"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Pumpe Setup"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Du skal nu begynde at konfigurere dine påmindelser, fylde din Pod med insulin, parre den med din enhed og placere den på din krop."; /* Cancel button title */ "Cancel" = "Annuller"; @@ -694,94 +694,94 @@ "Continue" = "Fortsæt"; /* Are you sure you want to skip Omnipod Onboarding? */ -"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; +"Skip Omnipod Onboarding?" = "Spring Omnipod Onboarding over?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Appen giver dig besked før Pod'en udløber.\n\nIndstil antallet af timer før udløb som påmindelse."; /* Text of continue button on ExpirationReminderSetupView" */ -"Next" = "Next"; +"Next" = "Næste"; /* */ "Expiration Reminder" = "Udløbs Påmindelse"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Lavt Reservoir"; /* */ "Save" = "Gem"; /* hr (short for hour) */ -"hr" = "hr"; +"hr" = "t"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Annuller Manuel Basal"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin \nSuspenderet"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Genoptag Insulintilførsel"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Sørg for, at din pod er tæt på, og prøv igen."; /* Error message shown when the pod is not connected */ -"Pod not connected" = "Pod not connected"; +"Pod not connected" = "Pod ikke forbundet"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Suspenderet"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Genoptager insulintilførsel..."; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Suspenderer insulinlevering..."; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Ingen Pods fundet"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "For mange pods fundet"; /* Recovery suggestion when no response is received from pod */ -"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; +"Make sure iPhone is nearby the active pod" = "Sørg for, at iPhone er i nærheden af den aktive pod"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Prøv igen"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Flyt til et nyt område væk fra andre Pods og prøv igen."; /* Recovery suggestion for PodCommsError.noPodsFound */ -"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; +"Make sure your pod is filled and nearby." = "Sørg for, at din pod er fyldt og i nærheden."; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; +"Please reposition iPhone further from the pod" = "Flyt iPhone længere væk fra podden"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; +"Please reposition iPhone relative to the pod" = "Flyt iPhone nærmere podden"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Hav kun den originale pod tæt på eller deaktiver den original pod"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Kommunikationsfejl. Flyt til et nyt område"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Sørg for, at din pod er tæt på, og prøv igen."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Vent, indtil eksisterende bolus er færdig, eller annuller bolus"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Vent, indtil eksisterende bolus er færdig, eller annuller bolus"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Vent, indtil den eksisterende midlertidige basal er færdig, eller suspender for at annullere"; /* DASH Pod time ago since last status */ "%@ ago" = "%@ siden"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index 54b17653a9..7b326799c6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -36,7 +36,7 @@ "%@U" = "%@E"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ i %2$@"; /* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ "%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ har ikke været i stand til at kommunikere med Pod'en på din krop siden %2$@.\n\nUden kommunikation med Pod'en kan appen ikke fortsætte med at sende kommandoer for insulintilførsel eller vise nøjagtige, nylige oplysninger om dit aktive insulin eller det insulin, der leveres af Pod'en.\n\nOvervåg din glukose nøje i de næste 6 eller flere timer, da der måske eller måske ikke er insulin, der aktivt arbejder i din krop, som %3$@ ikke kan vise."; @@ -508,7 +508,7 @@ "Pod Settings" = "Pod-Indstillinger"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Pumpe Setup"; /* Label text for step one of attach pod instructions */ "Prepare site." = "Forbered indstikssted."; @@ -681,7 +681,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Påmindelserne ovenfor vil ikke lyde, hvis din enhed er i lydløs tilstand eller Forstyr ikke.\n\nDer er andre kritiske Pod alarmer og alarmer, der vil lyde, selvom din enhed er indstillet til Lydløs eller Forstyr ikke."; /* Message for pod sync time action sheet */ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Tiden på din pumpe er forskellig fra den aktuelle tid. Vil du opdatere tiden på din pumpe til det aktuelle tidspunkt?"; diff --git a/Dependencies/rileylink_ios/RileyLinkKitUI/da.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkKitUI/da.lproj/Localizable.strings index 82d37ef86c..00ebe40b27 100644 --- a/Dependencies/rileylink_ios/RileyLinkKitUI/da.lproj/Localizable.strings +++ b/Dependencies/rileylink_ios/RileyLinkKitUI/da.lproj/Localizable.strings @@ -103,4 +103,4 @@ "Uptime" = "Oppetid"; /* The title of the cell showing ORL */ -"Voltage" = "Voltage"; +"Voltage" = "Spænding"; diff --git a/FreeAPS/Resources/da.lproj/InfoPlist.strings b/FreeAPS/Resources/da.lproj/InfoPlist.strings index 490542f424..ed2f1f4b2f 100644 --- a/FreeAPS/Resources/da.lproj/InfoPlist.strings +++ b/FreeAPS/Resources/da.lproj/InfoPlist.strings @@ -1,20 +1,20 @@ /* Privacy - NFC Scan Usage Description */ -"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; +"NFCReaderUsageDescription" = "NFC bruges til at scanne Libre sensorer."; /* Privacy - Bluetooth Always Usage Description */ -"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulin pumpe og dine glukose monitor enheder"; /* Privacy - Bluetooth Peripheral Usage Description */ -"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothPeripheralUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulin pumpe og dine glukose monitor enheder"; /* Privacy - Face ID Usage Description */ -"NSFaceIDUsageDescription" = "For authorized acces to bolus"; +"NSFaceIDUsageDescription" = "For autoriseret adgang til bolus"; /* Privacy - Calendars Usage Description */ -"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; +"NSCalendarsUsageDescription" = "Kalender bruges til at oprette en ny glucose begivenheder."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthUpdateUsageDescription" = "Health App bruges til at opbevare blodglukose, insulin og kulhydrater"; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthShareUsageDescription" = "Health App bruges til at opbevare blodglukose, insulin og kulhydrater"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 3649d64403..dde5241791 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Fortsæt uden bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDette er mere insulin end din \"max dosis\" indstilling!\nEr du sikker på at du vil tilføje "; /* Header */ "Enact Bolus" = "Udfør Bolus"; @@ -122,25 +122,25 @@ "Basal Insulin and Sensitivity ratio" = "Basal insulin og følsomhedsforhold"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "En lavere indstilling for 'Halve basaldosis ved motion' vil lede til en sænkning af basalinsulin og en øget insulinfølsomhed tidligere, ved et lavere mål."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Nuværende indstilling: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max begrænser maxværdien"; /* */ -"Enter preset name" = "Enter preset name"; +"Enter preset name" = "Angiv forudindstillingsnavn"; /* Preset name */ -"Name" = "Name"; +"Name" = "Navn"; /* minutes of target temp */ -"minutes" = "minutes"; +"minutes" = "minutter"; /* */ -"Presets" = "Presets"; +"Presets" = "Forudindstillinger"; /* Save preset name */ "Save" = "Gem"; @@ -149,16 +149,16 @@ "Save as Preset" = "Gem som forudindstilling"; /* Delete Meal Preset */ -"Delete Preset" = "Delete Preset"; +"Delete Preset" = "Slet forudindstilling"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Delete preset '%@'?"; +"Delete preset '%@'?" = "Slet forudindstilling '%@'?"; /* Button */ -"No" = "No"; +"No" = "Nej"; /* Button */ -"Yes" = "Yes"; +"Yes" = "Ja"; /* + Button */ "[ +1 ]" = "[ +1 ]"; @@ -167,7 +167,7 @@ "[ -1 ]" = "[ -1 ]"; /* Upper temp target limit */ -"Top target" = "Top target"; +"Top target" = "Øvre mål"; /* Temp target set for ... minutes */ "for" = "for"; @@ -179,28 +179,28 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Basal profile"; +"Basal profile" = "Basal profil"; /* */ -"Carb ratio" = "Carb ratio"; +"Carb ratio" = "Kolhydratsratio"; /* */ -"Delete autotune data" = "Delete autotune data"; +"Delete autotune data" = "Slet autotune data"; /* */ -"Run now" = "Run now"; +"Run now" = "Kør nu"; /* */ -"Last run" = "Last run"; +"Last run" = "Senest kørt"; /* */ -"Sensitivity" = "Sensitivity"; +"Sensitivity" = "Sensitivitet"; /* */ "Use Autotune" = "use Autotune"; /* Add profile basal */ -"Add" = "Add"; +"Add" = "Tilføj"; /* */ "Basal Profile" = "Basal profil"; @@ -215,19 +215,19 @@ "Saving..." = "Gemmer..."; /* */ -"Schedule" = "Schedule"; +"Schedule" = "Skema"; /* */ -"starts at" = "starts at"; +"starts at" = "starter ved"; /* Time basal profile */ -"Time" = "Time"; +"Time" = "Tid"; /* */ -"Calculated Ratio" = "Calculated Ratio"; +"Calculated Ratio" = "Udregnet Ratio"; /* Carb Ratios header */ -"Carb Ratios" = "Carb Ratios"; +"Carb Ratios" = "Kolhydratsratio"; /* */ "Ratio" = "Ratio"; @@ -236,56 +236,56 @@ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Udregent Sensitivitet"; /* */ -"Insulin Sensitivities" = "Insulin Sensitivities"; +"Insulin Sensitivities" = "Insulin Sensitivitet"; /* */ -"Sensitivity Ratio" = "Sensitivity Ratio"; +"Sensitivity Ratio" = "Sensitivitetsratio"; /* */ -"Dismiss" = "Dismiss"; +"Dismiss" = "Luk"; /* */ -"Important message" = "Important message"; +"Important message" = "Vigtig besked"; /* */ -"Amount" = "Amount"; +"Amount" = "Mængde"; /* */ -"Cancel Temp Basal" = "Cancel Temp Basal"; +"Cancel Temp Basal" = "Annuller midlertidig basal"; /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Udfør"; /* */ -"Manual Temp Basal" = "Manual Temp Basal"; +"Manual Temp Basal" = "Manuel Temp Basal"; /* Allow uploads to different services */ -"Allow uploads" = "Allow uploads"; +"Allow uploads" = "Tilføj uploads"; /* API secret in NS */ -"API secret" = "API secret"; +"API secret" = "API hemmelighed"; /* Connect to NS */ -"Connect" = "Connect"; +"Connect" = "Forbind"; /* Connected to NS */ -"Connected!" = "Connected!"; +"Connected!" = "Forbundet!"; /* Connecting to NS */ -"Connecting..." = "Connecting..."; +"Connecting..." = "Forbinder..."; /* */ "Invalid URL" = "Invalid URL"; /* */ -"Local glucose source" = "Local glucose source"; +"Local glucose source" = "Local glukose kilde"; /* Header */ -"Nightscout Config" = "Nightscout Config"; +"Nightscout Config" = "Nightscout Konfiguration"; /* */ "Port" = "Port"; @@ -294,64 +294,64 @@ Enact a temp Basal or a temp target */ "URL" = "URL"; /**/ -"Use local glucose server" = "Use local glucose server"; +"Use local glucose server" = "Brug lokal server som glukosekilde"; /* */ -"Edit settings json" = "Edit settings json"; +"Edit settings json" = "Rediger indstillingsjson"; /* */ -"Glucose units" = "Glucose units"; +"Glucose units" = "Glukose enhed"; /* */ -"Preferences" = "Preferences"; +"Preferences" = "Preferencer"; /* Recommended Insulin Fraction in preferences */ -"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; +"Recommended Insulin Fraction" = "Anbefalet Insulinbrøk"; /* Do you want to show bolus screen after added carbs? */ -"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; +"Skip Bolus screen after carbs" = "Skip Bolus skærm efter kulhydrater"; /* Allow remote control from NS */ -"Remote control" = "Remote control"; +"Remote control" = "Fjernkontrol"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nKontroller nu alle dine nye indstillinger grundigt:\n\n* Basal Indstillinger\n * Kulhydratratios\n * Glukose Mål\n * Insulin Følsomhed\n * VIA\n\n i iAPS Indstillinger > Konfiguration.\n\nDårlige eller ugyldige profilindstillinger kan have katastrofale effekter."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dette vil erstatte nogle eller alle dine aktuelle pumpeindstillinger. Er du sikker på, at du vil importere profilindstillinger fra Nightscout?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nUgyldig Nightcsout Basal Indstillinger. \n\nImport afbrudt. Tjek venligst dine Nightscout Profil Basal Indstillinger!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nIndstillinger blev importeret, men Basalinsulin indstillinger kunne ikke gemmes til pumpe (Ingen pumpe). Tjek dine basal indstillinger og tryk på 'Gem på Pumpe' for at synkronisere de nye basal indstillinger"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Importfejl"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Ja, importer"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importer indstillinger fra Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Import indstillinger?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Import fra Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Indstillinger importeret"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nUoverensstemmende glukose enheder i Nightscout og Pumpe Indstillinger. Import af indstillinger afbrudt."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Kan ikke finde standard Nightscout profil."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Blodglukose Test"; /* Add Medtronic pump */ "Add Medtronic" = "Tilføj Medtronic"; @@ -372,7 +372,7 @@ Enact a temp Basal or a temp target */ "Delivery limits" = "Insulingrænser"; /* */ -"Duration of Insulin Action" = "Duration of Insulin Action"; +"Duration of Insulin Action" = "Varighed af Insulin Aktivitet"; /* hours of duration of insulin activity */ "hours" = "timer"; @@ -471,10 +471,10 @@ Enact a temp Basal or a temp target */ "Steps" = "Skridt"; /* */ -"ISF" = "ISF"; +"ISF" = "Insulin følsomhedsfaktor"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "Garmin Connect skal være installeret for at bruge iAPS.\n Gå til App Store for at downloade den"; /* */ "Garmin is not available" = "Garmin er ikke tilgængelig"; @@ -492,13 +492,13 @@ Enact a temp Basal or a temp target */ "Share logs" = "Del logs"; /* Upper target */ -"High target" = "High target"; +"High target" = "Højt mål"; /* Lower target */ -"Low target" = "Low target"; +"Low target" = "Lavt mål"; /* When bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Administrerer Bolus"; /* */ "Pump suspended" = "Pumpe suspenderet"; @@ -507,13 +507,13 @@ Enact a temp Basal or a temp target */ "Middleware" = "Middleware"; /* Header */ -"History" = "History"; +"History" = "Historie"; /* Nightscout option */ "Upload" = "Upload"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Tillad Uploads"; /* Type of CGM or glucose source */ "Type" = "Type"; @@ -522,67 +522,67 @@ Enact a temp Basal or a temp target */ "CGM" = "CGM"; /* CGM Transmitter ID */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "Sender ID"; /* Other CGM setting */ -"Other" = "Other"; +"Other" = "Andet"; /* Whatch app alert */ -"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; +"Set temp targets presets on iPhone first" = "Indstil forudindstillinger for midlertidig profil på iPhone først"; /* Updating Watch app */ -"Updating..." = "Updating..."; +"Updating..." = "Opdaterer..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp Targets"; +"Temp Targets" = "Midlertidige Mål"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete carbs?" = "Slet kulhydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete insulin?" = "Slet insulin?"; /* Treatments list */ -"Treatments" = "Treatments"; +"Treatments" = "Behandlinger"; /* " min" in Treatments list */ " min" = " min"; /* */ -"Unable to change anything" = "Unable to change anything"; +"Unable to change anything" = "Kunne ikke ændre noget"; /* Calendar and Libre transmitter settings --------------- */ /* */ -"Configure Libre Transmitter" = "Configure Libre Transmitter"; +"Configure Libre Transmitter" = "Konfigurer Libre Sender"; /* */ -"Calibrations" = "Calibrations"; +"Calibrations" = "Kalibreringer"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Lav Begivenheder i Kalender"; /* */ -"Calendar" = "Calendar"; +"Calendar" = "Kalender"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatisk"; /* */ -"Other" = "Other"; +"Other" = "Andet"; /* */ -"Libre Transmitter" = "Libre Transmitter"; +"Libre Transmitter" = "Libre Sender"; /* */ -"Libre Transmitters" = "Libre Transmitters"; +"Libre Transmitters" = "Libre Sendere"; /* */ -"Bluetooth Transmitters" = "Bluetooth Transmitters"; +"Bluetooth Transmitters" = "Bluetooth Sendere"; /* */ -"Modes" = "Modes"; +"Modes" = "Sendere"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; @@ -591,7 +591,7 @@ Enact a temp Basal or a temp target */ "Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; /* State was restored */ -"State was restored" = "State was restored"; +"State was restored" = "Tilstand blev gendannet"; /* The short unit display string for millimoles of glucose per liter */ "mmol/L" = "mmol/L"; @@ -600,7 +600,7 @@ Enact a temp Basal or a temp target */ "mg/dL" = "mg/dL"; /* */ -"Add calibration" = "Add calibration"; +"Add calibration" = "Tilføj kalibrering"; /* When adding capillary glucose meater reading */ "Meter glucose" = "Meter glucose"; @@ -615,19 +615,19 @@ Enact a temp Basal or a temp target */ "Intercept" = "Intercept"; /* */ -"Chart" = "Chart"; +"Chart" = "Graf"; /* */ -"Remove" = "Remove"; +"Remove" = "Fjern"; /* */ -"Remove Last" = "Remove Last"; +"Remove Last" = "Fjern Sidste"; /* */ -"Remove All" = "Remove All"; +"Remove All" = "Fjern Alle"; /* */ -"About the Process" = "About the Process"; +"About the Process" = "Om Processen"; /* */ "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; @@ -792,88 +792,88 @@ Enact a temp Basal or a temp target */ "Connection State" = "Tilslutningstilstand"; /* */ -"Transmitter Type" = "Transmitter Type"; +"Transmitter Type" = "Sender Type"; /* */ "Sensor Type" = "Sensor Type"; /* */ -"Factory Calibration Parameters" = "Factory Calibration Parameters"; +"Factory Calibration Parameters" = "Fabrikskalibreringsparametre"; /* */ -"Valid for footer" = "Valid for footer"; +"Valid for footer" = "Gyldig til footer"; /* */ -"Edit calibrations" = "Edit calibrations"; +"Edit calibrations" = "Rediger kalibreringer"; /* */ -"edit calibration clicked" = "edit calibration clicked"; +"edit calibration clicked" = "redigere kalibrering klikket"; /* */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Slet CGM"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; +"Are you sure you want to remove this cgm from loop?" = "Er du sikker på at du vil fjerne denne CGM fra iAPS?"; /* */ -"There is no undo" = "There is no undo"; +"There is no undo" = "Der er ingen fortryd"; /* */ -"Advanced" = "Advanced"; +"Advanced" = "Avanceret"; /* */ "Alarms" = "Alarmer"; /* */ -"Glucose Settings" = "Glucose Settings"; +"Glucose Settings" = "Glukose Indstillinger"; /* */ -"Notifications" = "Notifications"; +"Notifications" = "Notifikationer"; /* */ -"Export logs" = "Export logs"; +"Export logs" = "Eksporter logs"; /* */ -"Export not available" = "Export not available"; +"Export not available" = "Eksport ikke tilgængelig"; /* */ -"Log export requires ios 15" = "Log export requires ios 15"; +"Log export requires ios 15" = "Log eksport kræver iOS 15"; /* */ -"Got it!" = "Got it!"; +"Got it!" = "Modtaget!"; /* */ -"Saved to %@" = "Saved to %@"; +"Saved to %@" = "Gem til %@"; /* */ -"No logs available" = "No logs available"; +"No logs available" = "Ingen logs tilgængelige"; /* */ -"Glucose Notification visibility" = "Glucose Notification visibility"; +"Glucose Notification visibility" = "Synlighed af Glukose Notifikation"; /* */ -"Always Notify Glucose" = "Always Notify Glucose"; +"Always Notify Glucose" = "Send altid Glukosenotifikation"; /* */ "Notify per reading" = "Notify per reading"; /* */ -"Value" = "Value"; +"Value" = "Værdi"; /* */ -"Adds Phone Battery" = "Adds Phone Battery"; +"Adds Phone Battery" = "Tilføjer Telefonbatteri"; /* */ -"Adds Transmitter Battery" = "Adds Transmitter Battery"; +"Adds Transmitter Battery" = "Tilføjer Senderbatteri"; /* */ -"Also vibrate" = "Also vibrate"; +"Also vibrate" = "Vibrér også"; /* */ -"Additional notification types" = "Additional notification types"; +"Additional notification types" = "Yderligere notifikationstyper"; /* */ -"Misc" = "Misc"; +"Misc" = "Diverse"; /* */ "Unit override" = "Unit override"; @@ -885,22 +885,22 @@ Enact a temp Basal or a temp target */ "High" = "Høj"; /* */ -"glucose" = "glucose"; +"glucose" = "glukose"; /* */ -"Schedule " = "Schedule "; +"Schedule " = "Skema "; /* */ "tapped save schedules" = "tapped save schedules"; /* */ -"Error" = "Error"; +"Error" = "Fejl"; /* */ "Some ui element was incorrectly specified" = "Some ui element was incorrectly specified"; /* */ -"Success" = "Success"; +"Success" = "Succes"; /* */ "Schedules were saved successfully!" = "Schedules were saved successfully!"; @@ -933,22 +933,22 @@ Enact a temp Basal or a temp target */ "Click to Snooze Alerts" = "Click to Snooze Alerts"; /* */ -"Strength" = "Strength"; +"Strength" = "Styrke"; /* */ -"Hold the top of your iPhone near the sensor to pair" = "Hold the top of your iPhone near the sensor to pair"; +"Hold the top of your iPhone near the sensor to pair" = "Hold toppen af din iPhone nær sensoren for at parre"; /* */ -"Sensor not found" = "Sensor not found"; +"Sensor not found" = "Sensor ikke fundet"; /* */ -"Also play alert sound" = "Also play alert sound"; +"Also play alert sound" = "Afspil også alarm lyd"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Notifikationsindstillinger"; /* */ -"Found devices: %d" = "Found devices: %d"; +"Found devices: %d" = "Fundne enheder: %d"; /* */ "Backfill options" = "Backfill options"; @@ -1057,72 +1057,72 @@ Enact a temp Basal or a temp target */ "Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Brug af delt app-gruppe med ekstern CGM app GlucoseDirect"; /* Dexcom G6 app */ "Dexcom G6 app" = "Dexcom G6 app"; /* Native G5 app */ -"Native G5 app" = "Native G5 app"; +"Native G5 app" = "Nativ G5 app"; /* Minilink transmitter */ -"Minilink transmitter" = "Minilink transmitter"; +"Minilink transmitter" = "Minilink sender"; /* Simple simulator */ -"Simple simulator" = "Simple simulator"; +"Simple simulator" = "Simpel simulator"; /* Direct connection with Libre 1 transmitters or Libre 2 */ -"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direkte forbindelse med Libre 1-sendere eller europæiske Libre 2-sensorer"; /* Online or internal server */ -"Online or internal server" = "Online or internal server"; +"Online or internal server" = "Online eller intern server"; /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Developer"; +"Developer" = "Udvikler"; /* Debug option view NS Upload Profile */ -"NS Upload Profile" = "NS Upload Profile"; +"NS Upload Profile" = "NS Upload Profil"; /* Debug option view NS Uploaded Profile */ -"NS Uploaded Profile" = "NS Uploaded Profile"; +"NS Uploaded Profile" = "NS Uploadet Profil"; /* Debug option view Autosense */ "Autosense" = "Autosense"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Dynamisk Sensitivitet"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Autotune kun Basal Insulin"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Gem som dine normale basalsatser"; /* */ "Save on Pump" = "Gem på Pump"; /* Debug option view Pump History */ -"Pump History" = "Pump History"; +"Pump History" = "Pumpe Historie"; /* Debug option view Target Ranges */ -"Target ranges" = "Target ranges"; +"Target ranges" = "Målområder"; /* Debug option view Temp targets */ -"Temp targets" = "Temp targets"; +"Temp targets" = "Midlertidige mål"; /* Debug option view Meal */ -"Meal" = "Meal"; +"Meal" = "Måltid"; /* Debug option view Pump profile */ -"Pump profile" = "Pump profile"; +"Pump profile" = "Pumpeprofil"; /* Debug option view Profile */ -"Profile" = "Profile"; +"Profile" = "Profil"; /* Debug option view Enacted */ -"Enacted" = "Enacted"; +"Enacted" = "Udført"; /* Debug option view Announcements (from NS) */ "Announcements" = "Announcements"; @@ -1137,23 +1137,23 @@ Enact a temp Basal or a temp target */ "Target presets" = "Target presets"; /* Debug option view */ -"Loop Cycles" = "Loop Cycles"; +"Loop Cycles" = "Loop Cykler"; /* Debug option view Glucose Data used for statistics */ -"Glucose Data used for statistics" = "Glucose Data used for statistics"; +"Glucose Data used for statistics" = "Glukosedata anvendt til statistik"; /* --------------- HealthKit intergration --------------------*/ /* */ "Apple Health" = "Apple Health"; /* */ -"Connect to Apple Health" = "Connect to Apple Health"; +"Connect to Apple Health" = "Forbind til Apple Health"; /* Show when have not permissions for writing to Health */ -"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For at skrive til Apple Health er skal du give tilladelser i Indstillinger > Sundhed > Data Adgang"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Dette gør det muligt for iAPS at læse fra og skrive til Apple Heath. Du skal også give tilladelser i Indstillinger > Sundhed > Dataadgang. Hvis du indtaster en glukoseværdi i Apple Health, skal du åbne iAPS for at bekræfte, at den dukker op."; /* New ALerts ------------------------- */ /* Info title */ @@ -1163,22 +1163,22 @@ Enact a temp Basal or a temp target */ "Warning" = "Advarsel"; /* Error title */ -"Error" = "Error"; +"Error" = "Fejl"; /* Manual temp basal mode */ -"Manual" = "Manual"; +"Manual" = "Manuel"; /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Manuel Basal"; /* Current Manual Temp basal */ -" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; +" - Manual Basal ⚠️" = " - Manuel Basal ⚠️"; /* Total AT / Scheduled basal insulin */ -" U/day" = " U/day"; +" U/day" = " E/dag"; /* Total AT / Scheduled basal insulin */ "Total" = "Total"; @@ -1186,43 +1186,43 @@ Enact a temp Basal or a temp target */ /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ /* Enable FPU */ -"Enable" = "Enable"; +"Enable" = "Aktivér"; /* Header */ -"Conversion settings" = "Conversion settings"; +"Conversion settings" = "Indstillinger for konvertering"; /* Delay */ -"Delay In Minutes" = "Delay In Minutes"; +"Delay In Minutes" = "Forsinkelse I Minutter"; /* Duration */ -"Maximum Duration In Hours" = "Maximum Duration In Hours"; +"Maximum Duration In Hours" = "Maksimal Varighed I Timer"; /* Interval */ -"Interval In Minutes" = "Interval In Minutes"; +"Interval In Minutes" = "Interval I Minutter"; /* Override */ -"Override With A Factor Of " = "Override With A Factor Of "; +"Override With A Factor Of " = "Overskriv Med En Faktor Af "; /* Description */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; /* FPU Settings Title */ -"Fat and Protein" = "Fat and Protein"; +"Fat and Protein" = "Fedt og Protein"; /* Display fat and protein entities */ -"Fat & Protein" = "Fat & Protein"; +"Fat & Protein" = "Fedt & Protein"; /* */ -"Hide Fat & Protein" = "Hide Fat & Protein"; +"Hide Fat & Protein" = "Skjul Fedt & Protein"; /* Add Fat */ -"Fat" = "Fat"; +"Fat" = "Fedt"; /* Add Protein */ "Protein" = "Protein"; /* Service Section */ -"Fat And Protein Conversion" = "Fat And Protein Conversion"; +"Fat And Protein Conversion" = "Fedt Og Protein Konvertering"; /* Service Section */ "Profile Override" = "Profile Override"; From 0af009d97be0e9eb71ff0d6015d488a2eff3fb28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 23 Oct 2023 23:29:41 +0200 Subject: [PATCH 100/405] Upload when exiting settings, not just when using "Close button" Fix for issue #260 --- FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift | 7 +++---- .../Sources/Modules/Settings/View/SettingsRootView.swift | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift index d2c8e4a8fe..f37018a88c 100644 --- a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift +++ b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift @@ -46,13 +46,12 @@ extension Settings { return items } - func uploadProfileAndSettings(_: Bool) { - NSLog("SettingsState Upload Profile") - nightscoutManager.uploadProfileAndSettings(true) + func uploadProfileAndSettings(_ force: Bool) { + NSLog("SettingsState Upload Profile and Settings") + nightscoutManager.uploadProfileAndSettings(force) } func hideSettingsModal() { - nightscoutManager.uploadProfileAndSettings(false) hideModal() } } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 4698551020..b8625a13db 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -127,6 +127,7 @@ extension Settings { .navigationTitle("Settings") .navigationBarItems(leading: Button("Close", action: state.hideSettingsModal)) .navigationBarTitleDisplayMode(.automatic) + .onDisappear(perform: { state.uploadProfileAndSettings(false) }) } } } From 8d1db2b8277fee1cfc0f2fbc7eb5c29603add23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 24 Oct 2023 01:59:40 +0200 Subject: [PATCH 101/405] Ony upload profiles when changed, fix. (cherry picked from commit dbb832b5acb6212d1ecdf419147b062a8c3536f6) --- .../Services/Network/NightscoutManager.swift | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index c5267af953..4653b24020 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -560,25 +560,25 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { NSLog("NightscoutManager Settings, settings unchanged") } else { uploadSettings(settings) } + // UPLOAD Profiles WHEN CHANGED if let uploadedProfile = storage.retrieve(OpenAPS.Nightscout.uploadedProfile, as: NightscoutProfileStore.self), (uploadedProfile.store["default"]?.rawJSON ?? "").sorted() == ps.rawJSON.sorted(), !force { NSLog("NightscoutManager uploadProfile, no profile change") - return - } - - processQueue.async { - nightscout.uploadProfile(p) - .sink { completion in - switch completion { - case .finished: - self.storage.save(p, as: OpenAPS.Nightscout.uploadedProfile) - debug(.nightscout, "Profile uploaded") - case let .failure(error): - debug(.nightscout, error.localizedDescription) - } - } receiveValue: {} - .store(in: &self.lifetime) + } else { + processQueue.async { + nightscout.uploadProfile(p) + .sink { completion in + switch completion { + case .finished: + self.storage.save(p, as: OpenAPS.Nightscout.uploadedProfile) + debug(.nightscout, "Profile uploaded") + case let .failure(error): + debug(.nightscout, error.localizedDescription) + } + } receiveValue: {} + .store(in: &self.lifetime) + } } } From 29110721db9a38fce468833d3dbc502268f41512 Mon Sep 17 00:00:00 2001 From: bjornoleh <63544115+bjornoleh@users.noreply.github.com> Date: Wed, 25 Oct 2023 14:51:45 +0200 Subject: [PATCH 102/405] Fix run script for branch name and commit ID to work with Xcode 15 (#274) * BuildBranch fix for Xcode 15 - remove BuildBranch from Info.plist - new Run script: get branch name and commit ID, replaces previous run script - output to branch.txt - use seven characters for the short commit reference, in line with GitHub - run script early in build phases - add branch.txt to FreeAPS project under FreeAPS/Resources - add branch.txt to .gitignore - read branch information from branch.txt also for upload of statistics in APSManager.swift * Display build number like TestFlight (build number in brackets) Previous style: iAPS v2.2.5 - 12 Changed to: iAPS 2.2.5 (12) --- .gitignore | 2 ++ FreeAPS.xcodeproj/project.pbxproj | 14 +++++++---- FreeAPS/Resources/Info.plist | 2 -- FreeAPS/Sources/APS/APSManager.swift | 24 ++++++++++++++++++- .../Modules/Settings/SettingsStateModel.swift | 21 +++++++++++++++- .../Settings/View/SettingsRootView.swift | 2 +- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index b35734476b..4a72f1f123 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,5 @@ fastlane/test_output fastlane/FastlaneRunner ConfigOverride.xcconfig + +branch.txt \ No newline at end of file diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 54bdb94ff3..acbdee74b8 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -297,6 +297,7 @@ A6F097A14CAAE0CE0D11BE1B /* AddCarbsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618E62C9757B2F95431B5DC0 /* AddCarbsProvider.swift */; }; AD3D2CD42CD01B9EB8F26522 /* PumpConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF65DA88F972B56090AD6AC3 /* PumpConfigDataFlow.swift */; }; B7C465E9472624D8A2BE2A6A /* CalibrationsDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA241FB1663EC96FDBE64C8A /* CalibrationsDataFlow.swift */; }; + B9CAAEFC2AE70836000F68BC /* branch.txt in Resources */ = {isa = PBXBuildFile; fileRef = B9CAAEFB2AE70836000F68BC /* branch.txt */; }; BA00D96F7B2FF169A06FB530 /* CGMStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C018D1680307A31C9ED7120 /* CGMStateModel.swift */; }; BA90041DC8991147E5C8C3AA /* CalibrationsRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500371C09F54F89A97D65FDB /* CalibrationsRootView.swift */; }; BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */; }; @@ -815,6 +816,7 @@ B5EF98E22A39CD656A230704 /* AutotuneConfigProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AutotuneConfigProvider.swift; sourceTree = ""; }; B8C7F882606FF83A21BE00D8 /* PumpSettingsEditorRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpSettingsEditorRootView.swift; sourceTree = ""; }; B9B5C0607505A38F256BF99A /* CGMDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CGMDataFlow.swift; sourceTree = ""; }; + B9CAAEFB2AE70836000F68BC /* branch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = branch.txt; sourceTree = SOURCE_ROOT; }; BA49538D56989D8DA6FCF538 /* TargetsEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TargetsEditorDataFlow.swift; sourceTree = ""; }; BC210C0F3CB6D3C86E5DED4E /* LibreConfigRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LibreConfigRootView.swift; sourceTree = ""; }; BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorRootView.swift; sourceTree = ""; }; @@ -1372,6 +1374,7 @@ 3811DEC725C9DA7300A708ED /* FreeAPS.entitlements */, 388E596425AD948E0019842D /* Info.plist */, 1927C8E82744606D00347C69 /* InfoPlist.strings */, + B9CAAEFB2AE70836000F68BC /* branch.txt */, 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */, ); path = Resources; @@ -2272,13 +2275,13 @@ isa = PBXNativeTarget; buildConfigurationList = 388E596725AD948E0019842D /* Build configuration list for PBXNativeTarget "FreeAPS" */; buildPhases = ( + B9CAAEFA2AE6FDE6000F68BC /* Run Script: get branch name and commit ID */, 3811DEF525CA169200A708ED /* Swiftformat */, 388E595425AD948C0019842D /* Sources */, 388E595525AD948C0019842D /* Frameworks */, 388E595625AD948C0019842D /* Resources */, 3821ECD025DC703C00BC42AD /* Embed Frameworks */, 38E8753D27554D5900975559 /* Embed Watch Content */, - B99D8B8E295F34DB00420AB8 /* Run Script */, ); buildRules = ( ); @@ -2436,6 +2439,7 @@ 38DF178E27733E6800B3528F /* Assets.xcassets in Resources */, 19DA48E829CD339B00EEA1E7 /* Assets.xcassets in Resources */, 388E596F25AD96040019842D /* javascript in Resources */, + B9CAAEFC2AE70836000F68BC /* branch.txt in Resources */, 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2487,24 +2491,24 @@ shellPath = /bin/sh; shellScript = "source \"${SRCROOT}\"/scripts/swiftformat.sh\n\n"; }; - B99D8B8E295F34DB00420AB8 /* Run Script */ = { + B9CAAEFA2AE6FDE6000F68BC /* Run Script: get branch name and commit ID */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 12; + buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); - name = "Run Script"; + name = "Run Script: get branch name and commit ID"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/bin/sh\n\ngit_version=$(git log -1 --format=\"%h\")\ngit_branch=$(git symbolic-ref --short -q HEAD)\ngit_tag=$(git describe --tags --exact-match 2>/dev/null)\n\ngit_branch_or_tag=\"${git_branch:-${git_tag}}\"\ngit_branch_or_tag_version=\"${git_branch:-${git_tag}} ${git_version}\"\n\ninfo_plist=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n\n/usr/libexec/PlistBuddy -c \"Set :BuildBranch '${git_branch_or_tag_version}'\" \"${info_plist}\"\n"; + shellScript = "# Prints a message\necho \"writing BRANCH to branch.txt\"\n\n# Retrieves version, branch, and tag information from Git\ngit_version=$(git log -1 --format=\"%h\" --abbrev=7)\ngit_branch=$(git symbolic-ref --short -q HEAD)\ngit_tag=$(git describe --tags --exact-match 2>/dev/null)\n\n# Determines branch or tag information\ngit_branch_or_tag=\"${git_branch:-${git_tag}}\"\ngit_branch_or_tag_version=\"${git_branch_or_tag} ${git_version}\"\n\necho \"BRANCH = ${git_branch_or_tag_version}\" > \"./branch.txt\"\n\n# Prints a message about the working directory and branch.txt\necho \"branch.txt is created/modified in ${PWD}\"\n"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index 81083064a3..e999a6a920 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -8,8 +8,6 @@ com.freeapsx.background-task.critical-event-log - BuildBranch - CBBundleDisplayName $(APP_DISPLAY_NAME) CFBundleDevelopmentRegion diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 46a7c03379..7e387b0959 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -948,7 +948,29 @@ final class BaseAPSManager: APSManager, Injectable { let buildDate = Bundle.main.buildDate let version = Bundle.main.releaseVersionNumber let build = Bundle.main.buildVersionNumber - let branch = Bundle.main.infoDictionary?["BuildBranch"] as? String ?? "" + + // Read branch information from branch.txt instead of infoDictionary + var branch = "Unknown" + if let branchFileURL = Bundle.main.url(forResource: "branch", withExtension: "txt"), + let branchFileContent = try? String(contentsOf: branchFileURL) + { + let lines = branchFileContent.components(separatedBy: .newlines) + for line in lines { + let components = line.components(separatedBy: "=") + if components.count == 2 { + let key = components[0].trimmingCharacters(in: .whitespaces) + let value = components[1].trimmingCharacters(in: .whitespaces) + + if key == "BRANCH" { + branch = value + break + } + } + } + } else { + branch = "Unknown" + } + let copyrightNotice_ = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? "" let pump_ = pumpManager?.localizedTitle ?? "" let cgm = settingsManager.settings.cgm diff --git a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift index f37018a88c..cb53017e66 100644 --- a/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift +++ b/FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift @@ -25,7 +25,26 @@ extension Settings { versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown" - branch = Bundle.main.infoDictionary?["BuildBranch"] as? String ?? "Unknown" + // Read branch information from the branch.txt instead of infoDictionary + if let branchFileURL = Bundle.main.url(forResource: "branch", withExtension: "txt"), + let branchFileContent = try? String(contentsOf: branchFileURL) + { + let lines = branchFileContent.components(separatedBy: .newlines) + for line in lines { + let components = line.components(separatedBy: "=") + if components.count == 2 { + let key = components[0].trimmingCharacters(in: .whitespaces) + let value = components[1].trimmingCharacters(in: .whitespaces) + + if key == "BRANCH" { + branch = value + break + } + } + } + } else { + branch = "Unknown" + } copyrightNotice = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? "" diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index b8625a13db..003e1210ce 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -12,7 +12,7 @@ extension Settings { Form { Section( header: Text( - "iAPS v\(state.versionNumber) - \(state.buildNumber) \nBranch: \(state.branch) \(state.copyrightNotice) " + "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice) " ).textCase(nil) ) { Toggle("Closed loop", isOn: $state.closedLoop) From 31456eb9d09fcbbca399fdcaebd7d45720e8b9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 25 Oct 2023 21:20:45 +0200 Subject: [PATCH 103/405] Display Remote commands (#279) Display remote commands from Nightscout in MainChart. Bolus, Temp basal, Open loop, Closed loop, Pump suspend, Pump resume. --- .../owl.imageset/Contents.json | 31 +++++++ ...123-4d05-89b5-97f5c4f7a432-2 3 (kopia).png | Bin 0 -> 17259 bytes ...f04184-2123-4d05-89b5-97f5c4f7a432-2 3.png | Bin 0 -> 14237 bytes .../APS/Storage/AnnouncementsStorage.swift | 11 +++ FreeAPS/Sources/Models/Announcement.swift | 2 +- .../Sources/Modules/Home/HomeDataFlow.swift | 1 + .../Sources/Modules/Home/HomeProvider.swift | 7 ++ .../Sources/Modules/Home/HomeStateModel.swift | 10 +++ .../Home/View/Chart/MainChartView.swift | 77 ++++++++++++++++++ .../Modules/Home/View/HomeRootView.swift | 1 + 10 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 FreeAPS/Resources/Assets.xcassets/owl.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3 (kopia).png create mode 100644 FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3.png diff --git a/FreeAPS/Resources/Assets.xcassets/owl.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/owl.imageset/Contents.json new file mode 100644 index 0000000000..e55c886a0f --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/owl.imageset/Contents.json @@ -0,0 +1,31 @@ +{ + "images" : [ + { + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "filename" : "apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3 (kopia).png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3 (kopia).png b/FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3 (kopia).png new file mode 100644 index 0000000000000000000000000000000000000000..ad34b1034bce08a1a8452aee23ec976af6068329 GIT binary patch literal 17259 zcmZ|11z227lQujI?he5R5AN;`!6i7sA-KD{JHahLaCe8`?(XgqELebl^6c)r@4w&f z%+=F<`c$>lsp>vmefLBtDM%qB;3EJ40Av|yaTRbp^*6x5fPYm2LiE8Al(~q!2mnwU zhxo@38hqVrswrb8FAtyvr{Msw5EuYRa0&wa1wh~f{!)Nb03!&3f2A!UKK>^S5PXvb z0R9DFfP*6h>py8Ma5^~50ssY$|MI4R!{3hqIQ+f-Cswj>H?_7gbhdK@u`%*6vakSH znOWI*S(tfQIY2D`Bv`ls0LVOu|87qn@Ly$4;8eAse_GnpU)2n6DHG%@2<5tsZ=cJP$|*;i+0 zdtN3cH#av%H#SB)M{_0?9v&VhW>zLvRt7KygOi7?v!OeKtrPiw6!Kr?h?_bYJ6hN~ zTiDrx{+4TKWar{6Kt}erqJMq0kW^caQ&X z%X!7@tnD0C?G24h1zGt2>CC@p{kJ6kgZdve(iFD7 zlU~u$0{nyw|5o$&A^cOtzvul=dd>fCmLL!3e=_`g=Ko~S`rjD-J@elfOpJM*T#PJD zjh+87xPRHfKb9wIXwLL++5AlZFEu~YUsL)w)A|p){U;Y}xPk~^q5sz)Ac&x=SFnTx7#$QApemnVY*Yp;1VyDG96b*Lenl!YR;29MzPCu_$Tb{!mJdh(H_w z;4z>eAm9V3rMX9T6C}1N5I!bOuBD^QyKESu@c44WzYo8^igjb?>gStzM6mCd^e*As z`d&I!eezyaRfRFd--rg(W3X;7$P86FgaN1y=aMohzJ2w3V^&1}L^u2X^$zh~Q$(mzYI&X$MDB~dQK4@eu$!j$P;{9pL4j9CjqDHjkCk#RIQMx(tLb_6^8Uo4lbQl82X>WAp?HO)@XpFCVylJI& zMq7teKwB6%gLN`yYl5y&uGKJFKP9N+z8gUu*|C(#<5c9=hs-5+d3Ht@==`mD)3aRe z_mk(|EXU^n>5Xkjl1Je!QACD$zK3-uMT~3j-}Si+HVre9-&&PkcPl2Fe5dDrzI0W=&{$3@c`(D6!DQQ+YHq5J*f zAp1h|i2$Xzy?ssJVF0^b@V-=0V$H7G=Pp9g+o;!ZEW&t#KcvAON2@))qHD*ccdqIv65=x$o9vqpbaOS`F~_=FpdsP0yr_J!$bVS4g}1r=+CcT#>J$5u;>V#50+9J7do%FVV?l}ZLu|bt za&@0DH7y%qY)Klk^zA-bRW_#h9j2S7=zCo>j&ILxO(XI*6VbURKGdTCt6pg>SrQr~1=?%()M2)&*t?zpbmXo!0L$TnL?M|R@*if)i4c=Y{-$?r*) zL_}I$+?i788@5!ABpp;*Ugz+ShncO5?jaIC{y&S&T?b4xJ-|K3V#7BWbomRnSH6Tv z@q;nOc6vHsTl$Kocf+oN)I(InO73}U!kAZMe2N6Fo^wJROt)^7T=pNKQBA-1*9RtY zUq#5(!prPGw+XS5^D~_8R3<`>W!N{ZM>&YDn;u83<+jr_^cg4lptOp%)3P`4(}Atl zWuy+?e(uPQBq6rpHd)Jc_PLhxkLQd{_I=8<+TAMzvs8Vt}e0MS@<~rSl%(bpG%Ze&`;dJ3v?-@;} z>3QL*U4(2ep z-ci+yO+Q0ADkz}82?o=N+)5DX9FvdIZzic&HpOTTzA+siGqxmu*HAKEde1@SiuSV8*IjRxYa+E8I_l z<)hp_mPW>8-fdrA*@Unxz_t?NALBMH0{f%(S3I5~K70;3ql+3TppEb;w@6x9N1+0r z_**GFtiP0W+GzM!pJ0G-jy=W)nG=ryg!D=D zapPx6BTXK?Djp0I&ypq&l&3R{#B3qZO|>+nXfBcuUW1r( zbb9xZHX1%Yxy>|~tQ3djPVc9dc{X-FmMh+dqIQ5P(G1meO8N*#lahH@xCsv+KI@)) z)xo}=vGeILlSqoY@t5HHpWCtJ^&f$h_hRdddak)kCu3zq0q0t%7(G7O*2s5Yo0jMI zqD4OkPb;rzy|un>47)L@?*~(TJi|{&6u-fmv~^b9eOZTQaXtRSjWr$f#wLi0CnGl0fYeQ}- zwCatFCH#;2t5|-{^oD-5R&exg-B1TIHA7wekj_n+Y4E_#?rAEL6 z07^`U)kT33THUwVSHq^OE6YxC0>6jdvZ$~=s{aNXZ(Wk0bbpY%A)a9@A|HKjB|k?H z;MUDEiHGp+HU#&}v9bQacxu#Va=FVq*IOnSF#xu3czV*@<>b1Qj&*Iwk-_90yMR^& z-lg;172qp^mI}_EINH7ak8kRZD(4m){YtDK7;vTsgNSzmH7)oM(SOA=; z9op>LPKqLQAu;@>&ak9A0cX2D=f)(6zYs2d*fLE416bwS1@aH}TStHD`M`Zhjf;|G zYKQN0CkYN5I1+ql^{3ZUY#x;H5Gdd40Be=#PvV`(#uq+PKQW^n?C@M0av85s!HSWN zm`J_=N$hK3Zdu5zmtn-D7z~(PY$O6o^`;DAsys5Tz$69UQe4D6+xSu_RxEfP4hYpO z1U_Z0^mb=Y(n1l90aY^;!9T4q7xFkJv0IQ7Ht^-Mp>{}p7XV6bn<%nK_ZkLrP8e3=fGTpy9^ zvIydk_;^la|0&~D;~KBd)hm$m_Iy! zmUUKP<0g2fu3X{pCmGp?fe4u5Af$AShEo?c(lj@OgbXjyPcf%Fg0M@~b4?eU7QWD3 z?TsEvHWk4M-X0{dLlU0FSj3?ef2@PU?Z}dNn*U6Yv--SGEkuK8si^D%qCdN(av&I8 z*Dx9DqVc{7`_+TD-Bb1t9>#q zwNp?>Sa$D$fOR)&HDFPtiIU$gfDRfM$^dbo(i<=`Qh5NL@K=?w()30K%hB2u;MPn# z&(c6*i>Bh@H7;Gw6gT@|(~?kIOZEh1Y!3;&Ip8(1d>a-#yXLZtQ_|Vodi%|_=Wzww z%g~TcEdubD18ps1@mV6+FV9=1j(%0Hwl!b;G#1c4&VWe#rLrxm!A$(}9fOsQ|Ie>J z>|Q8AesBK6oQB$L zAe@AFFKN|mW6Kv#jCXQ(8oqNu>VxEhmB@VK;XxT(+14xgi}jGcFZ_&A47 z6QwA^haF=z(O)cwkTZxVLVtEp1)eapCvO|0|~G8s+Jr{&GM{el>KxMxixRGG_>x8?zSw=NX-%)g#S9ui{`8M9w^ zal4n*MFN&-9Z8DlD4nTH1@6<=F(@Pr3I3dFbmKe2%*Kj!oTYTA_Rk7U^6)2}oA6|Z z{;K)%i(-^ZH1q*M<`b7uMP{Xi_@elm48HD2!whwUC`C{GIzftaqp$ia?>=#<3-B4GVTK z{52iRcbaqXECsz0%WOg!#&pswH9w6eFlMsSW|7rz^^yEj>WDg&*E%HG!z{_l-RCdf z*8{9?Dv?IXS|q3K6EWDG;lJqgUr#m8{O~X9u&=bqwa&Ek+{4-xW+}oInP3DN!&w4HlD(C}NDF zF*51usa^6db6$*m#x%7|Z>mgu|Fc7VdkWS>@so<*V5cUp+~WTfq#bA|nrK(WA;uyB63mR{O*=zw7~ z=fH~cm2acL7N-M9)Lp1yneen(WBHkOU9Eu3lMYPymD)#?7R(03zA<3GrK!6XB7l^a zaen5q{pw2(Z9!)J=Y;G!e}|H|HP71aTx{zd{+Q1$c=}9(c`9FU|1KrGz(slBnsIl2 z2*%0reLevOU+6iGQ0k=-ov_x7yOQG!{qsKBb6DdF7xR|t@%S8ly(1YixL^nH7QDGN zDG&$TkK1yh8TE#Sgb}%>!S?o-6XJ@GNGyxJ==avBmY2<}L^={5VAnNKh$)3ws|1E) z`A~loL=aDu2)tD&cNhh!z0PuDSEq0|MPx6Aeb^;}>c_7+Tku=_K+26;Px2&q z;`{w{(thEyhDZP4m`U@3msS?=@CUs@AK3+WRd~UQ0bpF)#JC(tl+O`yk7@Oy1=l#q zdv=FDO_oEXzWu9M=(V(ZJN#LGrAhvq;^~Q!A9(eqPHA?>CmxotYP8m*Xk@q2>aAJr zo^>8vCm#QvaQh+2VYf(0eGP$@1}fDzR8JoGZT_~vZF>?u(zHqX2I4FW%HVe+K%qZ? z2Xh0)Itn!tqdM!?D};4s_^gME`5;WiDj8WT*Ll;L?G1F~7C9nNmzv`Hm#;VFV;!^q`;>j%ANKL>aSO#s9pXh=eZaM!Szm%-_98LyfWo`SWF38?scz1 zdLO3#D*w#!h6$+`X?^}!B*w_!LAL|->)DYbmKq1y7ha+`f!ROZ-qYMiAfg%*nCM2W zV404|XneynG$2kZ8@!;dQ)$|6`TBULg$TrGRjGp{^80hG@{z9(5B@8^erSJzQTuG% zb?%4bqmj?hk&>GqNilqIX`(S%(Tsb%?q;O+Ao&fA52&(vc3F+(Bjk#>*42o}p=vS6 zd^k(ZRV4Z7Sk89YfEC)o#~loO3O-v6kfb+PvbIUmdz_;DaC*nu*d6S>ac^4+g+hBm zEXxzf{^+fj#ty=|q37)WMq>gy|phm6Q;sUsd&=3{H<&RB3&+Gr#S=xH#y zlR;g(ELXkyP`pvAeT#cikrO^nGr`^!pFW>2`kL?P7N7lXw#UMn0>-04(kfA$fB3aB z0k`lbyctIkWJam|DoI$HMnnT4Mxk;YS$2kZl8R|m%20V+^EJna%zy#S_pX4X@ypJF z!lIUOuOP#h7A(2hgJ>xN^r%4iND5PDnx03uSmXF3N^;xZ;wQ^EVXc>8yW+#m!$MRucs4a_L(6oV`6A(#RJZEJMts(Ey~LFN zZ7G{WU{-*}9rofwoZ>5FD{YMrsY5QcJ!A4WF8SrPv{It}(Yg}GJd|U@@280|xz=zj zIQO-VvEli&Q4Zw}WlU|6i4qn5+j%{V1aGfbe$79d5q?KIeK_qm5zOEh>bbh*qG4O^&I@UHRfH)cou-R#{=stC+W$`2j9 z-0I9ytHQ$buP?=tl`jMbttm|fpiu1=?~7-oE_w)JY)-$3zq13qyRrTBDb4xwoo(UvKI8JpgK5!2`fvkV6J55P^Ii*AEZ~*IhMt>MlJ*cjfbMv{|nY z=(e3$9)oEluT|jQ3D$geJ}oWQUK&_!DU_`Xy_(t9-<}ZD!eF)< zyb_~Tr!r&j6&6bLh(env5)|a{(IzzE2xt#DC8$27mn3~o^M70jf}PtYsLE*IWa?Go zoJEn<7vl!*2_oRsj3xwTYZlryCOK9-E=ThgxlNj`;{55bn6czRW5v<>eLKEzmH8U< z**^SA4%M8HE`fUW7uhp5daQ$J8ViIfKF)0p@VEKRbb}{#xg%=IHiDc!C<>c1N4C%r z-LvS?+IZa%VV9oU;p9i^;?o>Ax=~A9wp6{oxSut{T!&dI171+lWoh_ncG)g#)9uQ-O46@TuhkV7?cql_?!~&NeY|FtxE>oV zl7T9=*6!-c`Z88kjJ@JcFe9RQG36In2|A9&&hPw4(3w;7IJRFOB$91KM6im_6`BzH-m zw^{Y_c7mE==bkap=)tZWmKl4_qw0y105m)mpV&@$rH19M1l(ogJ!c-}Y-Yan<&%r>803X()6+h_kWgU+gEuU3!2MLnI(X_J8@5R;&JuNjeax;PcQ%#2E#Z_hEv zj8kA+K^Cd0^kGScH>_8M)A=(o{ZrSB6WA&)MR@S9qI;yA>^iJ!Tf)7*&U?Sw4MsWo zNTg1YOYkEc8YXKtnrL8?#LCkO1Dt+p_e)3fgnzq1+w2G{DcpD*&?HSUN;QNn9y5*J zp~=O~TGrM0^!2EdBVf##?zqv!&|uwME)ZdPzynH!y$Z5ieH*43=n~`NoWWEWpH$O+ z_A|1>e^}dGv;aEv`s4QA8XT8gkpPWx$46@HS^gMmz6sgWQ%h67_RDrdA=-0#OoM0> z>sx_foyeia%eJ%7`DX3S2$ty>5hL`}i=uGo8*Ja(%q{n{O04CJXe~TsoF9fP5hK0A;en0mC=#F$kK zmS}n~2+$SY0d(TPx|IX=slh1gcRm#XYnY@{365_P{B?<(pD;+o`1RoF%v2(bg>{iS z<(I(Q59^SDX=>#uKM%|O(-oi*p(}kc(I|1ZH_E$ZOYE2Q+(L{N;%l(2CjpkhpFc~+ zVQVtdaRnDb_K4%aj0^!G)}r80OdxFebICv*{D=ssNQUBQj&bXZmYC)RfxGs5qhH*A z{e-QAle%EG8@ON8VWM(`D+Q6&NjtdfN8OMSy2*qOL?z}A_9)O6`dIRr?QXK$!1{LK zc4;WT#FT~mi15&Ex-n8!gv*KwLn(I7Syr423xp9mO2Y->hKs8PhI@XkhFz?xu&)Pg zh|5%2uPuOt%fkJMc*{S;lxmS`t^sWiXTVPHN=>PIq8S&%DS-#1DgN7W*6Z(-KeCVv z)eWXbTX^s4;)kg!qw20yt?E(k-(!`(3IqDwDUGk`YE`2E@-!uI=QaR}UXQC9tL1JM zt>_5ubn9g6jhe=?f(m+>tTL!}wAxYGw!)w?RrSn9mouTIH?tcdmiqH7DSmNPo z{{zX_pzy7OKY7Qj3x#msE6$CaqE|nZ>0Y#0zLS($*Izjo6)4uav|+WPmFVuoyhv&3 zaGg^_3?|-{+l+W}jFgyHo6k??nE?zExQ8%#9{Rf-4r$Ko#u&##o&wsslpD2P^j?ov zw=!O*7*7MFXJ@(SEbsYEP(=Oq`?+-dg80)f$Z2bUFBS^d+JOdRyVvW{Hs z(f3c^n>?1w7!Ovjlv+;9l8O72 z*`}n?r~KroCExA{m-h&eHtI5TbsR3wJ)a!x|8}K_NE!> zW3x=VR!S|tQYaISpIzaZh?LUfO=>qigg*<2G~)}(6eelDB~gFt#_UcH=jZM*dw%3h zj2(YC;#r}1ltk3D;K3(5HQ+%ch$N{lu9K?-1URm zt$TvA3ZvCUDge-EjjstrXSQ!p~jtxgm-WuUx{YpkpigUjhgjF{&)ppq?%v~)o zA-{pGz|J_6$M0v}id@vPGvgSptbqYNyD&O81o75smVZkduJW1xb%cMow(34>Ib3J> zf=L@v&O^w#yD8AcnY4*$8aMTKBJX*H!zaNdp+-mt)t^wwoi=L$@gT|I3|gZ|HiN8| za1Gn`i>61E}nr029&thdpYJT=AL%{^=C;Il&7HJmv3bR9)QJNaHJuR;w zzg(^cn14SiwW($$-M2GX=Dyl6kiN}6|CXXhczvO#!B6tsYG&H81_{Vj#iuz)o?w%Tf6rqE7I-BY2pZKXL zrY>%AXU2Q~g$|ky*3oNj&E0rp)Hf9ocAE{1tZ>2%1VNP&zZv=~3D% zgRDM0yk$y|KHJFn%uyTKl!VikO?scS|JP>}a>XlZp{EGcnPoY5Z0J=Heowp#okD|H zs4i4Ex6gqt3$LZTxDk0Un#yp#WLS>rETJ`iUA729zn6{0kR&pDRj(jZ7J~~Oc0XZk z{V3x^nu8_}cp`T^JRvzw;va~_(;_GLNzjiouow_JD>BoCL69>MdmIgw@8D|%IQCyp z2hX#aPgWQZEFtfT$PNIn;*29|RXs3(Jw|sRiL+4YHQy==?mSZ8c^*_{kLJSI_1#4m z@K8K#%g_U83T8B86-^;S6xCHdk{iS_NdF?a%ER^Cl*8n`gBTbv!_6a$<4lbaqcwr+ zMCg@MXS}jqWMArpA^lN5vm5ODhtmsWNQ7DOgzc@VM>6`*XCA zkr)ThcDw5ZKjatf2MF97II`JEEb|T{a>Aq2Pw9Tal?0AlR-ArlabcQ5D5=(OOl1ak`P71BrBX|v}urC=u#!K)Froer8_~=FR>}md)Gl_+>3pk$QR&7IGUEw`}G99 zjzs^3%QGr4ndOCB+Y4@I7yt70%Ju>MXtUms@tVxHDc%Wo8>MnG6dhi7%{3bf zXz`=DfkN84*b_P_n^xc5h+69g7Zo>LbaD~b5CvW2>*HsGdK;<}o|X?6f;NhrSeucP zGPR~Al2uN$u#3bfot!$JjZ+zNSbwx8$iQAz1=XC6T zFguT&HXFT4QN*xccMO;0G86Hvo)aTUWNYYpA4ff2hB0z6rTw01%tAS;a*>i1z$y~S z7>EFSukDx2h7#9C#K<|`&?$-ie+YvH`-6T|(pOZ*AXx=?z1}b3+O-~}pg)|IUL;ij zKwmS7l-)MxIazk!&rZiw6?h~tcnS7NrtJdHVb@g*`%>s|B+W4th4zVw0Y70#u$Ccl zt;(fY?k5Zn)&>rmvG0U9hqbrligFEQ4)%B5y~2jsH6tksJlEkYch0yLv;WKHJ{3imdE95GCd$?8k% zqu=|3AFKLD^z@_3ok<~(dEo+HZ|;x^?raBaETwZfR~1~F@keYz(hSBbPkMuKtGT4^ zWh~-U)1MI*qDV;;h?_)i>&l$w3a+XECD>bT%&3VzPq(j021%19`Y?n@uafB+ZRM|Q zmsemc5kZ|X730n47OG#39{J%ZHhJ=>=F09Cn=>o$AZt5F4wP5QLR+H^75TJNHjAAF z4Skz^UW2)z>o4j>{Nm>_o&Jo|JI0V0+^bFpg z5{h8xRO~*RlLA|3w29ureNs;SwS`i=t~#5e9$|=$mXyhRtFHFGK1Rp?K*}N$e@p+F zYb8xZwG{s$_F8LH;H#$VA6#Qft;`DSfsZ@8g!J{}tcz7E!j8)e7-YYjmyMz@)R&)7 z*!$_X=`{zZBn^8)L%v_w_3(oxGnqut`?)lk%JwiA8PZJ|r7FsAp6ksQwmb#Qw?lsy^-P{#Z2!Uj$%4YzZ-a97{s zyko=K&Ty`WY5=g|CW@VAQvuuL5!>65{R{(J>QnG}_Ml2~sK8i%mrI z+5&Re-o9Xv3#T~|`bt7WQn48tKxt$D44P%Gu*EvK$nxy6k9(I00Sf6?=fg_GXp8$x z7KtPgHqCLHk63PZ5NEffAvNf~9It=7~1a%A%@nHXnr!qwUa+m@P(aJ#N zkb*G%?oy&-WQGg(6t?J`SvN0hkFKO-4 z;KDq~MxB4l7S;K+Y=;4@i#~_1awbBo>#i0u_qsxkH4s$-5?j%4lIQ5-hY%K01C*;i zOKf{tG*JZ7=(CKw@-C$C?SkOs8pFhAr0e9B?`C^An}{NYRa~{HtoJ@8XlQ~4N3@tN zg@MpL>sgha&gBsOdlNYVI$Y~o4EXo2tWOnPeLz=;;z(fWG8(EmLmUA$73h@9E8*2Av9Q&rPL z59*HRlx)zl$ocQ*RmVQ63T(7-sip69spbxJ;VbTYK~p;DC2`*F10npIgOGbD2cCX6 zciUVXv`mX4KJn^eB2)Dj4@p68y3TO@vY?yE=u!+v9n+FzsbKpIWo3;_kepBaNm++x zA9=hJIqE3TXs;QiMZd=Gq$A+I@D1Kkt0kGY>-MtOV(JQM1bHrK(M`A2E1G!T^k)yWb!9 ze7+e3_uN4)9)BGj6Wr0jMSO(UsttX_PqD)Iy!C@4Gg)YMW7g2gn0*3BV z;x!mODe+Z^yhoK_sV_BkpPNNO&S1s5FnPyJjhTh>dZ-2hg!MA533EOr1?r{#QLBKH zZbt>e#(jXd%(qDV{NS>rhl}RHE-I=aiBH)nUlFI=EX8U?PliLvn#lGShH~Ay05ULS z5w+BcG!CdFTC{YS_FDPrQ-PMzTV2&N#lGZW2>}JTYjo+ceRcrv_tqRPa6DCvH+|}q z&Z!J0tnI>0}s_+j0Ysd_QQzMVv^>f*u-B)11TL9yPWXRAD8*aG_FIe>@ zX}g*a*=vLy#ksz#;lfr_zvSQaze9gb;-Y~Athf?DIkR>t{QAE>b$pdjd4LZg|JE;WUI z*bmGFP7SJY4PetR4HetNNsB+T9d*W^pu3x(&e9kO_kNE^pyjLK=v`8qu?dB(gc1@l1h zPQ?Z%3?N8+m*P}NjBl-Y))mjOjW7-TR%_y# zoouN07u@h&b=1d|EIn;hVYgDToOgH4M!L7KHPNdt+;sAud6$hO9|@U5L-=>%tk4ER zwJYvp7^+E+pI+5v401bzLDJ#%dR>0}ot>!&!0 zz;xq^L<$hpH44CVQ0^a5FBj5_h>@JZ_25ohsVbSdof2ZYZfwM^gZtgG7wbf&snar_ zl6vNU!AQd`pUz5Y($U218R6!)Za;c!q$L8#Q>4_P!C-G?eE5oxj^!|TLmPcuQV?5b zh8+?P#%p%C5``{p2FHW8v&?-Ke|8ts%Q}Z`5~pJe?q6t%`j7CAx%PrbEbU^058>^Q z1NNLgBni&WUX6_<8vT32Z)vVJ!;Y*4KLyq^I!z1{_`=2*pOA>O#vMm*cfpl!Gs$u` zwcspDzxRH-Qx~KW{Ynbor2S(_->;L#icDPBZNo)x6CITIv6=5QmL47qIiQboigL+S z&VOdjz_w%r$Ij;r0ZQ1?#b`T8MAU zq{yI&0(E+oAN-_Xuz z7b|>UuWr7z-p$JDp=_w{RWk8A9gYisuReV-zQLQz7FKXfkrC8VwGdJ)fCtKrYMao7 z@p#BPa%GbUMf>{Bd`rpg+5QGtXgx;R2Ewhbr2wnfm#wer=Mp6cYJe0m-;L^3UL zArKWu*KKDS$MA}PkHtZzHlog|j#Apw>Usa3aWeW&B#$<|AI~A94u6ss$B@eLLIzB1 zI4Mk0NbE~TBzyh~jQSQ8vd|Ms6TRRR-q^%Z%eE=p3%x;c6z@tT-;(%X3J1qr+P zZ}q|jnlmObTGwW9f}Khju0I+;SB=+ZItA`)3Arfrny&WAuQqv=j*k7%Cl!ijFndV(K7g}_)dD=poO>FAqQUn44F+FYo>leTQ=mhf zS3*PK$AyP|aA)NG7~_zMRLpKymW^g`(oY6*Hjv~Rf}v<6s=r6P#nh z{RA1gGk4YCNZn5!bpT$Kq3}EJ_`*03JO)8QK@mHr;L{E^i*6JSjY zbCX#uI%PI5!N4*946`V*Nn*4R^}guuMJLv9+iuA6|BJ-)2NA0TYd<9Mw&6{E>-5HV zXPgN=8PjJ;1gj`@Qt=u_oSbU-kHbPH!;XahuF3{eucw1l?B)KE4(WcFnR}Y;?+m&h zt0jI?xjsrO_`O{=pc&L@fOPapL9eKv#HdrGp@NspD2iLvDQvS`amvM(EsPwGP;4#G z9V-@K1Kh}UsvFwS6|P~#k(#tB&~evOq|;|nYmZ0Q6^no2 zTc=(!A)wM85%p@)w!?@MI4Wc4C9KinyTLBLR5a>#vU7jNJ%r1ODDYXQHxXDO6C(J= zZpcXA_YIYT`l z6yf|ccwE3U7FX|pUdK17KNROL3(L-?>;8DP&QTxYySbVc29U0$c&e2QW?i?_)nbwb z7V8N^i9^i_hMW*pz3zKC%SVcUL_#okm}O=bb?k^7CuK4kd=8JYSmI6?@BwKJC{GMJ z(X&5u>DC|%H73cdYyH+q*uj9+A?H8WLv&=N_5KFnlWjdcEe9n4Al-{_E4ESlV`YeF|p4gT^QW94}PvnxGuoxs!<%sv0R3r~P;KKhCSqzwA_Ccf^PB z#$1M!aTTrkgl}p`?gZrV=>rIWk^Cxx5??(YO6Um=p zF#v^bG=I=}GWf^H{bYfCj)zr4%|57f|yA>-;N? zY7x8XPQzXy1)SCA@EJQ!6C#5T zzyg)iQO*N}F9rw}RgW z!}Y^OGK|~J@ouC?ql(nS#ns7~M}=XAR1CsUxq079_ZNog;!{CWij0Zoe@|Fv`~f_X l3a~UPGbixJph3Nne95ihLvvGM`um3wG7<{nRiXxg{~uw$2mk;8 literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3.png b/FreeAPS/Resources/Assets.xcassets/owl.imageset/apps.53525.13510798887505226.836b071a-2d62-4ce8-92bc-701910b6b96e.19f04184-2123-4d05-89b5-97f5c4f7a432-2 3.png new file mode 100644 index 0000000000000000000000000000000000000000..ae83a209e2dffb7e670059dfb9fad053aacddcdf GIT binary patch literal 14237 zcmW+-byyT%7pA+V8}UbXOM`ST-6`GO9U|SKfTWakr-U?uG)Q-Mhwxp#KbC!#2WEEW z-t(R}&U{u;l14`%MuCEYLYI}1PzCSfuP-D7@KZH7+z7luyQ)fyLsgEE?t>3-mST!x zP*64Ts81&F;4`w5jE*Z56h`;!3%WVc_81C^mqS)UOx?@yI2$nqSL1Jlrw)Mu0X!_F z7)MC%b4V^yRAf*X9-O-9I~gnqP2?yXGUSlA`<_tPaAN<-U?Ic2mB9&y4B@1(v2C$& zD(s!01iqZ=6@TGWTFt4{TNWxk6xw~?hGEcD=CFL)e;RP>7+0(DpD6ktLN}NXT?5A0 zchFBLaUpeUE;KAbX2z`ZFrCofLTU z590|*TSXF{ugMv16ke!nxht{2ZbAflfSJ_x2>OWOGm4erI__G=p^geEp9`+XGDa&5 z#`L8eD)opk8;T$t>3b9%^KLdLtVk67fG|#9R8iQjwAn;zdJS08k#|rK=x7A4YBVmy zI8u0x_h-;++M?>Y`PlG3V6sS^w+59xLz;rjxPtSrf5T=ad2S7=2z1T(LxP>pc5w*N zqoAcBWo2uqxiAo_&q$st-o;HHhms^%wJNjPbQ^3+{U5F%mSb7_**x~TDtB$XD_$RZ z-L1`sQ_fT9AU%3z>h!0pFVCLq|K1`A(HKI-<;%Ef?8Da&1o4| zZqVjo-LAFV>K^NB>60eY4L=vv1ra6?xe%vhfHTRHNqqaT881@V`SSd@GC!|b2c#Wl0-;$5ZRk{@v1M^K3=@}zP)Sro1LL!13y1c?KduwzE9fU55r z-M2FI+|9zh%}>9`JeSt(|KtYqxNOPXHrg+`;TrOy)H$RblH#GsEp+%c@drNpg;yBO zlxc*YVj=J~2*EEwlWxD6K(v471Un(!)F<+Mj(M7_EL>W^_}y`-c_MZteeCZlQ(cRa z7mp$Y_xji8H^W;)$wJ`TW*mS1yOD7_-V2i>ppo|0zrxbSkf2z==lVjM<0YQW>zLzn zvecq)%hX+X*xG77g5RM0O_<#6Fzl2VhE$n98QEJqK4@9=%DJdJLkyg&rqS!%lo#QU z!PcdYbjP};VX4j%la>>=-H1=`?E@4BOx#7ro+=Ke1ce4lBUdajx9ZR52iv~QbGjCD zrZ-CG*+{yo_FX~Ha_1X;z19*nxmZpqh|@&xU?x7L^PelGo zv${Q5&N1xpDK#N|*$$bFj@!+5We{=N6yqgBibtNx0+%9A|~C{Xcmh zn$fJ#*V3G%TT~oj9*jNOko;K+NGtXKeAKP4Si(6_ecqumAE5KTm!}4)TCWws@vgny%$lC!|xu2 zQE)^P(IJllJM(aRN}-xg#I_e%V5e$bO%W+9p>i-=F*3Wxx*6ew1h2kWXBi*mkc-G1 zb33c&h_@orR;p2+*5vZ~!3E~BAgzV|2Z1O^^u-d@(5%xv&|RCTjz2Tr80 zxXQs?RaGvHM;<=LNOREsyZ`>9mrrNWXcnuG_>8lD5EV|=D8sB<|Hoo9BacGRE5UHp zlnTdR%#8eNE~69!}lu?Xzv;Y?1;9v%#*7X80VEw0P%2h$VcCGM_p zC#FRtV>M<2Jv=L+R6hN&B)jnGtumLSUc@2D(W z$d`wSdF*_1KnNBQLtQ?VA$1ph0FgjQuhFhF@OIhLWT8tMmRQKgjgDC*aE(sEbXtyl zf@*k=Ni1FNb9_AJf>Sfe<>Tp3Eeh|gL_agG%yqZ{P&n6@yW>+MZ{Jb(T<3s`Y_V4| zyCh8e6kNcz=T14i#Z+q0*60E5aDv~ob|l}2nI=c0?VYcVV@(m8q2XkBajo`?JRY0k zUoy>5e>vk#HY7WK?f%^bL29MQLd-|QkO8>S-sX9ValKg%HkPZ<&AeG&W#R7o;S~B_ zNrU*2ZIsdrSw+Q}hpT-v-a91aG1rf3XxM$)L-{f2NV-U@LWrZMmhyJaJHNl~vZxly zOcNChFMuLjGmj5=ZL3T*Y7aq>yrqk8Kpw}=FsA_{va z5zKzE#sSfzXOs3l2HpCS?5N1pV$Mezdh+^Tktz9T=!5dC9fie(g<Wn6WH{M_coXn+ zKG4!%LDLkR_TlAb(Gh(dj&r0?0@i0cRqH5>=NWzpg;Ylco|0R(3r56sN5LVp(O$5o zrba3H4V;JhT&01ntx)6~>3f%7Y6Vj00?Q^R3oakUl7s1BVJC~^2{b;9p1x!Dm_Z?6 zVNzIJubQqj&;y5w$#lKYZM4fY?alt2Xqf%mRqWTB1-_BD!=hBTE522oo~MR-sJ`tM z{V_yerZkcZK=CxvVhgGOG(J`!Z$~FJ&qEeXaTeDOHKDXAFGuK|*cr{-Jg*S@lO2}G z=?y3I8RtJi^N}>ga;>Ty-_Z>A6#yOHv$0aw+14ZV3I`^k4e~Eep$7o7n)y zKhPoeEyr^d)p7ruY2RX<@xK9zz-dGb(u}|L)@s|Gk0)=0ZI#5$ zOwd|AK=rZcH>+&>a>&uO8VRmQG-D0_q!k~Cr%=AXo->*O&DQy`IYN^<``)m|RPuC$ z_2-e2qGGC{jCo(U+~C+&H%V8b=qU^&0@(z;)oSAH{t0owI5l5AU={A5iJ|=&tAr~y z`S4d~xTilmm5qP9Zd_RYbf%oZGqLRDX;&nCoWk0n?U<*+`*PYAvNov3pMn(7d+8eR#Wb-~tFVD{2pY6nUaxsmXpNf6P% z8PMWUKw7)%px9ta?!RHbLEWDykX}Z`XEGk7x$Y-%#O;)BHtFie6uuK(XmKq@WVZaZ z!Fl%!1vWLlUhG0ZA)9|@4F3&nkROdZVwx=#!XNEcH|xQbp9@sP*sVMab281zb;jKx z*ys8|6V;4c@BJU#WYlgJ=<9`tU!KNa1{;MBgQ(SFa%zbqIpkytq++!fw@XWMxZIi+ zk9FF;YC_IGJyZq$lfQGQU2>aJ^ifbigZ1C~Jp8UeyC(NK5uGv#|bU>l0@&q z5akz$4!3wFB0HZhatd){?KLc-u=@XS|#;&ykqPuV$;fcuD!|I zY^rwd&6UaNwtr(be18oL*k<#)*9u~^g0ktbviGw8MGIRikBp2g2bMJalmu#LE>Kjx zoW7d0w#4gvqaQ6TbN61#O61Z2)kspM|X|R~G?7wYD z5Db3eV0w!fDWd!7icl`JGtcqvx4^N>WsSsncfA&uq9eCwWEDb*qNpG;(G>Oor&PbG z?}`ij5YZ3tEE*ciQTbkXKc5`262-H!vVL?tU5o^nQ8w}|HaW&;tY@5N<^)$uOeRh= z*v{c9ZCeK1GOaNgOnWSQtyOO8@HlKMDl5nDA({uj2Vh}&x%2yo+*{=Fh_guXE6Bln5`P5b%gWz&qD;-1zmm*48*# zRDIY*os{1mgF<*Iw9}gv1T(O4(** zVxyzm8eMnCQYZrMx_f_uR{m?T!B)!?aL1~^qXBYXg>OKccsxJdtDp)9buOcIC8nj} zt7_p{Pn4>O=|-`#d;kD@_XDNLjLE2T33Yz>&(JlonC<2R=(1juu;bAAm|sF}3klkq z08hSZzVUnQ^|v2IxA*K<+V8I&O@bLI4?@D6axL#mJX@bX9e#wJ&7ezo@ICD)?xKtB zQE#-JVuM@ti4-XLar&g zUd?Kq=H`y|DP@ss<1FK)PvmgX_{|*FC7Lbfito{xP#-v?V=Z7HQg^}e1tu|xraKk( zCTIl!s+VMv{XP7iA}jt(QF_-?wQ@&5lT&+#?SKUwODH~pz1{Rn*vHvCl zIVKZ>9=r3!<3n&Mhv7u{J&rPZ%pOPmQYV2@AyVtwgK^vY6TDdH`inKLl2`w3%eCHN z`R|?M}l*Jks!#@HX&1mr%1#5)>wUWYllxx*$5(Cpx{x9{}|Y} zPD=~}Z$eUb_dmH}#I1%80Q*hKS(WLd@*mr=A}}c&$~Cq+0w0fgF|&CfvQ{O__8rty zCLg~6>N!E(E%0#=s{(MngC9C|%`D&9I)j#P_1iou)-8I8`TEll6f8Fz3{OlV(IcIj|#*>fDKx*mcy2?=aor(D` zH9JRTU(*&=`CkmtqIsNjoOV9q3cMlm>&K>+A{21ir%%kuaVU2OJKPbkmErz-24~)7 z$vu#Ce=jU{b;p6REYN4T+CX>XC=@ly+s&Y_R4 ztl0C0IVT;Q%je~88jmtuiQk_p{<>goaHM=AK@Q%V$zvs zVAul|0b4ES_{g@br~PL%u(nXGSgA$(ef8NuU*EaUNCQ6uwbU^?OjGm?u=a^i#NZ`AcBKcd$;@fYK%Dd|=PL z<*H2eQH~jzgox1rS8X$-;a%%xzQ1R*l&I&6;D5zkjnTl6ZV9TR?3>QKeb1Xy#=i{~R(5fMIi@5VU#{B-efPX%-J3fG_>?K$~b2qC{+uHxFXP;F#>Y~@F ze@E)8%`zBGz`A3X^xOrDxwki|&63bQ02on>rTtc@j77~uIkx^u zufoX8tp8%kh5k0<8<>_Jl5U=BNyJ(L5a@Sru$kHLfV!;e?i(h7^;!&%0$uhK{6Z}@ zP+(z)gfU44fOxW|A;L8eaM$xmk-ri@*`1uPJoc?oj|;?e*h(t7?!0Ps-ysE3M01@t ze{FY+ehjgb2bxEp3tkLT#{^rvUIf$(5ZF2^_&G!m>!7824TuXdvV_e+C_t50Dp3Aihk`ly?U!xRHvPm-H?Z7qA-{}Q;# zr+@Uzj(|PFG1kHLLaI&|L>%fhFLV!FkCrzb-KE0HGzmmNV#3HMi~Fo>s`)vsZDFlpcRnh^t`Knb?aX^1D~HHh{Nxd z#oV9noR?3$f}}sPY3FCA{CB>lZz#WczhC^#jtDcJP*$8568v9`yA%7CwxFITy8F4Dj)b0jhjUfwHp_I1Q|b{Y7Q~oBR|zSYlsV&}4l6~Y z<4N#G#5~aVx~h6OXX}$DP~d$9Fwafh*jp=O^z=qY%{F%`~{ov`z>db}{GQjR@U#T!48lz* z4`p@>j+eeKc7)?BT|*^)tS4=+o$@G}LfCJ9RMl2aUf!%}@8Q`qhqJfN^`lLvjP+R7 zd)eF{W%BAJBd%lVbpnIGbt38E_r?%${J^Gc zA7Rh9msN^m$8}mo2GTlize3=`#n~`p)n2W^Fi;sS6h3=YBWnA`(2*$YrX{Nbm~aSj zZUHF_SU^X!Z#3Lb=2B6SnIQ~5$u@qD2z5>`S1pq3@#k9SAb*qdlX`oZjOAQtcl=wR zP)27wFkof1boXwYzbjg-Vh>C}@_d8LSwng3|FWIbOd~cst%tOMei1n2N32q1*m1SB zwPnXmiGaNR*_r6uf7G@8q3tq#87#)zz4(!q-}Bil^>|YwdP{v*&zXhiU9}tSh^RZ| zw%@llExAxlU7SUZl_X5l&jV7z#p65_NpT3G1w4y@Z^HidKvYDMVC9HC{<~dWHfVL5 zsN>&fB7K99Nw1O{bPIw5Q%_z!UCM}iyyG78K?4Eoh&`;V_Z3WQa0-lA+_mj04@Y(5 zwOtttHU^-bJ58Zdy874!w|br`d1A+5zU9EkKX-{ytJH7FHHeoX#LVk9J=*nX(Z}|d zW?*Li&1u$;mObzkoddl|CbgXC01cQQvjQvBlAMc3B(WlFe#}{@QVamLglHG&JogDU z9;ErJbXFt7ue^@rbJBLKa2EKni7PVzDAj;dZeF^GO}|O?gO1N8!Ok$*dnEo|uGB@;@b3W&IltQ=pS(tj1=LPZ ziK@Br`z(fk6?g2vpBk9((fEaT2SdKhOw! z{TctY0CsZp?1IyC;mfgf4lwMP@Amg7p7`12$QNWs6^8|C!Mdgk4 zKpYvl4^iY~1I!$=_M1tK$QMTMQEwHO9xo2HLK$rSb>dT*y@kXXG!r&cQ`4{t9k!ZU z-{Xe4j~{}zAN>X2GQ;POo^1k1+|8ZSG|FbiSC+>r`bsj0-v364LA@k5Z>EMj;3F>~ zbH0Ln0MRrYqp4nmPx2ro{Cz@vIa6tn%y3hA!{f-p1pQ_G~6 zS8g?#Bh0rm!@q-x)Zx~MLAGAM#ikF`D2E9}wD$n=upWQRfCyHg`P=9nvL|kQ|LSmY zw9@gIbRQ`ee*5$0YD#&RVe>VPdyz^<4xRzt1d55do$KO>jw ziS`0V^4l)3+DEvTc^d`WJdWkKDA-HRFiQ6VcD^9P5{fkGd^+kQBOn+sX5?5khmEum zf@5M$y}QhMl)CcYB%m&d6%RT7huy1=4!je zL&d;BDng7Yu*~Bq1UKGJpFsD;b6fqP)SD2ahPKQAg#FtMaC!{>0`o=^+bWv{cx!^C z0A5u)T@&G$n|(l_nP5iyN2A33aJJUg`TiNoh_P1iBoFaa%gA5yTV2BP5dhdS;89TV zGUr@0V{nWN!MWbDhy4cHU+(O)> z0l3R=M}cAO4Jb83dwOU_sakOa^UH$E`4Rbqe=X%fmKf~k&72w06j^bLu`Hs=6n6{z z)lP$!?KHhC{6QE1)91O{n0hhIcXxMJF5AOHZr{|PLI?RcxN(6ok7T*rV=X8npDhyD zc?ee71&t0B0OF{>XydY@1YnC(MsLY1o+me-)MJ`{b9B%;fUK_nWRRHQuZ~>a>+_4rV_)oUxX#yr~tQ)pg zg;OxZz#keHc|sD)=BFM{E`*ytf~VP=x94!Z7K%AMM#+N^$6+mqWuAsb&VUyOua*e7 zV+FX&JO_G|F_O&%DQ#Z89BrA9A0;Z#tsGJw4PB>{Wd<%VpAC3lBbckN08zvL6+EP5 zWRy5Ljk*R%+>W0vxsD4RJX{}AtGkVLqD681#;inD_$F*{umsVe zkJ`|ww@TD3l1nXNrzA(7EP+tR?tYfyaEzxAIoS~}-y?z%jZbLof#^pEli0xM>%d6ft@k_hPu85nbOV+7yGUIoP9#paqUg}nqEQ^< zmX#X?1oHn}tFvc?5s|_WK>lC@j2kDA1uCQXEu3 zSxZV7R&O;SF0Z5%=QYP%z=p31+E$5^ZSxkfWMweK0ifhGxM`B@+hae#E;AJQGyk@& zyP^w%r2(5}=IKnf0W@PB9xW5@c>tSkIIUi9WWCBpmN_lZ*_g0hzJ#+p0&YgE?tz+{O zAoLstmDwCiS$rY)nyfOkH1;y@x(885AAm%QKCBa>*W~c~=0w`U*~S;3|3L=3nc(%| z+?}wF! z2&AN>6oTQ3<$ot_r)A@UmoX84jkW^vWXhCdpSS!MH6Jww(M{@ zA*`gwj7a&wNGE*()k(jV_lbOREJujZppAxx=AvsM5|_m&PeWto@^W0H4M>@7GLDat zZNTWW#uPjYYLbd2mTKpmc>D-&COh{-Cs_=kgHWUyAleV$U-dusVu~~ac(LIdm6|kW zG3rz(;CdPPawiCIF3o^Z0R03e?%g#~b^DH)52=hJYA4`*wWfV2@C|N_3jAy2ayB+) zs1ak?KMV;|eL=jE4jk#6r79zl+w!W;G7#)8entKl%e!*cemN#EXG|vxy0*IaF)&r< z@lf8o#A=)`@Y>Dio-DVe-*Ua!D3aPPWaQ*PkuIn}R|7j$1L@(8SQlqM1g=2s)$ur6 zqq$UGpdn^L6&b8uw0@5JIh1%pKkj_I`txToFe$kLN|6zTIoqo89n;{moGTDX7t|3c zhqbA)`oJmUu2=>@BP%7<2T6m05#XS`4;GKpo(_1Z0s8t`yRXhmzXsqXDPv#n?!4eD z;*OZM7}o53P{ll9M#l0BfnC5bhckL=A{BKs+d5aEoQU)X5n`qu{}UXzD}0Ie7hF6L~dBNDRNOhP=syg~Kx z+&HRf__|9=3UCR_&PoH9 z5UBv^zC)mQtpY;I3+~yQYYt$>qYSzd8e)O!4cu(*g=-T0IN+4Da5f1O zt@{9ykc@j`YA&Cmh5mUwZdhCo1apW|1vPDqK1MyquwTB*YDob?F#`Yg z8}-+Ml*4vZq+9vdi6<67e3oc#h`9zQW1H`#L=p4o&Fb_}5yrM!j+493SDQHS*RS{- zR`lFniWLB-@6u&N+_s+&tJW+VH5bPT*FrYD_$^2fc7^d4xRI6k=z#H0@I8~r$Gr(m zGJO^FuJr^HA>?}xJ~5de<368)Y+g)BMn**#WRv7%Re7d0>LvU1!lu8F8mm=PVNav+ z^>1XndQMsjkgVThnfr+D0PeD^wR;NT9AP;i63}~vjFK;vsf=1aAY}YOOGCqfFWN|q zbF%xIJ^=6Pr`3l~7>a=>ExYxAylXc;esqKEN14&s>HvMA!Jt*iw0Lk? zV_zyBD_)S#NV9y*=W|sO1w(1D=2tBV{w&K71ktYnV3q&%j21D0+3zj;&r;|y{(Mg_ zJKwxFvTL0;`)%EBzrA;*X|iH#M#yFhAGd&K;R6GC|5$Hp-aZ+U2>H}!Z|Z#y{s}9M zjiZ(I6FPqsGb|3K4~BNpUrjoe7_Tvx0?bUQQtqFO-(T)Ffb^OWdLP`m{1_76lM7%J zz5x(;EQLA{6t+U6_+<|s75`(A>Eb*mz;&`%XOdCrnjguu%9EcIZ{B-VU&3}l!e-zK zp(muVdQLuN>r%jLmFhN>+1>VHdSn7YO}+eY{jL;j2x8Ab%__s}uYbe#Kaq^_)VA3Q zN0?8{gXHf>olnUr-Y(^8o|cDac6Q$K{$l$8j6hN;Orab-=WcIynCl7K17>BDCmtTQ zFNNdd+_vnnKfD8oC%K1)q_qX~0RJtF^g`hPbUY4$KN^*lf4j%qm|CoY8xXwt0zX0H zB$q3>j>&BX7x!0!o{-K-=cB`Noag(d?w{AQdLB8q)N6EKum8jHj|l=}B|5E#zh=QS zh!VYOVdRxp$k*9Mhh>K2aD~u@8fPXZr$eYyN8u=QGC?nufydz;2uukYsd=3ZEC!b( zg(Q+lWwtAqP6nZ~6wm1N*?Mo$sU#VnQ&2@5+iw|QSH@cr?#jlytE#C9T}coW5y8ZYO)a7(??GET9v0wgi4I}3rN-%_GeuLK4oiO zD6iSojEPO8_SOz?uRn}5tp+eI7h6*4fbgQtY9e2(jfN?bgvYMh71JKv&zz&U)(^@d z!u}6*gpD#Hm!M`e_7-vxEz+WEvvB>G=qOyrjSFv5bc98)tz&% zLR)90;=03ka-2!i3Go1Bxx)f_yS&pDv%Th{IlCJ2vv)WLGa!O_%MS4 zFdwtPu(jA|KP5@h-u(S?M$2fyW+IMUs4VYsGu@()h{rC&fp(t3AVjyxfmsL^d5>zN zd422cg#E5B<%2e~H>jGH-2oGf-Y*!G_ zi3uU5uRdKP|CMPq1nWacH~w6e5v$Nx-XFQv)1NN^0u^y@J~0y(Avs#65vBMooX0)6B`S1@eREqb_IZv^@^Dgn!UDI1p(%h|j4kXErh z4AN~Eci8-Rf&?&DvG*FCy3NI!UMVarmkA$(mfXgF>=tO(s|hYCwNWX>cK9(+^(lYhZr4mif>6>oCmkue{@$y;P?iw>iwK+>Jk~I&Qx7uzaIi zW^(G;*Zd|fHvI4Vr3o8cYV3g8^HjOv@JbT!xEZ;43%}a4tOg7tI zjYS zQ0KuoGB+ifequrb7W<~j-2#w2=CW&Mmt|#T zd6j0{PxqINjjU_L;1uU4!10JELY)H>ev7t{*2;1a z6{g08*|-1?CoW(8>TWypCBG-}Kag#w#EBgzBlP|HRiYn{U1X2v2EBi7*Vfj*NzF+? z5B7|I6Tm>Sv6NB21pP4uF2pcRxTHRA$q0;1Fa0-ya;qjR;a9>&II)%+1 zbreDAj!rrP0XzyZl$7+J`~mR)I*#Gh9Te)`P^Bz0<@DIoP*;G%`GEM`#8VIMAKWQi z94XNTw3ZH_5~@Jnxqw!Jcy8ezH@fKR)^xi(Kn1Wm3NNy99hz}InF zmO+l^Ud}G?P)kjt5VS-%gFGSBGw>N2(Ic6)#&d);;(|e~+xx~8Sbq_=nWpQX#1}4x zUxAJzUBIzjcB5p_)|qVgb|sIq^?h;$y<;3qOitau{1%b_3`RZ>DN3mBCMMj6bdcO} zlkAvtlfa;p56+u6AL4>3842TvNk~ZK3Uln&Fu*fAgI^FN!kOq;JMZ!lL;ZcI!niPM z8HmRK7){wf{J_pp^=Eb3qGQTm{6|d5U?&DbhcJ6uRUP0%(*qwq+MsuxSW68YM_U6! zhJsW;e(Ef=})BT>v$ykdp``ZiZkzJrxhRJ?XOSz0)`fe~lD zh*T_djjA6O;j7s``SYw0uk1Qoay_gAV$_!y7i!hbP4AQ2X zfJ+MF44e#w$!Vw=27`pW_ZAww6_$n%*br; zg3P;+f1S`Nmr+!ccu}j*!t|ShOB=UA!ooX|sU>pyH Date func recent() -> Announcement? + func validate() -> [Announcement] } final class BaseAnnouncementsStorage: AnnouncementsStorage, Injectable { @@ -66,4 +67,14 @@ final class BaseAnnouncementsStorage: AnnouncementsStorage, Injectable { } return recent } + + func validate() -> [Announcement] { + guard let enactedEvents = storage.retrieve(OpenAPS.FreeAPS.announcementsEnacted, as: [Announcement].self)?.reversed() + else { + return [] + } + let validate = enactedEvents + .filter({ $0.enteredBy == Announcement.remote }) + return validate + } } diff --git a/FreeAPS/Sources/Models/Announcement.swift b/FreeAPS/Sources/Models/Announcement.swift index 7a44bfb752..a1f9d2bcd9 100644 --- a/FreeAPS/Sources/Models/Announcement.swift +++ b/FreeAPS/Sources/Models/Announcement.swift @@ -1,6 +1,6 @@ import Foundation -struct Announcement: JSON { +struct Announcement: JSON, Equatable { let createdAt: Date let enteredBy: String let notes: String diff --git a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift index e7bb1930f6..e0ea9544c3 100644 --- a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift +++ b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift @@ -19,4 +19,5 @@ protocol HomeProvider: Provider { func pumpBattery() -> Battery? func pumpReservoir() -> Decimal? func tempTarget() -> TempTarget? + func announcement(_ hours: Int) -> [Announcement] } diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index 90f40e6080..c9cc1c0a07 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -9,6 +9,7 @@ extension Home { @Injected() var pumpHistoryStorage: PumpHistoryStorage! @Injected() var tempTargetsStorage: TempTargetsStorage! @Injected() var carbsStorage: CarbsStorage! + @Injected() var announcementStorage: AnnouncementsStorage! var suggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) @@ -57,6 +58,12 @@ extension Home { } } + func announcement(_ hours: Int) -> [Announcement] { + announcementStorage.validate().filter { + $0.createdAt.addingTimeInterval(hours.hours.timeInterval) > Date() + } + } + func pumpSettings() -> PumpSettings { storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self) ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings)) diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 85c2edf47b..715fe62f17 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -13,6 +13,7 @@ extension Home { private(set) var filteredHours = 24 @Published var glucose: [BloodGlucose] = [] @Published var isManual: [BloodGlucose] = [] + @Published var announcement: [Announcement] = [] @Published var suggestion: Suggestion? @Published var uploadStats = false @Published var enactedSuggestion: Suggestion? @@ -73,6 +74,7 @@ extension Home { setupCarbs() setupBattery() setupReservoir() + setupAnnouncements() suggestion = provider.suggestion uploadStats = settingsManager.settings.uploadStats @@ -308,6 +310,13 @@ extension Home { } } + private func setupAnnouncements() { + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.announcement = self.provider.announcement(self.filteredHours) + } + } + private func setStatusTitle() { guard let suggestion = suggestion else { statusTitle = "No suggestion" @@ -423,6 +432,7 @@ extension Home.StateModel: setupBasals() setupBoluses() setupSuspensions() + setupAnnouncements() } func pumpSettingsDidChange(_: PumpSettings) { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index f752fd1f7c..e4675ee666 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -14,6 +14,12 @@ struct DotInfo { let value: Decimal } +struct AnnouncementDot { + let rect: CGRect + let value: Decimal + let note: String +} + typealias GlucoseYRange = (minValue: Int, minY: CGFloat, maxValue: Int, maxY: CGFloat) struct MainChartView: View { @@ -33,6 +39,19 @@ struct MainChartView: View { static let fpuSize: CGFloat = 5 static let carbsScale: CGFloat = 0.3 static let fpuScale: CGFloat = 1 + static let announcementSize: CGFloat = 8 + static let announcementScale: CGFloat = 2.5 + static let owlSeize: CGFloat = 25 + static let owlOffset: CGFloat = 60 + } + + private enum Command { + static let open = "🟢" + static let closed = "🔴" + static let suspend = "❌" + static let resume = "✅" + static let tempbasal = "💧..." + static let bolus = "💧" } @Binding var glucose: [BloodGlucose] @@ -41,6 +60,7 @@ struct MainChartView: View { @Binding var tempBasals: [PumpHistoryEvent] @Binding var boluses: [PumpHistoryEvent] @Binding var suspensions: [PumpHistoryEvent] + @Binding var announcement: [Announcement] @Binding var hours: Int @Binding var maxBasal: Decimal @Binding var autotunedBasalProfile: [BasalProfileEntry] @@ -60,6 +80,8 @@ struct MainChartView: View { @State var didAppearTrigger = false @State private var glucoseDots: [CGRect] = [] @State private var manualGlucoseDots: [CGRect] = [] + @State private var announcementDots: [AnnouncementDot] = [] + @State private var announcementPath = Path() @State private var manualGlucoseDotsCenter: [CGRect] = [] @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @@ -277,6 +299,7 @@ struct MainChartView: View { glucoseView(fullSize: fullSize) manualGlucoseView(fullSize: fullSize) manualGlucoseCenterView(fullSize: fullSize) + announcementView(fullSize: fullSize) predictionsView(fullSize: fullSize) } timeLabelsView(fullSize: fullSize) @@ -367,6 +390,35 @@ struct MainChartView: View { } } + private func announcementView(fullSize: CGSize) -> some View { + ZStack { + ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in + let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) + let type: String = + info.note.contains("true") ? + Command.open : + info.note.contains("false") ? + Command.closed : + info.note.contains("suspend") ? + Command.suspend : + info.note.contains("resume") ? + Command.resume : + info.note.contains("tempbasal") ? + Command.tempbasal : Command.bolus + VStack { + Text(type).font(.caption2).foregroundStyle(Color(.tempBasal)) + Image("owl").resizable().frame(maxWidth: Config.owlSeize, maxHeight: Config.owlSeize).scaledToFill() + }.position(position).asAny() + } + } + .onChange(of: announcement) { _ in + calculateAnnouncementDots(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + calculateAnnouncementDots(fullSize: fullSize) + } + } + private func manualGlucoseCenterView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDotsCenter { @@ -530,6 +582,7 @@ extension MainChartView { calculateGlucoseDots(fullSize: fullSize) calculateManualGlucoseDots(fullSize: fullSize) calculateManualGlucoseDotsCenter(fullSize: fullSize) + calculateAnnouncementDots(fullSize: fullSize) calculateUnSmoothedGlucoseDots(fullSize: fullSize) calculateBolusDots(fullSize: fullSize) calculateCarbsDots(fullSize: fullSize) @@ -587,6 +640,30 @@ extension MainChartView { } } + private func calculateAnnouncementDots(fullSize: CGSize) { + calculationQueue.async { + let dots = announcement.map { value -> AnnouncementDot in + let center = timeToInterpolatedPoint(value.createdAt.timeIntervalSince1970, fullSize: fullSize) + let size = Config.announcementSize * Config.announcementScale + let rect = CGRect(x: center.x - size / 2, y: center.y - size / 2, width: size, height: size) + let note = value.notes + return AnnouncementDot(rect: rect, value: 10, note: note) + } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + let range = self.getGlucoseYRange(fullSize: fullSize) + + DispatchQueue.main.async { + glucoseYRange = range + announcementDots = dots + announcementPath = path + } + } + } + private func calculateUnSmoothedGlucoseDots(fullSize: CGSize) { calculationQueue.async { let dots = glucose.concurrentMap { value -> CGRect in diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 4d00283cab..8096c77f0d 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -389,6 +389,7 @@ extension Home { tempBasals: $state.tempBasals, boluses: $state.boluses, suspensions: $state.suspensions, + announcement: $state.announcement, hours: .constant(state.filteredHours), maxBasal: $state.maxBasal, autotunedBasalProfile: $state.autotunedBasalProfile, From ba6304d7b3c165af5147581ea541fea588e0d0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 26 Oct 2023 02:13:15 +0200 Subject: [PATCH 104/405] Layout fix for remotes. --- FreeAPS/Sources/Models/Announcement.swift | 2 +- FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Models/Announcement.swift b/FreeAPS/Sources/Models/Announcement.swift index a1f9d2bcd9..bc4cc172e6 100644 --- a/FreeAPS/Sources/Models/Announcement.swift +++ b/FreeAPS/Sources/Models/Announcement.swift @@ -1,6 +1,6 @@ import Foundation -struct Announcement: JSON, Equatable { +struct Announcement: JSON, Equatable, Hashable { let createdAt: Date let enteredBy: String let notes: String diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index e4675ee666..2b08059c0a 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -42,7 +42,7 @@ struct MainChartView: View { static let announcementSize: CGFloat = 8 static let announcementScale: CGFloat = 2.5 static let owlSeize: CGFloat = 25 - static let owlOffset: CGFloat = 60 + static let owlOffset: CGFloat = 80 } private enum Command { @@ -50,7 +50,7 @@ struct MainChartView: View { static let closed = "🔴" static let suspend = "❌" static let resume = "✅" - static let tempbasal = "💧..." + static let tempbasal = "basal" static let bolus = "💧" } @@ -406,7 +406,7 @@ struct MainChartView: View { info.note.contains("tempbasal") ? Command.tempbasal : Command.bolus VStack { - Text(type).font(.caption2).foregroundStyle(Color(.tempBasal)) + Text(type).font(.caption2).foregroundStyle(.orange) Image("owl").resizable().frame(maxWidth: Config.owlSeize, maxHeight: Config.owlSeize).scaledToFill() }.position(position).asAny() } From d571ce0d4e6ff9db3c9c03e94fa0073afd573365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 26 Oct 2023 02:13:54 +0200 Subject: [PATCH 105/405] Layout of glucose data table Make first row cleaner --- .../DataTable/View/DataTableRootView.swift | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9ff129d7bf..582be700b5 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -71,14 +71,18 @@ extension DataTable { private var glucoseList: some View { List { - Button { - newGlucose = true - isFocused = true - isLayered.toggle() + HStack { + Text("Time").foregroundStyle(.secondary) + Spacer() + Text(state.units.rawValue).foregroundStyle(.secondary) + Button { + newGlucose = true + isFocused = true + isLayered.toggle() + } + label: { Image(systemName: "plus.circle.fill").foregroundStyle(.secondary) } + .buttonStyle(.borderless) } - label: { Text("Add") }.frame(maxWidth: .infinity, alignment: .trailing) - .padding(.trailing, 20) - ForEach(state.glucose) { item in glucoseView(item, isManual: item.glucose) }.onDelete(perform: deleteGlucose) @@ -222,7 +226,6 @@ extension DataTable { state.units == .mmolL ? $0.asMmolL : Decimal($0) ) as NSNumber)! } ?? "--") - Text(state.units.rawValue) if isManual.type == GlucoseType.manual.rawValue { Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red) } else { From 93af12504c07ab44bf990efabc38a1b3cc355297 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Thu, 26 Oct 2023 20:16:05 +0200 Subject: [PATCH 106/405] Add changes after PR revision * Change button style and add a header row to list * Add conditional filtering for future entries * Add filter button that changes text --- .../DataTable/View/DataTableRootView.swift | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 0eeabbb77a..f0ee92e116 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -13,6 +13,7 @@ extension DataTable { @State private var removeInsulinAlert: Alert? @State private var showNonPumpInsulin: Bool = false @State private var isAmountUnconfirmed: Bool = true + @State private var showFutureEntries: Bool = true @State private var newGlucose = false @State private var isLayered = false @FocusState private var isFocused: Bool @@ -75,44 +76,59 @@ extension DataTable { } private var treatmentsList: some View { - Section( - header: VStack { + List { + HStack { + Button(action: { showFutureEntries.toggle() }, label: { + HStack { + Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") + .foregroundColor(Color.accentColor) + Text(showFutureEntries ? "Hide Future" : "Display Future") + .foregroundColor(Color.accentColor) + .font(.caption) + + }.frame(maxWidth: .infinity, alignment: .leading) + + }).buttonStyle(.borderless) + Spacer() + Button(action: { showNonPumpInsulin = true state.nonPumpInsulinDate = Date() }, label: { HStack { Text( - NSLocalizedString("Non-Pump Insulin", comment: "Non-Pump Insulin button text") + NSLocalizedString("External Insulin", comment: "External Insulin button text") ) - .foregroundColor(Color.gray) - .font(.body).textCase(.none) + .foregroundColor(Color.accentColor) + .font(.caption) Image(systemName: "plus.circle.fill") - .resizable() - .frame(width: 24, height: 24) - .foregroundColor(Color.gray) + .foregroundColor(Color.accentColor) }.frame(maxWidth: .infinity, alignment: .trailing) }).buttonStyle(.borderless) - - Spacer() } - ) { - List { - if !state.treatments.isEmpty { - ForEach(state.treatments) { item in + + if !state.treatments.isEmpty { + if showFutureEntries { + ForEach(state.treatments.filter { item in + item.date <= Date() + }) { item in treatmentView(item) } } else { - HStack { - Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) + ForEach(state.treatments) { item in + treatmentView(item) } } - } - .alert(isPresented: $isRemoveInsulinAlertPresented) { - removeInsulinAlert! + } else { + HStack { + Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) + } } } + .alert(isPresented: $isRemoveInsulinAlertPresented) { + removeInsulinAlert! + } } private var glucoseList: some View { @@ -201,7 +217,8 @@ extension DataTable { message: Text(item.amountText), primaryButton: .destructive( Text("Delete"), - action: { state.deleteCarbs(item) } + action: { + state.deleteCarbs(item) } ), secondaryButton: .cancel() ) From 6da2995527f5ee91c7a055412c353933cff2a9e2 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Thu, 26 Oct 2023 20:25:29 +0200 Subject: [PATCH 107/405] Make button size for header row consistent with PR #272 --- .../Sources/Modules/DataTable/View/DataTableRootView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index f0ee92e116..e6510a5f96 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -82,9 +82,9 @@ extension DataTable { HStack { Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") .foregroundColor(Color.accentColor) - Text(showFutureEntries ? "Hide Future" : "Display Future") + Text(showFutureEntries ? "Hide Future" : "Show Future") .foregroundColor(Color.accentColor) - .font(.caption) + .font(.body) }.frame(maxWidth: .infinity, alignment: .leading) @@ -99,7 +99,7 @@ extension DataTable { NSLocalizedString("External Insulin", comment: "External Insulin button text") ) .foregroundColor(Color.accentColor) - .font(.caption) + .font(.body) Image(systemName: "plus.circle.fill") .foregroundColor(Color.accentColor) From 967fce01c102a3a63895bdab750096b424899cba Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Fri, 27 Oct 2023 13:35:27 +0200 Subject: [PATCH 108/405] Streamline navigation views (#269) * Streamline home view navigation views: * Add title to carb entry view, as it was missing * Streamlines all buttons (centered alignment, same size) for all coming-from-home-view dialogs/views * Some changes after PR discussion * Change navigation title style from `.automatic` to `.inline` for all views accessible from home screen * Save screen space by moving (i) icon in bolus entry next to `Insulin recommended` * Change color styling for (i) icon in bolus entry * Revert info icon in bolus entry view back to speech bubble style" --- .../AddCarbs/View/AddCarbsRootView.swift | 14 +++++----- .../View/AddTempTargetRootView.swift | 14 +++++----- .../Modules/Bolus/View/BolusRootView.swift | 26 ++++++++++--------- .../DataTable/View/DataTableRootView.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 6 ++--- .../Settings/View/SettingsRootView.swift | 2 +- .../Modules/Stat/View/StatRootView.swift | 2 +- 7 files changed, 35 insertions(+), 31 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 976d1ef115..fd5cb0ffff 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -7,7 +7,7 @@ extension AddCarbs { let resolver: Resolver @StateObject var state = StateModel() @State var dish: String = "" - @State var isPromtPresented = false + @State var isPromptPresented = false @State var saved = false @State private var showAlert = false @FocusState private var isFocused: Bool @@ -75,7 +75,7 @@ extension AddCarbs { .controlSize(.mini) .buttonStyle(BorderlessButtonStyle()) Button { - isPromtPresented = true + isPromptPresented = true } label: { Text("Save as Preset") } .frame(maxWidth: .infinity, alignment: .trailing) @@ -101,7 +101,7 @@ extension AddCarbs { ) ) } - .popover(isPresented: $isPromtPresented) { + .popover(isPresented: $isPromptPresented) { presetPopover } } @@ -118,7 +118,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text("Save and continue").font(.title3) } + label: { Text("Save and continue") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } @@ -130,6 +130,8 @@ extension AddCarbs { } } .onAppear(perform: configureView) + .navigationTitle("Add Meals") + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) } @@ -148,14 +150,14 @@ extension AddCarbs { try? moc.save() state.addNewPresetToWaitersNotepad(dish) saved = false - isPromtPresented = false + isPromptPresented = false } } label: { Text("Save") } Button { dish = "" saved = false - isPromtPresented = false } + isPromptPresented = false } label: { Text("Cancel") } } header: { Text("Enter Meal Preset Name") } } diff --git a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift index 41f759a189..d7d1a09be7 100644 --- a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift +++ b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift @@ -6,7 +6,7 @@ extension AddTempTarget { struct RootView: BaseView { let resolver: Resolver @StateObject var state = StateModel() - @State private var isPromtPresented = false + @State private var isPromptPresented = false @State private var isRemoveAlertPresented = false @State private var removeAlert: Alert? @State private var isEditing = false @@ -99,7 +99,7 @@ extension AddTempTarget { Text("minutes").foregroundColor(.secondary) } DatePicker("Date", selection: $state.date) - Button { isPromtPresented = true } + Button { isPromptPresented = true } label: { Text("Save as preset") } } } @@ -112,7 +112,7 @@ extension AddTempTarget { Text("minutes").foregroundColor(.secondary) } DatePicker("Date", selection: $state.date) - Button { isPromtPresented = true } + Button { isPromptPresented = true } label: { Text("Save as preset") } .disabled(state.duration == 0) } @@ -125,16 +125,16 @@ extension AddTempTarget { label: { Text("Cancel Temp Target") } } } - .popover(isPresented: $isPromtPresented) { + .popover(isPresented: $isPromptPresented) { Form { Section(header: Text("Enter preset name")) { TextField("Name", text: $state.newPresetName) Button { state.save() - isPromtPresented = false + isPromptPresented = false } label: { Text("Save") } - Button { isPromtPresented = false } + Button { isPromptPresented = false } label: { Text("Cancel") } } } @@ -144,7 +144,7 @@ extension AddTempTarget { state.hbt = isEnabledArray.first?.hbt ?? 160 } .navigationTitle("Enact Temp Target") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) } diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 0f1f38b06f..665f4fa220 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -38,24 +38,25 @@ extension Bolus { } else { HStack { Text("Insulin recommended") + Image(systemName: "info.bubble") + .symbolRenderingMode(.palette) + .foregroundStyle(.primary, .blue) + .onTapGesture { + presentInfo.toggle() + } + Spacer() + Text( formatter .string(from: state.insulinRecommended as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary) + .onTapGesture { + if state.error, state.insulinRecommended > 0 { displayError = true } + else { state.amount = state.insulinRecommended } + } }.contentShape(Rectangle()) - .onTapGesture { - if state.error, state.insulinRecommended > 0 { displayError = true } - else { state.amount = state.insulinRecommended } - } - HStack { - Image(systemName: "info.bubble").symbolRenderingMode(.palette).foregroundStyle( - .primary, .blue - ) - }.onTapGesture { - presentInfo.toggle() - } } } header: { Text("Recommendation") } @@ -79,6 +80,7 @@ extension Bolus { Section { Button { state.add() } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) .disabled( state.amount <= 0 || state.amount > state.maxBolus ) @@ -153,7 +155,7 @@ extension Bolus { } } .navigationTitle("Enact Bolus") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { bolusInfo diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 582be700b5..8b75096e0e 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -54,7 +54,7 @@ extension DataTable { .onAppear(perform: configureView) .navigationTitle(isLayered ? "" : "History") .blur(radius: isLayered ? 4.0 : 0) - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button(isLayered ? "" : "Close", action: state.hideModal)) .popup(isPresented: newGlucose, alignment: .center, direction: .top) { addGlucose diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 8096c77f0d..a74c57add2 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -95,7 +95,7 @@ extension Home { .frame(maxWidth: .infinity) .padding(.top, 10 + geo.safeAreaInsets.top) .padding(.bottom, 10) - .background(Color.gray.opacity(0.2)) + .background(Color.gray.opacity(0.3)) } var cobIobView: some View { @@ -415,7 +415,7 @@ extension Home { let colour: Color = colorScheme == .dark ? .black : .white // Rectangle().fill(colour).frame(maxHeight: 1) ZStack { - Rectangle().fill(Color.gray.opacity(0.2)).frame(maxHeight: 40) + Rectangle().fill(Color.gray.opacity(0.3)).frame(maxHeight: 40) let cancel = fetchedPercent.first?.enabled ?? false HStack(spacing: cancel ? 25 : 15) { Text(selectedProfile().name).foregroundColor(.secondary) @@ -478,7 +478,7 @@ extension Home { @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { ZStack { - Rectangle().fill(Color.gray.opacity(0.2)).frame(height: 50 + geo.safeAreaInsets.bottom) + Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { Button { state.showModal(for: .addCarbs) } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 003e1210ce..ba68523ff2 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -126,7 +126,7 @@ extension Settings { .onAppear(perform: configureView) .navigationTitle("Settings") .navigationBarItems(leading: Button("Close", action: state.hideSettingsModal)) - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .onDisappear(perform: { state.uploadProfileAndSettings(false) }) } } diff --git a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift index 28f266ded3..021c553572 100644 --- a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift @@ -148,7 +148,7 @@ extension Stat { } .onAppear(perform: configureView) .navigationBarTitle("Statistics") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) } } From d5144f246a2ec77b3e1745899cb28acb3e63c0a5 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Fri, 27 Oct 2023 15:49:09 +0200 Subject: [PATCH 109/405] Use sheet instead of pop-up for manual glucose (#272) * Add sheet (new View) for adding manual glucose * Use glucose meter limits for manual glucose (0.8 - 40 mmol/l) --- .../DataTable/DataTableStateModel.swift | 8 +- .../DataTable/View/DataTableRootView.swift | 109 +++++++++--------- 2 files changed, 59 insertions(+), 58 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index f23b5fd910..4070047b25 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -13,7 +13,7 @@ extension DataTable { @Published var mode: Mode = .treatments @Published var treatments: [Treatment] = [] @Published var glucose: [Glucose] = [] - @Published var manualGlcuose: Decimal = 0 + @Published var manualGlucose: Decimal = 0 var units: GlucoseUnits = .mmolL @@ -149,7 +149,6 @@ extension DataTable { func deleteGlucose(at index: Int) { let id = glucose[index].id provider.deleteGlucose(id: id) - // CoreData let fetchRequest: NSFetchRequest fetchRequest = NSFetchRequest(entityName: "Readings") fetchRequest.predicate = NSPredicate(format: "id == %@", id) @@ -166,14 +165,14 @@ extension DataTable { ) } } catch { /* To do: handle any thrown errors. */ } - // Manual Glucose + // Deletes Manual Glucose if (glucose[index].glucose.type ?? "") == GlucoseType.manual.rawValue { provider.deleteManualGlucose(date: glucose[index].glucose.dateString) } } func addManualGlucose() { - let glucose = units == .mmolL ? manualGlcuose.asMgdL : manualGlcuose + let glucose = units == .mmolL ? manualGlucose.asMgdL : manualGlucose let now = Date() let id = UUID().uuidString @@ -193,7 +192,6 @@ extension DataTable { // Save to Health var saveToHealth = [BloodGlucose]() saveToHealth.append(saveToJSON) - healthKitManager.saveIfNeeded(bloodGlucose: saveToHealth) } } } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 8b75096e0e..81982bf43f 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -11,9 +11,8 @@ extension DataTable { @State private var removeCarbsAlert: Alert? @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? - @State private var newGlucose = false - @State private var isLayered = false - @FocusState private var isFocused: Bool + @State private var showManualGlucose: Bool = false + @State private var isAmountUnconfirmed: Bool = true @Environment(\.colorScheme) var colorScheme @@ -52,12 +51,11 @@ extension DataTable { } } .onAppear(perform: configureView) - .navigationTitle(isLayered ? "" : "History") - .blur(radius: isLayered ? 4.0 : 0) + .navigationTitle("History") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button(isLayered ? "" : "Close", action: state.hideModal)) - .popup(isPresented: newGlucose, alignment: .center, direction: .top) { - addGlucose + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .sheet(isPresented: $showManualGlucose) { + addGlucoseView } } @@ -75,61 +73,66 @@ extension DataTable { Text("Time").foregroundStyle(.secondary) Spacer() Text(state.units.rawValue).foregroundStyle(.secondary) - Button { - newGlucose = true - isFocused = true - isLayered.toggle() + Button( + action: { showManualGlucose = true + state.manualGlucose = 0 }, + label: { Image(systemName: "plus.circle.fill").foregroundStyle(.secondary) + } + ).buttonStyle(.borderless) + } + if !state.glucose.isEmpty { + ForEach(state.glucose) { item in + glucoseView(item, isManual: item.glucose) + } + .onDelete(perform: deleteGlucose) + } else { + HStack { + Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) } - label: { Image(systemName: "plus.circle.fill").foregroundStyle(.secondary) } - .buttonStyle(.borderless) } - ForEach(state.glucose) { item in - glucoseView(item, isManual: item.glucose) - }.onDelete(perform: deleteGlucose) } } - private var addGlucose: some View { - VStack { - Form { - Section { - HStack { - Text("Glucose").font(.custom("popup", fixedSize: 18)) - DecimalTextField(" ... ", value: $state.manualGlcuose, formatter: glucoseFormatter) - .focused($isFocused).font(.custom("glucose", fixedSize: 22)) - Text(state.units.rawValue).foregroundStyle(.secondary) + var addGlucoseView: some View { + NavigationView { + VStack { + Form { + Section { + HStack { + Text("New Glucose") + DecimalTextField( + " ... ", + value: $state.manualGlucose, + formatter: glucoseFormatter, + autofocus: true, + cleanInput: true + ) + Text(state.units.rawValue).foregroundStyle(.secondary) + } } - } - header: { - Text("Blood Glucose Test").foregroundColor(.secondary).font(.custom("popupHeader", fixedSize: 12)) - .padding(.top) - } - HStack { - Button { - newGlucose = false - isLayered = false - } - label: { Text("Cancel").foregroundColor(.red) } - .frame(maxWidth: .infinity, alignment: .leading) - Spacer() - Button { - state.addManualGlucose() - newGlucose = false - isLayered = false + + Section { + HStack { + let limitLow: Decimal = state.units == .mmolL ? 0.8 : 40 + let limitHigh: Decimal = state.units == .mgdL ? 14 : 720 + + Button { + state.addManualGlucose() + isAmountUnconfirmed = false + showManualGlucose = false + } + label: { Text("Save") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled(state.manualGlucose < limitLow || state.manualGlucose > limitHigh) + } } - label: { Text("Save") } - .frame(maxWidth: .infinity, alignment: .trailing) - .disabled(state.manualGlcuose <= 0) } - .buttonStyle(BorderlessButtonStyle()) - .font(.custom("popupButtons", fixedSize: 16)) } + .onAppear(perform: configureView) + .navigationTitle("Add Glucose") + .navigationBarTitleDisplayMode(.automatic) + .navigationBarItems(leading: Button("Close", action: { showManualGlucose = false })) } - .frame(minHeight: 220, maxHeight: 260).cornerRadius(20) - .background( - RoundedRectangle(cornerRadius: 20, style: .continuous) - .fill(Color(.tertiarySystemBackground)) - ).shadow(radius: 40) } @ViewBuilder private func treatmentView(_ item: Treatment) -> some View { From 561bfff5c3c7aa9fc297fbeefd6a100baf2c47b0 Mon Sep 17 00:00:00 2001 From: Liroy van Hoewijk <4643445+LiroyvH@users.noreply.github.com> Date: Fri, 27 Oct 2023 17:55:50 +0200 Subject: [PATCH 110/405] Prevent Nightscout collisions from occurring when a transmitter ID is recycled (#285) * Update DexcomSourceG5.swift Generate unique _id value to prevent Mongo collisions in Nightscout * Update DexcomSourceG6.swift Generate unique _id value to prevent Mongo collisions in Nightscout --- FreeAPS/Sources/APS/CGM/DexcomSourceG5.swift | 2 +- FreeAPS/Sources/APS/CGM/DexcomSourceG6.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/APS/CGM/DexcomSourceG5.swift b/FreeAPS/Sources/APS/CGM/DexcomSourceG5.swift index 847e462da7..831dfd2a5a 100644 --- a/FreeAPS/Sources/APS/CGM/DexcomSourceG5.swift +++ b/FreeAPS/Sources/APS/CGM/DexcomSourceG5.swift @@ -148,7 +148,7 @@ extension DexcomSourceG5: CGMManagerDelegate { let quantity = newGlucoseSample.quantity let value = Int(quantity.doubleValue(for: .milligramsPerDeciliter)) return BloodGlucose( - _id: newGlucoseSample.syncIdentifier, + _id: UUID().uuidString, sgv: value, direction: .init(trendType: newGlucoseSample.trend), date: Decimal(Int(newGlucoseSample.date.timeIntervalSince1970 * 1000)), diff --git a/FreeAPS/Sources/APS/CGM/DexcomSourceG6.swift b/FreeAPS/Sources/APS/CGM/DexcomSourceG6.swift index b5f00d381e..ad5a3afeec 100644 --- a/FreeAPS/Sources/APS/CGM/DexcomSourceG6.swift +++ b/FreeAPS/Sources/APS/CGM/DexcomSourceG6.swift @@ -153,7 +153,7 @@ extension DexcomSourceG6: CGMManagerDelegate { let quantity = newGlucoseSample.quantity let value = Int(quantity.doubleValue(for: .milligramsPerDeciliter)) return BloodGlucose( - _id: newGlucoseSample.syncIdentifier, + _id: UUID().uuidString, sgv: value, direction: .init(trendType: newGlucoseSample.trend), date: Decimal(Int(newGlucoseSample.date.timeIntervalSince1970 * 1000)), From fb078e8dd5eafff45b4c58fc509ca93b532ea4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 27 Oct 2023 21:06:42 +0200 Subject: [PATCH 111/405] Symbols mixed up. --- FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 2b08059c0a..fb4e82f57f 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -46,8 +46,8 @@ struct MainChartView: View { } private enum Command { - static let open = "🟢" - static let closed = "🔴" + static let open = "🔴" + static let closed = "🟢" static let suspend = "❌" static let resume = "✅" static let tempbasal = "basal" From 9ae788717a3d3d1348650d7f7ad09deca400d5af Mon Sep 17 00:00:00 2001 From: dnzxy Date: Fri, 27 Oct 2023 23:54:01 +0200 Subject: [PATCH 112/405] Style changes for treatments header row buttons by Jon --- .../Sources/Modules/DataTable/DataTableStateModel.swift | 2 +- .../Modules/DataTable/View/DataTableRootView.swift | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index fcb6181daa..679e19e239 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -18,7 +18,7 @@ extension DataTable { @Published var maxBolus: Decimal = 0 @Published var nonPumpInsulinAmount: Decimal = 0 @Published var nonPumpInsulinDate = Date() - + var units: GlucoseUnits = .mmolL override func subscribe() { diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index dfc60e94b9..8fbb6d7c12 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -80,8 +80,8 @@ extension DataTable { Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") .foregroundColor(Color.accentColor) Text(showFutureEntries ? "Hide Future" : "Show Future") - .foregroundColor(Color.accentColor) - .font(.body) + .foregroundColor(Color.secondary) + .font(.caption) }.frame(maxWidth: .infinity, alignment: .leading) @@ -95,8 +95,8 @@ extension DataTable { Text( NSLocalizedString("External Insulin", comment: "External Insulin button text") ) - .foregroundColor(Color.accentColor) - .font(.body) + .foregroundColor(Color.secondary) + .font(.caption) Image(systemName: "plus.circle.fill") .foregroundColor(Color.accentColor) From 2557abf501498c05f54a71bda955bd79123c0daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 28 Oct 2023 00:15:09 +0200 Subject: [PATCH 113/405] Typo which prevented change of imported DIA setting --- .../Modules/NightscoutConfig/NightscoutConfigStateModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index b244ff11bb..cab1f7219a 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -266,7 +266,9 @@ extension NightscoutConfig { debug(.service, "Settings have been imported and the Basals saved to pump!") // DIA. Save if changed. let dia = fetchedProfile.dia - if dia != self.dia, dia <= 0 { + print("dia: " + dia.description) + print("pump dia: " + self.dia.description) + if dia != self.dia, dia >= 0 { let file = PumpSettings( insulinActionCurve: dia, maxBolus: self.maxBolus, From 62750dc67b9a251aa379769c50fa4e71f0b46ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 28 Oct 2023 00:18:43 +0200 Subject: [PATCH 114/405] Remove openaps setting insulin curve, becuse this now is a duplicate setting found also in pumpManagerUI settings --- .../PreferencesEditor/PreferencesEditorStateModel.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index bdd1c86326..5f9e3b6962 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -22,12 +22,6 @@ extension PreferencesEditor { } let mainFields = [ - Field( - displayName: NSLocalizedString("Insulin curve", comment: "Insulin curve"), - type: .insulinCurve(keypath: \.curve), - infoText: "Insulin curve info", - settable: self - ), Field( displayName: NSLocalizedString("Max IOB", comment: "Max IOB"), type: .decimal(keypath: \.maxIOB), From 1981bd7fde8de37fe371300c2afaf1ef6f3cb773 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sat, 28 Oct 2023 02:22:36 +0200 Subject: [PATCH 115/405] Added other SF Symbols, changed text to "Add". --- .../Modules/DataTable/View/DataTableRootView.swift | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 8fbb6d7c12..1b08208506 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -77,7 +77,7 @@ extension DataTable { HStack { Button(action: { showFutureEntries.toggle() }, label: { HStack { - Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") + Image(systemName: "book.pages") .foregroundColor(Color.accentColor) Text(showFutureEntries ? "Hide Future" : "Show Future") .foregroundColor(Color.secondary) @@ -92,13 +92,11 @@ extension DataTable { Button(action: { showNonPumpInsulin = true state.nonPumpInsulinDate = Date() }, label: { HStack { - Text( - NSLocalizedString("External Insulin", comment: "External Insulin button text") - ) - .foregroundColor(Color.secondary) - .font(.caption) + Text("Add") + .foregroundColor(Color.secondary) + .font(.caption) - Image(systemName: "plus.circle.fill") + Image(systemName: "syringe") .foregroundColor(Color.accentColor) }.frame(maxWidth: .infinity, alignment: .trailing) From 6dc9d2e0c27682b8bd1243e154c5fe04fe389f25 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sat, 28 Oct 2023 11:26:24 +0200 Subject: [PATCH 116/405] Fix future entries condition * Invert default to false (Jon initially said this to be default) * Add comment to describe default * Fix condition for treatment list data population --- .../Sources/Modules/DataTable/View/DataTableRootView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 1b08208506..9be5ca37b8 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -12,7 +12,7 @@ extension DataTable { @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? @State private var showNonPumpInsulin: Bool = false - @State private var showFutureEntries: Bool = true + @State private var showFutureEntries: Bool = false // default to hide future entries @State private var showManualGlucose: Bool = false @State private var isAmountUnconfirmed: Bool = true @@ -104,7 +104,7 @@ extension DataTable { } if !state.treatments.isEmpty { - if showFutureEntries { + if !showFutureEntries { ForEach(state.treatments.filter { item in item.date <= Date() }) { item in From 3c2435fd0b87cad340a542dff26b17b07ebaf052 Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sat, 28 Oct 2023 13:47:05 +0200 Subject: [PATCH 117/405] Revert back to initial calendar SF Symbols --- FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9be5ca37b8..1df8307152 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -77,7 +77,7 @@ extension DataTable { HStack { Button(action: { showFutureEntries.toggle() }, label: { HStack { - Image(systemName: "book.pages") + Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") .foregroundColor(Color.accentColor) Text(showFutureEntries ? "Hide Future" : "Show Future") .foregroundColor(Color.secondary) From 3f2eddcb55bdb7de568369494ed4bbb1e2fa80f8 Mon Sep 17 00:00:00 2001 From: Pierre L Date: Sat, 28 Oct 2023 14:55:10 +0200 Subject: [PATCH 118/405] Refactor Healthkit manager for Insulin Refactor the code to sync with HK to be less battery drain. Limit to 100 last data. --- .../Services/HealthKit/HealthKitManager.swift | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 0b043b018a..9985598521 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -227,23 +227,22 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P events.isNotEmpty else { return } - func delete(syncIds: [String]?) { - syncIds?.forEach { syncID in + func save(bolusToModify: [InsulinBolus], bolus: [InsulinBolus], basal: [InsulinBasal]) { + // first step : delete the HK value + // second step : recreate with the new value ! + bolusToModify.forEach { syncID in let predicate = HKQuery.predicateForObjects( withMetadataKey: HKMetadataKeySyncIdentifier, operatorType: .equalTo, value: syncID ) - self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in guard let error = error else { return } warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) } } - } - - func save(bolus: [InsulinBolus], basal: [InsulinBasal]) { - let bolusSamples = bolus + let bolusTotal = bolus + bolusToModify + let bolusSamples = bolusTotal .map { HKQuantitySample( type: sampleType, @@ -280,30 +279,21 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P healthKitStore.save(bolusSamples + basalSamples) { _, _ in } } - // delete existing event in HK where the amount is not the last value in the pumphistory loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) .receive(on: processQueue) - .compactMap { samples -> [String] in + .compactMap { samples -> ([InsulinBolus], [InsulinBolus], [InsulinBasal]) in let sampleIDs = samples.compactMap(\.syncIdentifier) - let bolusToDelete = events + let bolusToModify = events .filter { $0.type == .bolus && sampleIDs.contains($0.id) } - .compactMap { event -> String? in + .compactMap { event -> InsulinBolus? in guard let amount = event.amount else { return nil } guard let sampleAmount = samples.first(where: { $0.syncIdentifier == event.id }) as? HKQuantitySample else { return nil } if Double(amount) != sampleAmount.quantity.doubleValue(for: .internationalUnit()) { - return sampleAmount.syncIdentifier + return InsulinBolus(id: sampleAmount.syncIdentifier!, amount: amount, date: event.timestamp) } else { return nil } } - return bolusToDelete - } - .sink(receiveValue: delete) - .store(in: &lifetime) - loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) - .receive(on: processQueue) - .compactMap { samples -> ([InsulinBolus], [InsulinBasal]) in - let sampleIDs = samples.compactMap(\.syncIdentifier) let bolus = events .filter { $0.type == .bolus && !sampleIDs.contains($0.id) } .compactMap { event -> InsulinBolus? in @@ -348,7 +338,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P endDelivery: nextBasalEvent.timestamp ) } - return (bolus, basal) + return (bolusToModify, bolus, basal) } .sink(receiveValue: save) .store(in: &lifetime) @@ -407,13 +397,14 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P /// Try to load samples from Health store private func loadSamplesFromHealth( - sampleType: HKQuantityType + sampleType: HKQuantityType, + limit: Int = 100 ) -> Future<[HKSample], Never> { Future { promise in let query = HKSampleQuery( sampleType: sampleType, predicate: nil, - limit: 1000, + limit: limit, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? [])) @@ -425,7 +416,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P /// Try to load samples from Health store with id and do some work private func loadSamplesFromHealth( sampleType: HKQuantityType, - withIDs ids: [String] + withIDs ids: [String], + limit: Int = 100 ) -> Future<[HKSample], Never> { Future { promise in let predicate = HKQuery.predicateForObjects( @@ -436,7 +428,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, - limit: 1000, + limit: limit, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? [])) From 7c7693c05332667efdb4a703aa4fe2cc1f979dca Mon Sep 17 00:00:00 2001 From: Pierre L Date: Sat, 28 Oct 2023 19:25:09 +0200 Subject: [PATCH 119/405] fix Blood glucose ID with Nightscout Fix #280 with checking the compliance of ID as uuid. Not perfect (lost data in NS) but avoid the 500 error. Fix for G7 sensor. --- FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift | 2 +- FreeAPS/Sources/Services/Network/NightscoutManager.swift | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift b/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift index 1b585ef217..ddb54b3cd7 100644 --- a/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift +++ b/FreeAPS/Sources/APS/CGM/dexcomSourceG7.swift @@ -148,7 +148,7 @@ extension DexcomSourceG7: CGMManagerDelegate { let quantity = newGlucoseSample.quantity let value = Int(quantity.doubleValue(for: .milligramsPerDeciliter)) return BloodGlucose( - _id: newGlucoseSample.syncIdentifier, + _id: UUID().uuidString, sgv: value, direction: .init(trendType: newGlucoseSample.trend), date: Decimal(Int(newGlucoseSample.date.timeIntervalSince1970 * 1000)), diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 4653b24020..712e347817 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -610,9 +610,12 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { guard !glucose.isEmpty, let nightscout = nightscoutAPI, isUploadEnabled, isUploadGlucoseEnabled else { return } + // check if unique code + // var uuid = UUID(uuidString: yourString) This will return nil if yourString is not a valid UUID + let glucoseWithoutCorrectID = glucose.filter { UUID(uuidString: $0._id) != nil } processQueue.async { - glucose.chunks(ofCount: 100) + glucoseWithoutCorrectID.chunks(ofCount: 100) .map { chunk -> AnyPublisher in nightscout.uploadGlucose(Array(chunk)) } From ecd0938e7b8acc9a33281242da8572f5ef9293bc Mon Sep 17 00:00:00 2001 From: dnzxy Date: Sun, 29 Oct 2023 00:33:25 +0200 Subject: [PATCH 120/405] Fixes for deletion and localization * Removed unnecessary NSLocalizedString wrappers * Remove obsolete `.alert()` that was blocking FPU and carb deletion alert --- .../DataTable/View/DataTableRootView.swift | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 1df8307152..7d6e2db44f 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -117,13 +117,10 @@ extension DataTable { } } else { HStack { - Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) + Text("No data.") } } } - .alert(isPresented: $isRemoveInsulinAlertPresented) { - removeInsulinAlert! - } } private var glucoseList: some View { @@ -146,7 +143,7 @@ extension DataTable { .onDelete(perform: deleteGlucose) } else { HStack { - Text(NSLocalizedString("No data.", comment: "No data text when no entries in history list")) + Text("No data.") } } } @@ -285,7 +282,7 @@ extension DataTable { Form { Section { HStack { - Text(NSLocalizedString("Amount", comment: "")) + Text("Amount") Spacer() DecimalTextField( "0", @@ -313,10 +310,7 @@ extension DataTable { showNonPumpInsulin = false } label: { - Text(NSLocalizedString( - "Log non-pump insulin", - comment: "Log non-pump insulin button text" - )) + Text("Log non-pump insulin") } .foregroundColor(amountWarningCondition ? Color.white : Color.accentColor) .frame(maxWidth: .infinity, alignment: .center) @@ -329,10 +323,7 @@ extension DataTable { header: { if amountWarningCondition { - Text(NSLocalizedString( - "⚠️ Warning! The entered insulin amount is greater than your Max Bolus setting!", - comment: "Non-pump insulin maxBolus * 3 alert text" - )) + Text("⚠️ Warning! The entered insulin amount is greater than your Max Bolus setting!") } } .listRowBackground( From 23f4e9b03110392e37d2a91b1374825a25f66b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 02:29:45 +0100 Subject: [PATCH 121/405] Always display warning when over maxBolus --- .../Sources/Modules/DataTable/View/DataTableRootView.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 7d6e2db44f..94c55a4f34 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -299,8 +299,7 @@ extension DataTable { DatePicker("Date", selection: $state.nonPumpInsulinDate, in: ...Date()) } - let amountWarningCondition = (state.nonPumpInsulinAmount > state.maxBolus) && - (state.nonPumpInsulinAmount <= state.maxBolus * 3) + let amountWarningCondition = (state.nonPumpInsulinAmount > state.maxBolus) Section { HStack { @@ -315,8 +314,7 @@ extension DataTable { .foregroundColor(amountWarningCondition ? Color.white : Color.accentColor) .frame(maxWidth: .infinity, alignment: .center) .disabled( - state.nonPumpInsulinAmount <= 0 || state.nonPumpInsulinAmount > state - .maxBolus * 3 + state.nonPumpInsulinAmount <= 0 || state.nonPumpInsulinAmount > state.maxBolus * 3 ) } } From 80e34056b2567ca14dea82f0db79814a74fe9ece Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Sun, 29 Oct 2023 02:41:36 +0100 Subject: [PATCH 122/405] update version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index b95ff05ad5..31f91b706a 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.5 +APP_VERSION = 2.2.6 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 56306a4ee2de2fe994dfb9fdd78889006f270eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 04:26:34 +0100 Subject: [PATCH 123/405] UI. Clean up and chnge order of items --- .../DataTable/View/DataTableRootView.swift | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 94c55a4f34..c9be7c06c5 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -75,33 +75,35 @@ extension DataTable { private var treatmentsList: some View { List { HStack { - Button(action: { showFutureEntries.toggle() }, label: { + Button(action: { showNonPumpInsulin = true + state.nonPumpInsulinDate = Date() }, label: { HStack { - Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") - .foregroundColor(Color.accentColor) - Text(showFutureEntries ? "Hide Future" : "Show Future") + Image(systemName: "syringe") + Text("Add") .foregroundColor(Color.secondary) .font(.caption) - }.frame(maxWidth: .infinity, alignment: .leading) - }).buttonStyle(.borderless) Spacer() - Button(action: { showNonPumpInsulin = true - state.nonPumpInsulinDate = Date() }, label: { + Button(action: { showFutureEntries.toggle() }, label: { HStack { - Text("Add") + Text(showFutureEntries ? "Hide Future" : "Show Future") .foregroundColor(Color.secondary) .font(.caption) - - Image(systemName: "syringe") - .foregroundColor(Color.accentColor) + Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") }.frame(maxWidth: .infinity, alignment: .trailing) - }).buttonStyle(.borderless) - } + }.listRowBackground( + Rectangle() + .cornerRadius(20) + .background(Color.clear) + .foregroundColor( + colorScheme == .dark ? Color(.systemBackground) : + Color(.secondarySystemBackground) + ) + ).listRowSeparator(.hidden, edges: .bottom) if !state.treatments.isEmpty { if !showFutureEntries { @@ -126,16 +128,24 @@ extension DataTable { private var glucoseList: some View { List { HStack { - Text("Time").foregroundStyle(.secondary) - Spacer() - Text(state.units.rawValue).foregroundStyle(.secondary) Button( action: { showManualGlucose = true state.manualGlucose = 0 }, label: { Image(systemName: "plus.circle.fill").foregroundStyle(.secondary) } ).buttonStyle(.borderless) - } + Text(state.units.rawValue).foregroundStyle(.secondary) + Spacer() + Text("Time").foregroundStyle(.secondary) + }.listRowBackground( + Rectangle() + .background(Color.clear) + .foregroundColor( + colorScheme == .dark ? Color(.systemBackground) : + Color(.secondarySystemBackground) + ) + ).listRowSeparator(.hidden, edges: .bottom) + if !state.glucose.isEmpty { ForEach(state.glucose) { item in glucoseView(item, isManual: item.glucose) @@ -171,7 +181,6 @@ extension DataTable { HStack { let limitLow: Decimal = state.units == .mmolL ? 0.8 : 40 let limitHigh: Decimal = state.units == .mgdL ? 14 : 720 - Button { state.addManualGlucose() isAmountUnconfirmed = false @@ -194,8 +203,6 @@ extension DataTable { @ViewBuilder private func treatmentView(_ item: Treatment) -> some View { HStack { Image(systemName: "circle.fill").foregroundColor(item.color) - Text(dateFormatter.string(from: item.date)) - .moveDisabled(true) Text((item.isSMB ?? false) ? "SMB" : item.type.name) Text(item.amountText).foregroundColor(.secondary) @@ -273,6 +280,9 @@ extension DataTable { removeInsulinAlert! } } + Spacer() + Text(dateFormatter.string(from: item.date)) + .moveDisabled(true) } } @@ -341,8 +351,6 @@ extension DataTable { @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View { VStack(alignment: .leading, spacing: 4) { HStack { - Text(dateFormatter.string(from: item.glucose.dateString)) - Spacer() Text(item.glucose.glucose.map { glucoseFormatter.string(from: Double( state.units == .mmolL ? $0.asMmolL : Decimal($0) @@ -353,6 +361,9 @@ extension DataTable { } else { Text(item.glucose.direction?.symbol ?? "--") } + Spacer() + + Text(dateFormatter.string(from: item.glucose.dateString)) } } } From 3b2d7664c7a7c44f4048ef3456e69faa92049f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 04:52:32 +0100 Subject: [PATCH 124/405] revert background --- .../DataTable/View/DataTableRootView.swift | 21 ++----------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index c9be7c06c5..f0b9feb347 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -95,16 +95,7 @@ extension DataTable { Image(systemName: showFutureEntries ? "calendar.badge.minus" : "calendar.badge.plus") }.frame(maxWidth: .infinity, alignment: .trailing) }).buttonStyle(.borderless) - }.listRowBackground( - Rectangle() - .cornerRadius(20) - .background(Color.clear) - .foregroundColor( - colorScheme == .dark ? Color(.systemBackground) : - Color(.secondarySystemBackground) - ) - ).listRowSeparator(.hidden, edges: .bottom) - + } if !state.treatments.isEmpty { if !showFutureEntries { ForEach(state.treatments.filter { item in @@ -137,15 +128,7 @@ extension DataTable { Text(state.units.rawValue).foregroundStyle(.secondary) Spacer() Text("Time").foregroundStyle(.secondary) - }.listRowBackground( - Rectangle() - .background(Color.clear) - .foregroundColor( - colorScheme == .dark ? Color(.systemBackground) : - Color(.secondarySystemBackground) - ) - ).listRowSeparator(.hidden, edges: .bottom) - + } if !state.glucose.isEmpty { ForEach(state.glucose) { item in glucoseView(item, isManual: item.glucose) From 5aeae8736b2dea49ec660d0c8d2449ad3057dad4 Mon Sep 17 00:00:00 2001 From: polscm32 <107251660+polscm32@users.noreply.github.com> Date: Sun, 29 Oct 2023 11:43:34 +0100 Subject: [PATCH 125/405] Implement alternative Bolus calculator (#286) *New alternative bolus calc and toggle function in bolus calculator settings to switch between bolus calculators * add options for fatty meals in bolus calc config settings and apply a custom override factor * fix problem with DecimalTextFields which throw error UIViewAlertForUnsatisfiableConstraints --- FreeAPS.xcodeproj/project.pbxproj | 52 +++ .../xcshareddata/swiftpm/Package.resolved | 2 +- .../defaults/freeaps/freeaps_settings.json | 6 +- FreeAPS/Sources/Models/FreeAPSSettings.swift | 20 + .../Sources/Modules/Bolus/BolusProvider.swift | 6 + .../Modules/Bolus/BolusStateModel.swift | 166 +++++++- .../Components/CheckboxToggleStyle.swift | 23 + .../View/AlternativeBolusCalcRootView.swift | 397 ++++++++++++++++++ .../Modules/Bolus/View/BolusRootView.swift | 268 +----------- .../Bolus/View/DefaultBolusCalcRootView.swift | 275 ++++++++++++ .../BolusCalculatorConfigDataFlow.swift | 5 + .../BolusCalculatorConfigProvider.swift | 3 + .../BolusCalculatorStateModel.swift | 27 ++ .../View/BolusCalculatorConfigRootView.swift | 52 +++ .../Settings/View/SettingsRootView.swift | 1 + FreeAPS/Sources/Router/Screen.swift | 3 + FreeAPS/Sources/Views/DecimalTextField.swift | 25 -- 17 files changed, 1032 insertions(+), 299 deletions(-) create mode 100644 FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift create mode 100644 FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift create mode 100644 FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index acbdee74b8..0ed29a6621 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -301,6 +301,13 @@ BA00D96F7B2FF169A06FB530 /* CGMStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C018D1680307A31C9ED7120 /* CGMStateModel.swift */; }; BA90041DC8991147E5C8C3AA /* CalibrationsRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500371C09F54F89A97D65FDB /* CalibrationsRootView.swift */; }; BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */; }; + BD2FF1A02AE29D43005D1C5D /* CheckboxToggleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */; }; + BD7DA9A52AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */; }; + BD7DA9A72AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */; }; + BD7DA9A92AE06E9200601B20 /* BolusCalculatorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */; }; + BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */; }; + BDFD165A2AE40438007F0DDA /* AlternativeBolusCalcRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */; }; + BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */; }; BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */; }; C967DACD3B1E638F8B43BE06 /* ManualTempBasalStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFCFE0781F9074C2917890E8 /* ManualTempBasalStateModel.swift */; }; CA370FC152BC98B3D1832968 /* BasalProfileEditorRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */; }; @@ -819,6 +826,13 @@ B9CAAEFB2AE70836000F68BC /* branch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = branch.txt; sourceTree = SOURCE_ROOT; }; BA49538D56989D8DA6FCF538 /* TargetsEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TargetsEditorDataFlow.swift; sourceTree = ""; }; BC210C0F3CB6D3C86E5DED4E /* LibreConfigRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LibreConfigRootView.swift; sourceTree = ""; }; + BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxToggleStyle.swift; sourceTree = ""; }; + BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigDataFlow.swift; sourceTree = ""; }; + BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigProvider.swift; sourceTree = ""; }; + BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorStateModel.swift; sourceTree = ""; }; + BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigRootView.swift; sourceTree = ""; }; + BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlternativeBolusCalcRootView.swift; sourceTree = ""; }; + BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultBolusCalcRootView.swift; sourceTree = ""; }; BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorRootView.swift; sourceTree = ""; }; C19984D62EFC0035A9E9644D /* BolusProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusProvider.swift; sourceTree = ""; }; C377490C77661D75E8C50649 /* ManualTempBasalRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalRootView.swift; sourceTree = ""; }; @@ -1154,6 +1168,7 @@ 3811DE0325C9D31700A708ED /* Modules */ = { isa = PBXGroup; children = ( + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19F95FF129F10F9C00314DDC /* Stat */, @@ -2039,6 +2054,35 @@ isa = PBXGroup; children = ( 10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */, + BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */, + BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */, + ); + path = View; + sourceTree = ""; + }; + BD2FF19E2AE29D24005D1C5D /* Components */ = { + isa = PBXGroup; + children = ( + BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */, + ); + path = Components; + sourceTree = ""; + }; + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */ = { + isa = PBXGroup; + children = ( + BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */, + BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */, + BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */, + BD7DA9AA2AE06E9600601B20 /* View */, + ); + path = BolusCalculatorConfig; + sourceTree = ""; + }; + BD7DA9AA2AE06E9600601B20 /* View */ = { + isa = PBXGroup; + children = ( + BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */, ); path = View; sourceTree = ""; @@ -2057,6 +2101,7 @@ C2C98283C436DB934D7E7994 /* Bolus */ = { isa = PBXGroup; children = ( + BD2FF19E2AE29D24005D1C5D /* Components */, C8D1A7CA8C10C4403D4BBFA7 /* BolusDataFlow.swift */, C19984D62EFC0035A9E9644D /* BolusProvider.swift */, 223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */, @@ -2632,6 +2677,7 @@ 3811DE6125C9D4D500A708ED /* ViewModifiers.swift in Sources */, 3811DEAC25C9D88300A708ED /* NightscoutManager.swift in Sources */, 19A910302A24BF6300C8951B /* StatsView.swift in Sources */, + BD7DA9A92AE06E9200601B20 /* BolusCalculatorStateModel.swift in Sources */, CEB434E528B8FF5D00B70274 /* UIColor.swift in Sources */, 190EBCCB29FF13CB00BA767D /* StatConfigRootView.swift in Sources */, 3811DEA925C9D88300A708ED /* AppearanceManager.swift in Sources */, @@ -2663,6 +2709,7 @@ 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */, 38B4F3CB25E502E200E76A18 /* WeakObjectSet.swift in Sources */, 38E989DD25F5021400C0CED0 /* PumpStatus.swift in Sources */, + BDFD165A2AE40438007F0DDA /* AlternativeBolusCalcRootView.swift in Sources */, 38E98A2525F52C9300C0CED0 /* IssueReporter.swift in Sources */, 190EBCC429FF136900BA767D /* StatConfigDataFlow.swift in Sources */, 3811DEB025C9D88300A708ED /* BaseKeychain.swift in Sources */, @@ -2688,6 +2735,7 @@ 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, 642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */, + BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */, AD3D2CD42CD01B9EB8F26522 /* PumpConfigDataFlow.swift in Sources */, 53F2382465BF74DB1A967C8B /* PumpConfigProvider.swift in Sources */, 5D16287A969E64D18CE40E44 /* PumpConfigStateModel.swift in Sources */, @@ -2729,6 +2777,7 @@ DBA5254DBB2586C98F61220C /* ISFEditorProvider.swift in Sources */, 1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */, F816826028DB441800054060 /* BluetoothTransmitter.swift in Sources */, + BD7DA9A72AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift in Sources */, 38192E0D261BAF980094D973 /* ConvenienceExtensions.swift in Sources */, FEFA5C0F299F810B00765C17 /* Core_Data.xcdatamodeld in Sources */, 88AB39B23C9552BD6E0C9461 /* ISFEditorRootView.swift in Sources */, @@ -2768,6 +2817,7 @@ CE82E02728E869DF00473A9C /* AlertEntry.swift in Sources */, 38E4451E274DB04600EC9A94 /* AppDelegate.swift in Sources */, 5BFA1C2208114643B77F8CEB /* AddTempTargetProvider.swift in Sources */, + BD2FF1A02AE29D43005D1C5D /* CheckboxToggleStyle.swift in Sources */, E0D4F80527513ECF00BDF1FE /* HealthKitSample.swift in Sources */, 919DBD08F13BAFB180DF6F47 /* AddTempTargetStateModel.swift in Sources */, 8BC2F5A29AD1ED08AC0EE013 /* AddTempTargetRootView.swift in Sources */, @@ -2780,6 +2830,7 @@ 69A31254F2451C20361D172F /* BolusStateModel.swift in Sources */, 0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */, 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */, + BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */, 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */, FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */, F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */, @@ -2807,6 +2858,7 @@ F5CA3DB1F9DC8B05792BBFAA /* CGMDataFlow.swift in Sources */, BA00D96F7B2FF169A06FB530 /* CGMStateModel.swift in Sources */, 61962FCAF8A2D222553AC5A3 /* LibreConfigDataFlow.swift in Sources */, + BD7DA9A52AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift in Sources */, 6EADD581738D64431902AC0A /* LibreConfigProvider.swift in Sources */, CE94598729E9E4110047C9C6 /* WatchConfigRootView.swift in Sources */, 903D18976088B09110BCBE29 /* LibreConfigStateModel.swift in Sources */, diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2cfe78ebfa..142d983415 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 05331cf0f6..83f064eb03 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -42,5 +42,9 @@ "oneDimensionalGraph" : false, "rulerMarks" : false, "maxCarbs": 1000, - "displayFatAndProteinOnWatch": false + "displayFatAndProteinOnWatch": false, + "overrideFactor": 0.8, + "useCalc": false, + "fattyMeals": false, + "fattyMealFactor": 0.7 } diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 031d9a48b2..476c64408a 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -45,6 +45,10 @@ struct FreeAPSSettings: JSON, Equatable { var maxCarbs: Decimal = 1000 var displayFatAndProteinOnWatch: Bool = false var onlyAutotuneBasals: Bool = false + var overrideFactor: Decimal = 0.8 + var useCalc: Bool = false + var fattyMeals: Bool = false + var fattyMealFactor: Decimal = 0.7 } extension FreeAPSSettings: Decodable { @@ -139,6 +143,22 @@ extension FreeAPSSettings: Decodable { settings.individualAdjustmentFactor = individualAdjustmentFactor } + if let useCalc = try? container.decode(Bool.self, forKey: .useCalc) { + settings.useCalc = useCalc + } + + if let fattyMeals = try? container.decode(Bool.self, forKey: .fattyMeals) { + settings.fattyMeals = fattyMeals + } + + if let fattyMealFactor = try? container.decode(Decimal.self, forKey: .fattyMealFactor) { + settings.fattyMealFactor = fattyMealFactor + } + + if let overrideFactor = try? container.decode(Decimal.self, forKey: .overrideFactor) { + settings.overrideFactor = overrideFactor + } + if let timeCap = try? container.decode(Int.self, forKey: .timeCap) { settings.timeCap = timeCap } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift index b0c6d0f3b0..f72a3fca89 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift @@ -4,6 +4,12 @@ extension Bolus { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } + func getProfile() -> CarbRatios { + storage.retrieve(OpenAPS.Settings.carbRatios, as: CarbRatios.self) + ?? CarbRatios(from: OpenAPS.defaults(for: OpenAPS.Settings.carbRatios)) + ?? CarbRatios(units: .grams, schedule: []) + } + func pumpSettings() -> PumpSettings { storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self) ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings)) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 72a53a01a6..8381925ba4 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,3 +1,5 @@ + +import LoopKit import SwiftUI import Swinject @@ -7,28 +9,59 @@ extension Bolus { @Injected() var apsManager: APSManager! @Injected() var broadcaster: Broadcaster! @Injected() var pumpHistoryStorage: PumpHistoryStorage! + // added for bolus calculator + @Injected() var glucoseStorage: GlucoseStorage! + @Injected() var settings: SettingsManager! + @Injected() var storage: FileStorage! + @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 @Published var insulinRequired: Decimal = 0 - @Published var waitForSuggestion: Bool = false - @Published var error: Bool = false + @Published var units: GlucoseUnits = .mmolL + @Published var percentage: Decimal = 0 + @Published var threshold: Decimal = 0 + @Published var maxBolus: Decimal = 0 @Published var errorString: Decimal = 0 @Published var evBG: Int = 0 @Published var insulin: Decimal = 0 - @Published var target: Decimal = 0 @Published var isf: Decimal = 0 - @Published var percentage: Decimal = 0 - @Published var threshold: Decimal = 0 + @Published var error: Bool = false @Published var minGuardBG: Decimal = 0 @Published var minDelta: Decimal = 0 @Published var expectedDelta: Decimal = 0 @Published var minPredBG: Decimal = 0 - @Published var units: GlucoseUnits = .mmolL - @Published var maxBolus: Decimal = 0 + @Published var waitForSuggestion: Bool = false var waitForSuggestionInitial: Bool = false + // added for bolus calculator + @Published var glucose: [BloodGlucose] = [] + @Published var recentGlucose: BloodGlucose? + @Published var target: Decimal = 0 + @Published var cob: Decimal = 0 + @Published var iob: Decimal = 0 + + @Published var currentBG: Decimal = 0 + @Published var fifteenMinInsulin: Decimal = 0 + @Published var deltaBG: Decimal = 0 + @Published var targetDifferenceInsulin: Decimal = 0 + @Published var wholeCobInsulin: Decimal = 0 + @Published var iobInsulinReduction: Decimal = 0 + @Published var wholeCalc: Decimal = 0 + @Published var roundedWholeCalc: Decimal = 0 + @Published var insulinCalculated: Decimal = 0 + @Published var roundedInsulinCalculated: Decimal = 0 + @Published var fraction: Decimal = 0 + @Published var useCalc: Bool = false + @Published var basal: Decimal = 0 + @Published var fattyMeals: Bool = false + @Published var fattyMealFactor: Decimal = 0 + @Published var useFattyMealCorrectionFactor: Bool = false + + @Published var carbRatio: Decimal = 0 + @Published var currentTime: String = "" + override func subscribe() { setupInsulinRequired() broadcaster.register(SuggestionObserver.self, observer: self) @@ -37,6 +70,46 @@ extension Bolus { threshold = provider.suggestion?.threshold ?? 0 maxBolus = provider.pumpSettings().maxBolus + // added + fraction = settings.settings.overrideFactor + useCalc = settings.settings.useCalc + fattyMeals = settings.settings.fattyMeals + fattyMealFactor = settings.settings.fattyMealFactor + + // get carb ratio entry schedule + let schedule = provider.getProfile().schedule + // get current time in same format as carb ratio entry start date + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH:mm:ss" + let currentTime = dateFormatter.string(from: Date()) + // loop through schedule to get current carb ratio + for (index, entry) in schedule.enumerated() { + if let entryStartTimeDate = dateFormatter.date(from: entry.start) { + var entryEndTimeDate: Date + + if index < schedule.count - 1 { + let nextEntry = schedule[index + 1] + if let nextEntryStartTimeDate = dateFormatter.date(from: nextEntry.start) { + let timeDifference = nextEntryStartTimeDate.timeIntervalSince(entryStartTimeDate) + entryEndTimeDate = entryStartTimeDate.addingTimeInterval(timeDifference) + } else { + continue + } + } else { + entryEndTimeDate = Date() + } + // if currentTime is between start and end of carb ratio entry -> carbRatio = currentRatio + if let currentTimeDate = dateFormatter.date(from: currentTime) { + if currentTimeDate >= entryStartTimeDate, currentTimeDate <= entryEndTimeDate { + if let currentRatio = entry.ratio as? Decimal { + carbRatio = currentRatio + break + } + } + } + } + } + if waitForSuggestionInitial { apsManager.determineBasal() .receive(on: DispatchQueue.main) @@ -51,13 +124,80 @@ extension Bolus { } } + func getDeltaBG() { + let glucose = glucoseStorage.recent() + guard glucose.count >= 3 else { return } + + let lastGlucose = glucose.last! + + let thirdLastGlucose = glucose[glucose.count - 3] + let delta = Decimal(lastGlucose.glucose!) - Decimal(thirdLastGlucose.glucose!) + + deltaBG = delta + } + + // CALCULATIONS FOR THE BOLUS CALCULATOR + func calculateInsulin() -> Decimal { + // for mmol conversion + var conversion: Decimal = 1.0 + if units == .mmolL { + conversion = 0.0555 + } + // insulin needed for the current blood glucose + let targetDifference = (currentBG - target) * conversion + targetDifferenceInsulin = targetDifference / isf + + // more or less insulin because of bg trend in the last 15 minutes + fifteenMinInsulin = (deltaBG * conversion) / isf + + // determine whole COB for which we want to dose insulin for and then determine insulin for wholeCOB + wholeCobInsulin = cob / carbRatio + + // determine how much the calculator reduces/ increases the bolus because of IOB + iobInsulinReduction = (-1) * iob + + // adding everything together + // add a calc for the case that no fifteenMinInsulin is available + if deltaBG != 0 { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin + fifteenMinInsulin) + } else { + // add (rare) case that no glucose value is available -> maybe display warning? + // if no bg is available, ?? sets its value to 0 + if currentBG == 0 { + wholeCalc = (iobInsulinReduction + wholeCobInsulin) + } else { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin) + } + } + // rounding + let wholeCalcAsDouble = Double(wholeCalc) + roundedWholeCalc = Decimal(round(100 * wholeCalcAsDouble) / 100) + + // apply custom factor at the end of the calculations + let result = wholeCalc * fraction + + // apply custom factor if fatty meal toggle in bolus calc config settings is on and the box for fatty meals is checked (in RootView) + if useFattyMealCorrectionFactor { + insulinCalculated = result * fattyMealFactor + } else { + insulinCalculated = result + } + + // display no negative insulinCalculated + insulinCalculated = max(insulinCalculated, 0) + let insulinCalculatedAsDouble = Double(insulinCalculated) + roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) + + return insulinCalculated + } + func add() { guard amount > 0 else { showModal(for: nil) return } - let maxAmount = Double(min(amount, maxBolus)) + let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus)) unlockmanager.unlock() .sink { _ in } receiveValue: { [weak self] _ in @@ -73,7 +213,7 @@ extension Bolus { showModal(for: nil) return } - amount = min(amount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin + amount = min(amount, maxBolus * 3) pumpHistoryStorage.storeEvents( [ @@ -98,8 +238,6 @@ extension Bolus { DispatchQueue.main.async { self.insulinRequired = self.provider.suggestion?.insulinReq ?? 0 - // Manual Bolus recommendation (normally) yields a higher amount than the insulin reqiured amount computed for SMBs (auto boluses). A manual bolus threfore now (test) uses the Eventual BG for glucose prediction, whereas the insulinReg for SMBs uses the minPredBG for glucose prediction (typically lower than Eventual BG). - var conversion: Decimal = 1.0 if self.units == .mmolL { conversion = 0.0555 @@ -109,6 +247,10 @@ extension Bolus { self.insulin = self.provider.suggestion?.insulinForManualBolus ?? 0 self.target = self.provider.suggestion?.current_target ?? 0 self.isf = self.provider.suggestion?.isf ?? 0 + self.iob = self.provider.suggestion?.iob ?? 0 + self.currentBG = (self.provider.suggestion?.bg ?? 0) + self.cob = self.provider.suggestion?.cob ?? 0 + self.basal = self.provider.suggestion?.rate ?? 0 if self.settingsManager.settings.insulinReqPercentage != 100 { self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) @@ -125,6 +267,8 @@ extension Bolus { self.insulinRecommended = self.apsManager .roundBolus(amount: max(self.insulinRecommended, 0)) + + self.getDeltaBG() } } } diff --git a/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift b/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift new file mode 100644 index 0000000000..f2833050eb --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift @@ -0,0 +1,23 @@ +import SwiftUI + +struct CheckboxToggleStyle: ToggleStyle { + func makeBody(configuration: Self.Configuration) -> some View { + HStack { + RoundedRectangle(cornerRadius: 5) + .stroke(lineWidth: 2) + .frame(width: 20, height: 20) + .cornerRadius(5) + .overlay { + if configuration.isOn { + Image(systemName: "checkmark") + } + } + .onTapGesture { + withAnimation { + configuration.isOn.toggle() + } + } + configuration.label + } + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift new file mode 100644 index 0000000000..2b73d663b3 --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -0,0 +1,397 @@ +import SwiftUI +import Swinject + +extension Bolus { + // alternative bolus calc + struct AlternativeBolusCalcRootView: BaseView { + let resolver: Resolver + let waitForSuggestion: Bool + @ObservedObject var state: StateModel + + @State private var showInfo = false + @State var insulinCalculated: Decimal = 0 + + @Environment(\.colorScheme) var colorScheme + + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var fractionDigits: Int { + if state.units == .mmolL { + return 1 + } else { return 0 } + } + + var body: some View { + Form { + Section { + HStack { + Text("Glucose") + DecimalTextField( + "0", + value: Binding( + get: { + if state.units == .mmolL { + return state.currentBG * 0.0555 + } else { + return state.currentBG + } + }, + set: { newValue in + if state.units == .mmolL { + state.currentBG = newValue * 0.0555 + } else { + state.currentBG = newValue + } + } + ), + formatter: formatter, + autofocus: false, + cleanInput: true + ) + .onChange(of: state.currentBG) { newValue in + if newValue > 500 { + state.currentBG = 500 // ensure that user can not input more than 500 mg/dL + } + insulinCalculated = state.calculateInsulin() + } + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + .contentShape(Rectangle()) + HStack { + Button(action: { + showInfo.toggle() + insulinCalculated = state.calculateInsulin() + }, label: { + Image(systemName: "info.circle") + Text("Calculations") + }) + .foregroundStyle(.blue) + .font(.footnote) + .buttonStyle(PlainButtonStyle()) + .frame(maxWidth: .infinity, alignment: .leading) + if state.fattyMeals { + Spacer() + Toggle(isOn: $state.useFattyMealCorrectionFactor) { + Text("Fatty Meal") + } + .toggleStyle(CheckboxToggleStyle()) + .font(.footnote) + .onChange(of: state.useFattyMealCorrectionFactor) { _ in + insulinCalculated = state.calculateInsulin() + } + } + } + } + header: { Text("Values") } + + Section { + HStack { + Text("Recommended Bolus") + Spacer() + + Text( + formatter + .string(from: Double(insulinCalculated) as NSNumber)! + ) + let unit = NSLocalizedString( + " U", + comment: "Unit in number of units delivered (keep the space character!)" + ) + Text(unit).foregroundColor(.secondary) + }.contentShape(Rectangle()) + .onTapGesture { + state.amount = insulinCalculated + } + + if !state.waitForSuggestion { + HStack { + Text("Bolus") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + } + } + } + header: { Text("Bolus") } + + Section { + Button(action: { + state.add() + }) { + Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") + .frame(maxWidth: .infinity, alignment: .center) + } + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) + } + .onAppear { + configureView { + state.waitForSuggestionInitial = waitForSuggestion + state.waitForSuggestion = waitForSuggestion + } + } + .navigationTitle("Enact Bolus") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + } + .blur(radius: showInfo ? 3 : 0) + .popup(isPresented: showInfo) { + bolusInfoAlternativeCalculator + } + } + + // calculation showed in popup + var bolusInfoAlternativeCalculator: some View { + let unit = NSLocalizedString( + " U", + comment: "Unit in number of units delivered (keep the space character!)" + ) + + return VStack { + VStack { + VStack { + HStack { + Text("Calculations") + .font(.title3) + .fontWeight(.semibold) + Spacer() + } + .padding(.vertical, 10) + HStack { + Text("Carb Ratio") + .foregroundColor(.secondary) + Spacer() + + Text(state.carbRatio.formatted()) + Text(NSLocalizedString(" g/U", comment: " grams per Unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF") + .foregroundColor(.secondary) + Spacer() + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("Target Glucose") + .foregroundColor(.secondary) + Spacer() + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + HStack { + Text("Basal") + .foregroundColor(.secondary) + Spacer() + let basal = state.basal + Text(basal.formatted()) + Text(NSLocalizedString(" U/h", comment: " Units per hour")) + .foregroundColor(.secondary) + } + HStack { + Text("Fraction") + .foregroundColor(.secondary) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + } + if state.useFattyMealCorrectionFactor { + HStack { + Text("Fatty Meal Factor") + .foregroundColor(.orange) + Spacer() + let fraction = state.fattyMealFactor + Text(fraction.formatted()) + .foregroundColor(.orange) + } + } + } + .padding() + + VStack { + HStack { + Text("Glucose") + .foregroundColor(.secondary) + Spacer() + let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG + Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue) + .foregroundColor(.secondary) + Spacer() + Image(systemName: "arrow.right") + Spacer() + + let targetDifferenceInsulin = state.targetDifferenceInsulin + // rounding + let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue + let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) + Text(roundedTargetDifferenceInsulin.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + HStack { + Text("IOB") + .foregroundColor(.secondary) + Spacer() + let iob = state.iob + // rounding + let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue + let roundedIob = Decimal(round(100 * iobAsDouble) / 100) + Text(roundedIob.formatted()) + Text(unit) + .foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let iobCalc = state.iobInsulinReduction + // rounding + let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue + let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) + Text(roundedIobCalc.formatted()) + Text(unit).foregroundColor(.secondary) + } + HStack { + Text("Trend") + .foregroundColor(.secondary) + Spacer() + let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG + Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let trendInsulin = state.fifteenMinInsulin + // rounding + let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue + let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) + Text(roundedTrendInsulin.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + HStack { + Text("COB") + .foregroundColor(.secondary) + Spacer() + let cob = state.cob + Text(cob.formatted()) + + let unitGrams = NSLocalizedString(" g", comment: "grams") + Text(unitGrams).foregroundColor(.secondary) + + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let insulinCob = state.wholeCobInsulin + // rounding + let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue + let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) + Text(roundedInsulinCob.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + } + .padding() + + Divider() + .fontWeight(.bold) + + HStack { + Text("Full Bolus") + .foregroundColor(.secondary) + Spacer() + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + } + .padding() + + Divider() + .fontWeight(.bold) + + HStack { + Text("Result") + .fontWeight(.bold) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + Text(" x ") + .foregroundColor(.secondary) + + // if fatty meal is chosen + if state.useFattyMealCorrectionFactor { + let fattyMealFactor = state.fattyMealFactor + Text(fattyMealFactor.formatted()) + .foregroundColor(.orange) + Text(" x ") + .foregroundColor(.secondary) + } + + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + Text(" = ") + .foregroundColor(.secondary) + + let result = state.insulinCalculated + // rounding + let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue + let roundedResult = Decimal(round(100 * resultAsDouble) / 100) + Text(roundedResult.formatted()) + .fontWeight(.bold) + .font(.system(size: 16)) + .foregroundColor(.blue) + Text(unit) + .foregroundColor(.secondary) + } + .padding() + } + .padding(.top, 10) + .padding(.bottom, 15) + + // Hide button + VStack { + Button { showInfo = false } + label: { + Text("OK") + } + .frame(maxWidth: .infinity, alignment: .center) + .font(.system(size: 16)) + .fontWeight(.semibold) + .foregroundColor(.blue) + } + .padding(.bottom, 20) + } + .font(.footnote) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4).opacity(0.9)) + ) + } + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 53e95f6021..05de4c6644 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -7,273 +7,19 @@ extension Bolus { let waitForSuggestion: Bool @StateObject var state = StateModel() - @State private var isAddInsulinAlertPresented = false - @State private var presentInfo = false - @State private var displayError = false - - @Environment(\.colorScheme) var colorScheme - - private var formatter: NumberFormatter { - let formatter = NumberFormatter() - formatter.numberStyle = .decimal - formatter.maximumFractionDigits = 2 - return formatter - } - - private var fractionDigits: Int { - if state.units == .mmolL { - return 1 - } else { return 0 } - } - var body: some View { - Form { - Section { - if state.waitForSuggestion { - HStack { - Text("Wait please").foregroundColor(.secondary) - Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug - } - } else { - HStack { - Text("Insulin recommended") - Image(systemName: "info.bubble") - .symbolRenderingMode(.palette) - .foregroundStyle(.primary, .blue) - .onTapGesture { - presentInfo.toggle() - } - - Spacer() - - Text( - formatter - .string(from: state.insulinRecommended as NSNumber)! + - NSLocalizedString(" U", comment: "Insulin unit") - ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary) - .onTapGesture { - if state.error, state.insulinRecommended > 0 { displayError = true } - else { state.amount = state.insulinRecommended } - } - }.contentShape(Rectangle()) - } - } - header: { Text("Recommendation") } - if !state.waitForSuggestion { - Section { - HStack { - Text("Amount") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: true, - cleanInput: true - ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) - } - } - header: { Text("Bolus") } - Section { - Button { state.add() } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) - } - - if waitForSuggestion { - Section { - Button { state.showModal(for: nil) } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) - } - } - } - } - .alert(isPresented: $displayError) { - Alert( - title: Text("Warning!"), - message: Text("\n" + alertString() + "\n"), - primaryButton: .destructive( - Text("Add"), - action: { - state.amount = state.insulinRecommended - displayError = false - } - ), - secondaryButton: .cancel() - ) - }.onAppear { - configureView { - state.waitForSuggestionInitial = waitForSuggestion - state.waitForSuggestion = waitForSuggestion - } - } - .navigationTitle("Enact Bolus") - .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) - .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { - bolusInfo - } - } - - var bolusInfo: some View { - VStack { - // Variables - VStack(spacing: 3) { - HStack { - Text("Eventual Glucose").foregroundColor(.secondary) - let evg = state.units == .mmolL ? Decimal(state.evBG).asMmolL : Decimal(state.evBG) - Text(evg.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - } - HStack { - Text("Target Glucose").foregroundColor(.secondary) - let target = state.units == .mmolL ? state.target.asMmolL : state.target - Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - } - HStack { - Text("ISF").foregroundColor(.secondary) - let isf = state.isf - Text(isf.formatted()) - Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) - .foregroundColor(.secondary) - } - HStack { - Text("ISF:") - Text("Insulin Sensitivity") - }.foregroundColor(.secondary).italic() - if state.percentage != 100 { - HStack { - Text("Percentage setting").foregroundColor(.secondary) - let percentage = state.percentage - Text(percentage.formatted()) - Text("%").foregroundColor(.secondary) - } - } - HStack { - Text("Formula:") - Text("(Eventual Glucose - Target) / ISF") - }.foregroundColor(.secondary).italic().padding(.top, 5) - } - .font(.footnote) - .padding(.top, 10) - Divider() - // Formula - VStack(spacing: 5) { - let unit = NSLocalizedString( - " U", - comment: "Unit in number of units delivered (keep the space character!)" - ) - let color: Color = (state.percentage != 100 && state.insulin > 0) ? .secondary : .blue - let fontWeight: Font.Weight = (state.percentage != 100 && state.insulin > 0) ? .regular : .bold - HStack { - Text(NSLocalizedString("Insulin recommended", comment: "") + ":").font(.callout) - Text(state.insulin.formatted() + unit).font(.callout).foregroundColor(color).fontWeight(fontWeight) - } - if state.percentage != 100, state.insulin > 0 { - Divider() - HStack { Text(state.percentage.formatted() + " % ->").font(.callout).foregroundColor(.secondary) - Text( - state.insulinRecommended.formatted() + unit - ).font(.callout).foregroundColor(.blue).bold() - } - } - } - // Warning - if state.error, state.insulinRecommended > 0 { - VStack(spacing: 5) { - Divider() - Text("Warning!").font(.callout).bold().foregroundColor(.orange) - Text(alertString()).font(.footnote) - Divider() - }.padding(.horizontal, 10) - } - // Footer - if !(state.error && state.insulinRecommended > 0) { - VStack { - Text( - "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." - ).font(.caption2).foregroundColor(.secondary) - }.padding(20) - } - // Hide button - VStack { - Button { presentInfo = false } - label: { Text("Hide") }.frame(maxWidth: .infinity, alignment: .center).font(.callout) - .foregroundColor(.blue) - }.padding(.bottom, 10) - } - .background( - RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) - // .fill(Color(.systemGray).gradient) // A more prominent pop-up, but harder to read - ) - } - - // Localize the Oref0 error/warning strings. The default should never be returned - private func alertString() -> String { - switch state.errorString { - case 1, - 2: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state.minGuardBG - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state.units - .rawValue + ", " + - NSLocalizedString( - "which is below your Threshold (", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state - .threshold.formatted() + " " + state.units.rawValue + ")" - case 3: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Climbing: ", comment: "Bolus pop-up / Alert string. Make translatons concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 4: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Falling: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 5: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Changing: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 6: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state - .minPredBG - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state - .units - .rawValue - default: - return "Ignore Warning..." + if state.useCalc { + // show alternative bolus calc based on toggle in bolus calc settings + AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, state: state) + } else { + // show iAPS standard bolus calc + DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, state: state) } } } } +// fix iOS 15 bug struct ActivityIndicator: UIViewRepresentable { @Binding var isAnimating: Bool let style: UIActivityIndicatorView.Style diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift new file mode 100644 index 0000000000..1e4d078a4f --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -0,0 +1,275 @@ +import SwiftUI +import Swinject + +extension Bolus { + struct DefaultBolusCalcRootView: BaseView { + let resolver: Resolver + let waitForSuggestion: Bool + @StateObject var state = StateModel() + + @State private var isAddInsulinAlertPresented = false + @State private var presentInfo = false + @State private var displayError = false + + @Environment(\.colorScheme) var colorScheme + + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var fractionDigits: Int { + if state.units == .mmolL { + return 1 + } else { return 0 } + } + + var body: some View { + Form { + Section { + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } else { + HStack { + Text("Insulin recommended") + Image(systemName: "info.bubble") + .symbolRenderingMode(.palette) + .foregroundStyle(.primary, .blue) + .onTapGesture { + presentInfo.toggle() + } + + Spacer() + + Text( + formatter + .string(from: state.insulinRecommended as NSNumber)! + + NSLocalizedString(" U", comment: "Insulin unit") + ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary) + .onTapGesture { + if state.error, state.insulinRecommended > 0 { displayError = true } + else { state.amount = state.insulinRecommended } + } + }.contentShape(Rectangle()) + } + } + header: { Text("Recommendation") } + if !state.waitForSuggestion { + Section { + HStack { + Text("Amount") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: true, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + } + } + header: { Text("Bolus") } + Section { + Button { state.add() } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) + } + + if waitForSuggestion { + Section { + Button { state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } + } + } + } + .alert(isPresented: $displayError) { + Alert( + title: Text("Warning!"), + message: Text("\n" + alertString() + "\n"), + primaryButton: .destructive( + Text("Add"), + action: { + state.amount = state.insulinRecommended + displayError = false + } + ), + secondaryButton: .cancel() + ) + }.onAppear { + configureView { + state.waitForSuggestionInitial = waitForSuggestion + state.waitForSuggestion = waitForSuggestion + } + } + .navigationTitle("Enact Bolus") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { + bolusInfo + } + } + + var bolusInfo: some View { + VStack { + // Variables + VStack(spacing: 3) { + HStack { + Text("Eventual Glucose").foregroundColor(.secondary) + let evg = state.units == .mmolL ? Decimal(state.evBG).asMmolL : Decimal(state.evBG) + Text(evg.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + } + HStack { + Text("Target Glucose").foregroundColor(.secondary) + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + } + HStack { + Text("ISF").foregroundColor(.secondary) + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF:") + Text("Insulin Sensitivity") + }.foregroundColor(.secondary).italic() + if state.percentage != 100 { + HStack { + Text("Percentage setting").foregroundColor(.secondary) + let percentage = state.percentage + Text(percentage.formatted()) + Text("%").foregroundColor(.secondary) + } + } + HStack { + Text("Formula:") + Text("(Eventual Glucose - Target) / ISF") + }.foregroundColor(.secondary).italic().padding(.top, 5) + } + .font(.footnote) + .padding(.top, 10) + Divider() + // Formula + VStack(spacing: 5) { + let unit = NSLocalizedString( + " U", + comment: "Unit in number of units delivered (keep the space character!)" + ) + let color: Color = (state.percentage != 100 && state.insulin > 0) ? .secondary : .blue + let fontWeight: Font.Weight = (state.percentage != 100 && state.insulin > 0) ? .regular : .bold + HStack { + Text(NSLocalizedString("Insulin recommended", comment: "") + ":").font(.callout) + Text(state.insulin.formatted() + unit).font(.callout).foregroundColor(color).fontWeight(fontWeight) + } + if state.percentage != 100, state.insulin > 0 { + Divider() + HStack { Text(state.percentage.formatted() + " % ->").font(.callout).foregroundColor(.secondary) + Text( + state.insulinRecommended.formatted() + unit + ).font(.callout).foregroundColor(.blue).bold() + } + } + } + // Warning + if state.error, state.insulinRecommended > 0 { + VStack(spacing: 5) { + Divider() + Text("Warning!").font(.callout).bold().foregroundColor(.orange) + Text(alertString()).font(.footnote) + Divider() + }.padding(.horizontal, 10) + } + // Footer + if !(state.error && state.insulinRecommended > 0) { + VStack { + Text( + "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." + ).font(.caption2).foregroundColor(.secondary) + }.padding(20) + } + // Hide button + VStack { + Button { presentInfo = false } + label: { Text("Hide") }.frame(maxWidth: .infinity, alignment: .center).font(.callout) + .foregroundColor(.blue) + }.padding(.bottom, 10) + } + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) + // .fill(Color(.systemGray).gradient) // A more prominent pop-up, but harder to read + ) + } + + // Localize the Oref0 error/warning strings. The default should never be returned + private func alertString() -> String { + switch state.errorString { + case 1, + 2: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state.minGuardBG + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state.units + .rawValue + ", " + + NSLocalizedString( + "which is below your Threshold (", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state + .threshold.formatted() + " " + state.units.rawValue + ")" + case 3: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Climbing: ", comment: "Bolus pop-up / Alert string. Make translatons concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 4: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Falling: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 5: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Changing: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 6: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state + .minPredBG + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state + .units + .rawValue + default: + return "Ignore Warning..." + } + } + } +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift new file mode 100644 index 0000000000..2b0fa79066 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift @@ -0,0 +1,5 @@ +enum BolusCalculatorConfig { + enum Config {} +} + +protocol BolusCalculatorConfigProvider {} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift new file mode 100644 index 0000000000..7aa2302e09 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift @@ -0,0 +1,3 @@ +extension BolusCalculatorConfig { + final class Provider: BaseProvider, BolusCalculatorConfigProvider {} +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift new file mode 100644 index 0000000000..d6063167c7 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift @@ -0,0 +1,27 @@ +import SwiftUI + +extension BolusCalculatorConfig { + final class StateModel: BaseStateModel { + @Published var overrideFactor: Decimal = 0 + @Published var useCalc: Bool = false + @Published var fattyMeals: Bool = false + @Published var fattyMealFactor: Decimal = 0 + + override func subscribe() { + subscribeSetting(\.overrideFactor, on: $overrideFactor, initial: { + let value = max(min($0, 1.2), 0.1) + overrideFactor = value + }, map: { + $0 + }) + subscribeSetting(\.useCalc, on: $useCalc) { useCalc = $0 } + subscribeSetting(\.fattyMeals, on: $fattyMeals) { fattyMeals = $0 } + subscribeSetting(\.fattyMealFactor, on: $fattyMealFactor, initial: { + let value = max(min($0, 1.2), 0.1) + fattyMealFactor = value + }, map: { + $0 + }) + } + } +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift new file mode 100644 index 0000000000..cade465161 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift @@ -0,0 +1,52 @@ +import SwiftUI +import Swinject + +extension BolusCalculatorConfig { + struct RootView: BaseView { + let resolver: Resolver + @StateObject var state = StateModel() + + private var conversionFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + + return formatter + } + + var body: some View { + Form { + Section(header: Text("Calculator settings")) { + HStack { + Toggle("Use alternative Bolus Calculator", isOn: $state.useCalc) + } + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.8", value: $state.overrideFactor, formatter: conversionFormatter) + } + } + Section(header: Text("Fatty Meals")) { + HStack { + Toggle("Apply factor for fatty meals", isOn: $state.fattyMeals) + } + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.7", value: $state.fattyMealFactor, formatter: conversionFormatter) + } + } + + Section( + footer: Text( + "This is another approach to the bolus calculator integrated in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." + ) + ) + {} + } + .onAppear(perform: configureView) + .navigationBarTitle("Bolus Calculator") + .navigationBarTitleDisplayMode(.automatic) + } + } +} diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index ba68523ff2..73da26e1f0 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -43,6 +43,7 @@ extension Settings { Text("Carb Ratios").navigationLink(to: .crEditor, from: self) Text("Target Glucose").navigationLink(to: .targetsEditor, from: self) Text("Autotune").navigationLink(to: .autotuneConfig, from: self) + Text("Bolus Calculator").navigationLink(to: .bolusCalculatorConfig, from: self) } Section(header: Text("Developer")) { diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index af152733c9..5bd74814b5 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -32,6 +32,7 @@ enum Screen: Identifiable, Hashable { case statistics case watch case statisticsConfig + case bolusCalculatorConfig var id: Int { String(reflecting: self).hashValue } } @@ -99,6 +100,8 @@ extension Screen { Stat.RootView(resolver: resolver) case .statisticsConfig: StatConfig.RootView(resolver: resolver) + case .bolusCalculatorConfig: + BolusCalculatorConfig.RootView(resolver: resolver) } } diff --git a/FreeAPS/Sources/Views/DecimalTextField.swift b/FreeAPS/Sources/Views/DecimalTextField.swift index 7b46a960f0..9cf67e8a5e 100644 --- a/FreeAPS/Sources/Views/DecimalTextField.swift +++ b/FreeAPS/Sources/Views/DecimalTextField.swift @@ -30,31 +30,6 @@ struct DecimalTextField: UIViewRepresentable { textfield.text = cleanInput ? "" : formatter.string(for: value) ?? placeholder textfield.textAlignment = .right - let toolBar = UIToolbar(frame: CGRect( - x: 0, - y: 0, - width: textfield.frame.size.width, - height: 44 - )) - let clearButton = UIBarButtonItem( - title: NSLocalizedString("Clear", comment: "Clear button"), - style: .plain, - target: self, - action: #selector(textfield.clearButtonTapped(button:)) - ) - let doneButton = UIBarButtonItem( - title: NSLocalizedString("Done", comment: "Done button"), - style: .done, - target: self, - action: #selector(textfield.doneButtonTapped(button:)) - ) - let space = UIBarButtonItem( - barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, - target: nil, - action: nil - ) - toolBar.setItems([clearButton, space, doneButton], animated: true) - textfield.inputAccessoryView = toolBar if autofocus { DispatchQueue.main.async { textfield.becomeFirstResponder() From fb2cd82c4ecacd3ee719367a78cd24437468d411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 11:53:26 +0100 Subject: [PATCH 126/405] Fix settings for new alternative bolus calc --- .../PreferencesEditor/PreferencesEditorStateModel.swift | 2 ++ .../View/PreferencesEditorRootView.swift | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index 5f9e3b6962..e475e82047 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -8,9 +8,11 @@ extension PreferencesEditor { @Published var insulinReqPercentage: Decimal = 70 @Published var skipBolusScreenAfterCarbs = false @Published var sections: [FieldSection] = [] + @Published var useAlternativeBolusCalc: Bool = false override func subscribe() { preferences = provider.preferences + useAlternativeBolusCalc = settingsManager.settings.useCalc subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 38f374d396..d745a75a30 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -30,9 +30,11 @@ extension PreferencesEditor { Toggle("Remote control", isOn: $state.allowAnnouncements) - HStack { - Text("Recommended Bolus Percentage") - DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) + if !state.useAlternativeBolusCalc { + HStack { + Text("Recommended Bolus Percentage") + DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) + } } Toggle("Skip Bolus screen after carbs", isOn: $state.skipBolusScreenAfterCarbs) From 5849cee4ea42ad34f746d4cf5dbbf56f2d204cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 12:39:53 +0100 Subject: [PATCH 127/405] Use 1 maximumFractionDigit when mmol/l --- .../Bolus/View/AlternativeBolusCalcRootView.swift | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 2b73d663b3..917caac11e 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -20,6 +20,15 @@ extension Bolus { return formatter } + private var gluoseFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if state.units == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + return formatter + } + private var fractionDigits: Int { if state.units == .mmolL { return 1 @@ -36,20 +45,20 @@ extension Bolus { value: Binding( get: { if state.units == .mmolL { - return state.currentBG * 0.0555 + return state.currentBG.asMmolL } else { return state.currentBG } }, set: { newValue in if state.units == .mmolL { - state.currentBG = newValue * 0.0555 + state.currentBG = newValue.asMmolL } else { state.currentBG = newValue } } ), - formatter: formatter, + formatter: gluoseFormatter, autofocus: false, cleanInput: true ) From d8d91f93cb1fe9625424932439a9b80003f71334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 16:41:06 +0100 Subject: [PATCH 128/405] Refactor Bolus Calc. More to come. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update bolus recommedation (run a loop) every time opened, to update carbs, COB etc. * Get carbRatio from Suggestion, like the other variables. Skip the loop, which sometimes didnt retrieve the CR (donät know why yet). --- FreeAPS/Sources/Models/Suggestion.swift | 2 + .../Sources/Modules/Bolus/BolusProvider.swift | 6 --- .../Modules/Bolus/BolusStateModel.swift | 42 +++---------------- 3 files changed, 8 insertions(+), 42 deletions(-) diff --git a/FreeAPS/Sources/Models/Suggestion.swift b/FreeAPS/Sources/Models/Suggestion.swift index a50ebfe9ca..2a79328392 100644 --- a/FreeAPS/Sources/Models/Suggestion.swift +++ b/FreeAPS/Sources/Models/Suggestion.swift @@ -29,6 +29,7 @@ struct Suggestion: JSON, Equatable { let minGuardBG: Decimal? let minPredBG: Decimal? let threshold: Decimal? + let carbRatio: Decimal? } struct Predictions: JSON, Equatable { @@ -75,6 +76,7 @@ extension Suggestion { case minGuardBG case minPredBG case threshold + case carbRatio = "CR" } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift index f72a3fca89..b0c6d0f3b0 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift @@ -4,12 +4,6 @@ extension Bolus { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } - func getProfile() -> CarbRatios { - storage.retrieve(OpenAPS.Settings.carbRatios, as: CarbRatios.self) - ?? CarbRatios(from: OpenAPS.defaults(for: OpenAPS.Settings.carbRatios)) - ?? CarbRatios(units: .grams, schedule: []) - } - func pumpSettings() -> PumpSettings { storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self) ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings)) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 8381925ba4..d828b1dc20 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -12,7 +12,6 @@ extension Bolus { // added for bolus calculator @Injected() var glucoseStorage: GlucoseStorage! @Injected() var settings: SettingsManager! - @Injected() var storage: FileStorage! @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @@ -32,6 +31,7 @@ extension Bolus { @Published var expectedDelta: Decimal = 0 @Published var minPredBG: Decimal = 0 @Published var waitForSuggestion: Bool = false + @Published var carbRatio: Decimal = 0 var waitForSuggestionInitial: Bool = false @@ -58,8 +58,6 @@ extension Bolus { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var useFattyMealCorrectionFactor: Bool = false - - @Published var carbRatio: Decimal = 0 @Published var currentTime: String = "" override func subscribe() { @@ -69,7 +67,6 @@ extension Bolus { percentage = settingsManager.settings.insulinReqPercentage threshold = provider.suggestion?.threshold ?? 0 maxBolus = provider.pumpSettings().maxBolus - // added fraction = settings.settings.overrideFactor useCalc = settings.settings.useCalc @@ -77,38 +74,6 @@ extension Bolus { fattyMealFactor = settings.settings.fattyMealFactor // get carb ratio entry schedule - let schedule = provider.getProfile().schedule - // get current time in same format as carb ratio entry start date - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "HH:mm:ss" - let currentTime = dateFormatter.string(from: Date()) - // loop through schedule to get current carb ratio - for (index, entry) in schedule.enumerated() { - if let entryStartTimeDate = dateFormatter.date(from: entry.start) { - var entryEndTimeDate: Date - - if index < schedule.count - 1 { - let nextEntry = schedule[index + 1] - if let nextEntryStartTimeDate = dateFormatter.date(from: nextEntry.start) { - let timeDifference = nextEntryStartTimeDate.timeIntervalSince(entryStartTimeDate) - entryEndTimeDate = entryStartTimeDate.addingTimeInterval(timeDifference) - } else { - continue - } - } else { - entryEndTimeDate = Date() - } - // if currentTime is between start and end of carb ratio entry -> carbRatio = currentRatio - if let currentTimeDate = dateFormatter.date(from: currentTime) { - if currentTimeDate >= entryStartTimeDate, currentTimeDate <= entryEndTimeDate { - if let currentRatio = entry.ratio as? Decimal { - carbRatio = currentRatio - break - } - } - } - } - } if waitForSuggestionInitial { apsManager.determineBasal() @@ -251,6 +216,7 @@ extension Bolus { self.currentBG = (self.provider.suggestion?.bg ?? 0) self.cob = self.provider.suggestion?.cob ?? 0 self.basal = self.provider.suggestion?.rate ?? 0 + self.carbRatio = self.provider.suggestion?.carbRatio ?? 0 if self.settingsManager.settings.insulinReqPercentage != 100 { self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) @@ -269,6 +235,10 @@ extension Bolus { .roundBolus(amount: max(self.insulinRecommended, 0)) self.getDeltaBG() + + if self.useCalc { + self.apsManager.determineBasalSync() + } } } } From 692a57eb1d3dab3d4486f412dd2d82441d4537ef Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 29 Oct 2023 17:51:16 +0100 Subject: [PATCH 129/405] Change labels (#289) * All occurances of "Non-Pump" or "nonPump" in texts and code changed to "External" * Removed label "Automatic" for SMBs in history --- .../APS/Storage/PumpHistoryStorage.swift | 6 ++-- .../Main/de.lproj/Localizable.strings | 4 +-- .../Main/en.lproj/Localizable.strings | 8 ++--- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 10 +++--- .../Modules/Bolus/BolusStateModel.swift | 2 +- .../Modules/DataTable/DataTableDataFlow.swift | 14 ++++---- .../DataTable/DataTableStateModel.swift | 22 ++++++------ .../DataTable/View/DataTableRootView.swift | 34 +++++++++---------- 8 files changed, 49 insertions(+), 51 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index b3b034f0de..45387e6d8b 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -46,7 +46,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { temp: nil, carbInput: nil, isSMB: dose.automatic, - isNonPumpInsulin: dose.manuallyEntered + isExternal: dose.manuallyEntered )] case .tempBasal: guard let dose = event.dose else { return [] } @@ -215,8 +215,8 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { if event.isSMB ?? false { return .smb } - if event.isNonPumpInsulin ?? false { - return .nonPumpInsulin + if event.isExternal ?? false { + return .isExternal } return event.type } diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index e7b8112ce7..15ccfaa23e 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1171,8 +1171,8 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; -/* A manually entered dose of non-pump insulin */ -"Non-pump Insulin" = "Externes Insulin"; +/* A manually entered dose of external insulin */ +"External Insulin" = "Externes Insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuelle Temporäre Basalrate"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 8cd859d1b3..dee32097ae 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -569,8 +569,8 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; -/* Non-pump insulin treatments */ -"Non-Pump" = "Non-Pump"; +/* External insulin treatments */ +"External" = "External"; /* */ "Other" = "Other"; @@ -1175,8 +1175,8 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; -/* A manually entered dose of non-pump insulin */ -"Non-pump Insulin" = "Non-pump Insulin"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index c53362d3d9..320f6de833 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -12,7 +12,7 @@ struct PumpHistoryEvent: JSON, Equatable { let carbInput: Int? let note: String? let isSMB: Bool? - let isNonPumpInsulin: Bool? + let isExternal: Bool? init( id: String, @@ -26,7 +26,7 @@ struct PumpHistoryEvent: JSON, Equatable { carbInput: Int? = nil, note: String? = nil, isSMB: Bool? = nil, - isNonPumpInsulin: Bool? = nil + isExternal: Bool? = nil ) { self.id = id self.type = type @@ -39,14 +39,14 @@ struct PumpHistoryEvent: JSON, Equatable { self.carbInput = carbInput self.note = note self.isSMB = isSMB - self.isNonPumpInsulin = isNonPumpInsulin + self.isExternal = isExternal } } enum EventType: String, JSON { case bolus = "Bolus" case smb = "SMB" - case nonPumpInsulin = "Non-pump Insulin" + case isExternal = "External Insulin" case mealBolus = "Meal Bolus" case correctionBolus = "Correction Bolus" case snackBolus = "Snack Bolus" @@ -90,6 +90,6 @@ extension PumpHistoryEvent { case carbInput = "carb_input" case note case isSMB - case isNonPumpInsulin + case isExternal } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index d828b1dc20..6ab1132980 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -192,7 +192,7 @@ extension Bolus { rate: nil, temp: nil, carbInput: nil, - isNonPumpInsulin: true + isExternal: true ) ] ) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 41f448f414..7a744ca704 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -67,7 +67,7 @@ enum DataTable { let fpuID: String? let note: String? let isSMB: Bool? - let isNonPump: Bool? + let isExternal: Bool? private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -96,7 +96,7 @@ enum DataTable { fpuID: String? = nil, note: String? = nil, isSMB: Bool? = nil, - isNonPump: Bool? = nil + isExternal: Bool? = nil ) { self.units = units self.type = type @@ -110,7 +110,7 @@ enum DataTable { self.fpuID = fpuID self.note = note self.isSMB = isSMB - self.isNonPump = isNonPump + self.isExternal = isExternal } static func == (lhs: Treatment, rhs: Treatment) -> Bool { @@ -139,11 +139,9 @@ enum DataTable { .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: var bolusText = " " - - if isSMB ?? false { - bolusText += NSLocalizedString("Automatic", comment: "Automatic delivered treatments") - } else if isNonPump ?? false { - bolusText += NSLocalizedString("Non-Pump", comment: "Non-pump Insulin") + if isSMB ?? false {} + else if isExternal ?? false { + bolusText += NSLocalizedString("External", comment: "External Insulin") } else { bolusText += NSLocalizedString("Manual", comment: "Manual Bolus") } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 679e19e239..1826591275 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -16,8 +16,8 @@ extension DataTable { @Published var glucose: [Glucose] = [] @Published var manualGlucose: Decimal = 0 @Published var maxBolus: Decimal = 0 - @Published var nonPumpInsulinAmount: Decimal = 0 - @Published var nonPumpInsulinDate = Date() + @Published var externalInsulinAmount: Decimal = 0 + @Published var externalInsulinDate = Date() var units: GlucoseUnits = .mmolL @@ -79,7 +79,7 @@ extension DataTable { amount: $0.amount, idPumpEvent: $0.id, isSMB: $0.isSMB, - isNonPump: $0.isNonPumpInsulin + isExternal: $0.isExternal ) } @@ -199,13 +199,13 @@ extension DataTable { saveToHealth.append(saveToJSON) } - func addNonPumpInsulin() { - guard nonPumpInsulinAmount > 0 else { + func addExternalInsulin() { + guard externalInsulinAmount > 0 else { showModal(for: nil) return } - nonPumpInsulinAmount = min(nonPumpInsulinAmount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin + externalInsulinAmount = min(externalInsulinAmount, maxBolus * 3) // Allow for 3 * Max Bolus for external insulin unlockmanager.unlock() .sink { _ in } receiveValue: { [weak self] _ in guard let self = self else { return } @@ -214,21 +214,21 @@ extension DataTable { PumpHistoryEvent( id: UUID().uuidString, type: .bolus, - timestamp: nonPumpInsulinDate, - amount: nonPumpInsulinAmount, + timestamp: externalInsulinDate, + amount: externalInsulinAmount, duration: nil, durationMin: nil, rate: nil, temp: nil, carbInput: nil, - isNonPumpInsulin: true + isExternal: true ) ] ) - debug(.default, "Non-pump insulin saved to pumphistory.json") + debug(.default, "External insulin saved to pumphistory.json") // Reset amount to 0 for next entry. - nonPumpInsulinAmount = 0 + externalInsulinAmount = 0 } .store(in: &lifetime) } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index f0b9feb347..014c1ba37b 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -11,7 +11,7 @@ extension DataTable { @State private var removeCarbsAlert: Alert? @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? - @State private var showNonPumpInsulin: Bool = false + @State private var showExternalInsulin: Bool = false @State private var showFutureEntries: Bool = false // default to hide future entries @State private var showManualGlucose: Bool = false @State private var isAmountUnconfirmed: Bool = true @@ -66,17 +66,17 @@ extension DataTable { .sheet(isPresented: $showManualGlucose) { addGlucoseView } - .sheet(isPresented: $showNonPumpInsulin, onDismiss: { if isAmountUnconfirmed { state.nonPumpInsulinAmount = 0 - state.nonPumpInsulinDate = Date() } }) { - addNonPumpInsulinView + .sheet(isPresented: $showExternalInsulin, onDismiss: { if isAmountUnconfirmed { state.externalInsulinAmount = 0 + state.externalInsulinDate = Date() } }) { + addExternalInsulinView } } private var treatmentsList: some View { List { HStack { - Button(action: { showNonPumpInsulin = true - state.nonPumpInsulinDate = Date() }, label: { + Button(action: { showExternalInsulin = true + state.externalInsulinDate = Date() }, label: { HStack { Image(systemName: "syringe") Text("Add") @@ -269,7 +269,7 @@ extension DataTable { } } - var addNonPumpInsulinView: some View { + var addExternalInsulinView: some View { NavigationView { VStack { Form { @@ -279,7 +279,7 @@ extension DataTable { Spacer() DecimalTextField( "0", - value: $state.nonPumpInsulinAmount, + value: $state.externalInsulinAmount, formatter: insulinFormatter, autofocus: true, cleanInput: true @@ -289,25 +289,25 @@ extension DataTable { } Section { - DatePicker("Date", selection: $state.nonPumpInsulinDate, in: ...Date()) + DatePicker("Date", selection: $state.externalInsulinDate, in: ...Date()) } - let amountWarningCondition = (state.nonPumpInsulinAmount > state.maxBolus) + let amountWarningCondition = (state.externalInsulinAmount > state.maxBolus) Section { HStack { Button { - state.addNonPumpInsulin() + state.addExternalInsulin() isAmountUnconfirmed = false - showNonPumpInsulin = false + showExternalInsulin = false } label: { - Text("Log non-pump insulin") + Text("Log external insulin") } .foregroundColor(amountWarningCondition ? Color.white : Color.accentColor) .frame(maxWidth: .infinity, alignment: .center) .disabled( - state.nonPumpInsulinAmount <= 0 || state.nonPumpInsulinAmount > state.maxBolus * 3 + state.externalInsulinAmount <= 0 || state.externalInsulinAmount > state.maxBolus * 3 ) } } @@ -324,10 +324,10 @@ extension DataTable { } } .onAppear(perform: configureView) - .navigationTitle("Non-Pump Insulin") + .navigationTitle("External Insulin") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: { showNonPumpInsulin = false - state.nonPumpInsulinAmount = 0 })) + .navigationBarItems(leading: Button("Close", action: { showExternalInsulin = false + state.externalInsulinAmount = 0 })) } } From 5dec48dadb70f3f4ba4996fa8daf1c1a1d6a2695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 18:53:56 +0100 Subject: [PATCH 130/405] Use fresh suggestion for both bolus calculators. Fresh as in updated every relevant oref variable, like COB, IOB etc. --- .../Modules/Bolus/BolusStateModel.swift | 4 -- .../View/AlternativeBolusCalcRootView.swift | 60 +++++++++++-------- .../Modules/Home/View/HomeRootView.swift | 5 +- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 6ab1132980..7c4c01660d 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -235,10 +235,6 @@ extension Bolus { .roundBolus(amount: max(self.insulinRecommended, 0)) self.getDeltaBG() - - if self.useCalc { - self.apsManager.determineBasalSync() - } } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 917caac11e..3e9bcd61d9 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -100,36 +100,44 @@ extension Bolus { header: { Text("Values") } Section { - HStack { - Text("Recommended Bolus") - Spacer() - - Text( - formatter - .string(from: Double(insulinCalculated) as NSNumber)! - ) - let unit = NSLocalizedString( - " U", - comment: "Unit in number of units delivered (keep the space character!)" - ) - Text(unit).foregroundColor(.secondary) - }.contentShape(Rectangle()) - .onTapGesture { - state.amount = insulinCalculated + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug } - - if !state.waitForSuggestion { + } else { HStack { - Text("Bolus") + Text("Recommended Bolus") Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: false, - cleanInput: true + + Text( + formatter + .string(from: Double(insulinCalculated) as NSNumber)! + ) + let unit = NSLocalizedString( + " U", + comment: "Unit in number of units delivered (keep the space character!)" ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + Text(unit).foregroundColor(.secondary) + }.contentShape(Rectangle()) + .onTapGesture { + state.amount = insulinCalculated + } + + if !state.waitForSuggestion { + HStack { + Text("Bolus") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + } } } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a74c57add2..a4d4bd0d1a 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -511,7 +511,10 @@ extension Home { .foregroundColor(.loopGreen) .buttonStyle(.borderless) Spacer() - Button { state.showModal(for: .bolus(waitForSuggestion: false)) } + Button { + state.showModal(for: .bolus(waitForSuggestion: true)) + state.apsManager.determineBasalSync() + } label: { Image("bolus") .renderingMode(.template) From a5156a6f03c547d001fbd57bb26cf38b9d4fb7ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 21:20:04 +0100 Subject: [PATCH 131/405] Bug fix for saved profiles regarding SMB and UAM basal minutes --- FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 1 - .../OverrideProfilesStateModel.swift | 14 +++++++--- .../View/OverrideProfilesRootView.swift | 28 ++++++++++--------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index ca0a7df66c..f264e23539 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -120,7 +120,6 @@ final class OpenAPS { func oref2() -> RawJSON { coredataContext.performAndWait { - let now = Date() let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) var hbt_ = preferences?.halfBasalExerciseTarget ?? 160 let wp = preferences?.weightPercentage ?? 1 diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index dd7e55921b..953bdfcdd1 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -24,13 +24,15 @@ extension OverrideProfilesConfig { @Published var end: Decimal = 23 @Published var smbMinutes: Decimal = 0 @Published var uamMinutes: Decimal = 0 + @Published var defaultSmbMinutes: Decimal = 0 + @Published var defaultUamMinutes: Decimal = 0 var units: GlucoseUnits = .mmolL override func subscribe() { units = settingsManager.settings.units - smbMinutes = settingsManager.preferences.maxSMBBasalMinutes - uamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes + defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes + defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes presets = [OverridePresets(context: coredataContext)] } @@ -151,8 +153,8 @@ extension OverrideProfilesConfig { saveOverride.end = profile.end } else { saveOverride.smbIsAlwaysOff = false } - saveOverride.smbMinutes = smbMinutes as NSDecimalNumber - saveOverride.uamMinutes = uamMinutes as NSDecimalNumber + saveOverride.smbMinutes = (profile.smbMinutes ?? 0) as NSDecimalNumber + saveOverride.uamMinutes = (profile.uamMinutes ?? 0) as NSDecimalNumber } try? self.coredataContext.save() } @@ -221,6 +223,8 @@ extension OverrideProfilesConfig { override_target = false smbIsOff = false advancedSettings = false + smbMinutes = defaultSmbMinutes + uamMinutes = defaultUamMinutes } } } @@ -240,6 +244,8 @@ extension OverrideProfilesConfig { profiles.date = Date() try? self.coredataContext.save() } + smbMinutes = defaultSmbMinutes + uamMinutes = defaultUamMinutes } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index d00107fb47..de691d474f 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -159,9 +159,8 @@ extension OverrideProfilesConfig { } HStack { Text("SMB Minutes") - let minutes = state.settingsManager.preferences.maxSMBBasalMinutes DecimalTextField( - minutes.formatted(), + "0", value: $state.smbMinutes, formatter: formatter, cleanInput: false @@ -170,9 +169,8 @@ extension OverrideProfilesConfig { } HStack { Text("UAM SMB Minutes") - let uam_minutes = state.settingsManager.preferences.maxUAMSMBBasalMinutes DecimalTextField( - uam_minutes.formatted(), + "0", value: $state.uamMinutes, formatter: formatter, cleanInput: false @@ -217,10 +215,7 @@ extension OverrideProfilesConfig { comment: "" ) } - .disabled( - (state.percentage == 100 && !state.override_target && !state.smbIsOff) || - (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) - ) + .disabled(unChanged()) .buttonStyle(BorderlessButtonStyle()) .font(.callout) .controlSize(.mini) @@ -248,12 +243,8 @@ extension OverrideProfilesConfig { .frame(maxWidth: .infinity, alignment: .trailing) .buttonStyle(BorderlessButtonStyle()) .controlSize(.mini) - .disabled( - (state.percentage == 100 && !state.override_target && !state.smbIsOff) || - (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) - ) + .disabled(unChanged()) } - .sheet(isPresented: $isSheetPresented) { presetPopover } @@ -336,6 +327,17 @@ extension OverrideProfilesConfig { } } + private func unChanged() -> Bool { + let isChanged = (state.percentage == 100 && !state.override_target && !state.smbIsOff && !state.advancedSettings) || + (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) || + ( + state.percentage == 100 && !state.override_target && !state.smbIsOff && state.isf && state.cr && state + .smbMinutes == state.defaultSmbMinutes && state.uamMinutes == state.defaultUamMinutes + ) + + return isChanged + } + private func removeProfile(at offsets: IndexSet) { for index in offsets { let language = fetchedProfiles[index] From b8ea284d7c413f4565f56862dbdf8ff506f41646 Mon Sep 17 00:00:00 2001 From: polscm32 <107251660+polscm32@users.noreply.github.com> Date: Mon, 30 Oct 2023 11:47:32 +0100 Subject: [PATCH 132/405] Small fixes for new bolus calc (#290) * update enact bolus button description when amount exceeds maxBolus and fix insulin unit description * reimplement continue without bolus button, delete unnecessary code in BolusStateModel * refactor code and let add insulin button be disabled if maxBolus is exceeded * remove unused variable --- .../Modules/Bolus/BolusStateModel.swift | 28 ----------- .../View/AlternativeBolusCalcRootView.swift | 47 +++++++++++++++---- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 7c4c01660d..607b7975d1 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -73,8 +73,6 @@ extension Bolus { fattyMeals = settings.settings.fattyMeals fattyMealFactor = settings.settings.fattyMealFactor - // get carb ratio entry schedule - if waitForSuggestionInitial { apsManager.determineBasal() .receive(on: DispatchQueue.main) @@ -173,32 +171,6 @@ extension Bolus { .store(in: &lifetime) } - func addWithoutBolus() { - guard amount > 0 else { - showModal(for: nil) - return - } - amount = min(amount, maxBolus * 3) - - pumpHistoryStorage.storeEvents( - [ - PumpHistoryEvent( - id: UUID().uuidString, - type: .bolus, - timestamp: Date(), - amount: amount, - duration: nil, - durationMin: nil, - rate: nil, - temp: nil, - carbInput: nil, - isExternal: true - ) - ] - ) - showModal(for: nil) - } - func setupInsulinRequired() { DispatchQueue.main.async { self.insulinRequired = self.provider.suggestion?.insulinReq ?? 0 diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 3e9bcd61d9..b4b32ed112 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -9,6 +9,7 @@ extension Bolus { @ObservedObject var state: StateModel @State private var showInfo = false + @State private var exceededMaxBolus = false @State var insulinCalculated: Decimal = 0 @Environment(\.colorScheme) var colorScheme @@ -136,7 +137,14 @@ extension Bolus { autofocus: false, cleanInput: true ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) + } + .onChange(of: state.amount) { newValue in + if newValue > state.maxBolus { + exceededMaxBolus = true + } else { + exceededMaxBolus = false + } } } } @@ -144,15 +152,21 @@ extension Bolus { header: { Text("Bolus") } Section { - Button(action: { - state.add() - }) { - Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") - .frame(maxWidth: .infinity, alignment: .center) + if state.amount == 0 { + Button { state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } else { + Button(action: { + state.add() + }) { + Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") + .frame(maxWidth: .infinity, alignment: .center) + } + .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) } .onAppear { configureView { @@ -387,13 +401,26 @@ extension Bolus { .foregroundColor(.secondary) } .padding() + + if exceededMaxBolus { + HStack { + let maxBolus = state.maxBolus + let maxBolusFormatted = maxBolus.formatted() + Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(unit)!") + } + .padding() + .fontWeight(.semibold) + .foregroundStyle(Color.loopRed) + } } .padding(.top, 10) .padding(.bottom, 15) // Hide button VStack { - Button { showInfo = false } + Button { + showInfo = false + } label: { Text("OK") } From 5bda95021f924e11e7eb8ce4601df4fe5fc02e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 30 Oct 2023 21:25:26 +0100 Subject: [PATCH 133/405] Don't run the algo twice in a row Reduce the delay --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a4d4bd0d1a..d6fe48f8fa 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -513,7 +513,6 @@ extension Home { Spacer() Button { state.showModal(for: .bolus(waitForSuggestion: true)) - state.apsManager.determineBasalSync() } label: { Image("bolus") From 4185165ad62be4d9bbb4568044f42446176b8b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 31 Oct 2023 12:50:06 +0100 Subject: [PATCH 134/405] Edit Meal entries from Boluse View (go back and forth). Not working with the waiter's notepad yet, but can be fixed later, as it's not that important in this reagard. (cherry picked from commit 3f5c93370ac27c5065bad5e14c64e2f2b5ee0318) --- .../Core_Data.xcdatamodel/contents | 2 +- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../Sources/APS/Storage/CarbsStorage.swift | 22 +++- .../Modules/AddCarbs/AddCarbsStateModel.swift | 47 ++++++-- .../AddCarbs/View/AddCarbsRootView.swift | 8 +- .../Modules/Bolus/BolusStateModel.swift | 10 ++ .../View/AlternativeBolusCalcRootView.swift | 112 +++++++++++++++++- .../Modules/Bolus/View/BolusRootView.swift | 5 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 1 + .../Modules/DataTable/DataTableProvider.swift | 4 +- .../Sources/Modules/Home/HomeStateModel.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 7 +- FreeAPS/Sources/Router/Screen.swift | 12 +- .../Services/Network/NightscoutAPI.swift | 6 +- .../Services/Network/NightscoutManager.swift | 14 +-- 15 files changed, 209 insertions(+), 45 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 41aaab7962..e32480087a 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 142d983415..2cfe78ebfa 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 2633686d3a..b0d9aeee81 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -12,7 +12,7 @@ protocol CarbsStorage { func syncDate() -> Date func recent() -> [CarbsEntry] func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] - func deleteCarbs(at date: Date) + func deleteCarbs(at date: String, complex: Bool?) } final class BaseCarbsStorage: CarbsStorage, Injectable { @@ -71,7 +71,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // New date for each carb equivalent var useDate = entries.last?.createdAt ?? Date() // Group and Identify all FPUs together - let fpuID = UUID().uuidString + let fpuID = (entries.last?.id ?? "") + ".fpu" // Create an array of all future carb equivalents. var futureCarbArray = [CarbsEntry]() while carbEquivalents > 0, numberOfEquivalents > 0 { @@ -81,7 +81,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) } let eachCarbEntry = CarbsEntry( - id: UUID().uuidString, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, + id: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, enteredBy: CarbsEntry.manual, isFPU: true, fpuID: fpuID ) @@ -143,11 +143,12 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? [] } - func deleteCarbs(at date: Date) { + func deleteCarbs(at id: String, complex: Bool?) { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - guard let entryIndex = allValues.firstIndex(where: { $0.createdAt == date }) else { + guard let entryIndex = allValues.firstIndex(where: { $0.id == id }) else { + debug(.default, "Didn't find anything to delete. Date to search for: " + id.description) return } @@ -166,6 +167,17 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { $0.carbsDidUpdate(allValues) } } + if let deleteComplexEntriesAlso = complex { + guard let fpuIndex = allValues.firstIndex(where: { $0.id == (id + ".fpu") }) else { + debug( + .default, + "Didn't find any complex fat and protein entries to delete. Date to search for: " + id.description + ) + return + } + allValues.removeAll(where: { $0.id == (id + ".fpu") }) + storage.save(allValues, as: OpenAPS.Monitor.carbHistory) + } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 87bc934d55..203a9031e5 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -18,6 +18,8 @@ extension AddCarbs { @Published var summation: [String] = [] @Published var maxCarbs: Decimal = 0 @Published var note: String = "" + @Published var id_: String = "" + @Published var summary: String = "" let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -34,24 +36,35 @@ extension AddCarbs { } carbs = min(carbs, maxCarbs) + id_ = UUID().uuidString + + let carbsToStore = [CarbsEntry( + id: id_, + createdAt: date, + carbs: carbs, + fat: fat, + protein: protein, + note: note, + enteredBy: CarbsEntry.manual, + isFPU: false, fpuID: nil + )] + carbsStorage.storeCarbs( - [CarbsEntry( - id: UUID().uuidString, - createdAt: date, - carbs: carbs, - fat: fat, - protein: protein, - note: note, - enteredBy: CarbsEntry.manual, - isFPU: false, fpuID: nil - )] + carbsToStore ) + /* + let entries = Meals( + carbs: carbs, protein: protein, fat: fat, note: note, summary: waitersNotepad(), id: id_, date: date, + enteredBy: CarbsEntry.manual, isFPU: false, fpuID: nil + ) + */ + if settingsManager.settings.skipBolusScreenAfterCarbs { apsManager.determineBasalSync() showModal(for: nil) } else { - showModal(for: .bolus(waitForSuggestion: true)) + showModal(for: .bolus(waitForSuggestion: true, meal: carbsToStore)) } } @@ -160,5 +173,17 @@ extension AddCarbs { } return waitersNotepadString } + + func loadEntries(_ editMode: Bool, _ meal: [CarbsEntry]?) { + if editMode { + if let entries = meal { + carbs = entries.first?.carbs ?? 0 + fat = entries.first?.fat ?? 0 + protein = entries.first?.protein ?? 0 + note = entries.first?.note ?? "" + id_ = entries.first?.id ?? "" + } + } + } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index fd5cb0ffff..6a50ace74e 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -5,6 +5,8 @@ import Swinject extension AddCarbs { struct RootView: BaseView { let resolver: Resolver + let editMode: Bool + let meal: [CarbsEntry]? @StateObject var state = StateModel() @State var dish: String = "" @State var isPromptPresented = false @@ -129,7 +131,11 @@ extension AddCarbs { } } } - .onAppear(perform: configureView) + .onAppear { + configureView { + state.loadEntries(editMode, meal) + } + } .navigationTitle("Add Meals") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 607b7975d1..cd72db9874 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -12,6 +12,7 @@ extension Bolus { // added for bolus calculator @Injected() var glucoseStorage: GlucoseStorage! @Injected() var settings: SettingsManager! + @Injected() var nsManager: NightscoutManager! @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @@ -209,6 +210,15 @@ extension Bolus { self.getDeltaBG() } } + + func backToCarbsView(_ meal: [CarbsEntry], _ complexEntry: Bool) { + debug(.apsManager, "Start deleting carbs") + nsManager.deleteCarbs( + at: meal.first?.id ?? "", isFPU: nil, fpuID: nil, syncID: meal.first?.id ?? "", + complex: complexEntry + ) + showModal(for: .addCarbs(editMode: true, meal: meal)) + } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b4b32ed112..9a63117d9e 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -6,6 +6,7 @@ extension Bolus { struct AlternativeBolusCalcRootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool + let meal: [CarbsEntry]? @ObservedObject var state: StateModel @State private var showInfo = false @@ -97,15 +98,65 @@ extension Bolus { } } } + } header: { Text("Values") } + + if changed { + Section { + VStack { + if let mealEntry = meal { + if (mealEntry.first?.carbs ?? 0) > 0 { + HStack { + Text("Carbs") + Spacer() + Text((mealEntry.first?.carbs ?? 0).formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if (mealEntry.first?.fat ?? 0) > 0 { + HStack { + Text("Fat") + Spacer() + Text((mealEntry.first?.fat ?? 0).formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if (mealEntry.first?.protein ?? 0) > 0 { + HStack { + Text("Protein") + Spacer() + Text((mealEntry.first?.protein ?? 0).formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if (mealEntry.first?.note ?? "") != "" { + HStack { + Text("Note") + Spacer() + Text(mealEntry.first?.note ?? "") + }.foregroundColor(.secondary) + } + } + } + } header: { Text("Meal Summary") } + } + + if changed { + Section { + Button { + if let exists = meal { + state.backToCarbsView(exists, hasFatOrProtein) + } + } + label: { Text("Edit Meal") }.frame(maxWidth: .infinity, alignment: .center) + } } - header: { Text("Values") } Section { if state.waitForSuggestion { HStack { Text("Wait please").foregroundColor(.secondary) Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + ActivityIndicator(isAnimating: .constant(true), style: .medium) } } else { HStack { @@ -172,6 +223,7 @@ extension Bolus { configureView { state.waitForSuggestionInitial = waitForSuggestion state.waitForSuggestion = waitForSuggestion + insulinCalculated = state.calculateInsulin() } } .navigationTitle("Enact Bolus") @@ -184,6 +236,20 @@ extension Bolus { } } + var changed: Bool { + if let exists = meal { + return ((exists.first?.carbs ?? 0) > 0 || (exists.first?.fat ?? 0) > 0 || (exists.first?.protein ?? 0) > 0) + } + return false + } + + var hasFatOrProtein: Bool { + if let exists = meal { + return ((exists.first?.fat ?? 0) > 0 || (exists.first?.protein ?? 0) > 0) + } + return false + } + // calculation showed in popup var bolusInfoAlternativeCalculator: some View { let unit = NSLocalizedString( @@ -193,7 +259,7 @@ extension Bolus { return VStack { VStack { - VStack { + VStack(spacing: 5) { HStack { Text("Calculations") .font(.title3) @@ -201,6 +267,46 @@ extension Bolus { Spacer() } .padding(.vertical, 10) + + if changed { + VStack(spacing: 3) { + if let mealEntry = meal { + if (mealEntry.first?.note ?? "") != "" { + HStack { + Text("Note") + .foregroundColor(.secondary) + Spacer() + Text(mealEntry.first?.note ?? "").foregroundColor(.secondary) + } + } + if (mealEntry.first?.carbs ?? 0) > 0 { + HStack { + Text("Carbs") + .foregroundColor(.secondary) + Spacer() + Text((mealEntry.first?.carbs ?? 0).formatted()) + } + } + if (mealEntry.first?.protein ?? 0) > 0 { + HStack { + Text("Protein") + .foregroundColor(.secondary) + Spacer() + Text((mealEntry.first?.protein ?? 0).formatted()) + } + } + if (mealEntry.first?.fat ?? 0) > 0 { + HStack { + Text("Fat") + .foregroundColor(.secondary) + Spacer() + Text((mealEntry.first?.fat ?? 0).formatted()) + } + } + } + }.padding(.bottom, 20) + } + HStack { Text("Carb Ratio") .foregroundColor(.secondary) diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 05de4c6644..d3f345ac4f 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -5,15 +5,16 @@ extension Bolus { struct RootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool + let meal: [CarbsEntry]? @StateObject var state = StateModel() var body: some View { if state.useCalc { // show alternative bolus calc based on toggle in bolus calc settings - AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, state: state) + AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal, state: state) } else { // show iAPS standard bolus calc - DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, state: state) + DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal, state: state) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1e4d078a4f..194b2182bf 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -5,6 +5,7 @@ extension Bolus { struct DefaultBolusCalcRootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool + let meal: [CarbsEntry]? @StateObject var state = StateModel() @State private var isAddInsulinAlertPresented = false diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index f5a8e50ddd..23337f55ce 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -33,10 +33,10 @@ extension DataTable { func deleteCarbs(_ treatement: Treatment) { nightscoutManager.deleteCarbs( - at: treatement.date, + at: treatement.id, isFPU: treatement.isFPU, fpuID: treatement.fpuID, - syncID: treatement.id + syncID: treatement.id, complex: nil ) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 715fe62f17..0f771d8eaf 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -196,7 +196,7 @@ extension Home { } func addCarbs() { - showModal(for: .addCarbs) + showModal(for: .addCarbs(editMode: false, meal: nil)) } func runLoop() { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index d6fe48f8fa..a427689b74 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -481,7 +481,7 @@ extension Home { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { - Button { state.showModal(for: .addCarbs) } + Button { state.showModal(for: .addCarbs(editMode: false, meal: nil)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image("carbs") @@ -512,7 +512,10 @@ extension Home { .buttonStyle(.borderless) Spacer() Button { - state.showModal(for: .bolus(waitForSuggestion: true)) + state.showModal(for: .bolus( + waitForSuggestion: true, + meal: nil + )) } label: { Image("bolus") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 5bd74814b5..74fe03b0e2 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -14,9 +14,9 @@ enum Screen: Identifiable, Hashable { case crEditor case targetsEditor case preferencesEditor - case addCarbs + case addCarbs(editMode: Bool, meal: [CarbsEntry]?) case addTempTarget - case bolus(waitForSuggestion: Bool) + case bolus(waitForSuggestion: Bool, meal: [CarbsEntry]?) case manualTempBasal case autotuneConfig case dataTable @@ -64,12 +64,12 @@ extension Screen { TargetsEditor.RootView(resolver: resolver) case .preferencesEditor: PreferencesEditor.RootView(resolver: resolver) - case .addCarbs: - AddCarbs.RootView(resolver: resolver) + case let .addCarbs(editMode, meal): + AddCarbs.RootView(resolver: resolver, editMode: editMode, meal: meal) case .addTempTarget: AddTempTarget.RootView(resolver: resolver) - case let .bolus(waitForSuggestion): - Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion) + case let .bolus(waitForSuggestion, meal): + Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal) case .manualTempBasal: ManualTempBasal.RootView(resolver: resolver) case .autotuneConfig: diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 7dd504a1cb..b0b9d9dde7 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -141,7 +141,7 @@ extension NightscoutAPI { .eraseToAnyPublisher() } - func deleteCarbs(at date: Date) -> AnyPublisher { + func deleteCarbs(at date: String) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme components.host = url.host @@ -150,8 +150,8 @@ extension NightscoutAPI { components.queryItems = [ URLQueryItem(name: "find[carbs][$exists]", value: "true"), URLQueryItem( - name: "find[created_at][$eq]", - value: Formatter.iso8601withFractionalSeconds.string(from: date) + name: "find[id][$eq]", + value: date ) ] diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 712e347817..cbf837a35b 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource { func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never> func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> - func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) + func deleteCarbs(at date: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -177,12 +177,12 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .eraseToAnyPublisher() } - func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) { + func deleteCarbs(at date: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) { // remove in AH healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID) guard let nightscout = nightscoutAPI, isUploadEnabled else { - carbsStorage.deleteCarbs(at: date) + carbsStorage.deleteCarbs(at: date, complex: complex) return } @@ -192,16 +192,16 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { let dates = allValues.filter { $0.fpuID == fpuID }.map(\.createdAt).removeDublicates() let publishers = dates - .map { d -> AnyPublisher in + .map { _ -> AnyPublisher in nightscout.deleteCarbs( - at: d + at: date ) } Publishers.MergeMany(publishers) .collect() .sink { completion in - self.carbsStorage.deleteCarbs(at: date) + self.carbsStorage.deleteCarbs(at: date, complex: complex) switch completion { case .finished: debug(.nightscout, "Carbs deleted") @@ -219,7 +219,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } else { nightscout.deleteCarbs(at: date) .sink { completion in - self.carbsStorage.deleteCarbs(at: date) + self.carbsStorage.deleteCarbs(at: date, complex: complex) switch completion { case .finished: debug(.nightscout, "Carbs deleted") From eb7c23b38f69206172a4bbcdb4d4acbcfbaaf550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 1 Nov 2023 01:21:19 +0100 Subject: [PATCH 135/405] Refactor. Use CoreData. Clean up (needs nore) --- .../Core_Data.xcdatamodel/contents | 8 + .../Sources/APS/Storage/CarbsStorage.swift | 22 +- .../Sources/Models/NightscoutTreatment.swift | 2 + .../Modules/AddCarbs/AddCarbsStateModel.swift | 55 +-- .../AddCarbs/View/AddCarbsRootView.swift | 5 +- .../Modules/Bolus/BolusStateModel.swift | 23 +- .../View/AlternativeBolusCalcRootView.swift | 359 ++++++++---------- .../Modules/Bolus/View/BolusRootView.swift | 6 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 3 +- .../Sources/Modules/Home/HomeStateModel.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 4 +- FreeAPS/Sources/Router/Screen.swift | 12 +- .../Services/Network/NightscoutAPI.swift | 4 +- .../Services/Network/NightscoutManager.swift | 16 +- 14 files changed, 246 insertions(+), 275 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index e32480087a..fefaa04c75 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -54,6 +54,14 @@ + + + + + + + + diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index b0d9aeee81..4e17fb933d 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -12,7 +12,7 @@ protocol CarbsStorage { func syncDate() -> Date func recent() -> [CarbsEntry] func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] - func deleteCarbs(at date: String, complex: Bool?) + func deleteCarbs(at uniqueID: String, complex: Bool?) } final class BaseCarbsStorage: CarbsStorage, Injectable { @@ -101,7 +101,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } // ------------------------- END OF TPU ---------------------------------------- // Store the actual (normal) carbs if entries.last?.carbs ?? 0 > 0 { - uniqEvents = [] + // uniqEvents = [] self.storage.transaction { storage in storage.append(entries, to: file, uniqBy: \.createdAt) uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? @@ -143,12 +143,12 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? [] } - func deleteCarbs(at id: String, complex: Bool?) { + func deleteCarbs(at uniqueID: String, complex: Bool?) { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - guard let entryIndex = allValues.firstIndex(where: { $0.id == id }) else { - debug(.default, "Didn't find anything to delete. Date to search for: " + id.description) + guard let entryIndex = allValues.firstIndex(where: { $0.id == uniqueID }) else { + debug(.default, "Didn't find anything to delete. Date to search for: " + uniqueID.description) return } @@ -167,15 +167,16 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { $0.carbsDidUpdate(allValues) } } - if let deleteComplexEntriesAlso = complex { - guard let fpuIndex = allValues.firstIndex(where: { $0.id == (id + ".fpu") }) else { + // When deleting both carbs and fat and protein (complex meal entry) + if let deleteComplexEntriesAlso = complex, deleteComplexEntriesAlso { + guard let fpuIndex = allValues.firstIndex(where: { $0.id == (uniqueID + ".fpu") }) else { debug( .default, - "Didn't find any complex fat and protein entries to delete. Date to search for: " + id.description + "Didn't find any complex fat and protein entries to delete. Date to search for: " + uniqueID.description ) return } - allValues.removeAll(where: { $0.id == (id + ".fpu") }) + allValues.removeAll(where: { $0.id == (uniqueID + ".fpu") }) storage.save(allValues, as: OpenAPS.Monitor.carbHistory) } } @@ -202,7 +203,8 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { protein: nil, foodType: $0.note, targetTop: nil, - targetBottom: nil + targetBottom: nil, + id: $0.id ) } return Array(Set(treatments).subtracting(Set(uploaded))) diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index 5c9e867d1a..83abffae3d 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -21,6 +21,7 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { var glucoseType: String? var glucose: String? var units: String? + var id: String? static let local = "iAPS" @@ -57,5 +58,6 @@ extension NigtscoutTreatment { case glucoseType case glucose case units + case id } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 203a9031e5..5d457e6c08 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -35,7 +35,6 @@ extension AddCarbs { return } carbs = min(carbs, maxCarbs) - id_ = UUID().uuidString let carbsToStore = [CarbsEntry( @@ -48,24 +47,15 @@ extension AddCarbs { enteredBy: CarbsEntry.manual, isFPU: false, fpuID: nil )] - - carbsStorage.storeCarbs( - carbsToStore - ) - - /* - let entries = Meals( - carbs: carbs, protein: protein, fat: fat, note: note, summary: waitersNotepad(), id: id_, date: date, - enteredBy: CarbsEntry.manual, isFPU: false, fpuID: nil - ) - */ + carbsStorage.storeCarbs(carbsToStore) if settingsManager.settings.skipBolusScreenAfterCarbs { apsManager.determineBasalSync() showModal(for: nil) - } else { - showModal(for: .bolus(waitForSuggestion: true, meal: carbsToStore)) - } + } else if carbs > 0 { + saveToCoreData(carbsToStore) + showModal(for: .bolus(waitForSuggestion: true, fetch: true)) + } else { hideModal() } } func deletePreset() { @@ -174,16 +164,37 @@ extension AddCarbs { return waitersNotepadString } - func loadEntries(_ editMode: Bool, _ meal: [CarbsEntry]?) { + func loadEntries(_ editMode: Bool) { if editMode { - if let entries = meal { - carbs = entries.first?.carbs ?? 0 - fat = entries.first?.fat ?? 0 - protein = entries.first?.protein ?? 0 - note = entries.first?.note ?? "" - id_ = entries.first?.id ?? "" + coredataContext.perform { + var mealToEdit = [Meals]() + let requestMeal = Meals.fetchRequest() as NSFetchRequest + let sortMeal = NSSortDescriptor(key: "createdAt", ascending: false) + requestMeal.sortDescriptors = [sortMeal] + requestMeal.fetchLimit = 1 + try? mealToEdit = self.coredataContext.fetch(requestMeal) + + self.carbs = Decimal(mealToEdit.first?.carbs ?? 0) + self.fat = Decimal(mealToEdit.first?.fat ?? 0) + self.protein = Decimal(mealToEdit.first?.protein ?? 0) + self.note = mealToEdit.first?.note ?? "" + self.id_ = mealToEdit.first?.id ?? "" } } } + + func saveToCoreData(_ stored: [CarbsEntry]) { + let save = Meals(context: coredataContext) + save.id = stored.first?.id ?? "" + save.createdAt = stored.first?.createdAt ?? .distantPast + save.id = stored.first?.id ?? "" + save.carbs = Double(stored.first?.carbs ?? 0) + save.fat = Double(stored.first?.fat ?? 0) + save.protein = Double(stored.first?.protein ?? 0) + save.note = stored.first?.note ?? "" + if coredataContext.hasChanges { + try? coredataContext.save() + } + } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 6a50ace74e..278d6cb527 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -6,7 +6,6 @@ extension AddCarbs { struct RootView: BaseView { let resolver: Resolver let editMode: Bool - let meal: [CarbsEntry]? @StateObject var state = StateModel() @State var dish: String = "" @State var isPromptPresented = false @@ -120,7 +119,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text("Save and continue") } + label: { Text(state.carbs > 0 ? "Save and continue" : "Save") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } @@ -133,7 +132,7 @@ extension AddCarbs { } .onAppear { configureView { - state.loadEntries(editMode, meal) + state.loadEntries(editMode) } } .navigationTitle("Add Meals") diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index cd72db9874..4e16fb9e4b 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -37,7 +37,6 @@ extension Bolus { var waitForSuggestionInitial: Bool = false // added for bolus calculator - @Published var glucose: [BloodGlucose] = [] @Published var recentGlucose: BloodGlucose? @Published var target: Decimal = 0 @Published var cob: Decimal = 0 @@ -59,7 +58,13 @@ extension Bolus { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var useFattyMealCorrectionFactor: Bool = false - @Published var currentTime: String = "" + @Published var eventualBG: Int = 0 + + @Published var meal: [CarbsEntry]? + @Published var carbs: Decimal = 0 + @Published var fat: Decimal = 0 + @Published var protein: Decimal = 0 + @Published var note: String = "" override func subscribe() { setupInsulinRequired() @@ -91,17 +96,14 @@ extension Bolus { func getDeltaBG() { let glucose = glucoseStorage.recent() guard glucose.count >= 3 else { return } - let lastGlucose = glucose.last! - let thirdLastGlucose = glucose[glucose.count - 3] let delta = Decimal(lastGlucose.glucose!) - Decimal(thirdLastGlucose.glucose!) - deltaBG = delta } // CALCULATIONS FOR THE BOLUS CALCULATOR - func calculateInsulin() -> Decimal { + func calculateInsulin() { // for mmol conversion var conversion: Decimal = 1.0 if units == .mmolL { @@ -152,7 +154,7 @@ extension Bolus { let insulinCalculatedAsDouble = Double(insulinCalculated) roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) - return insulinCalculated + insulinRecommended = min(insulinCalculated, maxBolus) } func add() { @@ -206,18 +208,17 @@ extension Bolus { self.insulinRecommended = self.apsManager .roundBolus(amount: max(self.insulinRecommended, 0)) - self.getDeltaBG() } } - func backToCarbsView(_ meal: [CarbsEntry], _ complexEntry: Bool) { + func backToCarbsView(complexEntry: Bool, _ id: String) { debug(.apsManager, "Start deleting carbs") nsManager.deleteCarbs( - at: meal.first?.id ?? "", isFPU: nil, fpuID: nil, syncID: meal.first?.id ?? "", + at: id, isFPU: nil, fpuID: nil, syncID: id, complex: complexEntry ) - showModal(for: .addCarbs(editMode: true, meal: meal)) + showModal(for: .addCarbs(editMode: true)) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 9a63117d9e..8ed84b70b8 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -1,20 +1,23 @@ +import Charts +import CoreData import SwiftUI import Swinject extension Bolus { - // alternative bolus calc struct AlternativeBolusCalcRootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool - let meal: [CarbsEntry]? - @ObservedObject var state: StateModel - + let fetch: Bool + @StateObject var state: StateModel @State private var showInfo = false @State private var exceededMaxBolus = false - @State var insulinCalculated: Decimal = 0 - @Environment(\.colorScheme) var colorScheme + @FetchRequest( + entity: Meals.entity(), + sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false)] + ) var meal: FetchedResults + private var formatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -39,45 +42,66 @@ extension Bolus { var body: some View { Form { - Section { + if state.waitForSuggestion { HStack { - Text("Glucose") - DecimalTextField( - "0", - value: Binding( - get: { - if state.units == .mmolL { - return state.currentBG.asMmolL - } else { - return state.currentBG - } - }, - set: { newValue in - if state.units == .mmolL { - state.currentBG = newValue.asMmolL - } else { - state.currentBG = newValue - } - } - ), - formatter: gluoseFormatter, - autofocus: false, - cleanInput: true - ) - .onChange(of: state.currentBG) { newValue in - if newValue > 500 { - state.currentBG = 500 // ensure that user can not input more than 500 mg/dL + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } + Section { + if fetch { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) } - insulinCalculated = state.calculateInsulin() } - Text(state.units.rawValue) - .foregroundColor(.secondary) + } else { + Text("No Meal") + } + } header: { Text("Meal Summary") } + + Section { + Button { + let id_ = meal.first?.id ?? "" + state.backToCarbsView(complexEntry: fetch, id_) } - .contentShape(Rectangle()) + label: { Text("Edit Meal / Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + } + + Section { HStack { Button(action: { showInfo.toggle() - insulinCalculated = state.calculateInsulin() + state.calculateInsulin() }, label: { Image(systemName: "info.circle") Text("Calculations") @@ -94,172 +118,94 @@ extension Bolus { .toggleStyle(CheckboxToggleStyle()) .font(.footnote) .onChange(of: state.useFattyMealCorrectionFactor) { _ in - insulinCalculated = state.calculateInsulin() + state.calculateInsulin() } } } - } header: { Text("Values") } - if changed { - Section { - VStack { - if let mealEntry = meal { - if (mealEntry.first?.carbs ?? 0) > 0 { - HStack { - Text("Carbs") - Spacer() - Text((mealEntry.first?.carbs ?? 0).formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if (mealEntry.first?.fat ?? 0) > 0 { - HStack { - Text("Fat") - Spacer() - Text((mealEntry.first?.fat ?? 0).formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if (mealEntry.first?.protein ?? 0) > 0 { - HStack { - Text("Protein") - Spacer() - Text((mealEntry.first?.protein ?? 0).formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if (mealEntry.first?.note ?? "") != "" { - HStack { - Text("Note") - Spacer() - Text(mealEntry.first?.note ?? "") - }.foregroundColor(.secondary) - } - } - } - } header: { Text("Meal Summary") } - } - - if changed { - Section { - Button { - if let exists = meal { - state.backToCarbsView(exists, hasFatOrProtein) - } - } - label: { Text("Edit Meal") }.frame(maxWidth: .infinity, alignment: .center) - } - } + HStack { + Text("Recommended Bolus") + Spacer() + Text( + formatter + .string(from: Double(state.insulinRecommended) as NSNumber)! + ) + Text( + NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") + ).foregroundColor(.secondary) + }.contentShape(Rectangle()) + .onTapGesture { state.amount = state.insulinRecommended } - Section { - if state.waitForSuggestion { + if !state.waitForSuggestion { HStack { - Text("Wait please").foregroundColor(.secondary) + Text("Bolus") Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) - } - } else { - HStack { - Text("Recommended Bolus") - Spacer() - - Text( - formatter - .string(from: Double(insulinCalculated) as NSNumber)! - ) - let unit = NSLocalizedString( - " U", - comment: "Unit in number of units delivered (keep the space character!)" + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true ) - Text(unit).foregroundColor(.secondary) - }.contentShape(Rectangle()) - .onTapGesture { - state.amount = insulinCalculated - } - - if !state.waitForSuggestion { - HStack { - Text("Bolus") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: false, - cleanInput: true - ) - Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) - } - .onChange(of: state.amount) { newValue in - if newValue > state.maxBolus { - exceededMaxBolus = true - } else { - exceededMaxBolus = false - } + Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) + } + .onChange(of: state.amount) { newValue in + if newValue > state.maxBolus { + exceededMaxBolus = true + } else { + exceededMaxBolus = false } } } - } - header: { Text("Bolus") } + } header: { Text("Bolus Summary") } Section { - if state.amount == 0 { + if state.amount == 0, waitForSuggestion { Button { state.showModal(for: nil) } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } else { - Button(action: { - state.add() - }) { - Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") - .frame(maxWidth: .infinity, alignment: .center) - } - .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) - } - } - .onAppear { - configureView { - state.waitForSuggestionInitial = waitForSuggestion - state.waitForSuggestion = waitForSuggestion - insulinCalculated = state.calculateInsulin() + Button { state.add() } + label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } + .frame(maxWidth: .infinity, alignment: .center) + .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } } - .navigationTitle("Enact Bolus") - .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) } .blur(radius: showInfo ? 3 : 0) + .navigationTitle("Enact Bolus") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + + .onAppear { + configureView { + state.waitForSuggestionInitial = waitForSuggestion + state.waitForSuggestion = waitForSuggestion + state.calculateInsulin() + } + } + .popup(isPresented: showInfo) { bolusInfoAlternativeCalculator } } var changed: Bool { - if let exists = meal { - return ((exists.first?.carbs ?? 0) > 0 || (exists.first?.fat ?? 0) > 0 || (exists.first?.protein ?? 0) > 0) - } - return false + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } var hasFatOrProtein: Bool { - if let exists = meal { - return ((exists.first?.fat ?? 0) > 0 || (exists.first?.protein ?? 0) > 0) - } - return false + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } // calculation showed in popup var bolusInfoAlternativeCalculator: some View { - let unit = NSLocalizedString( - " U", - comment: "Unit in number of units delivered (keep the space character!)" - ) - - return VStack { + VStack { + let unit = NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") VStack { - VStack(spacing: 5) { + VStack(spacing: 2) { HStack { Text("Calculations") .font(.title3) @@ -268,43 +214,45 @@ extension Bolus { } .padding(.vertical, 10) - if changed { - VStack(spacing: 3) { - if let mealEntry = meal { - if (mealEntry.first?.note ?? "") != "" { - HStack { - Text("Note") - .foregroundColor(.secondary) - Spacer() - Text(mealEntry.first?.note ?? "").foregroundColor(.secondary) - } + if fetch { + VStack { + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + .foregroundColor(.secondary) + Spacer() + Text(note) } - if (mealEntry.first?.carbs ?? 0) > 0 { - HStack { - Text("Carbs") - .foregroundColor(.secondary) - Spacer() - Text((mealEntry.first?.carbs ?? 0).formatted()) - } + } + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + .foregroundColor(.secondary) + Spacer() + Text(carbs.formatted()) + Text("g").foregroundColor(.secondary) } - if (mealEntry.first?.protein ?? 0) > 0 { - HStack { - Text("Protein") - .foregroundColor(.secondary) - Spacer() - Text((mealEntry.first?.protein ?? 0).formatted()) - } + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + .foregroundColor(.secondary) + Spacer() + Text(protein.formatted()) + Text("g").foregroundColor(.secondary) } - if (mealEntry.first?.fat ?? 0) > 0 { - HStack { - Text("Fat") - .foregroundColor(.secondary) - Spacer() - Text((mealEntry.first?.fat ?? 0).formatted()) - } + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + .foregroundColor(.secondary) + Spacer() + Text(fat.formatted()).foregroundColor(.orange) + Text("g").foregroundColor(.secondary) } } - }.padding(.bottom, 20) + } + Divider().fontWeight(.bold).padding(10) } HStack { @@ -360,10 +308,11 @@ extension Bolus { .foregroundColor(.orange) } } + Divider().fontWeight(.bold).foregroundColor(.white) } .padding() - VStack { + VStack(spacing: 2) { HStack { Text("Glucose") .foregroundColor(.secondary) @@ -454,7 +403,7 @@ extension Bolus { .padding() Divider() - .fontWeight(.bold) + .fontWeight(.bold).foregroundColor(.white) HStack { Text("Full Bolus") @@ -522,7 +471,7 @@ extension Bolus { .padding(.top, 10) .padding(.bottom, 15) - // Hide button + // Hide pop-up VStack { Button { showInfo = false diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index d3f345ac4f..6b381cce2a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -5,16 +5,16 @@ extension Bolus { struct RootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool - let meal: [CarbsEntry]? + let fetch: Bool @StateObject var state = StateModel() var body: some View { if state.useCalc { // show alternative bolus calc based on toggle in bolus calc settings - AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal, state: state) + AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch, state: state) } else { // show iAPS standard bolus calc - DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal, state: state) + DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch, state: state) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 194b2182bf..1054f3bae3 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -5,7 +5,7 @@ extension Bolus { struct DefaultBolusCalcRootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool - let meal: [CarbsEntry]? + let fetch: Bool @StateObject var state = StateModel() @State private var isAddInsulinAlertPresented = false @@ -212,7 +212,6 @@ extension Bolus { .background( RoundedRectangle(cornerRadius: 8, style: .continuous) .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) - // .fill(Color(.systemGray).gradient) // A more prominent pop-up, but harder to read ) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 0f771d8eaf..2075d544b6 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -196,7 +196,7 @@ extension Home { } func addCarbs() { - showModal(for: .addCarbs(editMode: false, meal: nil)) + showModal(for: .addCarbs(editMode: false)) } func runLoop() { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a427689b74..acc79ac51f 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -481,7 +481,7 @@ extension Home { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { - Button { state.showModal(for: .addCarbs(editMode: false, meal: nil)) } + Button { state.showModal(for: .addCarbs(editMode: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image("carbs") @@ -514,7 +514,7 @@ extension Home { Button { state.showModal(for: .bolus( waitForSuggestion: true, - meal: nil + fetch: false )) } label: { diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 74fe03b0e2..26a2b13dc1 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -14,9 +14,9 @@ enum Screen: Identifiable, Hashable { case crEditor case targetsEditor case preferencesEditor - case addCarbs(editMode: Bool, meal: [CarbsEntry]?) + case addCarbs(editMode: Bool) case addTempTarget - case bolus(waitForSuggestion: Bool, meal: [CarbsEntry]?) + case bolus(waitForSuggestion: Bool, fetch: Bool) case manualTempBasal case autotuneConfig case dataTable @@ -64,12 +64,12 @@ extension Screen { TargetsEditor.RootView(resolver: resolver) case .preferencesEditor: PreferencesEditor.RootView(resolver: resolver) - case let .addCarbs(editMode, meal): - AddCarbs.RootView(resolver: resolver, editMode: editMode, meal: meal) + case let .addCarbs(editMode): + AddCarbs.RootView(resolver: resolver, editMode: editMode) case .addTempTarget: AddTempTarget.RootView(resolver: resolver) - case let .bolus(waitForSuggestion, meal): - Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion, meal: meal) + case let .bolus(waitForSuggestion, fetch): + Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch) case .manualTempBasal: ManualTempBasal.RootView(resolver: resolver) case .autotuneConfig: diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index b0b9d9dde7..155610ac15 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -141,7 +141,7 @@ extension NightscoutAPI { .eraseToAnyPublisher() } - func deleteCarbs(at date: String) -> AnyPublisher { + func deleteCarbs(at uniqueID: String) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme components.host = url.host @@ -151,7 +151,7 @@ extension NightscoutAPI { URLQueryItem(name: "find[carbs][$exists]", value: "true"), URLQueryItem( name: "find[id][$eq]", - value: date + value: uniqueID ) ] diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index cbf837a35b..d4e11ce68c 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource { func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never> func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> - func deleteCarbs(at date: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -177,31 +177,31 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .eraseToAnyPublisher() } - func deleteCarbs(at date: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) { + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) { // remove in AH healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID) guard let nightscout = nightscoutAPI, isUploadEnabled else { - carbsStorage.deleteCarbs(at: date, complex: complex) + carbsStorage.deleteCarbs(at: uniqueID, complex: complex) return } if let isFPU = isFPU, isFPU { guard let fpuID = fpuID else { return } let allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - let dates = allValues.filter { $0.fpuID == fpuID }.map(\.createdAt).removeDublicates() + let dates = allValues.filter { $0.fpuID == fpuID }.map(\.id).removeDublicates() let publishers = dates .map { _ -> AnyPublisher in nightscout.deleteCarbs( - at: date + at: uniqueID ) } Publishers.MergeMany(publishers) .collect() .sink { completion in - self.carbsStorage.deleteCarbs(at: date, complex: complex) + self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex) switch completion { case .finished: debug(.nightscout, "Carbs deleted") @@ -217,9 +217,9 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .store(in: &lifetime) } else { - nightscout.deleteCarbs(at: date) + nightscout.deleteCarbs(at: uniqueID) .sink { completion in - self.carbsStorage.deleteCarbs(at: date, complex: complex) + self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex) switch completion { case .finished: debug(.nightscout, "Carbs deleted") From 72c999f67ebee3aa46a91de9785474c1223e7515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 1 Nov 2023 02:53:23 +0100 Subject: [PATCH 136/405] Only use the CoreData data when needed --- .../Modules/Bolus/BolusStateModel.swift | 29 +++-- .../View/AlternativeBolusCalcRootView.swift | 120 +++++++++--------- 2 files changed, 79 insertions(+), 70 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 4e16fb9e4b..5ec4131bd9 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -153,7 +153,6 @@ extension Bolus { insulinCalculated = max(insulinCalculated, 0) let insulinCalculatedAsDouble = Double(insulinCalculated) roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) - insulinRecommended = min(insulinCalculated, maxBolus) } @@ -193,9 +192,11 @@ extension Bolus { self.basal = self.provider.suggestion?.rate ?? 0 self.carbRatio = self.provider.suggestion?.carbRatio ?? 0 - if self.settingsManager.settings.insulinReqPercentage != 100 { - self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) - } else { self.insulinRecommended = self.insulin } + if !self.useCalc { + if self.settingsManager.settings.insulinReqPercentage != 100 { + self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) + } else { self.insulinRecommended = self.insulin } + } self.errorString = self.provider.suggestion?.manualBolusErrorString ?? 0 if self.errorString != 0 { @@ -206,19 +207,22 @@ extension Bolus { self.minPredBG = (self.provider.suggestion?.minPredBG ?? 0) * conversion } else { self.error = false } - self.insulinRecommended = self.apsManager - .roundBolus(amount: max(self.insulinRecommended, 0)) + if !self.useCalc { + self.insulinRecommended = self.apsManager + .roundBolus(amount: max(self.insulinRecommended, 0)) + } self.getDeltaBG() } } func backToCarbsView(complexEntry: Bool, _ id: String) { - debug(.apsManager, "Start deleting carbs") - nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id, - complex: complexEntry - ) - showModal(for: .addCarbs(editMode: true)) + if complexEntry { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id, + complex: complexEntry + ) + } + showModal(for: .addCarbs(editMode: complexEntry)) } } } @@ -229,5 +233,6 @@ extension Bolus.StateModel: SuggestionObserver { self.waitForSuggestion = false } setupInsulinRequired() + if useCalc { calculateInsulin() } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 8ed84b70b8..13565feb56 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -209,7 +209,6 @@ extension Bolus { HStack { Text("Calculations") .font(.title3) - .fontWeight(.semibold) Spacer() } .padding(.vertical, 10) @@ -251,66 +250,71 @@ extension Bolus { Text("g").foregroundColor(.secondary) } } - } - Divider().fontWeight(.bold).padding(10) + }.padding() } - HStack { - Text("Carb Ratio") - .foregroundColor(.secondary) - Spacer() + Divider().fontWeight(.bold) - Text(state.carbRatio.formatted()) - Text(NSLocalizedString(" g/U", comment: " grams per Unit")) - .foregroundColor(.secondary) - } - HStack { - Text("ISF") - .foregroundColor(.secondary) - Spacer() - let isf = state.isf - Text(isf.formatted()) - Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) - .foregroundColor(.secondary) - } - HStack { - Text("Target Glucose") - .foregroundColor(.secondary) - Spacer() - let target = state.units == .mmolL ? state.target.asMmolL : state.target - Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue) - .foregroundColor(.secondary) - } - HStack { - Text("Basal") - .foregroundColor(.secondary) - Spacer() - let basal = state.basal - Text(basal.formatted()) - Text(NSLocalizedString(" U/h", comment: " Units per hour")) - .foregroundColor(.secondary) - } - HStack { - Text("Fraction") - .foregroundColor(.secondary) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - } - if state.useFattyMealCorrectionFactor { + VStack { + HStack { + Text("Carb Ratio") + .foregroundColor(.secondary) + Spacer() + Text(state.carbRatio.formatted()) + Text(NSLocalizedString(" g/U", comment: " grams per Unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF") + .foregroundColor(.secondary) + Spacer() + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } HStack { - Text("Fatty Meal Factor") - .foregroundColor(.orange) + Text("Target Glucose") + .foregroundColor(.secondary) Spacer() - let fraction = state.fattyMealFactor + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text( + target + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + ) + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + HStack { + Text("Basal") + .foregroundColor(.secondary) + Spacer() + let basal = state.basal + Text(basal.formatted()) + Text(NSLocalizedString(" U/h", comment: " Units per hour")) + .foregroundColor(.secondary) + } + HStack { + Text("Fraction") + .foregroundColor(.secondary) + Spacer() + let fraction = state.fraction Text(fraction.formatted()) - .foregroundColor(.orange) + } + if state.useFattyMealCorrectionFactor { + HStack { + Text("Fatty Meal Factor") + .foregroundColor(.orange) + Spacer() + let fraction = state.fattyMealFactor + Text(fraction.formatted()) + .foregroundColor(.orange) + } } } - Divider().fontWeight(.bold).foregroundColor(.white) - } - .padding() + }.padding() + + Divider().fontWeight(.bold) VStack(spacing: 2) { HStack { @@ -403,7 +407,7 @@ extension Bolus { .padding() Divider() - .fontWeight(.bold).foregroundColor(.white) + .fontWeight(.bold) HStack { Text("Full Bolus") @@ -413,11 +417,9 @@ extension Bolus { Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) Text(unit) .foregroundColor(.secondary) - } - .padding() + }.padding() - Divider() - .fontWeight(.bold) + Divider().fontWeight(.bold) HStack { Text("Result") @@ -457,6 +459,8 @@ extension Bolus { } .padding() + Divider() + if exceededMaxBolus { HStack { let maxBolus = state.maxBolus From 1e600499ecae6bc6a78cd34adfa69cf563a18df8 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 29 Oct 2023 17:51:16 +0100 Subject: [PATCH 137/405] Change labels (#289) * All occurances of "Non-Pump" or "nonPump" in texts and code changed to "External" * Removed label "Automatic" for SMBs in history --- .../APS/Storage/PumpHistoryStorage.swift | 6 ++-- .../Main/de.lproj/Localizable.strings | 4 +-- .../Main/en.lproj/Localizable.strings | 8 ++--- FreeAPS/Sources/Models/PumpHistoryEvent.swift | 10 +++--- .../Modules/Bolus/BolusStateModel.swift | 2 +- .../Modules/DataTable/DataTableDataFlow.swift | 14 ++++---- .../DataTable/DataTableStateModel.swift | 22 ++++++------ .../DataTable/View/DataTableRootView.swift | 34 +++++++++---------- 8 files changed, 49 insertions(+), 51 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift index b3b034f0de..45387e6d8b 100644 --- a/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift +++ b/FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift @@ -46,7 +46,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { temp: nil, carbInput: nil, isSMB: dose.automatic, - isNonPumpInsulin: dose.manuallyEntered + isExternal: dose.manuallyEntered )] case .tempBasal: guard let dose = event.dose else { return [] } @@ -215,8 +215,8 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable { if event.isSMB ?? false { return .smb } - if event.isNonPumpInsulin ?? false { - return .nonPumpInsulin + if event.isExternal ?? false { + return .isExternal } return event.type } diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index e7b8112ce7..15ccfaa23e 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1171,8 +1171,8 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; -/* A manually entered dose of non-pump insulin */ -"Non-pump Insulin" = "Externes Insulin"; +/* A manually entered dose of external insulin */ +"External Insulin" = "Externes Insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuelle Temporäre Basalrate"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 8cd859d1b3..dee32097ae 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -569,8 +569,8 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; -/* Non-pump insulin treatments */ -"Non-Pump" = "Non-Pump"; +/* External insulin treatments */ +"External" = "External"; /* */ "Other" = "Other"; @@ -1175,8 +1175,8 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; -/* A manually entered dose of non-pump insulin */ -"Non-pump Insulin" = "Non-pump Insulin"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Models/PumpHistoryEvent.swift b/FreeAPS/Sources/Models/PumpHistoryEvent.swift index c53362d3d9..320f6de833 100644 --- a/FreeAPS/Sources/Models/PumpHistoryEvent.swift +++ b/FreeAPS/Sources/Models/PumpHistoryEvent.swift @@ -12,7 +12,7 @@ struct PumpHistoryEvent: JSON, Equatable { let carbInput: Int? let note: String? let isSMB: Bool? - let isNonPumpInsulin: Bool? + let isExternal: Bool? init( id: String, @@ -26,7 +26,7 @@ struct PumpHistoryEvent: JSON, Equatable { carbInput: Int? = nil, note: String? = nil, isSMB: Bool? = nil, - isNonPumpInsulin: Bool? = nil + isExternal: Bool? = nil ) { self.id = id self.type = type @@ -39,14 +39,14 @@ struct PumpHistoryEvent: JSON, Equatable { self.carbInput = carbInput self.note = note self.isSMB = isSMB - self.isNonPumpInsulin = isNonPumpInsulin + self.isExternal = isExternal } } enum EventType: String, JSON { case bolus = "Bolus" case smb = "SMB" - case nonPumpInsulin = "Non-pump Insulin" + case isExternal = "External Insulin" case mealBolus = "Meal Bolus" case correctionBolus = "Correction Bolus" case snackBolus = "Snack Bolus" @@ -90,6 +90,6 @@ extension PumpHistoryEvent { case carbInput = "carb_input" case note case isSMB - case isNonPumpInsulin + case isExternal } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 72a53a01a6..2cedb4068d 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -87,7 +87,7 @@ extension Bolus { rate: nil, temp: nil, carbInput: nil, - isNonPumpInsulin: true + isExternal: true ) ] ) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift index 41f448f414..7a744ca704 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift @@ -67,7 +67,7 @@ enum DataTable { let fpuID: String? let note: String? let isSMB: Bool? - let isNonPump: Bool? + let isExternal: Bool? private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -96,7 +96,7 @@ enum DataTable { fpuID: String? = nil, note: String? = nil, isSMB: Bool? = nil, - isNonPump: Bool? = nil + isExternal: Bool? = nil ) { self.units = units self.type = type @@ -110,7 +110,7 @@ enum DataTable { self.fpuID = fpuID self.note = note self.isSMB = isSMB - self.isNonPump = isNonPump + self.isExternal = isExternal } static func == (lhs: Treatment, rhs: Treatment) -> Bool { @@ -139,11 +139,9 @@ enum DataTable { .string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carb equilvalents") case .bolus: var bolusText = " " - - if isSMB ?? false { - bolusText += NSLocalizedString("Automatic", comment: "Automatic delivered treatments") - } else if isNonPump ?? false { - bolusText += NSLocalizedString("Non-Pump", comment: "Non-pump Insulin") + if isSMB ?? false {} + else if isExternal ?? false { + bolusText += NSLocalizedString("External", comment: "External Insulin") } else { bolusText += NSLocalizedString("Manual", comment: "Manual Bolus") } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 679e19e239..1826591275 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -16,8 +16,8 @@ extension DataTable { @Published var glucose: [Glucose] = [] @Published var manualGlucose: Decimal = 0 @Published var maxBolus: Decimal = 0 - @Published var nonPumpInsulinAmount: Decimal = 0 - @Published var nonPumpInsulinDate = Date() + @Published var externalInsulinAmount: Decimal = 0 + @Published var externalInsulinDate = Date() var units: GlucoseUnits = .mmolL @@ -79,7 +79,7 @@ extension DataTable { amount: $0.amount, idPumpEvent: $0.id, isSMB: $0.isSMB, - isNonPump: $0.isNonPumpInsulin + isExternal: $0.isExternal ) } @@ -199,13 +199,13 @@ extension DataTable { saveToHealth.append(saveToJSON) } - func addNonPumpInsulin() { - guard nonPumpInsulinAmount > 0 else { + func addExternalInsulin() { + guard externalInsulinAmount > 0 else { showModal(for: nil) return } - nonPumpInsulinAmount = min(nonPumpInsulinAmount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin + externalInsulinAmount = min(externalInsulinAmount, maxBolus * 3) // Allow for 3 * Max Bolus for external insulin unlockmanager.unlock() .sink { _ in } receiveValue: { [weak self] _ in guard let self = self else { return } @@ -214,21 +214,21 @@ extension DataTable { PumpHistoryEvent( id: UUID().uuidString, type: .bolus, - timestamp: nonPumpInsulinDate, - amount: nonPumpInsulinAmount, + timestamp: externalInsulinDate, + amount: externalInsulinAmount, duration: nil, durationMin: nil, rate: nil, temp: nil, carbInput: nil, - isNonPumpInsulin: true + isExternal: true ) ] ) - debug(.default, "Non-pump insulin saved to pumphistory.json") + debug(.default, "External insulin saved to pumphistory.json") // Reset amount to 0 for next entry. - nonPumpInsulinAmount = 0 + externalInsulinAmount = 0 } .store(in: &lifetime) } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index f0b9feb347..014c1ba37b 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -11,7 +11,7 @@ extension DataTable { @State private var removeCarbsAlert: Alert? @State private var isRemoveInsulinAlertPresented = false @State private var removeInsulinAlert: Alert? - @State private var showNonPumpInsulin: Bool = false + @State private var showExternalInsulin: Bool = false @State private var showFutureEntries: Bool = false // default to hide future entries @State private var showManualGlucose: Bool = false @State private var isAmountUnconfirmed: Bool = true @@ -66,17 +66,17 @@ extension DataTable { .sheet(isPresented: $showManualGlucose) { addGlucoseView } - .sheet(isPresented: $showNonPumpInsulin, onDismiss: { if isAmountUnconfirmed { state.nonPumpInsulinAmount = 0 - state.nonPumpInsulinDate = Date() } }) { - addNonPumpInsulinView + .sheet(isPresented: $showExternalInsulin, onDismiss: { if isAmountUnconfirmed { state.externalInsulinAmount = 0 + state.externalInsulinDate = Date() } }) { + addExternalInsulinView } } private var treatmentsList: some View { List { HStack { - Button(action: { showNonPumpInsulin = true - state.nonPumpInsulinDate = Date() }, label: { + Button(action: { showExternalInsulin = true + state.externalInsulinDate = Date() }, label: { HStack { Image(systemName: "syringe") Text("Add") @@ -269,7 +269,7 @@ extension DataTable { } } - var addNonPumpInsulinView: some View { + var addExternalInsulinView: some View { NavigationView { VStack { Form { @@ -279,7 +279,7 @@ extension DataTable { Spacer() DecimalTextField( "0", - value: $state.nonPumpInsulinAmount, + value: $state.externalInsulinAmount, formatter: insulinFormatter, autofocus: true, cleanInput: true @@ -289,25 +289,25 @@ extension DataTable { } Section { - DatePicker("Date", selection: $state.nonPumpInsulinDate, in: ...Date()) + DatePicker("Date", selection: $state.externalInsulinDate, in: ...Date()) } - let amountWarningCondition = (state.nonPumpInsulinAmount > state.maxBolus) + let amountWarningCondition = (state.externalInsulinAmount > state.maxBolus) Section { HStack { Button { - state.addNonPumpInsulin() + state.addExternalInsulin() isAmountUnconfirmed = false - showNonPumpInsulin = false + showExternalInsulin = false } label: { - Text("Log non-pump insulin") + Text("Log external insulin") } .foregroundColor(amountWarningCondition ? Color.white : Color.accentColor) .frame(maxWidth: .infinity, alignment: .center) .disabled( - state.nonPumpInsulinAmount <= 0 || state.nonPumpInsulinAmount > state.maxBolus * 3 + state.externalInsulinAmount <= 0 || state.externalInsulinAmount > state.maxBolus * 3 ) } } @@ -324,10 +324,10 @@ extension DataTable { } } .onAppear(perform: configureView) - .navigationTitle("Non-Pump Insulin") + .navigationTitle("External Insulin") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: { showNonPumpInsulin = false - state.nonPumpInsulinAmount = 0 })) + .navigationBarItems(leading: Button("Close", action: { showExternalInsulin = false + state.externalInsulinAmount = 0 })) } } From 2644bd5b62faa3c0836441f9c886a7b7ecb67e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 29 Oct 2023 21:20:04 +0100 Subject: [PATCH 138/405] Bug fix for saved profiles regarding SMB and UAM basal minutes --- FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 1 - .../OverrideProfilesStateModel.swift | 14 +++++++--- .../View/OverrideProfilesRootView.swift | 28 ++++++++++--------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index ca0a7df66c..f264e23539 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -120,7 +120,6 @@ final class OpenAPS { func oref2() -> RawJSON { coredataContext.performAndWait { - let now = Date() let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) var hbt_ = preferences?.halfBasalExerciseTarget ?? 160 let wp = preferences?.weightPercentage ?? 1 diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index dd7e55921b..953bdfcdd1 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -24,13 +24,15 @@ extension OverrideProfilesConfig { @Published var end: Decimal = 23 @Published var smbMinutes: Decimal = 0 @Published var uamMinutes: Decimal = 0 + @Published var defaultSmbMinutes: Decimal = 0 + @Published var defaultUamMinutes: Decimal = 0 var units: GlucoseUnits = .mmolL override func subscribe() { units = settingsManager.settings.units - smbMinutes = settingsManager.preferences.maxSMBBasalMinutes - uamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes + defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes + defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes presets = [OverridePresets(context: coredataContext)] } @@ -151,8 +153,8 @@ extension OverrideProfilesConfig { saveOverride.end = profile.end } else { saveOverride.smbIsAlwaysOff = false } - saveOverride.smbMinutes = smbMinutes as NSDecimalNumber - saveOverride.uamMinutes = uamMinutes as NSDecimalNumber + saveOverride.smbMinutes = (profile.smbMinutes ?? 0) as NSDecimalNumber + saveOverride.uamMinutes = (profile.uamMinutes ?? 0) as NSDecimalNumber } try? self.coredataContext.save() } @@ -221,6 +223,8 @@ extension OverrideProfilesConfig { override_target = false smbIsOff = false advancedSettings = false + smbMinutes = defaultSmbMinutes + uamMinutes = defaultUamMinutes } } } @@ -240,6 +244,8 @@ extension OverrideProfilesConfig { profiles.date = Date() try? self.coredataContext.save() } + smbMinutes = defaultSmbMinutes + uamMinutes = defaultUamMinutes } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index d00107fb47..de691d474f 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -159,9 +159,8 @@ extension OverrideProfilesConfig { } HStack { Text("SMB Minutes") - let minutes = state.settingsManager.preferences.maxSMBBasalMinutes DecimalTextField( - minutes.formatted(), + "0", value: $state.smbMinutes, formatter: formatter, cleanInput: false @@ -170,9 +169,8 @@ extension OverrideProfilesConfig { } HStack { Text("UAM SMB Minutes") - let uam_minutes = state.settingsManager.preferences.maxUAMSMBBasalMinutes DecimalTextField( - uam_minutes.formatted(), + "0", value: $state.uamMinutes, formatter: formatter, cleanInput: false @@ -217,10 +215,7 @@ extension OverrideProfilesConfig { comment: "" ) } - .disabled( - (state.percentage == 100 && !state.override_target && !state.smbIsOff) || - (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) - ) + .disabled(unChanged()) .buttonStyle(BorderlessButtonStyle()) .font(.callout) .controlSize(.mini) @@ -248,12 +243,8 @@ extension OverrideProfilesConfig { .frame(maxWidth: .infinity, alignment: .trailing) .buttonStyle(BorderlessButtonStyle()) .controlSize(.mini) - .disabled( - (state.percentage == 100 && !state.override_target && !state.smbIsOff) || - (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) - ) + .disabled(unChanged()) } - .sheet(isPresented: $isSheetPresented) { presetPopover } @@ -336,6 +327,17 @@ extension OverrideProfilesConfig { } } + private func unChanged() -> Bool { + let isChanged = (state.percentage == 100 && !state.override_target && !state.smbIsOff && !state.advancedSettings) || + (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) || + ( + state.percentage == 100 && !state.override_target && !state.smbIsOff && state.isf && state.cr && state + .smbMinutes == state.defaultSmbMinutes && state.uamMinutes == state.defaultUamMinutes + ) + + return isChanged + } + private func removeProfile(at offsets: IndexSet) { for index in offsets { let language = fetchedProfiles[index] From 55643ff24b4c94ccae5433e3ab2b74df7035aee5 Mon Sep 17 00:00:00 2001 From: polscm32 <107251660+polscm32@users.noreply.github.com> Date: Wed, 1 Nov 2023 16:09:06 +0100 Subject: [PATCH 139/405] fix typo in addGlucoseView in DataTableRootView which leads to save button always beeing disabled (#295) --- .../Sources/Modules/DataTable/View/DataTableRootView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 014c1ba37b..ee777a802a 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -162,8 +162,8 @@ extension DataTable { Section { HStack { - let limitLow: Decimal = state.units == .mmolL ? 0.8 : 40 - let limitHigh: Decimal = state.units == .mgdL ? 14 : 720 + let limitLow: Decimal = state.units == .mmolL ? 0.8 : 14 + let limitHigh: Decimal = state.units == .mmolL ? 40 : 720 Button { state.addManualGlucose() isAmountUnconfirmed = false From f039dc329b6a371aede3a4e4109e09346344b9cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 12:16:31 +0100 Subject: [PATCH 140/405] Fix deletion of fpus in NS. Still exessive, though. --- .../Sources/APS/Storage/CarbsStorage.swift | 41 +++--------- FreeAPS/Sources/Models/CarbsEntry.swift | 4 +- .../Sources/Models/NightscoutTreatment.swift | 4 +- .../Modules/AddCarbs/AddCarbsStateModel.swift | 9 +-- .../Modules/Bolus/BolusStateModel.swift | 12 +++- .../Modules/DataTable/DataTableProvider.swift | 2 +- .../DataTable/DataTableStateModel.swift | 4 +- .../Services/HealthKit/HealthKitManager.swift | 2 +- .../Services/Network/NightscoutAPI.swift | 7 +- .../Services/Network/NightscoutManager.swift | 66 +++++-------------- .../Services/WatchManager/WatchManager.swift | 2 +- .../Carbs/CarbPresetIntentRequest.swift | 2 +- 12 files changed, 56 insertions(+), 99 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 4e17fb933d..1297a51b56 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -12,7 +12,7 @@ protocol CarbsStorage { func syncDate() -> Date func recent() -> [CarbsEntry] func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] - func deleteCarbs(at uniqueID: String, complex: Bool?) + func deleteCarbs(at uniqueID: String) } final class BaseCarbsStorage: CarbsStorage, Injectable { @@ -71,7 +71,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // New date for each carb equivalent var useDate = entries.last?.createdAt ?? Date() // Group and Identify all FPUs together - let fpuID = (entries.last?.id ?? "") + ".fpu" + let fpuID = (entries.last?.collectionID ?? "") + ".fpu" // Create an array of all future carb equivalents. var futureCarbArray = [CarbsEntry]() while carbEquivalents > 0, numberOfEquivalents > 0 { @@ -81,7 +81,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) } let eachCarbEntry = CarbsEntry( - id: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, + collectionID: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, enteredBy: CarbsEntry.manual, isFPU: true, fpuID: fpuID ) @@ -143,47 +143,24 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? [] } - func deleteCarbs(at uniqueID: String, complex: Bool?) { + func deleteCarbs(at uniqueID: String) { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - guard let entryIndex = allValues.firstIndex(where: { $0.id == uniqueID }) else { - debug(.default, "Didn't find anything to delete. Date to search for: " + uniqueID.description) - return - } - - // If deleteing a FPUs remove all of those with the same ID - if allValues[entryIndex].isFPU != nil, allValues[entryIndex].isFPU ?? false { - let fpuString = allValues[entryIndex].fpuID - allValues.removeAll(where: { $0.fpuID == fpuString }) - storage.save(allValues, as: OpenAPS.Monitor.carbHistory) - broadcaster.notify(CarbsObserver.self, on: processQueue) { - $0.carbsDidUpdate(allValues) - } + if allValues.firstIndex(where: { $0.collectionID == uniqueID }) == nil { + debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description) } else { - allValues.remove(at: entryIndex) + allValues.removeAll(where: { $0.collectionID == uniqueID }) storage.save(allValues, as: OpenAPS.Monitor.carbHistory) broadcaster.notify(CarbsObserver.self, on: processQueue) { $0.carbsDidUpdate(allValues) } } - // When deleting both carbs and fat and protein (complex meal entry) - if let deleteComplexEntriesAlso = complex, deleteComplexEntriesAlso { - guard let fpuIndex = allValues.firstIndex(where: { $0.id == (uniqueID + ".fpu") }) else { - debug( - .default, - "Didn't find any complex fat and protein entries to delete. Date to search for: " + uniqueID.description - ) - return - } - allValues.removeAll(where: { $0.id == (uniqueID + ".fpu") }) - storage.save(allValues, as: OpenAPS.Monitor.carbHistory) - } } } func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] { - let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NigtscoutTreatment].self) ?? [] + let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCarbs, as: [NigtscoutTreatment].self) ?? [] let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual } let treatments = eventsManual.map { @@ -204,7 +181,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { foodType: $0.note, targetTop: nil, targetBottom: nil, - id: $0.id + collectionID: $0.collectionID ) } return Array(Set(treatments).subtracting(Set(uploaded))) diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index 3c8f35cc76..9faff357f9 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -1,7 +1,7 @@ import Foundation struct CarbsEntry: JSON, Equatable, Hashable { - let id: String? + let collectionID: String? let createdAt: Date let carbs: Decimal let fat: Decimal? @@ -25,7 +25,7 @@ struct CarbsEntry: JSON, Equatable, Hashable { extension CarbsEntry { private enum CodingKeys: String, CodingKey { - case id = "_id" + case collectionID = "_id" case createdAt = "created_at" case carbs case fat diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index 83abffae3d..e05f3cc2bd 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -21,7 +21,7 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { var glucoseType: String? var glucose: String? var units: String? - var id: String? + var collectionID: String? static let local = "iAPS" @@ -58,6 +58,6 @@ extension NigtscoutTreatment { case glucoseType case glucose case units - case id + case collectionID } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 5d457e6c08..a85dbfcab3 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -38,7 +38,7 @@ extension AddCarbs { id_ = UUID().uuidString let carbsToStore = [CarbsEntry( - id: id_, + collectionID: id_, createdAt: date, carbs: carbs, fat: fat, @@ -55,7 +55,9 @@ extension AddCarbs { } else if carbs > 0 { saveToCoreData(carbsToStore) showModal(for: .bolus(waitForSuggestion: true, fetch: true)) - } else { hideModal() } + } else { + hideModal() + } } func deletePreset() { @@ -185,9 +187,8 @@ extension AddCarbs { func saveToCoreData(_ stored: [CarbsEntry]) { let save = Meals(context: coredataContext) - save.id = stored.first?.id ?? "" save.createdAt = stored.first?.createdAt ?? .distantPast - save.id = stored.first?.id ?? "" + save.id = stored.first?.collectionID ?? "" save.carbs = Double(stored.first?.carbs ?? 0) save.fat = Double(stored.first?.fat ?? 0) save.protein = Double(stored.first?.protein ?? 0) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 5ec4131bd9..605f75c917 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -217,9 +217,17 @@ extension Bolus { func backToCarbsView(complexEntry: Bool, _ id: String) { if complexEntry { + DispatchQueue.safeMainSync { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id + ) + nsManager.deleteCarbs( + at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id + ) + } + } else { nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id, - complex: complexEntry + at: id, isFPU: nil, fpuID: nil, syncID: id ) } showModal(for: .addCarbs(editMode: complexEntry)) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index 23337f55ce..4540bd957b 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -36,7 +36,7 @@ extension DataTable { at: treatement.id, isFPU: treatement.isFPU, fpuID: treatement.fpuID, - syncID: treatement.id, complex: nil + syncID: treatement.id ) } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 1826591275..bf5b1045ca 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -40,7 +40,7 @@ extension DataTable { let carbs = self.provider.carbs() .filter { !($0.isFPU ?? false) } .map { - if let id = $0.id { + if let id = $0.collectionID { return Treatment( units: units, type: .carbs, @@ -62,7 +62,7 @@ extension DataTable { type: .fpus, date: $0.createdAt, amount: $0.carbs, - id: $0.id, + id: $0.collectionID, isFPU: $0.isFPU, fpuID: $0.fpuID, note: $0.note diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 9985598521..1e843b388f 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -194,7 +194,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let sampleIDs = samples.compactMap(\.syncIdentifier) let sampleDates = samples.map(\.startDate) let samplesToSave = carbsWithId - .filter { !sampleIDs.contains($0.id!) } // id existing in AH + .filter { !sampleIDs.contains($0.collectionID!) } // id existing in AH .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime .map { HKQuantitySample( diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 155610ac15..b5725df4d2 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -148,9 +148,10 @@ extension NightscoutAPI { components.port = url.port components.path = Config.treatmentsPath components.queryItems = [ - URLQueryItem(name: "find[carbs][$exists]", value: "true"), + // Removed below because it prevented all futire entries to be deleted. Don't know why? + /* URLQueryItem(name: "find[carbs][$exists]", value: "true"), */ URLQueryItem( - name: "find[id][$eq]", + name: "find[collectionID][$eq]", value: uniqueID ) ] @@ -322,7 +323,7 @@ extension NightscoutAPI { if let secret = secret { request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") } - request.httpBody = try! JSONCoding.encoder.encode(treatments) + request.httpBody = try? JSONCoding.encoder.encode(treatments) request.httpMethod = "POST" return service.run(request) diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index d4e11ce68c..94b8118d20 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource { func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never> func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> - func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -177,62 +177,32 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .eraseToAnyPublisher() } - func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) { + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) { // remove in AH healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID) guard let nightscout = nightscoutAPI, isUploadEnabled else { - carbsStorage.deleteCarbs(at: uniqueID, complex: complex) + carbsStorage.deleteCarbs(at: uniqueID) return } - if let isFPU = isFPU, isFPU { - guard let fpuID = fpuID else { return } - let allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - let dates = allValues.filter { $0.fpuID == fpuID }.map(\.id).removeDublicates() - - let publishers = dates - .map { _ -> AnyPublisher in - nightscout.deleteCarbs( - at: uniqueID + nightscout.deleteCarbs(at: uniqueID) + .collect() + .sink { completion in + self.carbsStorage.deleteCarbs(at: uniqueID) + switch completion { + case .finished: + debug(.nightscout, "Carbs deleted") + case let .failure(error): + info( + .nightscout, + "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning ) } - - Publishers.MergeMany(publishers) - .collect() - .sink { completion in - self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex) - switch completion { - case .finished: - debug(.nightscout, "Carbs deleted") - - case let .failure(error): - info( - .nightscout, - "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", - type: MessageType.warning - ) - } - } receiveValue: { _ in } - .store(in: &lifetime) - - } else { - nightscout.deleteCarbs(at: uniqueID) - .sink { completion in - self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex) - switch completion { - case .finished: - debug(.nightscout, "Carbs deleted") - case let .failure(error): - info( - .nightscout, - "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", - type: MessageType.warning - ) - } - } receiveValue: {} - .store(in: &lifetime) - } + } receiveValue: { _ in } + .store(in: &lifetime) + // } } func deleteInsulin(at date: Date) { diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index 74e5025337..16df25d2b4 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -272,7 +272,7 @@ extension BaseWatchManager: WCSessionDelegate { { carbsStorage.storeCarbs( [CarbsEntry( - id: UUID().uuidString, + collectionID: UUID().uuidString, createdAt: Date(), carbs: Decimal(carbs), fat: Decimal(fat), diff --git a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift index e891f3012a..a230c4c2e5 100644 --- a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift +++ b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift @@ -11,7 +11,7 @@ import Foundation carbsStorage.storeCarbs( [CarbsEntry( - id: UUID().uuidString, + collectionID: UUID().uuidString, createdAt: dateAdded, carbs: carbs, fat: Decimal(quantityFat), From 06361508332fed3baa1e142ad2ee0803d68aedd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 14:40:40 +0100 Subject: [PATCH 141/405] Fix update of calc --- .../Modules/Bolus/BolusStateModel.swift | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 605f75c917..1ccb77f698 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -103,7 +103,7 @@ extension Bolus { } // CALCULATIONS FOR THE BOLUS CALCULATOR - func calculateInsulin() { + func calculateInsulin() -> Decimal { // for mmol conversion var conversion: Decimal = 1.0 if units == .mmolL { @@ -153,7 +153,10 @@ extension Bolus { insulinCalculated = max(insulinCalculated, 0) let insulinCalculatedAsDouble = Double(insulinCalculated) roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) - insulinRecommended = min(insulinCalculated, maxBolus) + + insulinCalculated = min(insulinCalculated, maxBolus) + + return insulinCalculated } func add() { @@ -192,11 +195,9 @@ extension Bolus { self.basal = self.provider.suggestion?.rate ?? 0 self.carbRatio = self.provider.suggestion?.carbRatio ?? 0 - if !self.useCalc { - if self.settingsManager.settings.insulinReqPercentage != 100 { - self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) - } else { self.insulinRecommended = self.insulin } - } + if self.settingsManager.settings.insulinReqPercentage != 100 { + self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) + } else { self.insulinRecommended = self.insulin } self.errorString = self.provider.suggestion?.manualBolusErrorString ?? 0 if self.errorString != 0 { @@ -207,11 +208,13 @@ extension Bolus { self.minPredBG = (self.provider.suggestion?.minPredBG ?? 0) * conversion } else { self.error = false } - if !self.useCalc { - self.insulinRecommended = self.apsManager - .roundBolus(amount: max(self.insulinRecommended, 0)) + self.insulinRecommended = self.apsManager + .roundBolus(amount: max(self.insulinRecommended, 0)) + + if self.useCalc { + self.getDeltaBG() + self.insulinCalculated = self.calculateInsulin() } - self.getDeltaBG() } } @@ -241,6 +244,5 @@ extension Bolus.StateModel: SuggestionObserver { self.waitForSuggestion = false } setupInsulinRequired() - if useCalc { calculateInsulin() } } } From 160e9a93a7f82c80f216202b05fd96bacbd68c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 14:41:13 +0100 Subject: [PATCH 142/405] Fix update and add config of UI --- .../View/AlternativeBolusCalcRootView.swift | 176 ++++++++++-------- 1 file changed, 98 insertions(+), 78 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 13565feb56..1f26209b09 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -11,6 +11,13 @@ extension Bolus { @StateObject var state: StateModel @State private var showInfo = false @State private var exceededMaxBolus = false + + private enum Config { + static let dividerHeight: CGFloat = 2 + static let spacing: CGFloat = 3 + static let overlayColour: Color = .white // Currently not used + } + @Environment(\.colorScheme) var colorScheme @FetchRequest( @@ -25,6 +32,13 @@ extension Bolus { return formatter } + private var mealFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + return formatter + } + private var gluoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -101,7 +115,6 @@ extension Bolus { HStack { Button(action: { showInfo.toggle() - state.calculateInsulin() }, label: { Image(systemName: "info.circle") Text("Calculations") @@ -118,23 +131,31 @@ extension Bolus { .toggleStyle(CheckboxToggleStyle()) .font(.footnote) .onChange(of: state.useFattyMealCorrectionFactor) { _ in - state.calculateInsulin() + state.insulinCalculated = state.calculateInsulin() } } } - HStack { - Text("Recommended Bolus") - Spacer() - Text( - formatter - .string(from: Double(state.insulinRecommended) as NSNumber)! - ) - Text( - NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") - ).foregroundColor(.secondary) - }.contentShape(Rectangle()) - .onTapGesture { state.amount = state.insulinRecommended } + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } else { + HStack { + Text("Recommended Bolus") + Spacer() + Text( + formatter + .string(from: Double(state.insulinCalculated) as NSNumber) ?? "" + ) + Text( + NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") + ).foregroundColor(.secondary) + }.contentShape(Rectangle()) + .onTapGesture { state.amount = state.insulinCalculated } + } if !state.waitForSuggestion { HStack { @@ -183,7 +204,7 @@ extension Bolus { configureView { state.waitForSuggestionInitial = waitForSuggestion state.waitForSuggestion = waitForSuggestion - state.calculateInsulin() + state.insulinCalculated = state.calculateInsulin() } } @@ -200,18 +221,16 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - // calculation showed in popup + // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { let unit = NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") VStack { - VStack(spacing: 2) { + VStack(spacing: Config.spacing) { HStack { Text("Calculations") - .font(.title3) - Spacer() - } - .padding(.vertical, 10) + .font(.title3).frame(maxWidth: .infinity, alignment: .center) + }.padding(10) if fetch { VStack { @@ -228,7 +247,7 @@ extension Bolus { Text("Carbs") .foregroundColor(.secondary) Spacer() - Text(carbs.formatted()) + Text(mealFormatter.string(from: carbs as NSNumber) ?? "") Text("g").foregroundColor(.secondary) } } @@ -237,7 +256,7 @@ extension Bolus { Text("Protein") .foregroundColor(.secondary) Spacer() - Text(protein.formatted()) + Text(mealFormatter.string(from: protein as NSNumber) ?? "") Text("g").foregroundColor(.secondary) } } @@ -246,14 +265,14 @@ extension Bolus { Text("Fat") .foregroundColor(.secondary) Spacer() - Text(fat.formatted()).foregroundColor(.orange) + Text(mealFormatter.string(from: fat as NSNumber) ?? "") Text("g").foregroundColor(.secondary) } } }.padding() } - Divider().fontWeight(.bold) + if fetch { Divider().frame(height: Config.dividerHeight) } VStack { HStack { @@ -311,12 +330,12 @@ extension Bolus { .foregroundColor(.orange) } } - } - }.padding() + }.padding() + } - Divider().fontWeight(.bold) + Divider().frame(height: Config.dividerHeight) - VStack(spacing: 2) { + VStack(spacing: Config.spacing) { HStack { Text("Glucose") .foregroundColor(.secondary) @@ -403,63 +422,64 @@ extension Bolus { Text(unit) .foregroundColor(.secondary) } - } - .padding() + }.padding() - Divider() - .fontWeight(.bold) + Divider().frame(height: Config.dividerHeight) - HStack { - Text("Full Bolus") - .foregroundColor(.secondary) - Spacer() - let insulin = state.roundedWholeCalc - Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) - .foregroundColor(.secondary) - }.padding() + VStack { + HStack { + Text("Full Bolus") + .foregroundColor(.secondary) + Spacer() + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + } + }.padding(.horizontal) - Divider().fontWeight(.bold) + Divider().frame(height: Config.dividerHeight) - HStack { - Text("Result") - .fontWeight(.bold) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - Text(" x ") - .foregroundColor(.secondary) - - // if fatty meal is chosen - if state.useFattyMealCorrectionFactor { - let fattyMealFactor = state.fattyMealFactor - Text(fattyMealFactor.formatted()) - .foregroundColor(.orange) + VStack { + HStack { + Text("Result") + .fontWeight(.bold) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) Text(" x ") .foregroundColor(.secondary) - } - let insulin = state.roundedWholeCalc - Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) - .foregroundColor(.secondary) - Text(" = ") - .foregroundColor(.secondary) - - let result = state.insulinCalculated - // rounding - let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue - let roundedResult = Decimal(round(100 * resultAsDouble) / 100) - Text(roundedResult.formatted()) - .fontWeight(.bold) - .font(.system(size: 16)) - .foregroundColor(.blue) - Text(unit) - .foregroundColor(.secondary) - } - .padding() + // if fatty meal is chosen + if state.useFattyMealCorrectionFactor { + let fattyMealFactor = state.fattyMealFactor + Text(fattyMealFactor.formatted()) + .foregroundColor(.orange) + Text(" x ") + .foregroundColor(.secondary) + } + + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + Text(" = ") + .foregroundColor(.secondary) + + let result = state.insulinCalculated + // rounding + let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue + let roundedResult = Decimal(round(100 * resultAsDouble) / 100) + Text(roundedResult.formatted()) + .fontWeight(.bold) + .font(.system(size: 16)) + .foregroundColor(.blue) + Text(unit) + .foregroundColor(.secondary) + } + }.padding() - Divider() + Divider().frame(height: Config.dividerHeight) if exceededMaxBolus { HStack { From 838eb702ddf56ce3ad9dc5fd8eab85e8b4532e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 14:55:28 +0100 Subject: [PATCH 143/405] Config overlay colour --- .../Bolus/View/AlternativeBolusCalcRootView.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 1f26209b09..b92379497f 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -14,8 +14,8 @@ extension Bolus { private enum Config { static let dividerHeight: CGFloat = 2 + static let overlayColour: Color = .white // Currently commented out static let spacing: CGFloat = 3 - static let overlayColour: Color = .white // Currently not used } @Environment(\.colorScheme) var colorScheme @@ -272,7 +272,8 @@ extension Bolus { }.padding() } - if fetch { Divider().frame(height: Config.dividerHeight) } + if fetch { Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + } VStack { HStack { @@ -333,7 +334,7 @@ extension Bolus { }.padding() } - Divider().frame(height: Config.dividerHeight) + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) VStack(spacing: Config.spacing) { HStack { @@ -424,7 +425,7 @@ extension Bolus { } }.padding() - Divider().frame(height: Config.dividerHeight) + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) VStack { HStack { @@ -479,7 +480,7 @@ extension Bolus { } }.padding() - Divider().frame(height: Config.dividerHeight) + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) if exceededMaxBolus { HStack { From 044f5d5a1bda3ecd776176f22d222aec882c57d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 2 Nov 2023 15:19:32 +0100 Subject: [PATCH 144/405] Alternate Bolus Calculator and Edit of Meals * Implement new Bolus Calculator, by @polscm32, in Swift. * Refactor the new calculator above and the UI/UX of the new Bolus View * Add Feature: Edit the Meals from the Bolus View . Go from the Carbs View <--> Bolus View . --- .../Core_Data.xcdatamodel/contents | 10 +- FreeAPS.xcodeproj/project.pbxproj | 52 ++ .../defaults/freeaps/freeaps_settings.json | 6 +- .../Sources/APS/Storage/CarbsStorage.swift | 31 +- FreeAPS/Sources/Models/CarbsEntry.swift | 4 +- FreeAPS/Sources/Models/FreeAPSSettings.swift | 20 + .../Sources/Models/NightscoutTreatment.swift | 2 + FreeAPS/Sources/Models/Suggestion.swift | 2 + .../Modules/AddCarbs/AddCarbsStateModel.swift | 65 ++- .../AddCarbs/View/AddCarbsRootView.swift | 9 +- .../Modules/Bolus/BolusStateModel.swift | 180 ++++-- .../Components/CheckboxToggleStyle.swift | 23 + .../View/AlternativeBolusCalcRootView.swift | 521 ++++++++++++++++++ .../Modules/Bolus/View/BolusRootView.swift | 269 +-------- .../Bolus/View/DefaultBolusCalcRootView.swift | 275 +++++++++ .../BolusCalculatorConfigDataFlow.swift | 5 + .../BolusCalculatorConfigProvider.swift | 3 + .../BolusCalculatorStateModel.swift | 27 + .../View/BolusCalculatorConfigRootView.swift | 52 ++ .../Modules/DataTable/DataTableProvider.swift | 2 +- .../DataTable/DataTableStateModel.swift | 4 +- .../Sources/Modules/Home/HomeStateModel.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 9 +- .../PreferencesEditorStateModel.swift | 2 + .../View/PreferencesEditorRootView.swift | 8 +- .../Settings/View/SettingsRootView.swift | 1 + FreeAPS/Sources/Router/Screen.swift | 15 +- .../Services/HealthKit/HealthKitManager.swift | 2 +- .../Services/Network/NightscoutAPI.swift | 11 +- .../Services/Network/NightscoutManager.swift | 66 +-- .../Services/WatchManager/WatchManager.swift | 2 +- .../Carbs/CarbPresetIntentRequest.swift | 2 +- FreeAPS/Sources/Views/DecimalTextField.swift | 25 - 33 files changed, 1274 insertions(+), 433 deletions(-) create mode 100644 FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift create mode 100644 FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift create mode 100644 FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift create mode 100644 FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 41aaab7962..fefaa04c75 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -54,6 +54,14 @@ + + + + + + + + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index acbdee74b8..0ed29a6621 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -301,6 +301,13 @@ BA00D96F7B2FF169A06FB530 /* CGMStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C018D1680307A31C9ED7120 /* CGMStateModel.swift */; }; BA90041DC8991147E5C8C3AA /* CalibrationsRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500371C09F54F89A97D65FDB /* CalibrationsRootView.swift */; }; BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */; }; + BD2FF1A02AE29D43005D1C5D /* CheckboxToggleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */; }; + BD7DA9A52AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */; }; + BD7DA9A72AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */; }; + BD7DA9A92AE06E9200601B20 /* BolusCalculatorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */; }; + BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */; }; + BDFD165A2AE40438007F0DDA /* AlternativeBolusCalcRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */; }; + BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */; }; BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */; }; C967DACD3B1E638F8B43BE06 /* ManualTempBasalStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFCFE0781F9074C2917890E8 /* ManualTempBasalStateModel.swift */; }; CA370FC152BC98B3D1832968 /* BasalProfileEditorRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */; }; @@ -819,6 +826,13 @@ B9CAAEFB2AE70836000F68BC /* branch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = branch.txt; sourceTree = SOURCE_ROOT; }; BA49538D56989D8DA6FCF538 /* TargetsEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TargetsEditorDataFlow.swift; sourceTree = ""; }; BC210C0F3CB6D3C86E5DED4E /* LibreConfigRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LibreConfigRootView.swift; sourceTree = ""; }; + BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxToggleStyle.swift; sourceTree = ""; }; + BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigDataFlow.swift; sourceTree = ""; }; + BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigProvider.swift; sourceTree = ""; }; + BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorStateModel.swift; sourceTree = ""; }; + BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusCalculatorConfigRootView.swift; sourceTree = ""; }; + BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlternativeBolusCalcRootView.swift; sourceTree = ""; }; + BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultBolusCalcRootView.swift; sourceTree = ""; }; BF8BCB0C37DEB5EC377B9612 /* BasalProfileEditorRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorRootView.swift; sourceTree = ""; }; C19984D62EFC0035A9E9644D /* BolusProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusProvider.swift; sourceTree = ""; }; C377490C77661D75E8C50649 /* ManualTempBasalRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalRootView.swift; sourceTree = ""; }; @@ -1154,6 +1168,7 @@ 3811DE0325C9D31700A708ED /* Modules */ = { isa = PBXGroup; children = ( + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19F95FF129F10F9C00314DDC /* Stat */, @@ -2039,6 +2054,35 @@ isa = PBXGroup; children = ( 10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */, + BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */, + BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */, + ); + path = View; + sourceTree = ""; + }; + BD2FF19E2AE29D24005D1C5D /* Components */ = { + isa = PBXGroup; + children = ( + BD2FF19F2AE29D43005D1C5D /* CheckboxToggleStyle.swift */, + ); + path = Components; + sourceTree = ""; + }; + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */ = { + isa = PBXGroup; + children = ( + BD7DA9A42AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift */, + BD7DA9A62AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift */, + BD7DA9A82AE06E9200601B20 /* BolusCalculatorStateModel.swift */, + BD7DA9AA2AE06E9600601B20 /* View */, + ); + path = BolusCalculatorConfig; + sourceTree = ""; + }; + BD7DA9AA2AE06E9600601B20 /* View */ = { + isa = PBXGroup; + children = ( + BD7DA9AB2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift */, ); path = View; sourceTree = ""; @@ -2057,6 +2101,7 @@ C2C98283C436DB934D7E7994 /* Bolus */ = { isa = PBXGroup; children = ( + BD2FF19E2AE29D24005D1C5D /* Components */, C8D1A7CA8C10C4403D4BBFA7 /* BolusDataFlow.swift */, C19984D62EFC0035A9E9644D /* BolusProvider.swift */, 223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */, @@ -2632,6 +2677,7 @@ 3811DE6125C9D4D500A708ED /* ViewModifiers.swift in Sources */, 3811DEAC25C9D88300A708ED /* NightscoutManager.swift in Sources */, 19A910302A24BF6300C8951B /* StatsView.swift in Sources */, + BD7DA9A92AE06E9200601B20 /* BolusCalculatorStateModel.swift in Sources */, CEB434E528B8FF5D00B70274 /* UIColor.swift in Sources */, 190EBCCB29FF13CB00BA767D /* StatConfigRootView.swift in Sources */, 3811DEA925C9D88300A708ED /* AppearanceManager.swift in Sources */, @@ -2663,6 +2709,7 @@ 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */, 38B4F3CB25E502E200E76A18 /* WeakObjectSet.swift in Sources */, 38E989DD25F5021400C0CED0 /* PumpStatus.swift in Sources */, + BDFD165A2AE40438007F0DDA /* AlternativeBolusCalcRootView.swift in Sources */, 38E98A2525F52C9300C0CED0 /* IssueReporter.swift in Sources */, 190EBCC429FF136900BA767D /* StatConfigDataFlow.swift in Sources */, 3811DEB025C9D88300A708ED /* BaseKeychain.swift in Sources */, @@ -2688,6 +2735,7 @@ 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, 642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */, + BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */, AD3D2CD42CD01B9EB8F26522 /* PumpConfigDataFlow.swift in Sources */, 53F2382465BF74DB1A967C8B /* PumpConfigProvider.swift in Sources */, 5D16287A969E64D18CE40E44 /* PumpConfigStateModel.swift in Sources */, @@ -2729,6 +2777,7 @@ DBA5254DBB2586C98F61220C /* ISFEditorProvider.swift in Sources */, 1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */, F816826028DB441800054060 /* BluetoothTransmitter.swift in Sources */, + BD7DA9A72AE06E2B00601B20 /* BolusCalculatorConfigProvider.swift in Sources */, 38192E0D261BAF980094D973 /* ConvenienceExtensions.swift in Sources */, FEFA5C0F299F810B00765C17 /* Core_Data.xcdatamodeld in Sources */, 88AB39B23C9552BD6E0C9461 /* ISFEditorRootView.swift in Sources */, @@ -2768,6 +2817,7 @@ CE82E02728E869DF00473A9C /* AlertEntry.swift in Sources */, 38E4451E274DB04600EC9A94 /* AppDelegate.swift in Sources */, 5BFA1C2208114643B77F8CEB /* AddTempTargetProvider.swift in Sources */, + BD2FF1A02AE29D43005D1C5D /* CheckboxToggleStyle.swift in Sources */, E0D4F80527513ECF00BDF1FE /* HealthKitSample.swift in Sources */, 919DBD08F13BAFB180DF6F47 /* AddTempTargetStateModel.swift in Sources */, 8BC2F5A29AD1ED08AC0EE013 /* AddTempTargetRootView.swift in Sources */, @@ -2780,6 +2830,7 @@ 69A31254F2451C20361D172F /* BolusStateModel.swift in Sources */, 0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */, 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */, + BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */, 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */, FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */, F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */, @@ -2807,6 +2858,7 @@ F5CA3DB1F9DC8B05792BBFAA /* CGMDataFlow.swift in Sources */, BA00D96F7B2FF169A06FB530 /* CGMStateModel.swift in Sources */, 61962FCAF8A2D222553AC5A3 /* LibreConfigDataFlow.swift in Sources */, + BD7DA9A52AE06DFC00601B20 /* BolusCalculatorConfigDataFlow.swift in Sources */, 6EADD581738D64431902AC0A /* LibreConfigProvider.swift in Sources */, CE94598729E9E4110047C9C6 /* WatchConfigRootView.swift in Sources */, 903D18976088B09110BCBE29 /* LibreConfigStateModel.swift in Sources */, diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 05331cf0f6..83f064eb03 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -42,5 +42,9 @@ "oneDimensionalGraph" : false, "rulerMarks" : false, "maxCarbs": 1000, - "displayFatAndProteinOnWatch": false + "displayFatAndProteinOnWatch": false, + "overrideFactor": 0.8, + "useCalc": false, + "fattyMeals": false, + "fattyMealFactor": 0.7 } diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 2633686d3a..1297a51b56 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -12,7 +12,7 @@ protocol CarbsStorage { func syncDate() -> Date func recent() -> [CarbsEntry] func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] - func deleteCarbs(at date: Date) + func deleteCarbs(at uniqueID: String) } final class BaseCarbsStorage: CarbsStorage, Injectable { @@ -71,7 +71,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // New date for each carb equivalent var useDate = entries.last?.createdAt ?? Date() // Group and Identify all FPUs together - let fpuID = UUID().uuidString + let fpuID = (entries.last?.collectionID ?? "") + ".fpu" // Create an array of all future carb equivalents. var futureCarbArray = [CarbsEntry]() while carbEquivalents > 0, numberOfEquivalents > 0 { @@ -81,7 +81,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) } let eachCarbEntry = CarbsEntry( - id: UUID().uuidString, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, + collectionID: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, enteredBy: CarbsEntry.manual, isFPU: true, fpuID: fpuID ) @@ -101,7 +101,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } // ------------------------- END OF TPU ---------------------------------------- // Store the actual (normal) carbs if entries.last?.carbs ?? 0 > 0 { - uniqEvents = [] + // uniqEvents = [] self.storage.transaction { storage in storage.append(entries, to: file, uniqBy: \.createdAt) uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? @@ -143,24 +143,14 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? [] } - func deleteCarbs(at date: Date) { + func deleteCarbs(at uniqueID: String) { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - guard let entryIndex = allValues.firstIndex(where: { $0.createdAt == date }) else { - return - } - - // If deleteing a FPUs remove all of those with the same ID - if allValues[entryIndex].isFPU != nil, allValues[entryIndex].isFPU ?? false { - let fpuString = allValues[entryIndex].fpuID - allValues.removeAll(where: { $0.fpuID == fpuString }) - storage.save(allValues, as: OpenAPS.Monitor.carbHistory) - broadcaster.notify(CarbsObserver.self, on: processQueue) { - $0.carbsDidUpdate(allValues) - } + if allValues.firstIndex(where: { $0.collectionID == uniqueID }) == nil { + debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description) } else { - allValues.remove(at: entryIndex) + allValues.removeAll(where: { $0.collectionID == uniqueID }) storage.save(allValues, as: OpenAPS.Monitor.carbHistory) broadcaster.notify(CarbsObserver.self, on: processQueue) { $0.carbsDidUpdate(allValues) @@ -170,7 +160,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] { - let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NigtscoutTreatment].self) ?? [] + let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCarbs, as: [NigtscoutTreatment].self) ?? [] let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual } let treatments = eventsManual.map { @@ -190,7 +180,8 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { protein: nil, foodType: $0.note, targetTop: nil, - targetBottom: nil + targetBottom: nil, + collectionID: $0.collectionID ) } return Array(Set(treatments).subtracting(Set(uploaded))) diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index 3c8f35cc76..9faff357f9 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -1,7 +1,7 @@ import Foundation struct CarbsEntry: JSON, Equatable, Hashable { - let id: String? + let collectionID: String? let createdAt: Date let carbs: Decimal let fat: Decimal? @@ -25,7 +25,7 @@ struct CarbsEntry: JSON, Equatable, Hashable { extension CarbsEntry { private enum CodingKeys: String, CodingKey { - case id = "_id" + case collectionID = "_id" case createdAt = "created_at" case carbs case fat diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 031d9a48b2..476c64408a 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -45,6 +45,10 @@ struct FreeAPSSettings: JSON, Equatable { var maxCarbs: Decimal = 1000 var displayFatAndProteinOnWatch: Bool = false var onlyAutotuneBasals: Bool = false + var overrideFactor: Decimal = 0.8 + var useCalc: Bool = false + var fattyMeals: Bool = false + var fattyMealFactor: Decimal = 0.7 } extension FreeAPSSettings: Decodable { @@ -139,6 +143,22 @@ extension FreeAPSSettings: Decodable { settings.individualAdjustmentFactor = individualAdjustmentFactor } + if let useCalc = try? container.decode(Bool.self, forKey: .useCalc) { + settings.useCalc = useCalc + } + + if let fattyMeals = try? container.decode(Bool.self, forKey: .fattyMeals) { + settings.fattyMeals = fattyMeals + } + + if let fattyMealFactor = try? container.decode(Decimal.self, forKey: .fattyMealFactor) { + settings.fattyMealFactor = fattyMealFactor + } + + if let overrideFactor = try? container.decode(Decimal.self, forKey: .overrideFactor) { + settings.overrideFactor = overrideFactor + } + if let timeCap = try? container.decode(Int.self, forKey: .timeCap) { settings.timeCap = timeCap } diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index 5c9e867d1a..e05f3cc2bd 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -21,6 +21,7 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { var glucoseType: String? var glucose: String? var units: String? + var collectionID: String? static let local = "iAPS" @@ -57,5 +58,6 @@ extension NigtscoutTreatment { case glucoseType case glucose case units + case collectionID } } diff --git a/FreeAPS/Sources/Models/Suggestion.swift b/FreeAPS/Sources/Models/Suggestion.swift index a50ebfe9ca..2a79328392 100644 --- a/FreeAPS/Sources/Models/Suggestion.swift +++ b/FreeAPS/Sources/Models/Suggestion.swift @@ -29,6 +29,7 @@ struct Suggestion: JSON, Equatable { let minGuardBG: Decimal? let minPredBG: Decimal? let threshold: Decimal? + let carbRatio: Decimal? } struct Predictions: JSON, Equatable { @@ -75,6 +76,7 @@ extension Suggestion { case minGuardBG case minPredBG case threshold + case carbRatio = "CR" } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 87bc934d55..a85dbfcab3 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -18,6 +18,8 @@ extension AddCarbs { @Published var summation: [String] = [] @Published var maxCarbs: Decimal = 0 @Published var note: String = "" + @Published var id_: String = "" + @Published var summary: String = "" let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -33,25 +35,28 @@ extension AddCarbs { return } carbs = min(carbs, maxCarbs) - - carbsStorage.storeCarbs( - [CarbsEntry( - id: UUID().uuidString, - createdAt: date, - carbs: carbs, - fat: fat, - protein: protein, - note: note, - enteredBy: CarbsEntry.manual, - isFPU: false, fpuID: nil - )] - ) + id_ = UUID().uuidString + + let carbsToStore = [CarbsEntry( + collectionID: id_, + createdAt: date, + carbs: carbs, + fat: fat, + protein: protein, + note: note, + enteredBy: CarbsEntry.manual, + isFPU: false, fpuID: nil + )] + carbsStorage.storeCarbs(carbsToStore) if settingsManager.settings.skipBolusScreenAfterCarbs { apsManager.determineBasalSync() showModal(for: nil) + } else if carbs > 0 { + saveToCoreData(carbsToStore) + showModal(for: .bolus(waitForSuggestion: true, fetch: true)) } else { - showModal(for: .bolus(waitForSuggestion: true)) + hideModal() } } @@ -160,5 +165,37 @@ extension AddCarbs { } return waitersNotepadString } + + func loadEntries(_ editMode: Bool) { + if editMode { + coredataContext.perform { + var mealToEdit = [Meals]() + let requestMeal = Meals.fetchRequest() as NSFetchRequest + let sortMeal = NSSortDescriptor(key: "createdAt", ascending: false) + requestMeal.sortDescriptors = [sortMeal] + requestMeal.fetchLimit = 1 + try? mealToEdit = self.coredataContext.fetch(requestMeal) + + self.carbs = Decimal(mealToEdit.first?.carbs ?? 0) + self.fat = Decimal(mealToEdit.first?.fat ?? 0) + self.protein = Decimal(mealToEdit.first?.protein ?? 0) + self.note = mealToEdit.first?.note ?? "" + self.id_ = mealToEdit.first?.id ?? "" + } + } + } + + func saveToCoreData(_ stored: [CarbsEntry]) { + let save = Meals(context: coredataContext) + save.createdAt = stored.first?.createdAt ?? .distantPast + save.id = stored.first?.collectionID ?? "" + save.carbs = Double(stored.first?.carbs ?? 0) + save.fat = Double(stored.first?.fat ?? 0) + save.protein = Double(stored.first?.protein ?? 0) + save.note = stored.first?.note ?? "" + if coredataContext.hasChanges { + try? coredataContext.save() + } + } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index fd5cb0ffff..278d6cb527 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -5,6 +5,7 @@ import Swinject extension AddCarbs { struct RootView: BaseView { let resolver: Resolver + let editMode: Bool @StateObject var state = StateModel() @State var dish: String = "" @State var isPromptPresented = false @@ -118,7 +119,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text("Save and continue") } + label: { Text(state.carbs > 0 ? "Save and continue" : "Save") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } @@ -129,7 +130,11 @@ extension AddCarbs { } } } - .onAppear(perform: configureView) + .onAppear { + configureView { + state.loadEntries(editMode) + } + } .navigationTitle("Add Meals") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 2cedb4068d..1ccb77f698 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,3 +1,5 @@ + +import LoopKit import SwiftUI import Swinject @@ -7,28 +9,63 @@ extension Bolus { @Injected() var apsManager: APSManager! @Injected() var broadcaster: Broadcaster! @Injected() var pumpHistoryStorage: PumpHistoryStorage! + // added for bolus calculator + @Injected() var glucoseStorage: GlucoseStorage! + @Injected() var settings: SettingsManager! + @Injected() var nsManager: NightscoutManager! + @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 @Published var insulinRequired: Decimal = 0 - @Published var waitForSuggestion: Bool = false - @Published var error: Bool = false + @Published var units: GlucoseUnits = .mmolL + @Published var percentage: Decimal = 0 + @Published var threshold: Decimal = 0 + @Published var maxBolus: Decimal = 0 @Published var errorString: Decimal = 0 @Published var evBG: Int = 0 @Published var insulin: Decimal = 0 - @Published var target: Decimal = 0 @Published var isf: Decimal = 0 - @Published var percentage: Decimal = 0 - @Published var threshold: Decimal = 0 + @Published var error: Bool = false @Published var minGuardBG: Decimal = 0 @Published var minDelta: Decimal = 0 @Published var expectedDelta: Decimal = 0 @Published var minPredBG: Decimal = 0 - @Published var units: GlucoseUnits = .mmolL - @Published var maxBolus: Decimal = 0 + @Published var waitForSuggestion: Bool = false + @Published var carbRatio: Decimal = 0 var waitForSuggestionInitial: Bool = false + // added for bolus calculator + @Published var recentGlucose: BloodGlucose? + @Published var target: Decimal = 0 + @Published var cob: Decimal = 0 + @Published var iob: Decimal = 0 + + @Published var currentBG: Decimal = 0 + @Published var fifteenMinInsulin: Decimal = 0 + @Published var deltaBG: Decimal = 0 + @Published var targetDifferenceInsulin: Decimal = 0 + @Published var wholeCobInsulin: Decimal = 0 + @Published var iobInsulinReduction: Decimal = 0 + @Published var wholeCalc: Decimal = 0 + @Published var roundedWholeCalc: Decimal = 0 + @Published var insulinCalculated: Decimal = 0 + @Published var roundedInsulinCalculated: Decimal = 0 + @Published var fraction: Decimal = 0 + @Published var useCalc: Bool = false + @Published var basal: Decimal = 0 + @Published var fattyMeals: Bool = false + @Published var fattyMealFactor: Decimal = 0 + @Published var useFattyMealCorrectionFactor: Bool = false + @Published var eventualBG: Int = 0 + + @Published var meal: [CarbsEntry]? + @Published var carbs: Decimal = 0 + @Published var fat: Decimal = 0 + @Published var protein: Decimal = 0 + @Published var note: String = "" + override func subscribe() { setupInsulinRequired() broadcaster.register(SuggestionObserver.self, observer: self) @@ -36,6 +73,11 @@ extension Bolus { percentage = settingsManager.settings.insulinReqPercentage threshold = provider.suggestion?.threshold ?? 0 maxBolus = provider.pumpSettings().maxBolus + // added + fraction = settings.settings.overrideFactor + useCalc = settings.settings.useCalc + fattyMeals = settings.settings.fattyMeals + fattyMealFactor = settings.settings.fattyMealFactor if waitForSuggestionInitial { apsManager.determineBasal() @@ -51,13 +93,79 @@ extension Bolus { } } + func getDeltaBG() { + let glucose = glucoseStorage.recent() + guard glucose.count >= 3 else { return } + let lastGlucose = glucose.last! + let thirdLastGlucose = glucose[glucose.count - 3] + let delta = Decimal(lastGlucose.glucose!) - Decimal(thirdLastGlucose.glucose!) + deltaBG = delta + } + + // CALCULATIONS FOR THE BOLUS CALCULATOR + func calculateInsulin() -> Decimal { + // for mmol conversion + var conversion: Decimal = 1.0 + if units == .mmolL { + conversion = 0.0555 + } + // insulin needed for the current blood glucose + let targetDifference = (currentBG - target) * conversion + targetDifferenceInsulin = targetDifference / isf + + // more or less insulin because of bg trend in the last 15 minutes + fifteenMinInsulin = (deltaBG * conversion) / isf + + // determine whole COB for which we want to dose insulin for and then determine insulin for wholeCOB + wholeCobInsulin = cob / carbRatio + + // determine how much the calculator reduces/ increases the bolus because of IOB + iobInsulinReduction = (-1) * iob + + // adding everything together + // add a calc for the case that no fifteenMinInsulin is available + if deltaBG != 0 { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin + fifteenMinInsulin) + } else { + // add (rare) case that no glucose value is available -> maybe display warning? + // if no bg is available, ?? sets its value to 0 + if currentBG == 0 { + wholeCalc = (iobInsulinReduction + wholeCobInsulin) + } else { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin) + } + } + // rounding + let wholeCalcAsDouble = Double(wholeCalc) + roundedWholeCalc = Decimal(round(100 * wholeCalcAsDouble) / 100) + + // apply custom factor at the end of the calculations + let result = wholeCalc * fraction + + // apply custom factor if fatty meal toggle in bolus calc config settings is on and the box for fatty meals is checked (in RootView) + if useFattyMealCorrectionFactor { + insulinCalculated = result * fattyMealFactor + } else { + insulinCalculated = result + } + + // display no negative insulinCalculated + insulinCalculated = max(insulinCalculated, 0) + let insulinCalculatedAsDouble = Double(insulinCalculated) + roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) + + insulinCalculated = min(insulinCalculated, maxBolus) + + return insulinCalculated + } + func add() { guard amount > 0 else { showModal(for: nil) return } - let maxAmount = Double(min(amount, maxBolus)) + let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus)) unlockmanager.unlock() .sink { _ in } receiveValue: { [weak self] _ in @@ -68,38 +176,10 @@ extension Bolus { .store(in: &lifetime) } - func addWithoutBolus() { - guard amount > 0 else { - showModal(for: nil) - return - } - amount = min(amount, maxBolus * 3) // Allow for 3 * Max Bolus for non-pump insulin - - pumpHistoryStorage.storeEvents( - [ - PumpHistoryEvent( - id: UUID().uuidString, - type: .bolus, - timestamp: Date(), - amount: amount, - duration: nil, - durationMin: nil, - rate: nil, - temp: nil, - carbInput: nil, - isExternal: true - ) - ] - ) - showModal(for: nil) - } - func setupInsulinRequired() { DispatchQueue.main.async { self.insulinRequired = self.provider.suggestion?.insulinReq ?? 0 - // Manual Bolus recommendation (normally) yields a higher amount than the insulin reqiured amount computed for SMBs (auto boluses). A manual bolus threfore now (test) uses the Eventual BG for glucose prediction, whereas the insulinReg for SMBs uses the minPredBG for glucose prediction (typically lower than Eventual BG). - var conversion: Decimal = 1.0 if self.units == .mmolL { conversion = 0.0555 @@ -109,6 +189,11 @@ extension Bolus { self.insulin = self.provider.suggestion?.insulinForManualBolus ?? 0 self.target = self.provider.suggestion?.current_target ?? 0 self.isf = self.provider.suggestion?.isf ?? 0 + self.iob = self.provider.suggestion?.iob ?? 0 + self.currentBG = (self.provider.suggestion?.bg ?? 0) + self.cob = self.provider.suggestion?.cob ?? 0 + self.basal = self.provider.suggestion?.rate ?? 0 + self.carbRatio = self.provider.suggestion?.carbRatio ?? 0 if self.settingsManager.settings.insulinReqPercentage != 100 { self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100) @@ -125,7 +210,30 @@ extension Bolus { self.insulinRecommended = self.apsManager .roundBolus(amount: max(self.insulinRecommended, 0)) + + if self.useCalc { + self.getDeltaBG() + self.insulinCalculated = self.calculateInsulin() + } + } + } + + func backToCarbsView(complexEntry: Bool, _ id: String) { + if complexEntry { + DispatchQueue.safeMainSync { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id + ) + nsManager.deleteCarbs( + at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id + ) + } + } else { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id + ) } + showModal(for: .addCarbs(editMode: complexEntry)) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift b/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift new file mode 100644 index 0000000000..f2833050eb --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/Components/CheckboxToggleStyle.swift @@ -0,0 +1,23 @@ +import SwiftUI + +struct CheckboxToggleStyle: ToggleStyle { + func makeBody(configuration: Self.Configuration) -> some View { + HStack { + RoundedRectangle(cornerRadius: 5) + .stroke(lineWidth: 2) + .frame(width: 20, height: 20) + .cornerRadius(5) + .overlay { + if configuration.isOn { + Image(systemName: "checkmark") + } + } + .onTapGesture { + withAnimation { + configuration.isOn.toggle() + } + } + configuration.label + } + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift new file mode 100644 index 0000000000..b92379497f --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -0,0 +1,521 @@ +import Charts +import CoreData +import SwiftUI +import Swinject + +extension Bolus { + struct AlternativeBolusCalcRootView: BaseView { + let resolver: Resolver + let waitForSuggestion: Bool + let fetch: Bool + @StateObject var state: StateModel + @State private var showInfo = false + @State private var exceededMaxBolus = false + + private enum Config { + static let dividerHeight: CGFloat = 2 + static let overlayColour: Color = .white // Currently commented out + static let spacing: CGFloat = 3 + } + + @Environment(\.colorScheme) var colorScheme + + @FetchRequest( + entity: Meals.entity(), + sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false)] + ) var meal: FetchedResults + + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var mealFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + return formatter + } + + private var gluoseFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if state.units == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + return formatter + } + + private var fractionDigits: Int { + if state.units == .mmolL { + return 1 + } else { return 0 } + } + + var body: some View { + Form { + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } + Section { + if fetch { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } else { + Text("No Meal") + } + } header: { Text("Meal Summary") } + + Section { + Button { + let id_ = meal.first?.id ?? "" + state.backToCarbsView(complexEntry: fetch, id_) + } + label: { Text("Edit Meal / Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + } + + Section { + HStack { + Button(action: { + showInfo.toggle() + }, label: { + Image(systemName: "info.circle") + Text("Calculations") + }) + .foregroundStyle(.blue) + .font(.footnote) + .buttonStyle(PlainButtonStyle()) + .frame(maxWidth: .infinity, alignment: .leading) + if state.fattyMeals { + Spacer() + Toggle(isOn: $state.useFattyMealCorrectionFactor) { + Text("Fatty Meal") + } + .toggleStyle(CheckboxToggleStyle()) + .font(.footnote) + .onChange(of: state.useFattyMealCorrectionFactor) { _ in + state.insulinCalculated = state.calculateInsulin() + } + } + } + + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } else { + HStack { + Text("Recommended Bolus") + Spacer() + Text( + formatter + .string(from: Double(state.insulinCalculated) as NSNumber) ?? "" + ) + Text( + NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") + ).foregroundColor(.secondary) + }.contentShape(Rectangle()) + .onTapGesture { state.amount = state.insulinCalculated } + } + + if !state.waitForSuggestion { + HStack { + Text("Bolus") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true + ) + Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) + } + .onChange(of: state.amount) { newValue in + if newValue > state.maxBolus { + exceededMaxBolus = true + } else { + exceededMaxBolus = false + } + } + } + } header: { Text("Bolus Summary") } + + Section { + if state.amount == 0, waitForSuggestion { + Button { state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } else { + Button { state.add() } + label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } + .frame(maxWidth: .infinity, alignment: .center) + .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) + } + } + } + .blur(radius: showInfo ? 3 : 0) + .navigationTitle("Enact Bolus") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + + .onAppear { + configureView { + state.waitForSuggestionInitial = waitForSuggestion + state.waitForSuggestion = waitForSuggestion + state.insulinCalculated = state.calculateInsulin() + } + } + + .popup(isPresented: showInfo) { + bolusInfoAlternativeCalculator + } + } + + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + // Pop-up + var bolusInfoAlternativeCalculator: some View { + VStack { + let unit = NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") + VStack { + VStack(spacing: Config.spacing) { + HStack { + Text("Calculations") + .font(.title3).frame(maxWidth: .infinity, alignment: .center) + }.padding(10) + + if fetch { + VStack { + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + .foregroundColor(.secondary) + Spacer() + Text(note) + } + } + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + .foregroundColor(.secondary) + Spacer() + Text(mealFormatter.string(from: carbs as NSNumber) ?? "") + Text("g").foregroundColor(.secondary) + } + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + .foregroundColor(.secondary) + Spacer() + Text(mealFormatter.string(from: protein as NSNumber) ?? "") + Text("g").foregroundColor(.secondary) + } + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + .foregroundColor(.secondary) + Spacer() + Text(mealFormatter.string(from: fat as NSNumber) ?? "") + Text("g").foregroundColor(.secondary) + } + } + }.padding() + } + + if fetch { Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + } + + VStack { + HStack { + Text("Carb Ratio") + .foregroundColor(.secondary) + Spacer() + Text(state.carbRatio.formatted()) + Text(NSLocalizedString(" g/U", comment: " grams per Unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF") + .foregroundColor(.secondary) + Spacer() + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("Target Glucose") + .foregroundColor(.secondary) + Spacer() + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text( + target + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + ) + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + HStack { + Text("Basal") + .foregroundColor(.secondary) + Spacer() + let basal = state.basal + Text(basal.formatted()) + Text(NSLocalizedString(" U/h", comment: " Units per hour")) + .foregroundColor(.secondary) + } + HStack { + Text("Fraction") + .foregroundColor(.secondary) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + } + if state.useFattyMealCorrectionFactor { + HStack { + Text("Fatty Meal Factor") + .foregroundColor(.orange) + Spacer() + let fraction = state.fattyMealFactor + Text(fraction.formatted()) + .foregroundColor(.orange) + } + } + }.padding() + } + + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + + VStack(spacing: Config.spacing) { + HStack { + Text("Glucose") + .foregroundColor(.secondary) + Spacer() + let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG + Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue) + .foregroundColor(.secondary) + Spacer() + Image(systemName: "arrow.right") + Spacer() + + let targetDifferenceInsulin = state.targetDifferenceInsulin + // rounding + let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue + let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) + Text(roundedTargetDifferenceInsulin.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + HStack { + Text("IOB") + .foregroundColor(.secondary) + Spacer() + let iob = state.iob + // rounding + let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue + let roundedIob = Decimal(round(100 * iobAsDouble) / 100) + Text(roundedIob.formatted()) + Text(unit) + .foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let iobCalc = state.iobInsulinReduction + // rounding + let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue + let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) + Text(roundedIobCalc.formatted()) + Text(unit).foregroundColor(.secondary) + } + HStack { + Text("Trend") + .foregroundColor(.secondary) + Spacer() + let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG + Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let trendInsulin = state.fifteenMinInsulin + // rounding + let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue + let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) + Text(roundedTrendInsulin.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + HStack { + Text("COB") + .foregroundColor(.secondary) + Spacer() + let cob = state.cob + Text(cob.formatted()) + + let unitGrams = NSLocalizedString(" g", comment: "grams") + Text(unitGrams).foregroundColor(.secondary) + + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let insulinCob = state.wholeCobInsulin + // rounding + let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue + let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) + Text(roundedInsulinCob.formatted()) + Text(unit) + .foregroundColor(.secondary) + } + }.padding() + + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + + VStack { + HStack { + Text("Full Bolus") + .foregroundColor(.secondary) + Spacer() + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + } + }.padding(.horizontal) + + Divider().frame(height: Config.dividerHeight) + + VStack { + HStack { + Text("Result") + .fontWeight(.bold) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + Text(" x ") + .foregroundColor(.secondary) + + // if fatty meal is chosen + if state.useFattyMealCorrectionFactor { + let fattyMealFactor = state.fattyMealFactor + Text(fattyMealFactor.formatted()) + .foregroundColor(.orange) + Text(" x ") + .foregroundColor(.secondary) + } + + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(unit) + .foregroundColor(.secondary) + Text(" = ") + .foregroundColor(.secondary) + + let result = state.insulinCalculated + // rounding + let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue + let roundedResult = Decimal(round(100 * resultAsDouble) / 100) + Text(roundedResult.formatted()) + .fontWeight(.bold) + .font(.system(size: 16)) + .foregroundColor(.blue) + Text(unit) + .foregroundColor(.secondary) + } + }.padding() + + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + + if exceededMaxBolus { + HStack { + let maxBolus = state.maxBolus + let maxBolusFormatted = maxBolus.formatted() + Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(unit)!") + } + .padding() + .fontWeight(.semibold) + .foregroundStyle(Color.loopRed) + } + } + .padding(.top, 10) + .padding(.bottom, 15) + + // Hide pop-up + VStack { + Button { + showInfo = false + } + label: { + Text("OK") + } + .frame(maxWidth: .infinity, alignment: .center) + .font(.system(size: 16)) + .fontWeight(.semibold) + .foregroundColor(.blue) + } + .padding(.bottom, 20) + } + .font(.footnote) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4).opacity(0.9)) + ) + } + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift index 53e95f6021..6b381cce2a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift @@ -5,275 +5,22 @@ extension Bolus { struct RootView: BaseView { let resolver: Resolver let waitForSuggestion: Bool + let fetch: Bool @StateObject var state = StateModel() - @State private var isAddInsulinAlertPresented = false - @State private var presentInfo = false - @State private var displayError = false - - @Environment(\.colorScheme) var colorScheme - - private var formatter: NumberFormatter { - let formatter = NumberFormatter() - formatter.numberStyle = .decimal - formatter.maximumFractionDigits = 2 - return formatter - } - - private var fractionDigits: Int { - if state.units == .mmolL { - return 1 - } else { return 0 } - } - var body: some View { - Form { - Section { - if state.waitForSuggestion { - HStack { - Text("Wait please").foregroundColor(.secondary) - Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug - } - } else { - HStack { - Text("Insulin recommended") - Image(systemName: "info.bubble") - .symbolRenderingMode(.palette) - .foregroundStyle(.primary, .blue) - .onTapGesture { - presentInfo.toggle() - } - - Spacer() - - Text( - formatter - .string(from: state.insulinRecommended as NSNumber)! + - NSLocalizedString(" U", comment: "Insulin unit") - ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary) - .onTapGesture { - if state.error, state.insulinRecommended > 0 { displayError = true } - else { state.amount = state.insulinRecommended } - } - }.contentShape(Rectangle()) - } - } - header: { Text("Recommendation") } - if !state.waitForSuggestion { - Section { - HStack { - Text("Amount") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: true, - cleanInput: true - ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) - } - } - header: { Text("Bolus") } - Section { - Button { state.add() } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) - } - - if waitForSuggestion { - Section { - Button { state.showModal(for: nil) } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) - } - } - } - } - .alert(isPresented: $displayError) { - Alert( - title: Text("Warning!"), - message: Text("\n" + alertString() + "\n"), - primaryButton: .destructive( - Text("Add"), - action: { - state.amount = state.insulinRecommended - displayError = false - } - ), - secondaryButton: .cancel() - ) - }.onAppear { - configureView { - state.waitForSuggestionInitial = waitForSuggestion - state.waitForSuggestion = waitForSuggestion - } - } - .navigationTitle("Enact Bolus") - .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) - .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { - bolusInfo - } - } - - var bolusInfo: some View { - VStack { - // Variables - VStack(spacing: 3) { - HStack { - Text("Eventual Glucose").foregroundColor(.secondary) - let evg = state.units == .mmolL ? Decimal(state.evBG).asMmolL : Decimal(state.evBG) - Text(evg.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - } - HStack { - Text("Target Glucose").foregroundColor(.secondary) - let target = state.units == .mmolL ? state.target.asMmolL : state.target - Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - } - HStack { - Text("ISF").foregroundColor(.secondary) - let isf = state.isf - Text(isf.formatted()) - Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) - .foregroundColor(.secondary) - } - HStack { - Text("ISF:") - Text("Insulin Sensitivity") - }.foregroundColor(.secondary).italic() - if state.percentage != 100 { - HStack { - Text("Percentage setting").foregroundColor(.secondary) - let percentage = state.percentage - Text(percentage.formatted()) - Text("%").foregroundColor(.secondary) - } - } - HStack { - Text("Formula:") - Text("(Eventual Glucose - Target) / ISF") - }.foregroundColor(.secondary).italic().padding(.top, 5) - } - .font(.footnote) - .padding(.top, 10) - Divider() - // Formula - VStack(spacing: 5) { - let unit = NSLocalizedString( - " U", - comment: "Unit in number of units delivered (keep the space character!)" - ) - let color: Color = (state.percentage != 100 && state.insulin > 0) ? .secondary : .blue - let fontWeight: Font.Weight = (state.percentage != 100 && state.insulin > 0) ? .regular : .bold - HStack { - Text(NSLocalizedString("Insulin recommended", comment: "") + ":").font(.callout) - Text(state.insulin.formatted() + unit).font(.callout).foregroundColor(color).fontWeight(fontWeight) - } - if state.percentage != 100, state.insulin > 0 { - Divider() - HStack { Text(state.percentage.formatted() + " % ->").font(.callout).foregroundColor(.secondary) - Text( - state.insulinRecommended.formatted() + unit - ).font(.callout).foregroundColor(.blue).bold() - } - } - } - // Warning - if state.error, state.insulinRecommended > 0 { - VStack(spacing: 5) { - Divider() - Text("Warning!").font(.callout).bold().foregroundColor(.orange) - Text(alertString()).font(.footnote) - Divider() - }.padding(.horizontal, 10) - } - // Footer - if !(state.error && state.insulinRecommended > 0) { - VStack { - Text( - "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." - ).font(.caption2).foregroundColor(.secondary) - }.padding(20) - } - // Hide button - VStack { - Button { presentInfo = false } - label: { Text("Hide") }.frame(maxWidth: .infinity, alignment: .center).font(.callout) - .foregroundColor(.blue) - }.padding(.bottom, 10) - } - .background( - RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) - // .fill(Color(.systemGray).gradient) // A more prominent pop-up, but harder to read - ) - } - - // Localize the Oref0 error/warning strings. The default should never be returned - private func alertString() -> String { - switch state.errorString { - case 1, - 2: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state.minGuardBG - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state.units - .rawValue + ", " + - NSLocalizedString( - "which is below your Threshold (", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state - .threshold.formatted() + " " + state.units.rawValue + ")" - case 3: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Climbing: ", comment: "Bolus pop-up / Alert string. Make translatons concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 4: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Falling: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 5: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + - state.expectedDelta - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + - NSLocalizedString(". Changing: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state - .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - case 6: - return NSLocalizedString( - "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", - comment: "Bolus pop-up / Alert string. Make translations concise!" - ) + state - .minPredBG - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state - .units - .rawValue - default: - return "Ignore Warning..." + if state.useCalc { + // show alternative bolus calc based on toggle in bolus calc settings + AlternativeBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch, state: state) + } else { + // show iAPS standard bolus calc + DefaultBolusCalcRootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch, state: state) } } } } +// fix iOS 15 bug struct ActivityIndicator: UIViewRepresentable { @Binding var isAnimating: Bool let style: UIActivityIndicatorView.Style diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift new file mode 100644 index 0000000000..1054f3bae3 --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -0,0 +1,275 @@ +import SwiftUI +import Swinject + +extension Bolus { + struct DefaultBolusCalcRootView: BaseView { + let resolver: Resolver + let waitForSuggestion: Bool + let fetch: Bool + @StateObject var state = StateModel() + + @State private var isAddInsulinAlertPresented = false + @State private var presentInfo = false + @State private var displayError = false + + @Environment(\.colorScheme) var colorScheme + + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var fractionDigits: Int { + if state.units == .mmolL { + return 1 + } else { return 0 } + } + + var body: some View { + Form { + Section { + if state.waitForSuggestion { + HStack { + Text("Wait please").foregroundColor(.secondary) + Spacer() + ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug + } + } else { + HStack { + Text("Insulin recommended") + Image(systemName: "info.bubble") + .symbolRenderingMode(.palette) + .foregroundStyle(.primary, .blue) + .onTapGesture { + presentInfo.toggle() + } + + Spacer() + + Text( + formatter + .string(from: state.insulinRecommended as NSNumber)! + + NSLocalizedString(" U", comment: "Insulin unit") + ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary) + .onTapGesture { + if state.error, state.insulinRecommended > 0 { displayError = true } + else { state.amount = state.insulinRecommended } + } + }.contentShape(Rectangle()) + } + } + header: { Text("Recommendation") } + if !state.waitForSuggestion { + Section { + HStack { + Text("Amount") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: true, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) + } + } + header: { Text("Bolus") } + Section { + Button { state.add() } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) + } + + if waitForSuggestion { + Section { + Button { state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } + } + } + } + .alert(isPresented: $displayError) { + Alert( + title: Text("Warning!"), + message: Text("\n" + alertString() + "\n"), + primaryButton: .destructive( + Text("Add"), + action: { + state.amount = state.insulinRecommended + displayError = false + } + ), + secondaryButton: .cancel() + ) + }.onAppear { + configureView { + state.waitForSuggestionInitial = waitForSuggestion + state.waitForSuggestion = waitForSuggestion + } + } + .navigationTitle("Enact Bolus") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { + bolusInfo + } + } + + var bolusInfo: some View { + VStack { + // Variables + VStack(spacing: 3) { + HStack { + Text("Eventual Glucose").foregroundColor(.secondary) + let evg = state.units == .mmolL ? Decimal(state.evBG).asMmolL : Decimal(state.evBG) + Text(evg.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + } + HStack { + Text("Target Glucose").foregroundColor(.secondary) + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + } + HStack { + Text("ISF").foregroundColor(.secondary) + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF:") + Text("Insulin Sensitivity") + }.foregroundColor(.secondary).italic() + if state.percentage != 100 { + HStack { + Text("Percentage setting").foregroundColor(.secondary) + let percentage = state.percentage + Text(percentage.formatted()) + Text("%").foregroundColor(.secondary) + } + } + HStack { + Text("Formula:") + Text("(Eventual Glucose - Target) / ISF") + }.foregroundColor(.secondary).italic().padding(.top, 5) + } + .font(.footnote) + .padding(.top, 10) + Divider() + // Formula + VStack(spacing: 5) { + let unit = NSLocalizedString( + " U", + comment: "Unit in number of units delivered (keep the space character!)" + ) + let color: Color = (state.percentage != 100 && state.insulin > 0) ? .secondary : .blue + let fontWeight: Font.Weight = (state.percentage != 100 && state.insulin > 0) ? .regular : .bold + HStack { + Text(NSLocalizedString("Insulin recommended", comment: "") + ":").font(.callout) + Text(state.insulin.formatted() + unit).font(.callout).foregroundColor(color).fontWeight(fontWeight) + } + if state.percentage != 100, state.insulin > 0 { + Divider() + HStack { Text(state.percentage.formatted() + " % ->").font(.callout).foregroundColor(.secondary) + Text( + state.insulinRecommended.formatted() + unit + ).font(.callout).foregroundColor(.blue).bold() + } + } + } + // Warning + if state.error, state.insulinRecommended > 0 { + VStack(spacing: 5) { + Divider() + Text("Warning!").font(.callout).bold().foregroundColor(.orange) + Text(alertString()).font(.footnote) + Divider() + }.padding(.horizontal, 10) + } + // Footer + if !(state.error && state.insulinRecommended > 0) { + VStack { + Text( + "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." + ).font(.caption2).foregroundColor(.secondary) + }.padding(20) + } + // Hide button + VStack { + Button { presentInfo = false } + label: { Text("Hide") }.frame(maxWidth: .infinity, alignment: .center).font(.callout) + .foregroundColor(.blue) + }.padding(.bottom, 10) + } + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) + ) + } + + // Localize the Oref0 error/warning strings. The default should never be returned + private func alertString() -> String { + switch state.errorString { + case 1, + 2: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state.minGuardBG + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state.units + .rawValue + ", " + + NSLocalizedString( + "which is below your Threshold (", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state + .threshold.formatted() + " " + state.units.rawValue + ")" + case 3: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Climbing: ", comment: "Bolus pop-up / Alert string. Make translatons concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 4: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Falling: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 5: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + + state.expectedDelta + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + + NSLocalizedString(". Changing: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state + .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + case 6: + return NSLocalizedString( + "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ", + comment: "Bolus pop-up / Alert string. Make translations concise!" + ) + state + .minPredBG + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state + .units + .rawValue + default: + return "Ignore Warning..." + } + } + } +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift new file mode 100644 index 0000000000..2b0fa79066 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigDataFlow.swift @@ -0,0 +1,5 @@ +enum BolusCalculatorConfig { + enum Config {} +} + +protocol BolusCalculatorConfigProvider {} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift new file mode 100644 index 0000000000..7aa2302e09 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorConfigProvider.swift @@ -0,0 +1,3 @@ +extension BolusCalculatorConfig { + final class Provider: BaseProvider, BolusCalculatorConfigProvider {} +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift new file mode 100644 index 0000000000..d6063167c7 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift @@ -0,0 +1,27 @@ +import SwiftUI + +extension BolusCalculatorConfig { + final class StateModel: BaseStateModel { + @Published var overrideFactor: Decimal = 0 + @Published var useCalc: Bool = false + @Published var fattyMeals: Bool = false + @Published var fattyMealFactor: Decimal = 0 + + override func subscribe() { + subscribeSetting(\.overrideFactor, on: $overrideFactor, initial: { + let value = max(min($0, 1.2), 0.1) + overrideFactor = value + }, map: { + $0 + }) + subscribeSetting(\.useCalc, on: $useCalc) { useCalc = $0 } + subscribeSetting(\.fattyMeals, on: $fattyMeals) { fattyMeals = $0 } + subscribeSetting(\.fattyMealFactor, on: $fattyMealFactor, initial: { + let value = max(min($0, 1.2), 0.1) + fattyMealFactor = value + }, map: { + $0 + }) + } + } +} diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift new file mode 100644 index 0000000000..cade465161 --- /dev/null +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift @@ -0,0 +1,52 @@ +import SwiftUI +import Swinject + +extension BolusCalculatorConfig { + struct RootView: BaseView { + let resolver: Resolver + @StateObject var state = StateModel() + + private var conversionFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + + return formatter + } + + var body: some View { + Form { + Section(header: Text("Calculator settings")) { + HStack { + Toggle("Use alternative Bolus Calculator", isOn: $state.useCalc) + } + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.8", value: $state.overrideFactor, formatter: conversionFormatter) + } + } + Section(header: Text("Fatty Meals")) { + HStack { + Toggle("Apply factor for fatty meals", isOn: $state.fattyMeals) + } + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.7", value: $state.fattyMealFactor, formatter: conversionFormatter) + } + } + + Section( + footer: Text( + "This is another approach to the bolus calculator integrated in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." + ) + ) + {} + } + .onAppear(perform: configureView) + .navigationBarTitle("Bolus Calculator") + .navigationBarTitleDisplayMode(.automatic) + } + } +} diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index f5a8e50ddd..4540bd957b 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -33,7 +33,7 @@ extension DataTable { func deleteCarbs(_ treatement: Treatment) { nightscoutManager.deleteCarbs( - at: treatement.date, + at: treatement.id, isFPU: treatement.isFPU, fpuID: treatement.fpuID, syncID: treatement.id diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 1826591275..bf5b1045ca 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -40,7 +40,7 @@ extension DataTable { let carbs = self.provider.carbs() .filter { !($0.isFPU ?? false) } .map { - if let id = $0.id { + if let id = $0.collectionID { return Treatment( units: units, type: .carbs, @@ -62,7 +62,7 @@ extension DataTable { type: .fpus, date: $0.createdAt, amount: $0.carbs, - id: $0.id, + id: $0.collectionID, isFPU: $0.isFPU, fpuID: $0.fpuID, note: $0.note diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 715fe62f17..2075d544b6 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -196,7 +196,7 @@ extension Home { } func addCarbs() { - showModal(for: .addCarbs) + showModal(for: .addCarbs(editMode: false)) } func runLoop() { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a74c57add2..acc79ac51f 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -481,7 +481,7 @@ extension Home { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { - Button { state.showModal(for: .addCarbs) } + Button { state.showModal(for: .addCarbs(editMode: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image("carbs") @@ -511,7 +511,12 @@ extension Home { .foregroundColor(.loopGreen) .buttonStyle(.borderless) Spacer() - Button { state.showModal(for: .bolus(waitForSuggestion: false)) } + Button { + state.showModal(for: .bolus( + waitForSuggestion: true, + fetch: false + )) + } label: { Image("bolus") .renderingMode(.template) diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index 5f9e3b6962..e475e82047 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -8,9 +8,11 @@ extension PreferencesEditor { @Published var insulinReqPercentage: Decimal = 70 @Published var skipBolusScreenAfterCarbs = false @Published var sections: [FieldSection] = [] + @Published var useAlternativeBolusCalc: Bool = false override func subscribe() { preferences = provider.preferences + useAlternativeBolusCalc = settingsManager.settings.useCalc subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 38f374d396..d745a75a30 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -30,9 +30,11 @@ extension PreferencesEditor { Toggle("Remote control", isOn: $state.allowAnnouncements) - HStack { - Text("Recommended Bolus Percentage") - DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) + if !state.useAlternativeBolusCalc { + HStack { + Text("Recommended Bolus Percentage") + DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) + } } Toggle("Skip Bolus screen after carbs", isOn: $state.skipBolusScreenAfterCarbs) diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index ba68523ff2..73da26e1f0 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -43,6 +43,7 @@ extension Settings { Text("Carb Ratios").navigationLink(to: .crEditor, from: self) Text("Target Glucose").navigationLink(to: .targetsEditor, from: self) Text("Autotune").navigationLink(to: .autotuneConfig, from: self) + Text("Bolus Calculator").navigationLink(to: .bolusCalculatorConfig, from: self) } Section(header: Text("Developer")) { diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index af152733c9..26a2b13dc1 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -14,9 +14,9 @@ enum Screen: Identifiable, Hashable { case crEditor case targetsEditor case preferencesEditor - case addCarbs + case addCarbs(editMode: Bool) case addTempTarget - case bolus(waitForSuggestion: Bool) + case bolus(waitForSuggestion: Bool, fetch: Bool) case manualTempBasal case autotuneConfig case dataTable @@ -32,6 +32,7 @@ enum Screen: Identifiable, Hashable { case statistics case watch case statisticsConfig + case bolusCalculatorConfig var id: Int { String(reflecting: self).hashValue } } @@ -63,12 +64,12 @@ extension Screen { TargetsEditor.RootView(resolver: resolver) case .preferencesEditor: PreferencesEditor.RootView(resolver: resolver) - case .addCarbs: - AddCarbs.RootView(resolver: resolver) + case let .addCarbs(editMode): + AddCarbs.RootView(resolver: resolver, editMode: editMode) case .addTempTarget: AddTempTarget.RootView(resolver: resolver) - case let .bolus(waitForSuggestion): - Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion) + case let .bolus(waitForSuggestion, fetch): + Bolus.RootView(resolver: resolver, waitForSuggestion: waitForSuggestion, fetch: fetch) case .manualTempBasal: ManualTempBasal.RootView(resolver: resolver) case .autotuneConfig: @@ -99,6 +100,8 @@ extension Screen { Stat.RootView(resolver: resolver) case .statisticsConfig: StatConfig.RootView(resolver: resolver) + case .bolusCalculatorConfig: + BolusCalculatorConfig.RootView(resolver: resolver) } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 9985598521..1e843b388f 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -194,7 +194,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let sampleIDs = samples.compactMap(\.syncIdentifier) let sampleDates = samples.map(\.startDate) let samplesToSave = carbsWithId - .filter { !sampleIDs.contains($0.id!) } // id existing in AH + .filter { !sampleIDs.contains($0.collectionID!) } // id existing in AH .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime .map { HKQuantitySample( diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 7dd504a1cb..b5725df4d2 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -141,17 +141,18 @@ extension NightscoutAPI { .eraseToAnyPublisher() } - func deleteCarbs(at date: Date) -> AnyPublisher { + func deleteCarbs(at uniqueID: String) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme components.host = url.host components.port = url.port components.path = Config.treatmentsPath components.queryItems = [ - URLQueryItem(name: "find[carbs][$exists]", value: "true"), + // Removed below because it prevented all futire entries to be deleted. Don't know why? + /* URLQueryItem(name: "find[carbs][$exists]", value: "true"), */ URLQueryItem( - name: "find[created_at][$eq]", - value: Formatter.iso8601withFractionalSeconds.string(from: date) + name: "find[collectionID][$eq]", + value: uniqueID ) ] @@ -322,7 +323,7 @@ extension NightscoutAPI { if let secret = secret { request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") } - request.httpBody = try! JSONCoding.encoder.encode(treatments) + request.httpBody = try? JSONCoding.encoder.encode(treatments) request.httpMethod = "POST" return service.run(request) diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 712e347817..94b8118d20 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource { func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never> func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> - func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -177,62 +177,32 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .eraseToAnyPublisher() } - func deleteCarbs(at date: Date, isFPU: Bool?, fpuID: String?, syncID: String) { + func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) { // remove in AH healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID) guard let nightscout = nightscoutAPI, isUploadEnabled else { - carbsStorage.deleteCarbs(at: date) + carbsStorage.deleteCarbs(at: uniqueID) return } - if let isFPU = isFPU, isFPU { - guard let fpuID = fpuID else { return } - let allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - let dates = allValues.filter { $0.fpuID == fpuID }.map(\.createdAt).removeDublicates() - - let publishers = dates - .map { d -> AnyPublisher in - nightscout.deleteCarbs( - at: d + nightscout.deleteCarbs(at: uniqueID) + .collect() + .sink { completion in + self.carbsStorage.deleteCarbs(at: uniqueID) + switch completion { + case .finished: + debug(.nightscout, "Carbs deleted") + case let .failure(error): + info( + .nightscout, + "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning ) } - - Publishers.MergeMany(publishers) - .collect() - .sink { completion in - self.carbsStorage.deleteCarbs(at: date) - switch completion { - case .finished: - debug(.nightscout, "Carbs deleted") - - case let .failure(error): - info( - .nightscout, - "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", - type: MessageType.warning - ) - } - } receiveValue: { _ in } - .store(in: &lifetime) - - } else { - nightscout.deleteCarbs(at: date) - .sink { completion in - self.carbsStorage.deleteCarbs(at: date) - switch completion { - case .finished: - debug(.nightscout, "Carbs deleted") - case let .failure(error): - info( - .nightscout, - "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", - type: MessageType.warning - ) - } - } receiveValue: {} - .store(in: &lifetime) - } + } receiveValue: { _ in } + .store(in: &lifetime) + // } } func deleteInsulin(at date: Date) { diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index 74e5025337..16df25d2b4 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -272,7 +272,7 @@ extension BaseWatchManager: WCSessionDelegate { { carbsStorage.storeCarbs( [CarbsEntry( - id: UUID().uuidString, + collectionID: UUID().uuidString, createdAt: Date(), carbs: Decimal(carbs), fat: Decimal(fat), diff --git a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift index e891f3012a..a230c4c2e5 100644 --- a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift +++ b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift @@ -11,7 +11,7 @@ import Foundation carbsStorage.storeCarbs( [CarbsEntry( - id: UUID().uuidString, + collectionID: UUID().uuidString, createdAt: dateAdded, carbs: carbs, fat: Decimal(quantityFat), diff --git a/FreeAPS/Sources/Views/DecimalTextField.swift b/FreeAPS/Sources/Views/DecimalTextField.swift index 7b46a960f0..9cf67e8a5e 100644 --- a/FreeAPS/Sources/Views/DecimalTextField.swift +++ b/FreeAPS/Sources/Views/DecimalTextField.swift @@ -30,31 +30,6 @@ struct DecimalTextField: UIViewRepresentable { textfield.text = cleanInput ? "" : formatter.string(for: value) ?? placeholder textfield.textAlignment = .right - let toolBar = UIToolbar(frame: CGRect( - x: 0, - y: 0, - width: textfield.frame.size.width, - height: 44 - )) - let clearButton = UIBarButtonItem( - title: NSLocalizedString("Clear", comment: "Clear button"), - style: .plain, - target: self, - action: #selector(textfield.clearButtonTapped(button:)) - ) - let doneButton = UIBarButtonItem( - title: NSLocalizedString("Done", comment: "Done button"), - style: .done, - target: self, - action: #selector(textfield.doneButtonTapped(button:)) - ) - let space = UIBarButtonItem( - barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, - target: nil, - action: nil - ) - toolBar.setItems([clearButton, space, doneButton], animated: true) - textfield.inputAccessoryView = toolBar if autofocus { DispatchQueue.main.async { textfield.becomeFirstResponder() From 83765ba17d2eb71e5583f05129561226d071b30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 15:54:29 +0100 Subject: [PATCH 145/405] Make button more descriptive --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b92379497f..61dd8f6591 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -108,7 +108,7 @@ extension Bolus { let id_ = meal.first?.id ?? "" state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text("Edit Meal / Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Delete and Edit" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { From a983a914ac177756443e17cdf0e15d9574267f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 15:54:29 +0100 Subject: [PATCH 146/405] Make button more descriptive --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b92379497f..61dd8f6591 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -108,7 +108,7 @@ extension Bolus { let id_ = meal.first?.id ?? "" state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text("Edit Meal / Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Delete and Edit" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { From e2174ab31c0f7ac68d319d169048108e426974c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 16:16:00 +0100 Subject: [PATCH 147/405] Update Label --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 61dd8f6591..ab2ddeb507 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -108,7 +108,7 @@ extension Bolus { let id_ = meal.first?.id ?? "" state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text(fetch ? "Delete and Edit" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Delete and Go Back" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { From 21896cc6d9bdea3f245f6f14afcb5799df6f91f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 16:16:00 +0100 Subject: [PATCH 148/405] Update Label --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 61dd8f6591..ab2ddeb507 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -108,7 +108,7 @@ extension Bolus { let id_ = meal.first?.id ?? "" state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text(fetch ? "Delete and Edit" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Delete and Go Back" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { From 3507cfa2f2f55e5e7c27838b14a90a6d24b06b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 19:05:24 +0100 Subject: [PATCH 149/405] A hack t0 make it appear as not saved until you enact or tap "Save" --- .../AddCarbs/View/AddCarbsRootView.swift | 2 +- .../Modules/Bolus/BolusStateModel.swift | 24 +++++++++------- .../View/AlternativeBolusCalcRootView.swift | 28 +++++++++++++++---- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 278d6cb527..dfdd8cfb4c 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -119,7 +119,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text(state.carbs > 0 ? "Save and continue" : "Save") } + label: { Text(state.carbs > 0 ? "Continue" : "Save") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 1ccb77f698..7caebbe8eb 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -219,21 +219,25 @@ extension Bolus { } func backToCarbsView(complexEntry: Bool, _ id: String) { - if complexEntry { - DispatchQueue.safeMainSync { - nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id - ) - nsManager.deleteCarbs( - at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id - ) - } + delete(deleteTwice: complexEntry, id: id) + showModal(for: .addCarbs(editMode: complexEntry)) + } + + func delete(deleteTwice: Bool, id: String) { + if deleteTwice { + // DispatchQueue.safeMainSync { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id + ) + nsManager.deleteCarbs( + at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id + ) + // } } else { nsManager.deleteCarbs( at: id, isFPU: nil, fpuID: nil, syncID: id ) } - showModal(for: .addCarbs(editMode: complexEntry)) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index ab2ddeb507..8c8b253073 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -11,6 +11,7 @@ extension Bolus { @StateObject var state: StateModel @State private var showInfo = false @State private var exceededMaxBolus = false + @State private var keepForNextWiew: Bool = false private enum Config { static let dividerHeight: CGFloat = 2 @@ -106,9 +107,10 @@ extension Bolus { Section { Button { let id_ = meal.first?.id ?? "" + keepForNextWiew = true state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text(fetch ? "Delete and Go Back" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { @@ -182,10 +184,16 @@ extension Bolus { Section { if state.amount == 0, waitForSuggestion { - Button { state.showModal(for: nil) } + Button { + keepForNextWiew = true + state.showModal(for: nil) + } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } else { - Button { state.add() } + Button { + keepForNextWiew = true + state.add() + } label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } .frame(maxWidth: .infinity, alignment: .center) .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) @@ -198,8 +206,10 @@ extension Bolus { .blur(radius: showInfo ? 3 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) - + .navigationBarItems( + leading: Button { state.hideModal() } + label: { Text("Close") } + ) .onAppear { configureView { state.waitForSuggestionInitial = waitForSuggestion @@ -207,7 +217,13 @@ extension Bolus { state.insulinCalculated = state.calculateInsulin() } } - + .onDisappear { + if fetch, hasFatOrProtein, !keepForNextWiew { + state.delete(deleteTwice: true, id: meal.first?.id ?? "") + } else if fetch, !keepForNextWiew { + state.delete(deleteTwice: false, id: meal.first?.id ?? "") + } + } .popup(isPresented: showInfo) { bolusInfoAlternativeCalculator } From 8a1fae698acdcf89c6671822adc3367fdc8f77d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 19:05:24 +0100 Subject: [PATCH 150/405] A hack to make it appear as not saved until you enact or tap "Save" --- .../AddCarbs/View/AddCarbsRootView.swift | 2 +- .../Modules/Bolus/BolusStateModel.swift | 24 +++++++++------- .../View/AlternativeBolusCalcRootView.swift | 28 +++++++++++++++---- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 278d6cb527..dfdd8cfb4c 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -119,7 +119,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text(state.carbs > 0 ? "Save and continue" : "Save") } + label: { Text(state.carbs > 0 ? "Continue" : "Save") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 1ccb77f698..7caebbe8eb 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -219,21 +219,25 @@ extension Bolus { } func backToCarbsView(complexEntry: Bool, _ id: String) { - if complexEntry { - DispatchQueue.safeMainSync { - nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id - ) - nsManager.deleteCarbs( - at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id - ) - } + delete(deleteTwice: complexEntry, id: id) + showModal(for: .addCarbs(editMode: complexEntry)) + } + + func delete(deleteTwice: Bool, id: String) { + if deleteTwice { + // DispatchQueue.safeMainSync { + nsManager.deleteCarbs( + at: id, isFPU: nil, fpuID: nil, syncID: id + ) + nsManager.deleteCarbs( + at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id + ) + // } } else { nsManager.deleteCarbs( at: id, isFPU: nil, fpuID: nil, syncID: id ) } - showModal(for: .addCarbs(editMode: complexEntry)) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index ab2ddeb507..8c8b253073 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -11,6 +11,7 @@ extension Bolus { @StateObject var state: StateModel @State private var showInfo = false @State private var exceededMaxBolus = false + @State private var keepForNextWiew: Bool = false private enum Config { static let dividerHeight: CGFloat = 2 @@ -106,9 +107,10 @@ extension Bolus { Section { Button { let id_ = meal.first?.id ?? "" + keepForNextWiew = true state.backToCarbsView(complexEntry: fetch, id_) } - label: { Text(fetch ? "Delete and Go Back" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } Section { @@ -182,10 +184,16 @@ extension Bolus { Section { if state.amount == 0, waitForSuggestion { - Button { state.showModal(for: nil) } + Button { + keepForNextWiew = true + state.showModal(for: nil) + } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } else { - Button { state.add() } + Button { + keepForNextWiew = true + state.add() + } label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } .frame(maxWidth: .infinity, alignment: .center) .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) @@ -198,8 +206,10 @@ extension Bolus { .blur(radius: showInfo ? 3 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) - + .navigationBarItems( + leading: Button { state.hideModal() } + label: { Text("Close") } + ) .onAppear { configureView { state.waitForSuggestionInitial = waitForSuggestion @@ -207,7 +217,13 @@ extension Bolus { state.insulinCalculated = state.calculateInsulin() } } - + .onDisappear { + if fetch, hasFatOrProtein, !keepForNextWiew { + state.delete(deleteTwice: true, id: meal.first?.id ?? "") + } else if fetch, !keepForNextWiew { + state.delete(deleteTwice: false, id: meal.first?.id ?? "") + } + } .popup(isPresented: showInfo) { bolusInfoAlternativeCalculator } From 58064baafaf5f30a1104a4247a0adfd76cbca196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 2 Nov 2023 20:10:32 +0100 Subject: [PATCH 151/405] Round to nearest increment --- FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 7caebbe8eb..8af8c78949 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,4 +1,5 @@ +import Foundation import LoopKit import SwiftUI import Swinject @@ -153,10 +154,10 @@ extension Bolus { insulinCalculated = max(insulinCalculated, 0) let insulinCalculatedAsDouble = Double(insulinCalculated) roundedInsulinCalculated = Decimal(round(100 * insulinCalculatedAsDouble) / 100) - insulinCalculated = min(insulinCalculated, maxBolus) - return insulinCalculated + return apsManager + .roundBolus(amount: max(insulinCalculated, 0)) } func add() { From b0a7bf42e7666e3898f25b2f0bd6bd04e1a7ba0c Mon Sep 17 00:00:00 2001 From: dsnallfot <72826201+dsnallfot@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:38:46 +0100 Subject: [PATCH 152/405] Fix for deletion of previous entered carbs when entering addcarbs view through add meal button in bolus view (#297) --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 8c8b253073..b63f526379 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -107,8 +107,12 @@ extension Bolus { Section { Button { let id_ = meal.first?.id ?? "" - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } } label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } From 7dac4d88a90fde07107ddceb6f305802a049fab2 Mon Sep 17 00:00:00 2001 From: dsnallfot <72826201+dsnallfot@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:38:46 +0100 Subject: [PATCH 153/405] Fix for deletion of previous entered carbs when entering addcarbs view through add meal button in bolus view (#297) (cherry picked from commit b0a7bf42e7666e3898f25b2f0bd6bd04e1a7ba0c) --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 8c8b253073..b63f526379 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -107,8 +107,12 @@ extension Bolus { Section { Button { let id_ = meal.first?.id ?? "" - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } } label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } From fe0b00b9edd7c8e007af8434c10b90b26d7d6509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 02:05:22 +0100 Subject: [PATCH 154/405] Simpler UI. New bolus calc. --- .../View/AlternativeBolusCalcRootView.swift | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b63f526379..98085fbcd1 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -57,15 +57,8 @@ extension Bolus { var body: some View { Form { - if state.waitForSuggestion { - HStack { - Text("Wait please").foregroundColor(.secondary) - Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug - } - } - Section { - if fetch { + if fetch { + Section { VStack { if let carbs = meal.first?.carbs, carbs > 0 { HStack { @@ -99,10 +92,9 @@ extension Bolus { }.foregroundColor(.secondary) } } - } else { - Text("No Meal") - } - } header: { Text("Meal Summary") } + + } header: { Text("Meal Summary") } + } Section { Button { @@ -115,7 +107,7 @@ extension Bolus { } } label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } + } header: { Text(!fetch ? "Meal Summary" : "") } Section { HStack { @@ -186,14 +178,8 @@ extension Bolus { } } header: { Text("Bolus Summary") } - Section { - if state.amount == 0, waitForSuggestion { - Button { - keepForNextWiew = true - state.showModal(for: nil) - } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) - } else { + if state.amount > 0 { + Section { Button { keepForNextWiew = true state.add() @@ -206,6 +192,13 @@ extension Bolus { ) } } + Section { + Button { + keepForNextWiew = true + state.showModal(for: nil) + } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } } .blur(radius: showInfo ? 3 : 0) .navigationTitle("Enact Bolus") From 8d0fc7d05093cf032d2ba2e366746b15443f3de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 02:05:22 +0100 Subject: [PATCH 155/405] Simpler UI. New bolus calc. --- .../View/AlternativeBolusCalcRootView.swift | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b63f526379..98085fbcd1 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -57,15 +57,8 @@ extension Bolus { var body: some View { Form { - if state.waitForSuggestion { - HStack { - Text("Wait please").foregroundColor(.secondary) - Spacer() - ActivityIndicator(isAnimating: .constant(true), style: .medium) // fix iOS 15 bug - } - } - Section { - if fetch { + if fetch { + Section { VStack { if let carbs = meal.first?.carbs, carbs > 0 { HStack { @@ -99,10 +92,9 @@ extension Bolus { }.foregroundColor(.secondary) } } - } else { - Text("No Meal") - } - } header: { Text("Meal Summary") } + + } header: { Text("Meal Summary") } + } Section { Button { @@ -115,7 +107,7 @@ extension Bolus { } } label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } + } header: { Text(!fetch ? "Meal Summary" : "") } Section { HStack { @@ -186,14 +178,8 @@ extension Bolus { } } header: { Text("Bolus Summary") } - Section { - if state.amount == 0, waitForSuggestion { - Button { - keepForNextWiew = true - state.showModal(for: nil) - } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) - } else { + if state.amount > 0 { + Section { Button { keepForNextWiew = true state.add() @@ -206,6 +192,13 @@ extension Bolus { ) } } + Section { + Button { + keepForNextWiew = true + state.showModal(for: nil) + } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } } .blur(radius: showInfo ? 3 : 0) .navigationTitle("Enact Bolus") From 29d1e06d3bb10b1ea900b252dfba98918f9ed74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 11:40:17 +0100 Subject: [PATCH 156/405] Add Edit Meals also for the default Bolus View --- .../View/AlternativeBolusCalcRootView.swift | 4 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 84 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 98085fbcd1..766b3cbfdd 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -215,9 +215,9 @@ extension Bolus { } } .onDisappear { - if fetch, hasFatOrProtein, !keepForNextWiew { + if fetch, hasFatOrProtein, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: true, id: meal.first?.id ?? "") - } else if fetch, !keepForNextWiew { + } else if fetch, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: false, id: meal.first?.id ?? "") } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1054f3bae3..f36ff4689c 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -11,9 +11,15 @@ extension Bolus { @State private var isAddInsulinAlertPresented = false @State private var presentInfo = false @State private var displayError = false + @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FetchRequest( + entity: Meals.entity(), + sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false)] + ) var meal: FetchedResults + private var formatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -29,6 +35,57 @@ extension Bolus { var body: some View { Form { + if fetch { + Section { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } header: { Text("Meal Summary") } + } + + Section { + Button { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + } header: { Text(!fetch ? "Meal Summary" : "") } + Section { if state.waitForSuggestion { HStack { @@ -78,7 +135,10 @@ extension Bolus { } header: { Text("Bolus") } Section { - Button { state.add() } + Button { + keepForNextWiew = true + state.add() + } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } .frame(maxWidth: .infinity, alignment: .center) .disabled( @@ -88,7 +148,10 @@ extension Bolus { if waitForSuggestion { Section { - Button { state.showModal(for: nil) } + Button { + keepForNextWiew = true + state.showModal(for: nil) + } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } @@ -113,6 +176,15 @@ extension Bolus { state.waitForSuggestion = waitForSuggestion } } + + .onDisappear { + if fetch, hasFatOrProtein, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: true, id: meal.first?.id ?? "") + } else if fetch, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: false, id: meal.first?.id ?? "") + } + } + .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) @@ -121,6 +193,14 @@ extension Bolus { } } + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + var bolusInfo: some View { VStack { // Variables From 9f70d7cbe7fc23115c9b1133e4a12de0ee6cec58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 11:40:17 +0100 Subject: [PATCH 157/405] Add Edit Meals also for the default Bolus View --- .../View/AlternativeBolusCalcRootView.swift | 4 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 84 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 98085fbcd1..766b3cbfdd 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -215,9 +215,9 @@ extension Bolus { } } .onDisappear { - if fetch, hasFatOrProtein, !keepForNextWiew { + if fetch, hasFatOrProtein, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: true, id: meal.first?.id ?? "") - } else if fetch, !keepForNextWiew { + } else if fetch, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: false, id: meal.first?.id ?? "") } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1054f3bae3..f36ff4689c 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -11,9 +11,15 @@ extension Bolus { @State private var isAddInsulinAlertPresented = false @State private var presentInfo = false @State private var displayError = false + @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FetchRequest( + entity: Meals.entity(), + sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false)] + ) var meal: FetchedResults + private var formatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -29,6 +35,57 @@ extension Bolus { var body: some View { Form { + if fetch { + Section { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } header: { Text("Meal Summary") } + } + + Section { + Button { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + } header: { Text(!fetch ? "Meal Summary" : "") } + Section { if state.waitForSuggestion { HStack { @@ -78,7 +135,10 @@ extension Bolus { } header: { Text("Bolus") } Section { - Button { state.add() } + Button { + keepForNextWiew = true + state.add() + } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } .frame(maxWidth: .infinity, alignment: .center) .disabled( @@ -88,7 +148,10 @@ extension Bolus { if waitForSuggestion { Section { - Button { state.showModal(for: nil) } + Button { + keepForNextWiew = true + state.showModal(for: nil) + } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } @@ -113,6 +176,15 @@ extension Bolus { state.waitForSuggestion = waitForSuggestion } } + + .onDisappear { + if fetch, hasFatOrProtein, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: true, id: meal.first?.id ?? "") + } else if fetch, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: false, id: meal.first?.id ?? "") + } + } + .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) @@ -121,6 +193,14 @@ extension Bolus { } } + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + var bolusInfo: some View { VStack { // Variables From 1f9312b14dd339bff33b43eeac7ad11ede3b829d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 11:40:17 +0100 Subject: [PATCH 158/405] Add Edit Meals also for the default Bolus View --- .../View/AlternativeBolusCalcRootView.swift | 4 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 84 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 98085fbcd1..766b3cbfdd 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -215,9 +215,9 @@ extension Bolus { } } .onDisappear { - if fetch, hasFatOrProtein, !keepForNextWiew { + if fetch, hasFatOrProtein, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: true, id: meal.first?.id ?? "") - } else if fetch, !keepForNextWiew { + } else if fetch, !keepForNextWiew, state.useCalc { state.delete(deleteTwice: false, id: meal.first?.id ?? "") } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1054f3bae3..f36ff4689c 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -11,9 +11,15 @@ extension Bolus { @State private var isAddInsulinAlertPresented = false @State private var presentInfo = false @State private var displayError = false + @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FetchRequest( + entity: Meals.entity(), + sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false)] + ) var meal: FetchedResults + private var formatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -29,6 +35,57 @@ extension Bolus { var body: some View { Form { + if fetch { + Section { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } header: { Text("Meal Summary") } + } + + Section { + Button { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) + } header: { Text(!fetch ? "Meal Summary" : "") } + Section { if state.waitForSuggestion { HStack { @@ -78,7 +135,10 @@ extension Bolus { } header: { Text("Bolus") } Section { - Button { state.add() } + Button { + keepForNextWiew = true + state.add() + } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } .frame(maxWidth: .infinity, alignment: .center) .disabled( @@ -88,7 +148,10 @@ extension Bolus { if waitForSuggestion { Section { - Button { state.showModal(for: nil) } + Button { + keepForNextWiew = true + state.showModal(for: nil) + } label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } @@ -113,6 +176,15 @@ extension Bolus { state.waitForSuggestion = waitForSuggestion } } + + .onDisappear { + if fetch, hasFatOrProtein, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: true, id: meal.first?.id ?? "") + } else if fetch, !keepForNextWiew, !state.useCalc { + state.delete(deleteTwice: false, id: meal.first?.id ?? "") + } + } + .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) @@ -121,6 +193,14 @@ extension Bolus { } } + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + var bolusInfo: some View { VStack { // Variables From fd9fb8421d5401e36746d058e3ebfddd00ecc311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 12:05:18 +0100 Subject: [PATCH 159/405] Structure the pop-up --- .../View/AlternativeBolusCalcRootView.swift | 539 ++++++++---------- 1 file changed, 250 insertions(+), 289 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 766b3cbfdd..0770ad7ea1 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -59,40 +59,7 @@ extension Bolus { Form { if fetch { Section { - VStack { - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - Spacer() - Text(carbs.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - Spacer() - Text(fat.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - Spacer() - Text(protein.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - Spacer() - Text(note) - }.foregroundColor(.secondary) - } - } - + mealEntries } header: { Text("Meal Summary") } } @@ -226,220 +193,24 @@ extension Bolus { } } - var changed: Bool { - ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) - } - - var hasFatOrProtein: Bool { - ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) - } - // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { - let unit = NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") VStack { VStack(spacing: Config.spacing) { HStack { Text("Calculations") .font(.title3).frame(maxWidth: .infinity, alignment: .center) }.padding(10) - if fetch { - VStack { - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - .foregroundColor(.secondary) - Spacer() - Text(note) - } - } - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: carbs as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: protein as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: fat as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - }.padding() - } - - if fetch { Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + mealEntries.padding() + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) } - - VStack { - HStack { - Text("Carb Ratio") - .foregroundColor(.secondary) - Spacer() - Text(state.carbRatio.formatted()) - Text(NSLocalizedString(" g/U", comment: " grams per Unit")) - .foregroundColor(.secondary) - } - HStack { - Text("ISF") - .foregroundColor(.secondary) - Spacer() - let isf = state.isf - Text(isf.formatted()) - Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) - .foregroundColor(.secondary) - } - HStack { - Text("Target Glucose") - .foregroundColor(.secondary) - Spacer() - let target = state.units == .mmolL ? state.target.asMmolL : state.target - Text( - target - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - ) - Text(state.units.rawValue) - .foregroundColor(.secondary) - } - HStack { - Text("Basal") - .foregroundColor(.secondary) - Spacer() - let basal = state.basal - Text(basal.formatted()) - Text(NSLocalizedString(" U/h", comment: " Units per hour")) - .foregroundColor(.secondary) - } - HStack { - Text("Fraction") - .foregroundColor(.secondary) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - } - if state.useFattyMealCorrectionFactor { - HStack { - Text("Fatty Meal Factor") - .foregroundColor(.orange) - Spacer() - let fraction = state.fattyMealFactor - Text(fraction.formatted()) - .foregroundColor(.orange) - } - } - }.padding() + settings.padding() } - Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - - VStack(spacing: Config.spacing) { - HStack { - Text("Glucose") - .foregroundColor(.secondary) - Spacer() - let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG - Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue) - .foregroundColor(.secondary) - Spacer() - Image(systemName: "arrow.right") - Spacer() - - let targetDifferenceInsulin = state.targetDifferenceInsulin - // rounding - let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue - let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) - Text(roundedTargetDifferenceInsulin.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - HStack { - Text("IOB") - .foregroundColor(.secondary) - Spacer() - let iob = state.iob - // rounding - let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue - let roundedIob = Decimal(round(100 * iobAsDouble) / 100) - Text(roundedIob.formatted()) - Text(unit) - .foregroundColor(.secondary) - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let iobCalc = state.iobInsulinReduction - // rounding - let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue - let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) - Text(roundedIobCalc.formatted()) - Text(unit).foregroundColor(.secondary) - } - HStack { - Text("Trend") - .foregroundColor(.secondary) - Spacer() - let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG - Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let trendInsulin = state.fifteenMinInsulin - // rounding - let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue - let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) - Text(roundedTrendInsulin.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - HStack { - Text("COB") - .foregroundColor(.secondary) - Spacer() - let cob = state.cob - Text(cob.formatted()) - - let unitGrams = NSLocalizedString(" g", comment: "grams") - Text(unitGrams).foregroundColor(.secondary) - - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let insulinCob = state.wholeCobInsulin - // rounding - let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue - let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) - Text(roundedInsulinCob.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - }.padding() - + insulinParts.padding() Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - VStack { HStack { Text("Full Bolus") @@ -447,59 +218,18 @@ extension Bolus { Spacer() let insulin = state.roundedWholeCalc Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) + Text(" U") .foregroundColor(.secondary) } }.padding(.horizontal) - Divider().frame(height: Config.dividerHeight) - - VStack { - HStack { - Text("Result") - .fontWeight(.bold) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - Text(" x ") - .foregroundColor(.secondary) - - // if fatty meal is chosen - if state.useFattyMealCorrectionFactor { - let fattyMealFactor = state.fattyMealFactor - Text(fattyMealFactor.formatted()) - .foregroundColor(.orange) - Text(" x ") - .foregroundColor(.secondary) - } - - let insulin = state.roundedWholeCalc - Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) - .foregroundColor(.secondary) - Text(" = ") - .foregroundColor(.secondary) - - let result = state.insulinCalculated - // rounding - let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue - let roundedResult = Decimal(round(100 * resultAsDouble) / 100) - Text(roundedResult.formatted()) - .fontWeight(.bold) - .font(.system(size: 16)) - .foregroundColor(.blue) - Text(unit) - .foregroundColor(.secondary) - } - }.padding() - + results.padding() Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - if exceededMaxBolus { HStack { let maxBolus = state.maxBolus let maxBolusFormatted = maxBolus.formatted() - Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(unit)!") + Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(" U")") } .padding() .fontWeight(.semibold) @@ -508,19 +238,14 @@ extension Bolus { } .padding(.top, 10) .padding(.bottom, 15) - // Hide pop-up VStack { - Button { - showInfo = false - } - label: { - Text("OK") - } - .frame(maxWidth: .infinity, alignment: .center) - .font(.system(size: 16)) - .fontWeight(.semibold) - .foregroundColor(.blue) + Button { showInfo = false } + label: { Text("OK") } + .frame(maxWidth: .infinity, alignment: .center) + .font(.system(size: 16)) + .fontWeight(.semibold) + .foregroundColor(.blue) } .padding(.bottom, 20) } @@ -530,5 +255,241 @@ extension Bolus { .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4).opacity(0.9)) ) } + + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var mealEntries: some View { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } + + var settings: some View { + VStack { + HStack { + Text("Carb Ratio") + .foregroundColor(.secondary) + Spacer() + Text(state.carbRatio.formatted()) + Text(NSLocalizedString(" g/U", comment: " grams per Unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF") + .foregroundColor(.secondary) + Spacer() + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("Target Glucose") + .foregroundColor(.secondary) + Spacer() + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text( + target + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + ) + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + HStack { + Text("Basal") + .foregroundColor(.secondary) + Spacer() + let basal = state.basal + Text(basal.formatted()) + Text(NSLocalizedString(" U/h", comment: " Units per hour")) + .foregroundColor(.secondary) + } + HStack { + Text("Fraction") + .foregroundColor(.secondary) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + } + if state.useFattyMealCorrectionFactor { + HStack { + Text("Fatty Meal Factor") + .foregroundColor(.orange) + Spacer() + let fraction = state.fattyMealFactor + Text(fraction.formatted()) + .foregroundColor(.orange) + } + } + } + } + + var insulinParts: some View { + VStack(spacing: Config.spacing) { + HStack { + Text("Glucose") + .foregroundColor(.secondary) + Spacer() + let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG + Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue) + .foregroundColor(.secondary) + Spacer() + Image(systemName: "arrow.right") + Spacer() + + let targetDifferenceInsulin = state.targetDifferenceInsulin + // rounding + let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue + let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) + Text(roundedTargetDifferenceInsulin.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + HStack { + Text("IOB") + .foregroundColor(.secondary) + Spacer() + let iob = state.iob + // rounding + let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue + let roundedIob = Decimal(round(100 * iobAsDouble) / 100) + Text(roundedIob.formatted()) + Text(" U") + .foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let iobCalc = state.iobInsulinReduction + // rounding + let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue + let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) + Text(roundedIobCalc.formatted()) + Text(" U").foregroundColor(.secondary) + } + HStack { + Text("Trend") + .foregroundColor(.secondary) + Spacer() + let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG + Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let trendInsulin = state.fifteenMinInsulin + // rounding + let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue + let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) + Text(roundedTrendInsulin.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + HStack { + Text("COB") + .foregroundColor(.secondary) + Spacer() + let cob = state.cob + Text(cob.formatted()) + + let unitGrams = NSLocalizedString(" g", comment: "grams") + Text(unitGrams).foregroundColor(.secondary) + + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let insulinCob = state.wholeCobInsulin + // rounding + let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue + let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) + Text(roundedInsulinCob.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + } + } + + var results: some View { + VStack { + HStack { + Text("Result") + .fontWeight(.bold) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + Text(" x ") + .foregroundColor(.secondary) + + // if fatty meal is chosen + if state.useFattyMealCorrectionFactor { + let fattyMealFactor = state.fattyMealFactor + Text(fattyMealFactor.formatted()) + .foregroundColor(.orange) + Text(" x ") + .foregroundColor(.secondary) + } + + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(" U") + .foregroundColor(.secondary) + Text(" = ") + .foregroundColor(.secondary) + + let result = state.insulinCalculated + // rounding + let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue + let roundedResult = Decimal(round(100 * resultAsDouble) / 100) + Text(roundedResult.formatted()) + .fontWeight(.bold) + .font(.system(size: 16)) + .foregroundColor(.blue) + Text(" U") + .foregroundColor(.secondary) + } + } + } } } From 79f8d69919f256f0587d9ed1d8f156901873c501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 12:05:18 +0100 Subject: [PATCH 160/405] Structure the pop-up --- .../View/AlternativeBolusCalcRootView.swift | 539 ++++++++---------- 1 file changed, 250 insertions(+), 289 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 766b3cbfdd..0770ad7ea1 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -59,40 +59,7 @@ extension Bolus { Form { if fetch { Section { - VStack { - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - Spacer() - Text(carbs.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - Spacer() - Text(fat.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - Spacer() - Text(protein.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - Spacer() - Text(note) - }.foregroundColor(.secondary) - } - } - + mealEntries } header: { Text("Meal Summary") } } @@ -226,220 +193,24 @@ extension Bolus { } } - var changed: Bool { - ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) - } - - var hasFatOrProtein: Bool { - ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) - } - // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { - let unit = NSLocalizedString(" U", comment: "Unit in number of units delivered (keep the space character!)") VStack { VStack(spacing: Config.spacing) { HStack { Text("Calculations") .font(.title3).frame(maxWidth: .infinity, alignment: .center) }.padding(10) - if fetch { - VStack { - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - .foregroundColor(.secondary) - Spacer() - Text(note) - } - } - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: carbs as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: protein as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - .foregroundColor(.secondary) - Spacer() - Text(mealFormatter.string(from: fat as NSNumber) ?? "") - Text("g").foregroundColor(.secondary) - } - } - }.padding() - } - - if fetch { Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) + mealEntries.padding() + Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) } - - VStack { - HStack { - Text("Carb Ratio") - .foregroundColor(.secondary) - Spacer() - Text(state.carbRatio.formatted()) - Text(NSLocalizedString(" g/U", comment: " grams per Unit")) - .foregroundColor(.secondary) - } - HStack { - Text("ISF") - .foregroundColor(.secondary) - Spacer() - let isf = state.isf - Text(isf.formatted()) - Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) - .foregroundColor(.secondary) - } - HStack { - Text("Target Glucose") - .foregroundColor(.secondary) - Spacer() - let target = state.units == .mmolL ? state.target.asMmolL : state.target - Text( - target - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) - ) - Text(state.units.rawValue) - .foregroundColor(.secondary) - } - HStack { - Text("Basal") - .foregroundColor(.secondary) - Spacer() - let basal = state.basal - Text(basal.formatted()) - Text(NSLocalizedString(" U/h", comment: " Units per hour")) - .foregroundColor(.secondary) - } - HStack { - Text("Fraction") - .foregroundColor(.secondary) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - } - if state.useFattyMealCorrectionFactor { - HStack { - Text("Fatty Meal Factor") - .foregroundColor(.orange) - Spacer() - let fraction = state.fattyMealFactor - Text(fraction.formatted()) - .foregroundColor(.orange) - } - } - }.padding() + settings.padding() } - Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - - VStack(spacing: Config.spacing) { - HStack { - Text("Glucose") - .foregroundColor(.secondary) - Spacer() - let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG - Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue) - .foregroundColor(.secondary) - Spacer() - Image(systemName: "arrow.right") - Spacer() - - let targetDifferenceInsulin = state.targetDifferenceInsulin - // rounding - let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue - let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) - Text(roundedTargetDifferenceInsulin.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - HStack { - Text("IOB") - .foregroundColor(.secondary) - Spacer() - let iob = state.iob - // rounding - let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue - let roundedIob = Decimal(round(100 * iobAsDouble) / 100) - Text(roundedIob.formatted()) - Text(unit) - .foregroundColor(.secondary) - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let iobCalc = state.iobInsulinReduction - // rounding - let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue - let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) - Text(roundedIobCalc.formatted()) - Text(unit).foregroundColor(.secondary) - } - HStack { - Text("Trend") - .foregroundColor(.secondary) - Spacer() - let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG - Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) - Text(state.units.rawValue).foregroundColor(.secondary) - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let trendInsulin = state.fifteenMinInsulin - // rounding - let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue - let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) - Text(roundedTrendInsulin.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - HStack { - Text("COB") - .foregroundColor(.secondary) - Spacer() - let cob = state.cob - Text(cob.formatted()) - - let unitGrams = NSLocalizedString(" g", comment: "grams") - Text(unitGrams).foregroundColor(.secondary) - - Spacer() - - Image(systemName: "arrow.right") - Spacer() - - let insulinCob = state.wholeCobInsulin - // rounding - let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue - let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) - Text(roundedInsulinCob.formatted()) - Text(unit) - .foregroundColor(.secondary) - } - }.padding() - + insulinParts.padding() Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - VStack { HStack { Text("Full Bolus") @@ -447,59 +218,18 @@ extension Bolus { Spacer() let insulin = state.roundedWholeCalc Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) + Text(" U") .foregroundColor(.secondary) } }.padding(.horizontal) - Divider().frame(height: Config.dividerHeight) - - VStack { - HStack { - Text("Result") - .fontWeight(.bold) - Spacer() - let fraction = state.fraction - Text(fraction.formatted()) - Text(" x ") - .foregroundColor(.secondary) - - // if fatty meal is chosen - if state.useFattyMealCorrectionFactor { - let fattyMealFactor = state.fattyMealFactor - Text(fattyMealFactor.formatted()) - .foregroundColor(.orange) - Text(" x ") - .foregroundColor(.secondary) - } - - let insulin = state.roundedWholeCalc - Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) - Text(unit) - .foregroundColor(.secondary) - Text(" = ") - .foregroundColor(.secondary) - - let result = state.insulinCalculated - // rounding - let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue - let roundedResult = Decimal(round(100 * resultAsDouble) / 100) - Text(roundedResult.formatted()) - .fontWeight(.bold) - .font(.system(size: 16)) - .foregroundColor(.blue) - Text(unit) - .foregroundColor(.secondary) - } - }.padding() - + results.padding() Divider().frame(height: Config.dividerHeight) // .overlay(Config.overlayColour) - if exceededMaxBolus { HStack { let maxBolus = state.maxBolus let maxBolusFormatted = maxBolus.formatted() - Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(unit)!") + Text("Your entered amount was limited by your max Bolus setting of \(maxBolusFormatted)\(" U")") } .padding() .fontWeight(.semibold) @@ -508,19 +238,14 @@ extension Bolus { } .padding(.top, 10) .padding(.bottom, 15) - // Hide pop-up VStack { - Button { - showInfo = false - } - label: { - Text("OK") - } - .frame(maxWidth: .infinity, alignment: .center) - .font(.system(size: 16)) - .fontWeight(.semibold) - .foregroundColor(.blue) + Button { showInfo = false } + label: { Text("OK") } + .frame(maxWidth: .infinity, alignment: .center) + .font(.system(size: 16)) + .fontWeight(.semibold) + .foregroundColor(.blue) } .padding(.bottom, 20) } @@ -530,5 +255,241 @@ extension Bolus { .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4).opacity(0.9)) ) } + + var changed: Bool { + ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var hasFatOrProtein: Bool { + ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) + } + + var mealEntries: some View { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } + + var settings: some View { + VStack { + HStack { + Text("Carb Ratio") + .foregroundColor(.secondary) + Spacer() + Text(state.carbRatio.formatted()) + Text(NSLocalizedString(" g/U", comment: " grams per Unit")) + .foregroundColor(.secondary) + } + HStack { + Text("ISF") + .foregroundColor(.secondary) + Spacer() + let isf = state.isf + Text(isf.formatted()) + Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit")) + .foregroundColor(.secondary) + } + HStack { + Text("Target Glucose") + .foregroundColor(.secondary) + Spacer() + let target = state.units == .mmolL ? state.target.asMmolL : state.target + Text( + target + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + ) + Text(state.units.rawValue) + .foregroundColor(.secondary) + } + HStack { + Text("Basal") + .foregroundColor(.secondary) + Spacer() + let basal = state.basal + Text(basal.formatted()) + Text(NSLocalizedString(" U/h", comment: " Units per hour")) + .foregroundColor(.secondary) + } + HStack { + Text("Fraction") + .foregroundColor(.secondary) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + } + if state.useFattyMealCorrectionFactor { + HStack { + Text("Fatty Meal Factor") + .foregroundColor(.orange) + Spacer() + let fraction = state.fattyMealFactor + Text(fraction.formatted()) + .foregroundColor(.orange) + } + } + } + } + + var insulinParts: some View { + VStack(spacing: Config.spacing) { + HStack { + Text("Glucose") + .foregroundColor(.secondary) + Spacer() + let glucose = state.units == .mmolL ? state.currentBG.asMmolL : state.currentBG + Text(glucose.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue) + .foregroundColor(.secondary) + Spacer() + Image(systemName: "arrow.right") + Spacer() + + let targetDifferenceInsulin = state.targetDifferenceInsulin + // rounding + let targetDifferenceInsulinAsDouble = NSDecimalNumber(decimal: targetDifferenceInsulin).doubleValue + let roundedTargetDifferenceInsulin = Decimal(round(100 * targetDifferenceInsulinAsDouble) / 100) + Text(roundedTargetDifferenceInsulin.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + HStack { + Text("IOB") + .foregroundColor(.secondary) + Spacer() + let iob = state.iob + // rounding + let iobAsDouble = NSDecimalNumber(decimal: iob).doubleValue + let roundedIob = Decimal(round(100 * iobAsDouble) / 100) + Text(roundedIob.formatted()) + Text(" U") + .foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let iobCalc = state.iobInsulinReduction + // rounding + let iobCalcAsDouble = NSDecimalNumber(decimal: iobCalc).doubleValue + let roundedIobCalc = Decimal(round(100 * iobCalcAsDouble) / 100) + Text(roundedIobCalc.formatted()) + Text(" U").foregroundColor(.secondary) + } + HStack { + Text("Trend") + .foregroundColor(.secondary) + Spacer() + let trend = state.units == .mmolL ? state.deltaBG.asMmolL : state.deltaBG + Text(trend.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))) + Text(state.units.rawValue).foregroundColor(.secondary) + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let trendInsulin = state.fifteenMinInsulin + // rounding + let trendInsulinAsDouble = NSDecimalNumber(decimal: trendInsulin).doubleValue + let roundedTrendInsulin = Decimal(round(100 * trendInsulinAsDouble) / 100) + Text(roundedTrendInsulin.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + HStack { + Text("COB") + .foregroundColor(.secondary) + Spacer() + let cob = state.cob + Text(cob.formatted()) + + let unitGrams = NSLocalizedString(" g", comment: "grams") + Text(unitGrams).foregroundColor(.secondary) + + Spacer() + + Image(systemName: "arrow.right") + Spacer() + + let insulinCob = state.wholeCobInsulin + // rounding + let insulinCobAsDouble = NSDecimalNumber(decimal: insulinCob).doubleValue + let roundedInsulinCob = Decimal(round(100 * insulinCobAsDouble) / 100) + Text(roundedInsulinCob.formatted()) + Text(" U") + .foregroundColor(.secondary) + } + } + } + + var results: some View { + VStack { + HStack { + Text("Result") + .fontWeight(.bold) + Spacer() + let fraction = state.fraction + Text(fraction.formatted()) + Text(" x ") + .foregroundColor(.secondary) + + // if fatty meal is chosen + if state.useFattyMealCorrectionFactor { + let fattyMealFactor = state.fattyMealFactor + Text(fattyMealFactor.formatted()) + .foregroundColor(.orange) + Text(" x ") + .foregroundColor(.secondary) + } + + let insulin = state.roundedWholeCalc + Text(insulin.formatted()).foregroundStyle(state.roundedWholeCalc < 0 ? Color.loopRed : Color.primary) + Text(" U") + .foregroundColor(.secondary) + Text(" = ") + .foregroundColor(.secondary) + + let result = state.insulinCalculated + // rounding + let resultAsDouble = NSDecimalNumber(decimal: result).doubleValue + let roundedResult = Decimal(round(100 * resultAsDouble) / 100) + Text(roundedResult.formatted()) + .fontWeight(.bold) + .font(.system(size: 16)) + .foregroundColor(.blue) + Text(" U") + .foregroundColor(.secondary) + } + } + } } } From 981781a9b57ed50d672b6ca90fb70fadae1041e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 12:34:57 +0100 Subject: [PATCH 161/405] Streamline the default calc --- .../Bolus/View/DefaultBolusCalcRootView.swift | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index f36ff4689c..1e53a64b2a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -115,11 +115,7 @@ extension Bolus { else { state.amount = state.insulinRecommended } } }.contentShape(Rectangle()) - } - } - header: { Text("Recommendation") } - if !state.waitForSuggestion { - Section { + HStack { Text("Amount") Spacer() @@ -133,19 +129,23 @@ extension Bolus { Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } } - header: { Text("Bolus") } - Section { - Button { - keepForNextWiew = true - state.add() + } + header: { Text("Bolus Summary") } + + if !state.waitForSuggestion { + if state.amount > 0 { + Section { + Button { + keepForNextWiew = true + state.add() + } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) } - if waitForSuggestion { Section { Button { From 96646a285a773a52b53fef54e286c522f774c515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 12:34:57 +0100 Subject: [PATCH 162/405] Streamline the default calc --- .../Bolus/View/DefaultBolusCalcRootView.swift | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index f36ff4689c..1e53a64b2a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -115,11 +115,7 @@ extension Bolus { else { state.amount = state.insulinRecommended } } }.contentShape(Rectangle()) - } - } - header: { Text("Recommendation") } - if !state.waitForSuggestion { - Section { + HStack { Text("Amount") Spacer() @@ -133,19 +129,23 @@ extension Bolus { Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } } - header: { Text("Bolus") } - Section { - Button { - keepForNextWiew = true - state.add() + } + header: { Text("Bolus Summary") } + + if !state.waitForSuggestion { + if state.amount > 0 { + Section { + Button { + keepForNextWiew = true + state.add() + } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled( + state.amount <= 0 || state.amount > state.maxBolus + ) } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) } - if waitForSuggestion { Section { Button { From 5f783b631b33a7802d3a652069d608a728e5b33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 12:40:26 +0100 Subject: [PATCH 163/405] Update version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 31f91b706a..2d57d6bd6a 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.6 +APP_VERSION = 2.2.7 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From c20a75ecd8aa50c3aa2ac32273f450dd871b8ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 13:03:45 +0100 Subject: [PATCH 164/405] New Localized Strings for the Bolus Views --- .../Main/en.lproj/Localizable.strings | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index dee32097ae..9c70870add 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; From 2fcb69e234624cb8d45b21bfbad88a4b8f02cf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 13:10:59 +0100 Subject: [PATCH 165/405] New localized String --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 9c70870add..aa9173ed6f 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Home"; From d42481734893242479351f4bc9da8ff075602c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 14:30:07 +0100 Subject: [PATCH 166/405] Only display "Continue without bolus" when insulin amount <= 0 --- .../Bolus/View/AlternativeBolusCalcRootView.swift | 12 +++++++----- .../Bolus/View/DefaultBolusCalcRootView.swift | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 0770ad7ea1..3b17ffc307 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -159,12 +159,14 @@ extension Bolus { ) } } - Section { - Button { - keepForNextWiew = true - state.showModal(for: nil) + if state.amount <= 0 { + Section { + Button { + keepForNextWiew = true + state.showModal(for: nil) + } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } .blur(radius: showInfo ? 3 : 0) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1e53a64b2a..00e7bd7aa6 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -146,7 +146,7 @@ extension Bolus { ) } } - if waitForSuggestion { + if state.amount <= 0 { Section { Button { keepForNextWiew = true From 8babe988f34a0c2756869f8007377b819e8dd1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 16:31:04 +0100 Subject: [PATCH 167/405] Act according to the "Skip bolus after carbs" setting --- FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift | 4 +++- FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index a85dbfcab3..bd831dfa01 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -20,6 +20,7 @@ extension AddCarbs { @Published var note: String = "" @Published var id_: String = "" @Published var summary: String = "" + @Published var skipBolus: Bool = false let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -27,6 +28,7 @@ extension AddCarbs { subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } carbsRequired = provider.suggestion?.carbsReq maxCarbs = settings.settings.maxCarbs + skipBolus = settingsManager.settings.skipBolusScreenAfterCarbs } func add() { @@ -49,7 +51,7 @@ extension AddCarbs { )] carbsStorage.storeCarbs(carbsToStore) - if settingsManager.settings.skipBolusScreenAfterCarbs { + if skipBolus { apsManager.determineBasalSync() showModal(for: nil) } else if carbs > 0 { diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index dfdd8cfb4c..62c52a5b81 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -119,7 +119,7 @@ extension AddCarbs { Section { Button { state.add() } - label: { Text(state.carbs > 0 ? "Continue" : "Save") } + label: { Text(state.skipBolus ? "Save" : "Continue") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } From 9904fbb6cd7a2a302224646000f9f18cbfa7c504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 3 Nov 2023 21:10:06 +0100 Subject: [PATCH 168/405] Don't use glucoseStorage --- .../Sources/Modules/Bolus/BolusDataFlow.swift | 1 + .../Sources/Modules/Bolus/BolusProvider.swift | 19 +++++++++++++++++++ .../Modules/Bolus/BolusStateModel.swift | 10 ++++++---- .../View/AlternativeBolusCalcRootView.swift | 1 - 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusDataFlow.swift b/FreeAPS/Sources/Modules/Bolus/BolusDataFlow.swift index 47ff496ade..beb0d59d32 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusDataFlow.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusDataFlow.swift @@ -5,4 +5,5 @@ enum Bolus { protocol BolusProvider: Provider { var suggestion: Suggestion? { get } func pumpSettings() -> PumpSettings + func fetchGlucose() -> [Readings] } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift index b0c6d0f3b0..962fd47f1d 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift @@ -1,5 +1,9 @@ +import CoreData + extension Bolus { final class Provider: BaseProvider, BolusProvider { + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext + var suggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } @@ -9,5 +13,20 @@ extension Bolus { ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings)) ?? PumpSettings(insulinActionCurve: 6, maxBolus: 10, maxBasal: 2) } + + func fetchGlucose() -> [Readings] { + var fetchGlucose = [Readings]() + coredataContext.performAndWait { + let requestReadings = Readings.fetchRequest() as NSFetchRequest + let sort = NSSortDescriptor(key: "date", ascending: true) + requestReadings.sortDescriptors = [sort] + requestReadings.predicate = NSPredicate( + format: "glucose > 0 AND date > %@", + Date().addingTimeInterval(-1.hours.timeInterval) as NSDate + ) + try? fetchGlucose = self.coredataContext.fetch(requestReadings) + } + return fetchGlucose + } } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 2e68a88da4..26f7e4203e 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,4 +1,5 @@ +import CoreData import LoopKit import SwiftUI import Swinject @@ -10,10 +11,11 @@ extension Bolus { @Injected() var broadcaster: Broadcaster! @Injected() var pumpHistoryStorage: PumpHistoryStorage! // added for bolus calculator - @Injected() var glucoseStorage: GlucoseStorage! @Injected() var settings: SettingsManager! @Injected() var nsManager: NightscoutManager! + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext + @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 @@ -94,11 +96,11 @@ extension Bolus { } func getDeltaBG() { - let glucose = glucoseStorage.recent() + let glucose = provider.fetchGlucose() guard glucose.count >= 3 else { return } - let lastGlucose = glucose.last! + let lastGlucose = glucose.last?.glucose ?? 0 let thirdLastGlucose = glucose[glucose.count - 3] - let delta = Decimal(lastGlucose.glucose!) - Decimal(thirdLastGlucose.glucose!) + let delta = Decimal(lastGlucose) - Decimal(thirdLastGlucose.glucose) deltaBG = delta } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 3b17ffc307..24ad7ca0f9 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -1,4 +1,3 @@ -import Charts import CoreData import SwiftUI import Swinject From 31e1e7a133b9d15793936650b201ab17c8bd2448 Mon Sep 17 00:00:00 2001 From: Liroy van Hoewijk <4643445+LiroyvH@users.noreply.github.com> Date: Sat, 4 Nov 2023 02:34:13 +0100 Subject: [PATCH 169/405] Fix Nightscout uploads being held back for FSL users (#300) --- FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift b/FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift index c71c40d956..49b430f716 100644 --- a/FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift +++ b/FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift @@ -72,7 +72,7 @@ extension BaseLibreTransmitterSource: LibreTransmitterManagerDelegate { case let .success(newGlucose): let glucose = newGlucose.map { value -> BloodGlucose in BloodGlucose( - _id: value.syncId, + _id: UUID().uuidString, sgv: Int(value.glucose), direction: manager.glucoseDisplay?.trendType .map { .init(trendType: $0) }, From f1d7bd74959944fdb628eccc0a545a534672db48 Mon Sep 17 00:00:00 2001 From: dsnallfot <72826201+dsnallfot@users.noreply.github.com> Date: Sat, 4 Nov 2023 02:35:13 +0100 Subject: [PATCH 170/405] =?UTF-8?q?Fix=20for=20bug=20after=20commit=20f039?= =?UTF-8?q?dc3.=20Carbs=20not=20uploaded=20to=20Apple=20Health=20=E2=80=A6?= =?UTF-8?q?=20=E2=80=A6due=20to=20wrong=20id=20in=20func=20(#301)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix for deletion of previous entered carbs when entering addcarbs view through add meal button in bolus view * Fix for bug after commit f039dc3. Carbs not uploaded to Apple Health due to wrong id in func --- FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 1e843b388f..82fbda55a6 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -186,7 +186,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P else { return } let carbsWithId = carbs.filter { c in - guard c.id != nil else { return false } + guard c.collectionID != nil else { return false } return true } @@ -203,8 +203,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P start: $0.createdAt, end: $0.createdAt, metadata: [ - HKMetadataKeyExternalUUID: $0.id ?? "_id", - HKMetadataKeySyncIdentifier: $0.id ?? "_id", + HKMetadataKeyExternalUUID: $0.collectionID ?? "_id", + HKMetadataKeySyncIdentifier: $0.collectionID ?? "_id", HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true ] From 30c16df92576d83f26e709dcea3b6705105273d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 4 Nov 2023 02:55:56 +0100 Subject: [PATCH 171/405] Crowdin translations --- .../da.lproj/Localizable.strings | 4 +- .../Main/ar.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/da.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/de.lproj/Localizable.strings | 36 ++++++++++++++++ .../Main/es.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/fi.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/fr.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/he.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/it.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/nb.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/nl.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/pl.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/pt-BR.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/pt-PT.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/ru.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/sk.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/sv.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/tr.lproj/Localizable.strings | 39 ++++++++++++++++++ .../Main/uk.lproj/Localizable.strings | 41 ++++++++++++++++++- .../Main/zh-Hans.lproj/Localizable.strings | 39 ++++++++++++++++++ 20 files changed, 741 insertions(+), 3 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index a07179ec83..ba32842173 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -15,7 +15,7 @@ "Pod Expired" = "Pod udløbet"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Lavt reservoir"; +"Low Reservoir" = "Lavt Reservoir"; /* Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Påmindelse om igangværende suspension"; @@ -532,7 +532,7 @@ "Setup Complete" = "Opsætning fuldført"; /* Value text for no expiration reminder */ -"No Reminder" = "Ingen påmindelse"; +"No Reminder" = "Ingen Påmindelse"; /* Error message description for PeripheralManagerError.notReady */ "Peripheral Not Ready" = "Perifer Enhed Ikke Klar"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index c96f3f8406..2a918bab32 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Other"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index dde5241791..21cff8d8b4 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Fejl ved"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Hjem"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatisk"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Andet"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuel Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 15ccfaa23e..6d3fcd8e66 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Fehler um"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Hauptseite"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatisch"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Sonstiges"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 4c33b986fe..369c7e2604 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Inicio"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Otro"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 70c9d5b995..19596ed75f 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Other"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 8ecc9dcb13..edfd6baa11 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Page d'accueil"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Autre"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index c96f3f8406..2a918bab32 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Other"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 65092af189..3956fe1536 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Errore a"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Altro"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Basale manuale temporanea"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 677ba08ab7..e1e2c6e8b9 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Feil kl."; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Hjem"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatisk"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Annet"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell basal"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 0525c489c3..cb8f8bb17a 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Foutmelding op"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Hoofdmenu"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatisch"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Anders"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 9ce06bcdf2..576a542c36 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -571,6 +604,9 @@ Połączono z Nightscout!"; /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Other"; @@ -1173,6 +1209,9 @@ Połączono z Nightscout!"; /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 354d643043..d91200004c 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Tela inicial"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Outros"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 26e055217c..78e5d78110 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Tela inicial"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Outro"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 0c6cbc2533..73483ee460 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Ошибка в"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Главная"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Автоматически"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Прочее"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручная ВБС"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index e2af781755..edc3c93cd5 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Home"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Other"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index e8e6b52a96..24bc2dbfd0 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Fel vid"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Måltidssammanfattning"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Ändra måltid"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Lägg till Måltid"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Sammanfattnig av bolus"; + +/* For the Bolus View pop-up */ +"Calculations" = "Beräkningar"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fettrik måltid"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Total mängd"; + +/* For the Bolus View pop-up */ +"Fraction" = "Faktor"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fettrik måltidsfaktor"; + +/* For the Bolus View pop-up */ +"Result" = "Resultat"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Du har angivit en insulinmängd som är över din maxinställning på %d%@"; + /* Home title */ "Home" = "Hem"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatisk"; +/* External insulin treatments */ +"External" = "Externt"; + /* */ "Other" = "Annan"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "Externt insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell temporär basal"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index b7b15c1cd5..ce64317a61 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "Ana sayfa"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "Diğer"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuel Bazal"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 44e32e8801..65ddbb630d 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Помилка в"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Резюме харчування"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Редагувати їжу"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Додати прийом їжі"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Підсумок болюсу"; + +/* For the Bolus View pop-up */ +"Calculations" = "Розрахунки"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Жирна їжа"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Повний болюс"; + +/* For the Bolus View pop-up */ +"Fraction" = "Частка"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Фактор жирної їжі"; + +/* For the Bolus View pop-up */ +"Result" = "Результат"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Введена вами сума була обмежена налаштуванням максимального болюсу %d%@"; + /* Home title */ "Home" = "Головна"; @@ -351,7 +384,7 @@ Enact a temp Basal or a temp target */ "Can't find the default Nightscout Profile." = "Не вдається знайти профіль Nightscout за замовчуванням."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Тест на глюкозу у крові"; /* Add Medtronic pump */ "Add Medtronic" = "Додати Medtronic"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Автоматично"; +/* External insulin treatments */ +"External" = "Зовнішній"; + /* */ "Other" = "Інше"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "Зовнішній інсулін"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручна тимчасова базальна швидкість (ТБШ)"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index e731371bcc..3324c2533a 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -55,6 +55,39 @@ /* Headline in enacted pop up (at: at what time) */ "Error at" = "Error at"; +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + /* Home title */ "Home" = "主页"; @@ -569,6 +602,9 @@ Enact a temp Basal or a temp target */ /* Automatic delivered treatments */ "Automatic" = "Automatic"; +/* External insulin treatments */ +"External" = "External"; + /* */ "Other" = "其他"; @@ -1171,6 +1207,9 @@ Enact a temp Basal or a temp target */ /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manual Basal"; From 04ed9f6c7faef4571c6323a86484994b82f2c746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 4 Nov 2023 03:16:44 +0100 Subject: [PATCH 172/405] Reduce clutter. Make more roome in Carbs View (needs more work). Button removed. Move some of settings to UI/UX Section. --- .../Modules/AddCarbs/AddCarbsStateModel.swift | 4 +- .../AddCarbs/View/AddCarbsRootView.swift | 209 ++++++++---------- .../PreferencesEditorStateModel.swift | 1 - .../View/PreferencesEditorRootView.swift | 2 - .../Settings/View/SettingsRootView.swift | 2 +- .../StatConfig/StatConfigStateModel.swift | 5 +- .../StatConfig/View/StatConfigRootView.swift | 18 +- 7 files changed, 110 insertions(+), 131 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index bd831dfa01..1ede5768a5 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -12,7 +12,7 @@ extension AddCarbs { @Published var protein: Decimal = 0 @Published var fat: Decimal = 0 @Published var carbsRequired: Decimal? - @Published var useFPUconversion: Bool = true + @Published var useFPUconversion: Bool = false @Published var dish: String = "" @Published var selection: Presets? @Published var summation: [String] = [] @@ -25,10 +25,10 @@ extension AddCarbs { let coredataContext = CoreDataStack.shared.persistentContainer.viewContext override func subscribe() { - subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } carbsRequired = provider.suggestion?.carbsReq maxCarbs = settings.settings.maxCarbs skipBolus = settingsManager.settings.skipBolusScreenAfterCarbs + useFPUconversion = settingsManager.settings.useFPUconversion } func add() { diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 62c52a5b81..1efde9046c 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -63,58 +63,13 @@ extension AddCarbs { .controlSize(.mini) } }.focused($isFocused) - HStack { - Button { - state.useFPUconversion.toggle() + .popover(isPresented: $isPromptPresented) { + presetPopover } - label: { - Text( - state - .useFPUconversion ? NSLocalizedString("Hide Fat & Protein", comment: "") : - NSLocalizedString("Fat & Protein", comment: "") - ) } - .controlSize(.mini) - .buttonStyle(BorderlessButtonStyle()) - Button { - isPromptPresented = true - } - label: { Text("Save as Preset") } - .frame(maxWidth: .infinity, alignment: .trailing) - .controlSize(.mini) - .buttonStyle(BorderlessButtonStyle()) - .foregroundColor( - (state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) || - ( - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state - .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state - .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == - state - .protein - ) ? .secondary : .orange - ) - .disabled( - (state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) || - ( - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state - .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state - .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state - .protein - ) - ) - } - .popover(isPresented: $isPromptPresented) { - presetPopover - } - } - - if state.useFPUconversion { - Section { - mealPresets - } } Section { - DatePicker("Date", selection: $state.date) + mealPresets } Section { @@ -124,10 +79,8 @@ extension AddCarbs { .frame(maxWidth: .infinity, alignment: .center) } footer: { Text(state.waitersNotepad().description) } - if !state.useFPUconversion { - Section { - mealPresets - } + Section { + DatePicker("Change Date", selection: $state.date) } } .onAppear { @@ -135,7 +88,7 @@ extension AddCarbs { state.loadEntries(editMode) } } - .navigationTitle("Add Meals") + .navigationTitle("Add Meal") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Close", action: state.hideModal)) } @@ -170,14 +123,30 @@ extension AddCarbs { var mealPresets: some View { Section { - VStack { - Picker("Meal Presets", selection: $state.selection) { - Text("Empty").tag(nil as Presets?) + HStack { + Button { + isPromptPresented = true + } + label: { Text("Save as Preset") } + .buttonStyle(BorderlessButtonStyle()) + .disabled( + (state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) || + ( + (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state + .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state + .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state + .protein + ) + ) + + Picker("Select a Preset", selection: $state.selection) { + Text("Presets").tag(nil as Presets?) ForEach(carbPresets, id: \.self) { (preset: Presets) in Text(preset.dish ?? "").tag(preset as Presets?) } } - .pickerStyle(.automatic) + .labelsHidden() + .frame(maxWidth: .infinity, alignment: .trailing) ._onBindingChange($state.selection) { _ in state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal @@ -185,80 +154,84 @@ extension AddCarbs { state.addToSummation() } } - HStack { - Button("Delete Preset") { - showAlert.toggle() - } - .disabled(state.selection == nil) - .accentColor(.orange) - .buttonStyle(BorderlessButtonStyle()) - .alert( - "Delete preset '\(state.selection?.dish ?? "")'?", - isPresented: $showAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.deletePreset() - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + if state.selection != nil { + HStack { + Button("Delete Preset") { + showAlert.toggle() + } + .disabled(state.selection == nil) + .tint(.orange) + .buttonStyle(BorderlessButtonStyle()) + .alert( + "Delete preset '\(state.selection?.dish ?? "")'?", + isPresented: $showAlert, + actions: { + Button("No", role: .cancel) {} + Button("Yes", role: .destructive) { + state.deletePreset() - state.addPresetToNewMeal() + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + + state.addPresetToNewMeal() + } } - } - ) - Button { - if state.carbs != 0, - (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) - } else { state.carbs = 0 } + ) + Button { + if state.carbs != 0, + (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) + } else { state.carbs = 0 } - if state.fat != 0, - (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) - } else { state.fat = 0 } + if state.fat != 0, + (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) + } else { state.fat = 0 } - if state.protein != 0, - (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) - } else { state.protein = 0 } + if state.protein != 0, + (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) + } else { state.protein = 0 } - state.removePresetFromNewMeal() - if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } - } - label: { Text("[ -1 ]") } - .disabled( - state - .selection == nil || - ( - !state.summation.contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" - ) - ) - .buttonStyle(BorderlessButtonStyle()) - .frame(maxWidth: .infinity, alignment: .trailing) - .accentColor(.minus) - Button { - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + state.removePresetFromNewMeal() + if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } + } + label: { Text("[ -1 ]") } + .disabled( + state + .selection == nil || + ( + !state.summation + .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" + ) + ) + .buttonStyle(BorderlessButtonStyle()) + .frame(maxWidth: .infinity, alignment: .trailing) + .tint(.minus) + Button { + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal - state.addPresetToNewMeal() + state.addPresetToNewMeal() + } + label: { Text("[ +1 ]") } + .disabled(state.selection == nil) + .buttonStyle(BorderlessButtonStyle()) + .tint(.blue) } - label: { Text("[ +1 ]") } - .disabled(state.selection == nil) - .buttonStyle(BorderlessButtonStyle()) - .accentColor(.blue) } } } @ViewBuilder private func proteinAndFat() -> some View { HStack { - Text("Fat").foregroundColor(.orange) // .fontWeight(.thin) + Text("Fat").foregroundColor(.orange) Spacer() DecimalTextField( "0", @@ -270,7 +243,7 @@ extension AddCarbs { Text("grams").foregroundColor(.secondary) } HStack { - Text("Protein").foregroundColor(.red) // .fontWeight(.thin) + Text("Protein").foregroundColor(.red) Spacer() DecimalTextField( "0", diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index e475e82047..e89a374ea8 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -15,7 +15,6 @@ extension PreferencesEditor { useAlternativeBolusCalc = settingsManager.settings.useCalc subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } - subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) { unitsIndex = $0 == .mgdL ? 0 : 1 diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index d745a75a30..7ca9d8380a 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -36,8 +36,6 @@ extension PreferencesEditor { DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) } } - - Toggle("Skip Bolus screen after carbs", isOn: $state.skipBolusScreenAfterCarbs) } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 73da26e1f0..fcef5080e7 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -32,7 +32,7 @@ extension Settings { Text("Notifications").navigationLink(to: .notificationsConfig, from: self) Text("Fat And Protein Conversion").navigationLink(to: .fpuConfig, from: self) Text("App Icons").navigationLink(to: .iconConfig, from: self) - Text("Statistics and Home View").navigationLink(to: .statisticsConfig, from: self) + Text("UI/UX Settings").navigationLink(to: .statisticsConfig, from: self) } Section(header: Text("Configuration")) { diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 4699f1a756..0069fcbfd6 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -10,6 +10,8 @@ extension StatConfig { @Published var yGridLines: Bool = false @Published var oneDimensionalGraph = false @Published var rulerMarks: Bool = false + @Published var skipBolusScreenAfterCarbs: Bool = false + @Published var useFPUconversion: Bool = true var units: GlucoseUnits = .mmolL @@ -21,7 +23,8 @@ extension StatConfig { subscribeSetting(\.xGridLines, on: $xGridLines) { xGridLines = $0 } subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } - subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } + subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } + subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } subscribeSetting(\.low, on: $low, initial: { let value = max(min($0, 90), 40) diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index fb12163d13..0c6915bb77 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -26,37 +26,43 @@ extension StatConfig { var body: some View { Form { - Section(header: Text("Settings")) { - Toggle("Change HbA1c Unit", isOn: $state.overrideHbA1cUnit) + Section { Toggle("Display Chart X - Grid lines", isOn: $state.xGridLines) Toggle("Display Chart Y - Grid lines", isOn: $state.yGridLines) Toggle("Display Chart Threshold lines for Low and High", isOn: $state.rulerMarks) Toggle("Standing / Laying TIR Chart", isOn: $state.oneDimensionalGraph) - HStack { Text("Hours X-Axis (6 default)") Spacer() DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) Text("hours").foregroundColor(.secondary) } + } header: { Text("Home Chart settings ") } + Section { HStack { Text("Low") Spacer() DecimalTextField("0", value: $state.low, formatter: glucoseFormatter) Text(state.units.rawValue).foregroundColor(.secondary) } - HStack { Text("High") Spacer() DecimalTextField("0", value: $state.high, formatter: glucoseFormatter) Text(state.units.rawValue).foregroundColor(.secondary) } - } + Toggle("Change HbA1c Unit", isOn: $state.overrideHbA1cUnit) + + } header: { Text("Statistics settings ") } + + Section { + Toggle("Skip Bolus screen after carbs", isOn: $state.skipBolusScreenAfterCarbs) + Toggle("Display and allow Fat and Protein entries", isOn: $state.useFPUconversion) + } header: { Text("Add Meal View settings ") } } .onAppear(perform: configureView) - .navigationBarTitle("Statistics") + .navigationBarTitle("UI/UX Settings") .navigationBarTitleDisplayMode(.automatic) } } From 0bfd3af14bec1a0f97f7fa8365ecd077d292a197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 4 Nov 2023 11:09:19 +0100 Subject: [PATCH 173/405] Revert label (since already transleted) --- .../Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 1efde9046c..b05230b362 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -80,7 +80,7 @@ extension AddCarbs { } footer: { Text(state.waitersNotepad().description) } Section { - DatePicker("Change Date", selection: $state.date) + DatePicker("Date", selection: $state.date) } } .onAppear { @@ -121,6 +121,10 @@ extension AddCarbs { } } + var notEmpty: Bool { + state.carbs > 0 || state.protein > 0 || state.fat > 0 + } + var mealPresets: some View { Section { HStack { @@ -130,7 +134,7 @@ extension AddCarbs { label: { Text("Save as Preset") } .buttonStyle(BorderlessButtonStyle()) .disabled( - (state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) || + !notEmpty || ( (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state From 6e1eefa2db3bb8c40dd89285b2dd9095ae6853ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 4 Nov 2023 14:26:51 +0100 Subject: [PATCH 174/405] Structure settings a bit --- .../PreferencesEditorStateModel.swift | 2 + .../Settings/View/SettingsRootView.swift | 38 +++++++++++-------- .../StatConfig/StatConfigStateModel.swift | 1 - .../StatConfig/View/StatConfigRootView.swift | 2 +- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index e89a374ea8..d2ca222466 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -9,10 +9,12 @@ extension PreferencesEditor { @Published var skipBolusScreenAfterCarbs = false @Published var sections: [FieldSection] = [] @Published var useAlternativeBolusCalc: Bool = false + @Published var units: GlucoseUnits = .mmolL override func subscribe() { preferences = provider.preferences useAlternativeBolusCalc = settingsManager.settings.useCalc + units = settingsManager.settings.units subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index fcef5080e7..5321c16bf7 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -10,43 +10,49 @@ extension Settings { var body: some View { Form { - Section( - header: Text( + Section { + Toggle("Closed loop", isOn: $state.closedLoop) + } header: { + Text( "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice) " ).textCase(nil) - ) { - Toggle("Closed loop", isOn: $state.closedLoop) } - Section(header: Text("Devices")) { + Section { Text("Pump").navigationLink(to: .pumpConfig, from: self) Text("CGM").navigationLink(to: .cgm, from: self) Text("Watch").navigationLink(to: .watch, from: self) - } + } header: { Text("Devices") } - Section(header: Text("Services")) { + Section { Text("Nightscout").navigationLink(to: .nighscoutConfig, from: self) if HKHealthStore.isHealthDataAvailable() { Text("Apple Health").navigationLink(to: .healthkit, from: self) } Text("Notifications").navigationLink(to: .notificationsConfig, from: self) - Text("Fat And Protein Conversion").navigationLink(to: .fpuConfig, from: self) - Text("App Icons").navigationLink(to: .iconConfig, from: self) - Text("UI/UX Settings").navigationLink(to: .statisticsConfig, from: self) - } + } header: { Text("Services") } - Section(header: Text("Configuration")) { - Text("Preferences").navigationLink(to: .preferencesEditor, from: self) + Section { Text("Pump Settings").navigationLink(to: .pumpSettingsEditor, from: self) Text("Basal Profile").navigationLink(to: .basalProfileEditor, from: self) Text("Insulin Sensitivities").navigationLink(to: .isfEditor, from: self) Text("Carb Ratios").navigationLink(to: .crEditor, from: self) Text("Target Glucose").navigationLink(to: .targetsEditor, from: self) + } header: { Text("Configuration") } + + Section { + Text("OpenAPS").navigationLink(to: .preferencesEditor, from: self) Text("Autotune").navigationLink(to: .autotuneConfig, from: self) + } header: { Text("OpenAPS") } + + Section { + Text("UI/UX").navigationLink(to: .statisticsConfig, from: self) + Text("App Icons").navigationLink(to: .iconConfig, from: self) Text("Bolus Calculator").navigationLink(to: .bolusCalculatorConfig, from: self) - } + Text("Fat And Protein Conversion").navigationLink(to: .fpuConfig, from: self) + } header: { Text("Extra Features") } - Section(header: Text("Developer")) { + Section { Toggle("Debug options", isOn: $state.debugOptions) if state.debugOptions { Group { @@ -108,7 +114,7 @@ extension Settings { .navigationLink(to: .configEditor(file: OpenAPS.FreeAPS.settings), from: self) } } - } + } header: { Text("Developer") } Section { Toggle("Animated Background", isOn: $state.animatedBackground) diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 0069fcbfd6..269fe8db6f 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -12,7 +12,6 @@ extension StatConfig { @Published var rulerMarks: Bool = false @Published var skipBolusScreenAfterCarbs: Bool = false @Published var useFPUconversion: Bool = true - var units: GlucoseUnits = .mmolL override func subscribe() { diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index 0c6915bb77..56a934c3a8 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -52,7 +52,7 @@ extension StatConfig { DecimalTextField("0", value: $state.high, formatter: glucoseFormatter) Text(state.units.rawValue).foregroundColor(.secondary) } - Toggle("Change HbA1c Unit", isOn: $state.overrideHbA1cUnit) + Toggle("Override HbA1c Unit", isOn: $state.overrideHbA1cUnit) } header: { Text("Statistics settings ") } From 40ab24644702daf101db3413cf2f942804f0ed3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 4 Nov 2023 14:46:27 +0100 Subject: [PATCH 175/405] Mover more settings... --- .../BolusCalculatorStateModel.swift | 3 +- .../View/BolusCalculatorConfigRootView.swift | 60 ++++++++++++------- .../PreferencesEditorStateModel.swift | 2 - .../View/PreferencesEditorRootView.swift | 7 --- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift index d6063167c7..2be23b790a 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift @@ -6,7 +6,7 @@ extension BolusCalculatorConfig { @Published var useCalc: Bool = false @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 - + @Published var insulinReqPercentage: Decimal = 70 override func subscribe() { subscribeSetting(\.overrideFactor, on: $overrideFactor, initial: { let value = max(min($0, 1.2), 0.1) @@ -22,6 +22,7 @@ extension BolusCalculatorConfig { }, map: { $0 }) + subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } } } } diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift index cade465161..11d0a3efea 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift @@ -14,35 +14,53 @@ extension BolusCalculatorConfig { return formatter } + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + return formatter + } + var body: some View { Form { - Section(header: Text("Calculator settings")) { - HStack { - Toggle("Use alternative Bolus Calculator", isOn: $state.useCalc) - } + Section { HStack { - Text("Override With A Factor Of ") - Spacer() - DecimalTextField("0.8", value: $state.overrideFactor, formatter: conversionFormatter) + Toggle("Use alternate Bolus Calculator", isOn: $state.useCalc) } - } - Section(header: Text("Fatty Meals")) { - HStack { - Toggle("Apply factor for fatty meals", isOn: $state.fattyMeals) + + if state.useCalc { + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.8", value: $state.overrideFactor, formatter: conversionFormatter) + } } - HStack { - Text("Override With A Factor Of ") - Spacer() - DecimalTextField("0.7", value: $state.fattyMealFactor, formatter: conversionFormatter) + + if !state.useCalc { + HStack { + Text("Recommended Bolus Percentage") + DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) + } } - } + } header: { Text("Calculator settings") } + + if state.useCalc { + Section { + HStack { + Toggle("Apply factor for fatty meals", isOn: $state.fattyMeals) + } + HStack { + Text("Override With A Factor Of ") + Spacer() + DecimalTextField("0.7", value: $state.fattyMealFactor, formatter: conversionFormatter) + } + } header: { Text("Fatty Meals") } - Section( - footer: Text( - "This is another approach to the bolus calculator integrated in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." + Section {} + footer: { Text( + "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." ) - ) - {} + } + } } .onAppear(perform: configureView) .navigationBarTitle("Bolus Calculator") diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index d2ca222466..7054d24ad0 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -5,7 +5,6 @@ extension PreferencesEditor { final class StateModel: BaseStateModel, PreferencesSettable { private(set) var preferences = Preferences() @Published var unitsIndex = 1 @Published var allowAnnouncements = false - @Published var insulinReqPercentage: Decimal = 70 @Published var skipBolusScreenAfterCarbs = false @Published var sections: [FieldSection] = [] @Published var useAlternativeBolusCalc: Bool = false @@ -16,7 +15,6 @@ extension PreferencesEditor { useAlternativeBolusCalc = settingsManager.settings.useCalc units = settingsManager.settings.units subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } - subscribeSetting(\.insulinReqPercentage, on: $insulinReqPercentage) { insulinReqPercentage = $0 } subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) { unitsIndex = $0 == .mgdL ? 0 : 1 diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 7ca9d8380a..1aa1c26bd9 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -29,13 +29,6 @@ extension PreferencesEditor { } Toggle("Remote control", isOn: $state.allowAnnouncements) - - if !state.useAlternativeBolusCalc { - HStack { - Text("Recommended Bolus Percentage") - DecimalTextField("", value: $state.insulinReqPercentage, formatter: formatter) - } - } } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in From 5ae04a94e067cf4a322660867a75563a8a7c1385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 02:41:37 +0100 Subject: [PATCH 176/405] Move dynamic ISF settings out from "OpenAPS" to "Extra Features" section --- FreeAPS.xcodeproj/project.pbxproj | 34 ++++++- .../Modules/Dynamic/DynamicDataFlow.swift | 5 ++ .../Modules/Dynamic/DynamicProvider.swift | 3 + .../Modules/Dynamic/DynamicStateModel.swift | 69 ++++++++++++++ .../Dynamic/View/DynamicRootView.swift | 89 +++++++++++++++++++ .../NightscoutConfigStateModel.swift | 2 + .../View/NightscoutConfigRootView.swift | 4 + .../PreferencesEditorStateModel.swift | 75 ---------------- .../View/PreferencesEditorRootView.swift | 2 - .../Settings/View/SettingsRootView.swift | 1 + FreeAPS/Sources/Router/Screen.swift | 3 + 11 files changed, 209 insertions(+), 78 deletions(-) create mode 100644 FreeAPS/Sources/Modules/Dynamic/DynamicDataFlow.swift create mode 100644 FreeAPS/Sources/Modules/Dynamic/DynamicProvider.swift create mode 100644 FreeAPS/Sources/Modules/Dynamic/DynamicStateModel.swift create mode 100644 FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 0ed29a6621..ac5c0d98d8 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -22,6 +22,10 @@ 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; }; 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; }; 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193F6CDC2A512C8F001240FD /* Loops.swift */; }; + 195D80B42AF6973A00D25097 /* DynamicRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B32AF6973A00D25097 /* DynamicRootView.swift */; }; + 195D80B72AF697B800D25097 /* DynamicDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */; }; + 195D80B92AF697F700D25097 /* DynamicProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B82AF697F700D25097 /* DynamicProvider.swift */; }; + 195D80BB2AF6980B00D25097 /* DynamicStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80BA2AF6980B00D25097 /* DynamicStateModel.swift */; }; 1967DFBE29D052C200759F30 /* Icons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBD29D052C200759F30 /* Icons.swift */; }; 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBF29D053AC00759F30 /* IconSelection.swift */; }; 1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; }; @@ -526,6 +530,10 @@ 1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 1935363F28496F7D001E0B16 /* Oref2_variables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oref2_variables.swift; sourceTree = ""; }; 193F6CDC2A512C8F001240FD /* Loops.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loops.swift; sourceTree = ""; }; + 195D80B32AF6973A00D25097 /* DynamicRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicRootView.swift; sourceTree = ""; }; + 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicDataFlow.swift; sourceTree = ""; }; + 195D80B82AF697F700D25097 /* DynamicProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicProvider.swift; sourceTree = ""; }; + 195D80BA2AF6980B00D25097 /* DynamicStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicStateModel.swift; sourceTree = ""; }; 1967DFBD29D052C200759F30 /* Icons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icons.swift; sourceTree = ""; }; 1967DFBF29D053AC00759F30 /* IconSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconSelection.swift; sourceTree = ""; }; 1967DFC129D053D300759F30 /* IconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconImage.swift; sourceTree = ""; }; @@ -1050,6 +1058,25 @@ name = "Recovered References"; sourceTree = ""; }; + 195D80B22AF696EE00D25097 /* Dynamic */ = { + isa = PBXGroup; + children = ( + 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */, + 195D80B82AF697F700D25097 /* DynamicProvider.swift */, + 195D80BA2AF6980B00D25097 /* DynamicStateModel.swift */, + 195D80B52AF6974200D25097 /* View */, + ); + path = Dynamic; + sourceTree = ""; + }; + 195D80B52AF6974200D25097 /* View */ = { + isa = PBXGroup; + children = ( + 195D80B32AF6973A00D25097 /* DynamicRootView.swift */, + ); + path = View; + sourceTree = ""; + }; 198377CF266BFEDE004DE65E /* Localizations */ = { isa = PBXGroup; children = ( @@ -1168,10 +1195,11 @@ 3811DE0325C9D31700A708ED /* Modules */ = { isa = PBXGroup; children = ( + 195D80B22AF696EE00D25097 /* Dynamic */, BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, - CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19F95FF129F10F9C00314DDC /* Stat */, + CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19E1F7E629D0828B005C8D20 /* IconConfig */, 19D466A129AA2B0A004D5F33 /* FPUConfig */, F90692CD274B99850037068D /* HealthKit */, @@ -2576,6 +2604,7 @@ 38C4D33725E9A1A300D30B77 /* DispatchQueue+Extensions.swift in Sources */, F90692CF274B999A0037068D /* HealthKitDataFlow.swift in Sources */, CE7CA3552A064973004BE681 /* ListStateIntent.swift in Sources */, + 195D80B72AF697B800D25097 /* DynamicDataFlow.swift in Sources */, 3862CC2E2743F9F700BF832C /* CalendarManager.swift in Sources */, CEA4F62329BE10F70011ADF7 /* SavitzkyGolayFilter.swift in Sources */, 38B4F3C325E2A20B00E76A18 /* PumpSetupView.swift in Sources */, @@ -2758,6 +2787,7 @@ 19F95FF729F10FEE00314DDC /* StatStateModel.swift in Sources */, 385CEAC125F2EA52002D6D5B /* Announcement.swift in Sources */, 8B759CFCF47B392BB365C251 /* BasalProfileEditorDataFlow.swift in Sources */, + 195D80B42AF6973A00D25097 /* DynamicRootView.swift in Sources */, 389442CB25F65F7100FA1F27 /* NightscoutTreatment.swift in Sources */, CE7CA3512A064973004BE681 /* ApplyTempPresetIntent.swift in Sources */, FA630397F76B582C8D8681A7 /* BasalProfileEditorProvider.swift in Sources */, @@ -2770,6 +2800,7 @@ 38887CCE25F5725200944304 /* IOBEntry.swift in Sources */, 38E98A2425F52C9300C0CED0 /* Logger.swift in Sources */, CA370FC152BC98B3D1832968 /* BasalProfileEditorRootView.swift in Sources */, + 195D80BB2AF6980B00D25097 /* DynamicStateModel.swift in Sources */, E00EEC0327368630002FF094 /* ServiceAssembly.swift in Sources */, 38192E07261BA9960094D973 /* FetchTreatmentsManager.swift in Sources */, 19012CDC291D2CB900FB8210 /* LoopStats.swift in Sources */, @@ -2853,6 +2884,7 @@ 1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */, 19F95FFA29F1102A00314DDC /* StatRootView.swift in Sources */, 0D9A5E34A899219C5C4CDFAF /* DataTableStateModel.swift in Sources */, + 195D80B92AF697F700D25097 /* DynamicProvider.swift in Sources */, D6D02515BBFBE64FEBE89856 /* DataTableRootView.swift in Sources */, 38569349270B5DFB0002C50D /* AppGroupSource.swift in Sources */, F5CA3DB1F9DC8B05792BBFAA /* CGMDataFlow.swift in Sources */, diff --git a/FreeAPS/Sources/Modules/Dynamic/DynamicDataFlow.swift b/FreeAPS/Sources/Modules/Dynamic/DynamicDataFlow.swift new file mode 100644 index 0000000000..9e7412dd24 --- /dev/null +++ b/FreeAPS/Sources/Modules/Dynamic/DynamicDataFlow.swift @@ -0,0 +1,5 @@ +enum Dynamic { + enum Config {} +} + +protocol DynamicProvider: Provider {} diff --git a/FreeAPS/Sources/Modules/Dynamic/DynamicProvider.swift b/FreeAPS/Sources/Modules/Dynamic/DynamicProvider.swift new file mode 100644 index 0000000000..2a1d9fca04 --- /dev/null +++ b/FreeAPS/Sources/Modules/Dynamic/DynamicProvider.swift @@ -0,0 +1,3 @@ +extension Dynamic { + final class Provider: BaseProvider, DynamicProvider {} +} diff --git a/FreeAPS/Sources/Modules/Dynamic/DynamicStateModel.swift b/FreeAPS/Sources/Modules/Dynamic/DynamicStateModel.swift new file mode 100644 index 0000000000..6a4f30e6fd --- /dev/null +++ b/FreeAPS/Sources/Modules/Dynamic/DynamicStateModel.swift @@ -0,0 +1,69 @@ +import SwiftUI + +extension Dynamic { + final class StateModel: BaseStateModel { + @Injected() var settings: SettingsManager! + @Injected() var storage: FileStorage! + + @Published var useNewFormula: Bool = false + @Published var enableDynamicCR: Bool = false + @Published var sigmoid: Bool = false + @Published var adjustmentFactor: Decimal = 0.5 + @Published var weightPercentage: Decimal = 0.65 + @Published var tddAdjBasal: Bool = false + @Published var threshold_setting: Decimal = 65 + @Published var unit: GlucoseUnits = .mmolL + + var preferences: Preferences { + settingsManager.preferences + } + + override func subscribe() { + unit = settingsManager.settings.units + useNewFormula = settings.preferences.useNewFormula + enableDynamicCR = settings.preferences.enableDynamicCR + sigmoid = settings.preferences.sigmoid + adjustmentFactor = settings.preferences.adjustmentFactor + weightPercentage = settings.preferences.weightPercentage + tddAdjBasal = settings.preferences.tddAdjBasal + + if unit == .mmolL { + threshold_setting = settings.preferences.threshold_setting.asMmolL + } else { + threshold_setting = settings.preferences.threshold_setting + } + } + + var unChanged: Bool { + preferences.enableDynamicCR == enableDynamicCR && + preferences.adjustmentFactor == adjustmentFactor && + preferences.sigmoid == sigmoid && + preferences.tddAdjBasal == tddAdjBasal && + preferences.threshold_setting == convertBack(threshold_setting) && + preferences.useNewFormula == useNewFormula && + preferences.weightPercentage == weightPercentage + } + + func convertBack(_ glucose: Decimal) -> Decimal { + if unit == .mmolL { + return glucose.asMgdL + } + return glucose + } + + func saveIfChanged() { + if !unChanged { + var newSettings = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) ?? Preferences() + newSettings.enableDynamicCR = enableDynamicCR + newSettings.adjustmentFactor = adjustmentFactor + newSettings.sigmoid = sigmoid + newSettings.tddAdjBasal = tddAdjBasal + newSettings.threshold_setting = convertBack(threshold_setting) + newSettings.useNewFormula = useNewFormula + newSettings.weightPercentage = weightPercentage + newSettings.timestamp = Date() + storage.save(newSettings, as: OpenAPS.Settings.preferences) + } + } + } +} diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift new file mode 100644 index 0000000000..35bce423c9 --- /dev/null +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -0,0 +1,89 @@ +import SwiftUI +import Swinject + +extension Dynamic { + struct RootView: BaseView { + let resolver: Resolver + @StateObject var state = StateModel() + + private var conversionFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + + return formatter + } + + private var formatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + return formatter + } + + private var glucoseFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if state.unit == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + formatter.roundingMode = .halfUp + return formatter + } + + var body: some View { + Form { + Section { + HStack { + Toggle("Activate Dynamic Sensitivity (ISF)", isOn: $state.useNewFormula) + } + if state.useNewFormula { + HStack { + Toggle("Activate Dynamic Carb Ratio (CR)", isOn: $state.enableDynamicCR) + } + } + } header: { Text("Enable") } + + if state.useNewFormula { + Section { + HStack { + Toggle("Use Sigmoid Formula", isOn: $state.sigmoid) + } + } header: { Text("Formula") } + + Section { + HStack { + Text("Adjustment Factor") + Spacer() + DecimalTextField("0", value: $state.adjustmentFactor, formatter: formatter) + } + + HStack { + Text("Weighted Average of TDD. Weight of past 24 hours:") + Spacer() + DecimalTextField("0", value: $state.weightPercentage, formatter: formatter) + } + + HStack { + Toggle("Adjust basal", isOn: $state.tddAdjBasal) + } + } header: { Text("Settings") } + + Section { + HStack { + Text("Threshold Setting") + Spacer() + DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) + Text(state.unit.rawValue) + } + } header: { Text("Safety") } + } + } + .onAppear(perform: configureView) + .navigationBarTitle("Dynamic ISF") + .navigationBarTitleDisplayMode(.automatic) + .onDisappear { + state.saveIfChanged() + } + } + } +} diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index cab1f7219a..bbcc981c65 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -32,6 +32,7 @@ extension NightscoutConfig { @Published var dia: Decimal = 6 @Published var maxBasal: Decimal = 2 @Published var maxBolus: Decimal = 10 + @Published var allowAnnouncements: Bool = false override func subscribe() { url = keychain.getValue(String.self, forKey: Config.urlKey) ?? "" @@ -41,6 +42,7 @@ extension NightscoutConfig { maxBasal = settingsManager.pumpSettings.maxBasal maxBolus = settingsManager.pumpSettings.maxBolus + subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled) { isUploadEnabled = $0 } subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource) { useLocalSource = $0 } subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init)) { localPort = Decimal($0) } diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 157f5a773b..6c07ccdea4 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -119,6 +119,10 @@ extension NightscoutConfig { Button("Backfill glucose") { state.backfillGlucose() } .disabled(state.url.isEmpty || state.connecting || state.backfilling) } + + Section { + Toggle("Remote control", isOn: $state.allowAnnouncements) + } header: { Text("Allow Remote control of iAPS") } } .onAppear(perform: configureView) .navigationBarTitle("Nightscout Config") diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift index 7054d24ad0..136f924d0f 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift @@ -12,9 +12,7 @@ extension PreferencesEditor { override func subscribe() { preferences = provider.preferences - useAlternativeBolusCalc = settingsManager.settings.useCalc units = settingsManager.settings.units - subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements) { allowAnnouncements = $0 } subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) { unitsIndex = $0 == .mgdL ? 0 : 1 @@ -80,75 +78,6 @@ extension PreferencesEditor { ) ] - let dynamicISF = [ - Field( - displayName: NSLocalizedString("Enable Dynamic ISF", comment: "Enable Dynamic ISF"), - type: .boolean(keypath: \.useNewFormula), - infoText: NSLocalizedString( - "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio:\n\nNew ISF = Static ISF / Dynamic ratio,\n\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\n\ninsulinFactor = 120 - InsulinPeakTimeInMinutes", - comment: "Enable Dynamic ISF" - ), - settable: self - ), - Field( - displayName: NSLocalizedString("Enable Dynamic CR", comment: "Use Dynamic CR together with Dynamic ISF"), - type: .boolean(keypath: \.enableDynamicCR), - infoText: NSLocalizedString( - "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)", - comment: "Use Dynamic CR together with Dynamic ISF" - ), - settable: self - ), - Field( - displayName: NSLocalizedString("Adjustment Factor", comment: "Adjust Dynamic ISF constant"), - type: .decimal(keypath: \.adjustmentFactor), - infoText: NSLocalizedString( - "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users", - comment: "Adjust Dynamic ISF constant" - ), - settable: self - ), - Field( - displayName: NSLocalizedString("Use Sigmoid Function", comment: "Use Sigmoid Function"), - type: .boolean(keypath: \.sigmoid), - infoText: NSLocalizedString( - "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function.", - comment: "Use Sigmoid Function" - ), - settable: self - ), - Field( - displayName: NSLocalizedString( - "Weighted Average of TDD. Weight of past 24 hours:", - comment: "Weight of past 24 hours of insulin" - ), - type: .decimal(keypath: \.weightPercentage), - infoText: NSLocalizedString( - "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment).", - comment: "Weight of past 24 hours of insulin" - ), - settable: self - ), - Field( - displayName: NSLocalizedString("Adjust basal", comment: "Enable adjustment of basal profile"), - type: .boolean(keypath: \.tddAdjBasal), - infoText: NSLocalizedString( - "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD", - comment: "Enable adjustment of basal profile" - ), - settable: self - ), - Field( - displayName: NSLocalizedString("Threshold Setting (mg/dl)", comment: "Threshold Setting"), - type: .decimal(keypath: \.threshold_setting), - infoText: NSLocalizedString( - "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl.", - comment: "Threshold Setting" - ), - settable: self - ) - ] - let smbFields = [ Field( displayName: NSLocalizedString("Enable SMB Always", comment: "Enable SMB Always"), @@ -450,10 +379,6 @@ extension PreferencesEditor { FieldSection( displayName: NSLocalizedString("OpenAPS main settings", comment: "OpenAPS main settings"), fields: mainFields ), - FieldSection( - displayName: NSLocalizedString("Dynamic settings", comment: "Dynamic settings"), - fields: dynamicISF - ), FieldSection( displayName: NSLocalizedString("OpenAPS SMB settings", comment: "OpenAPS SMB settings"), fields: smbFields diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 1aa1c26bd9..18e06eee91 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -27,8 +27,6 @@ extension PreferencesEditor { Text("mg/dL").tag(0) Text("mmol/L").tag(1) } - - Toggle("Remote control", isOn: $state.allowAnnouncements) } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 5321c16bf7..6cce471d00 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -50,6 +50,7 @@ extension Settings { Text("App Icons").navigationLink(to: .iconConfig, from: self) Text("Bolus Calculator").navigationLink(to: .bolusCalculatorConfig, from: self) Text("Fat And Protein Conversion").navigationLink(to: .fpuConfig, from: self) + Text("Dynamic ISF").navigationLink(to: .dynamicISF, from: self) } header: { Text("Extra Features") } Section { diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 26a2b13dc1..23f83f4a93 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -33,6 +33,7 @@ enum Screen: Identifiable, Hashable { case watch case statisticsConfig case bolusCalculatorConfig + case dynamicISF var id: Int { String(reflecting: self).hashValue } } @@ -102,6 +103,8 @@ extension Screen { StatConfig.RootView(resolver: resolver) case .bolusCalculatorConfig: BolusCalculatorConfig.RootView(resolver: resolver) + case .dynamicISF: + Dynamic.RootView(resolver: resolver) } } From f4578869704d8f498d071a85d37c894414a29f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 5 Nov 2023 02:50:38 +0100 Subject: [PATCH 177/405] Crowdin updates (#302) Swedish and Dutch --- .../Main/nl.lproj/Localizable.strings | 26 +++++++++---------- .../Main/sv.lproj/Localizable.strings | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index cb8f8bb17a..202d39c659 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Foutmelding op"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Maaltijd overzicht"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Wijzig maaltijd"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Maaltijd toevoegen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus overzicht"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Berekeningen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Vette maaltijd"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Volledige bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fractie"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Vette maaltijd factor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultaat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Je ingevoerde hoeveelheid is beperkt door je maximale bolusinstelling van %d%@"; /* Home title */ "Home" = "Hoofdmenu"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisch"; /* External insulin treatments */ -"External" = "External"; +"External" = "Extern"; /* */ "Other" = "Anders"; @@ -1208,7 +1208,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Externe insuline"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 24bc2dbfd0..ded4010971 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -71,7 +71,7 @@ "Calculations" = "Beräkningar"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fettrik måltid"; +"Fatty Meal" = "Fet mat"; /* For the Bolus View pop-up */ "Full Bolus" = "Total mängd"; From d60ed48cf7f5ea03e27f4cea64d8bc3f6dd3a680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 5 Nov 2023 02:51:51 +0100 Subject: [PATCH 178/405] Crowdin updates (#302) (#303) Swedish and Dutch --- .../Main/nl.lproj/Localizable.strings | 26 +++++++++---------- .../Main/sv.lproj/Localizable.strings | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index cb8f8bb17a..202d39c659 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Foutmelding op"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Maaltijd overzicht"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Wijzig maaltijd"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Maaltijd toevoegen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus overzicht"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Berekeningen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Vette maaltijd"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Volledige bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fractie"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Vette maaltijd factor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultaat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Je ingevoerde hoeveelheid is beperkt door je maximale bolusinstelling van %d%@"; /* Home title */ "Home" = "Hoofdmenu"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisch"; /* External insulin treatments */ -"External" = "External"; +"External" = "Extern"; /* */ "Other" = "Anders"; @@ -1208,7 +1208,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Externe insuline"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 24bc2dbfd0..ded4010971 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -71,7 +71,7 @@ "Calculations" = "Beräkningar"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fettrik måltid"; +"Fatty Meal" = "Fet mat"; /* For the Bolus View pop-up */ "Full Bolus" = "Total mängd"; From ae8ee7efc7799faaf0a5b9bd79e8ff48c435752d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 18:07:48 +0100 Subject: [PATCH 179/405] Title --- .../Sources/Modules/StatConfig/View/StatConfigRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index 56a934c3a8..6a2cd08b9f 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -62,7 +62,7 @@ extension StatConfig { } header: { Text("Add Meal View settings ") } } .onAppear(perform: configureView) - .navigationBarTitle("UI/UX Settings") + .navigationBarTitle("UI/UX") .navigationBarTitleDisplayMode(.automatic) } } From 70e56174e46d057093ec907385c59fec92ef63fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 18:29:37 +0100 Subject: [PATCH 180/405] Display "Comtine without boluse" as intended --- .../Bolus/View/DefaultBolusCalcRootView.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 00e7bd7aa6..c098a2bd90 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -146,14 +146,14 @@ extension Bolus { ) } } - if state.amount <= 0 { - Section { - Button { - keepForNextWiew = true - state.showModal(for: nil) - } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } + if state.amount <= 0 { + Section { + Button { + keepForNextWiew = true + state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } } From 1c01051ca05905b45fd2bcddc727224f5f24921d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 19:10:03 +0100 Subject: [PATCH 181/405] Add Back button --- .../View/AlternativeBolusCalcRootView.swift | 33 ++++-- .../Bolus/View/DefaultBolusCalcRootView.swift | 106 +++++++++++------- 2 files changed, 88 insertions(+), 51 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 24ad7ca0f9..8994edae11 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -63,16 +63,12 @@ extension Bolus { } Section { - Button { - let id_ = meal.first?.id ?? "" - if fetch { - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) - } else { - state.showModal(for: .addCarbs(editMode: false)) + if !fetch { + Button { + carbssView() } + label: { Text("Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } - label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } header: { Text(!fetch ? "Meal Summary" : "") } Section { @@ -172,7 +168,16 @@ extension Bolus { .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems( - leading: Button { state.hideModal() } + leading: Button { + if fetch { + carbssView() + } else { + state.hideModal() + } + } + label: { Text("Back") }, + + trailing: Button { state.hideModal() } label: { Text("Close") } ) .onAppear { @@ -265,6 +270,16 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } + func carbssView() { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + var mealEntries: some View { VStack { if let carbs = meal.first?.carbs, carbs > 0 { diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index c098a2bd90..491794ea89 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -37,53 +37,17 @@ extension Bolus { Form { if fetch { Section { - VStack { - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - Spacer() - Text(carbs.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - Spacer() - Text(fat.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - Spacer() - Text(protein.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - Spacer() - Text(note) - }.foregroundColor(.secondary) - } - } + mealEntries } header: { Text("Meal Summary") } } Section { - Button { - let id_ = meal.first?.id ?? "" - if fetch { - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) - } else { - state.showModal(for: .addCarbs(editMode: false)) + if !fetch { + Button { + carbssView() } + label: { Text("Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } - label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) } header: { Text(!fetch ? "Meal Summary" : "") } Section { @@ -187,7 +151,19 @@ extension Bolus { .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems( + leading: Button { + if fetch { + carbssView() + } else { + state.hideModal() + } + } + label: { Text("Back") }, + + trailing: Button { state.hideModal() } + label: { Text("Close") } + ) .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { bolusInfo } @@ -201,6 +177,52 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } + func carbssView() { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + + var mealEntries: some View { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } + var bolusInfo: some View { VStack { // Variables From 420e83c3f797d1b2a5fdc985b42f215cbfed8ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 19:16:16 +0100 Subject: [PATCH 182/405] Missing --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 4 +--- .../Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 8994edae11..e1adaaca24 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -171,11 +171,9 @@ extension Bolus { leading: Button { if fetch { carbssView() - } else { - state.hideModal() } } - label: { Text("Back") }, + label: { Text(fetch ? "Back" : "") }, trailing: Button { state.hideModal() } label: { Text("Close") } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 491794ea89..2f22db4ab3 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -155,11 +155,9 @@ extension Bolus { leading: Button { if fetch { carbssView() - } else { - state.hideModal() } } - label: { Text("Back") }, + label: { Text(fetch ? "Back" : "") }, trailing: Button { state.hideModal() } label: { Text("Close") } From 37fd93bb0dfa629ef66c9e21c045c43289cac0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:50:31 +0100 Subject: [PATCH 183/405] Crowdin updates (#304) German and Italian --- .../de.lproj/Localizable.strings | 4 +- .../it.lproj/Localizable.strings | 6 +- .../Main/de.lproj/Localizable.strings | 52 +++++------ .../Main/it.lproj/Localizable.strings | 90 +++++++++---------- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index cce909e92f..5ca3fcc5ee 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -1,5 +1,5 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "– – –"; +"– – –" = ""; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; @@ -99,7 +99,7 @@ "Sensor failed" = "Sensorfehler"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Starte den Sensor"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Signal\nVerlust"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings index 0e7c629332..02213ad8e2 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings @@ -2,7 +2,7 @@ "– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/minuto"; +"%@/min" = "%@/min"; /* No comment provided by engineer. */ "Are you sure you want to delete this CGM?" = "Sei sicuro di voler cancellare questo CGM?"; @@ -63,7 +63,7 @@ "Name" = "Nome"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scansiona per nuovo sensore"; +"Scan for new sensor" = "Scansiona nuovo sensore"; /* title for g7 settings connection status when scanning */ "Scanning" = "Lettura"; @@ -99,7 +99,7 @@ "Sensor failed" = "Sensore fallito"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Avvia sensore"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Perdita segnale \n"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 6d3fcd8e66..79e1f22eef 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Fehler um"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Mahlzeitenübersicht"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Mahlzeit bearbeiten"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Mahlzeit hinzufügen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolusübersicht"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Berechnungen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Fette Mahlzeit"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Voller Bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fraktion"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Fettspeise Faktor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Ergebnis"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Dein eingegebener Wert wurde durch deine maximale Bolus-Einstellung von %d%@ begrenzt"; /* Home title */ "Home" = "Hauptseite"; @@ -348,43 +348,43 @@ Enact a temp Basal or a temp target */ "Remote control" = "Fernbedienung"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nBitte überprüfen Sie jetzt alle Ihre neuen Einstellungen gründlich:\n\n* Basaleinstellungen\n * Carb Ratios\n * Glukose-Ziele\n * Insulinempfindlichkeiten\n * DIA\n\n in iAPS-Einstellungen > Konfiguration.\n\nSchlechte oder ungültige Profileinstellungen können abscheuliche Effekte haben."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dies wird einige oder alle deine aktuellen Pumpeneinstellungen ersetzen. Bist du sicher, dass du die Profileinstellungen von Nightscout importieren möchtest?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nUngültige Nightcsout Basal-Einstellungen. \n\nImport abgebrochen. Bitte überprüfen Sie Ihre Nightscout Profil Basal-Einstellungen!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nEinstellungen wurden importiert, aber die Basalen konnten nicht in Pumpe gespeichert werden (keine Pump). Überprüfen Sie Ihre Basiseinstellungen und tippen Sie auf Speichern auf Pump, um die neuen Basiseinstellungen zu synchronisieren"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Fehler beim Import"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Ja, importieren"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Einstellungen von Nightscout importieren"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Einstellungen importieren?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Einstellungen von Nightscout importieren"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Einstellungen importiert"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nFalsch übereinstimmende Glukoseeinheiten in Nightscout und Pump-Einstellungen. Import abgebrochen."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Kann das Standard-Nightscout-Profil nicht finden."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Blutzucker Einheit"; /* Add Medtronic pump */ "Add Medtronic" = "Medtronic-Pumpe hinzufügen"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisch"; /* External insulin treatments */ -"External" = "External"; +"External" = "Externe"; /* */ "Other" = "Sonstiges"; @@ -1134,7 +1134,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Nur Autotune Basalinsulin"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Als deine normalen Basalraten speichern"; /* */ "Save on Pump" = "Auf Pumpe speichern"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 3956fe1536..d71b6eba05 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Continua senza eseguire un bolo"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLa quantità è superiore all'impostazione del bolo massimo! \nSei sicuro di voler aggiungere?"; /* Header */ "Enact Bolus" = "Esegui bolo"; @@ -56,37 +56,37 @@ "Error at" = "Errore a"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Riepilogo Pasti"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Modifica pasto"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Aggiungi Pasto"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Riepilogo boli"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Calcolo in corso"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Pasto Grasso"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Bolo Completo"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Frazione"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Fattore Pasto Grasso"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Risultato"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Il tuo importo inserito è stato limitato dalla tua impostazione del Bolo massimo di %d%@"; /* Home title */ "Home" = "Home"; @@ -95,7 +95,7 @@ "looping" = "in loop"; /* min ago since last loop */ -"min ago" = "minuti fa"; +"min ago" = "min fa"; /* Status Title */ "No suggestion" = "Nessun suggerimento"; @@ -348,43 +348,43 @@ Enact a temp Basal or a temp target */ "Remote control" = "Controllo remoto"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nOra verifica attentamente tutte le nuove impostazioni:\n\n* Impostazioni basali\n * Rapporti carboidrati\n * Obiettivi glucosio\n * Sensibilità insulinica\n * DIA\n\n in Impostazioni iAPS > Configurazione.\n\nImpostazioni del profilo errate o non valide potrebbero avere effetti disastrosi."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Questo sostituirà alcune o tutte le impostazioni attuali del microinfusore. Sei sicuro di voler importare le impostazioni del profilo da Nightscout?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nImpostazioni Basali Nightscout non valide. \n\nImportazione annullata. Si prega di controllare le impostazioni Basali del profilo Nightscout!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nLe impostazioni sono state importate ma non è stato possibile salvare le basali nel microinfusore (nessun microinfusore). Controlla le impostazioni basali e tocca \"Salva sul microinfusore\" per sincronizzare le nuove impostazioni basali"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Errore d'importazione"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Sì, Importa"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importa impostazioni da Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Importa impostazioni?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importa da Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Impostazioni importate"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nUnità di glicemie non corrispondenti nelle impostazioni di Nightscout e della Pompa. Importa impostazioni interrotte."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Impossibile trovare il profilo predefinito di Nightscout."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Prova Glicemia"; /* Add Medtronic pump */ "Add Medtronic" = "Aggiungi microinfusore Medtronic"; @@ -477,19 +477,19 @@ Enact a temp Basal or a temp target */ "Pump" = "Microinfusore"; /* */ -"Watch" = "Watch"; +"Watch" = "Orologio"; /* */ -"Watch Configuration" = "Watch"; +"Watch Configuration" = "Orologio"; /* */ -"Apple Watch" = "Apple Watch"; +"Apple Watch" = "Orologio Apple"; /* */ -"Display on Watch" = "Mostra sul Watch"; +"Display on Watch" = "Mostra sull'orologio"; /* */ -"Garmin Watch" = "Garmin Watch"; +"Garmin Watch" = "Orologio Garmin"; /* */ "Add devices" = "Aggiungi dispositivi"; @@ -543,10 +543,10 @@ Enact a temp Basal or a temp target */ "History" = "Storia"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Carica"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Consenti caricamenti"; /* Type of CGM or glucose source */ "Type" = "Tipo"; @@ -594,16 +594,16 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrazioni"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Crea eventi nel calendario"; /* */ "Calendar" = "Calendario"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatico"; /* External insulin treatments */ -"External" = "External"; +"External" = "Esterno"; /* */ "Other" = "Altro"; @@ -1041,7 +1041,7 @@ Enact a temp Basal or a temp target */ "Bolus failed" = "Bolo fallito"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Bolo massimo superato!"; /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolo fallito o impreciso. Controlla la cronologia del microinfusore prima di ripetere."; @@ -1071,7 +1071,7 @@ Enact a temp Basal or a temp target */ " day(s)" = " giorno/i"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Mostra FC su Watch"; +"Display HR on Watch" = "Mostra FC sull'orologio"; /* Headers for settings ----------------------- */ @@ -1128,13 +1128,13 @@ Enact a temp Basal or a temp target */ "Autosense" = "Autosensibilità"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Sensibilità Dinamica"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Solo Insulina Basale Autotune"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Salva come Tassi Basali Normali"; /* */ "Save on Pump" = "Salva sul microinfusore"; @@ -1183,13 +1183,13 @@ Enact a temp Basal or a temp target */ "Apple Health" = "Apple Salute"; /* */ -"Connect to Apple Health" = "Connetti con Apple Health"; +"Connect to Apple Health" = "Connetti con Apple Salute"; /* Show when have not permissions for writing to Health */ "For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Per scrivere dati su Apple Health devi dare il permesso in Impostazioni > Salute > Accesso dati"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Questo permette a iAPS di leggere e scrivere su Apple Salute. È necessario anche dare i permessi in Impostazioni > Salute > Accesso dati. Se immetti un valore di glucosio in Apple Salute apri iAPS per confermarlo."; /* New ALerts ------------------------- */ /* Info title */ @@ -1208,7 +1208,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Insulina Esterna"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Basale manuale temporanea"; @@ -1898,7 +1898,7 @@ Enact a temp Basal or a temp target */ "Max COB" = "Max COB"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Il valore predefinito di maxCOB è di 120. (Se qualcuno inserisce più carboidrati in una o più voci, iAPS limiterà il COB a maxCOB e lo manterrà a maxCOB fino a quando i carboidrati entrati sopra il maxCOB non avranno mostrato di essere assorbiti. Essenzialmente, questo limita solo UAM come un cappuccio di sicurezza contro calcoli COB strani a causa di dati fluidi.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Bolo posticipato - Divisore DIA"; From fd5e02d7f5302b94d191156aa19350894d11ac00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 5 Nov 2023 21:01:14 +0100 Subject: [PATCH 184/405] Nother back button commit --- .../View/AlternativeBolusCalcRootView.swift | 17 +++-------------- .../Bolus/View/DefaultBolusCalcRootView.swift | 18 +++--------------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index e1adaaca24..f5999be92a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -62,15 +62,6 @@ extension Bolus { } header: { Text("Meal Summary") } } - Section { - if !fetch { - Button { - carbssView() - } - label: { Text("Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } - } header: { Text(!fetch ? "Meal Summary" : "") } - Section { HStack { Button(action: { @@ -138,7 +129,7 @@ extension Bolus { } } } - } header: { Text("Bolus Summary") } + } header: { Text("Bolus") } if state.amount > 0 { Section { @@ -169,11 +160,9 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - if fetch { - carbssView() - } + carbssView() } - label: { Text(fetch ? "Back" : "") }, + label: { Text(fetch ? "Back" : "Meal") }, trailing: Button { state.hideModal() } label: { Text("Close") } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 2f22db4ab3..8d66170cbd 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -41,15 +41,6 @@ extension Bolus { } header: { Text("Meal Summary") } } - Section { - if !fetch { - Button { - carbssView() - } - label: { Text("Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } - } header: { Text(!fetch ? "Meal Summary" : "") } - Section { if state.waitForSuggestion { HStack { @@ -93,8 +84,7 @@ extension Bolus { Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } } - } - header: { Text("Bolus Summary") } + } header: { Text("Bolus") } if !state.waitForSuggestion { if state.amount > 0 { @@ -153,11 +143,9 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - if fetch { - carbssView() - } + carbssView() } - label: { Text(fetch ? "Back" : "") }, + label: { Text(fetch ? "Back" : "Meal") }, trailing: Button { state.hideModal() } label: { Text("Close") } From 6ccedaca5493892a1aff19b705c6e782113a2650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 6 Nov 2023 15:59:08 +0100 Subject: [PATCH 185/405] Make sure to later always fetch latest entry --- FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 1ede5768a5..f309a95b72 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -189,7 +189,7 @@ extension AddCarbs { func saveToCoreData(_ stored: [CarbsEntry]) { let save = Meals(context: coredataContext) - save.createdAt = stored.first?.createdAt ?? .distantPast + save.createdAt = Date.now save.id = stored.first?.collectionID ?? "" save.carbs = Double(stored.first?.carbs ?? 0) save.fat = Double(stored.first?.fat ?? 0) From 36e6791b91a6f4c7326c717cd028f74bdc7067e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 7 Nov 2023 14:12:36 +0100 Subject: [PATCH 186/405] New meal view (#308) Working draft. --- .../Modules/AddCarbs/AddCarbsStateModel.swift | 32 ++- .../AddCarbs/View/AddCarbsRootView.swift | 261 +++++++++++------- .../Modules/Bolus/BolusStateModel.swift | 4 - .../Bolus/View/DefaultBolusCalcRootView.swift | 1 + 4 files changed, 181 insertions(+), 117 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index f309a95b72..7decc6441a 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -140,16 +140,16 @@ extension AddCarbs { var addedString = "" if extracarbs > 0, filteredArray.isNotEmpty { - addedString += "Additional carbs: \(extracarbs) " + addedString += "Additional carbs: \(extracarbs) ," } else if extracarbs < 0 { addedString += "Removed carbs: \(extracarbs) " } if extraFat > 0, filteredArray.isNotEmpty { - addedString += "Additional fat: \(extraFat) " - } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) " } + addedString += "Additional fat: \(extraFat) ," + } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) ," } if extraProtein > 0, filteredArray.isNotEmpty { - addedString += "Additional protein: \(extraProtein) " - } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) " } + addedString += "Additional protein: \(extraProtein) ," + } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) ," } if addedString != "" { waitersNotepad.append(addedString) @@ -170,7 +170,7 @@ extension AddCarbs { func loadEntries(_ editMode: Bool) { if editMode { - coredataContext.perform { + coredataContext.performAndWait { var mealToEdit = [Meals]() let requestMeal = Meals.fetchRequest() as NSFetchRequest let sortMeal = NSSortDescriptor(key: "createdAt", ascending: false) @@ -188,15 +188,17 @@ extension AddCarbs { } func saveToCoreData(_ stored: [CarbsEntry]) { - let save = Meals(context: coredataContext) - save.createdAt = Date.now - save.id = stored.first?.collectionID ?? "" - save.carbs = Double(stored.first?.carbs ?? 0) - save.fat = Double(stored.first?.fat ?? 0) - save.protein = Double(stored.first?.protein ?? 0) - save.note = stored.first?.note ?? "" - if coredataContext.hasChanges { - try? coredataContext.save() + coredataContext.performAndWait { + let save = Meals(context: coredataContext) + if let entry = stored.first { + save.createdAt = Date.now + save.id = entry.collectionID ?? "" + save.carbs = Double(entry.carbs) + save.fat = Double(entry.fat ?? 0) + save.protein = Double(entry.protein ?? 0) + save.note = entry.note + try? coredataContext.save() + } } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index b05230b362..a2c06acaf0 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -10,6 +10,7 @@ extension AddCarbs { @State var dish: String = "" @State var isPromptPresented = false @State var saved = false + @State var pushed = false @State private var showAlert = false @FocusState private var isFocused: Bool @@ -29,12 +30,12 @@ extension AddCarbs { var body: some View { Form { - if let carbsReq = state.carbsRequired { + if let carbsReq = state.carbsRequired, state.carbs < carbsReq { Section { HStack { Text("Carbs required") Spacer() - Text(formatter.string(from: carbsReq as NSNumber)! + " g") + Text((formatter.string(from: carbsReq as NSNumber) ?? "") + " g") } } } @@ -50,11 +51,55 @@ extension AddCarbs { cleanInput: true ) Text("grams").foregroundColor(.secondary) - }.padding(.vertical) + } if state.useFPUconversion { proteinAndFat() } + + // Summary when combining presets + if state.waitersNotepad() != "" { + HStack { + Text("Serving") + let test = state.waitersNotepad().components(separatedBy: ", ").removeDublicates() + HStack(spacing: 0) { + ForEach(test, id: \.self) { + Text($0).foregroundStyle(Color.randomGreen()).font(.footnote) + Text($0 == test[test.count - 1] ? "" : ", ") + } + }.frame(maxWidth: .infinity, alignment: .trailing) + } + } + + // Time + HStack { + let now = Date.now + Text("Time") + Spacer() + if !pushed { + Button { + pushed = true + } label: { Text("Now") }.buttonStyle(.borderless).foregroundColor(.secondary).padding(.trailing, 5) + } else { + Button { state.date = state.date.addingTimeInterval(-10.minutes.timeInterval) } + label: { Image(systemName: "minus.circle") }.tint(.blue).buttonStyle(.borderless) + DatePicker( + "Time", + selection: $state.date, + in: ...now, + displayedComponents: [.hourAndMinute] + ).controlSize(.mini) + .labelsHidden() + Button { + if state.date.addingTimeInterval(5.minutes.timeInterval) < now { + state.date = state.date.addingTimeInterval(10.minutes.timeInterval) + } + } + label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) + } + } + + // Optional meal note HStack { Text("Note").foregroundColor(.secondary) TextField("", text: $state.note).multilineTextAlignment(.trailing) @@ -62,14 +107,11 @@ extension AddCarbs { Button { isFocused = false } label: { Image(systemName: "keyboard.chevron.compact.down") } .controlSize(.mini) } - }.focused($isFocused) - .popover(isPresented: $isPromptPresented) { - presetPopover - } - } - - Section { - mealPresets + } + .focused($isFocused) + .popover(isPresented: $isPromptPresented) { + presetPopover + } } Section { @@ -77,10 +119,11 @@ extension AddCarbs { label: { Text(state.skipBolus ? "Save" : "Continue") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) - } footer: { Text(state.waitersNotepad().description) } + }.listRowBackground(!empty ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) Section { - DatePicker("Date", selection: $state.date) + mealPresets } } .onAppear { @@ -93,7 +136,7 @@ extension AddCarbs { .navigationBarItems(leading: Button("Close", action: state.hideModal)) } - var presetPopover: some View { + private var presetPopover: some View { Form { Section { TextField("Name Of Dish", text: $dish) @@ -121,114 +164,125 @@ extension AddCarbs { } } - var notEmpty: Bool { - state.carbs > 0 || state.protein > 0 || state.fat > 0 + private var empty: Bool { + state.carbs <= 0 && state.fat <= 0 && state.protein <= 0 + } + + private var minusButton: some View { + Button { + if state.carbs != 0, + (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) + } else { state.carbs = 0 } + + if state.fat != 0, + (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) + } else { state.fat = 0 } + + if state.protein != 0, + (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) + } else { state.protein = 0 } + + state.removePresetFromNewMeal() + if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } + } + label: { Image(systemName: "minus.circle") } + .disabled( + state + .selection == nil || + ( + !state.summation + .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" + ) + ) + .buttonStyle(.borderless) + .tint(.blue) + } + + private var plusButton: some View { + Button { + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + + state.addPresetToNewMeal() + } + label: { Image(systemName: "plus.circle") } + .disabled(state.selection == nil) + .buttonStyle(.borderless) + .tint(.blue) } - var mealPresets: some View { + private var mealPresets: some View { Section { HStack { - Button { - isPromptPresented = true + if state.selection != nil { + minusButton } - label: { Text("Save as Preset") } - .buttonStyle(BorderlessButtonStyle()) - .disabled( - !notEmpty || - ( - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state - .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state - .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state - .protein - ) - ) - - Picker("Select a Preset", selection: $state.selection) { - Text("Presets").tag(nil as Presets?) + Picker("Preset", selection: $state.selection) { + Text("Saved Food").tag(nil as Presets?) ForEach(carbPresets, id: \.self) { (preset: Presets) in Text(preset.dish ?? "").tag(preset as Presets?) } } .labelsHidden() - .frame(maxWidth: .infinity, alignment: .trailing) + .frame(maxWidth: .infinity, alignment: .center) ._onBindingChange($state.selection) { _ in state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal state.addToSummation() } + if state.selection != nil { + plusButton + } } - if state.selection != nil { - HStack { - Button("Delete Preset") { - showAlert.toggle() - } - .disabled(state.selection == nil) - .tint(.orange) - .buttonStyle(BorderlessButtonStyle()) - .alert( - "Delete preset '\(state.selection?.dish ?? "")'?", - isPresented: $showAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.deletePreset() + HStack { + Button("Delete Preset") { + showAlert.toggle() + } + .disabled(state.selection == nil) + .tint(.orange) + .buttonStyle(.borderless) + .alert( + "Delete preset '\(state.selection?.dish ?? "")'?", + isPresented: $showAlert, + actions: { + Button("No", role: .cancel) {} + Button("Yes", role: .destructive) { + state.deletePreset() - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal - state.addPresetToNewMeal() - } + state.addPresetToNewMeal() } - ) - Button { - if state.carbs != 0, - (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) - } else { state.carbs = 0 } - - if state.fat != 0, - (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) - } else { state.fat = 0 } - - if state.protein != 0, - (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) - } else { state.protein = 0 } - - state.removePresetFromNewMeal() - if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } } - label: { Text("[ -1 ]") } - .disabled( - state - .selection == nil || - ( - !state.summation - .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" - ) - ) - .buttonStyle(BorderlessButtonStyle()) - .frame(maxWidth: .infinity, alignment: .trailing) - .tint(.minus) - Button { - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + ) - state.addPresetToNewMeal() - } - label: { Text("[ +1 ]") } - .disabled(state.selection == nil) - .buttonStyle(BorderlessButtonStyle()) - .tint(.blue) + Spacer() + + Button { + isPromptPresented = true } + label: { Text("Save as Preset") } + .buttonStyle(.borderless) + .disabled( + empty || + ( + (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state + .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state + .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state + .protein + ) + ) } } } @@ -262,3 +316,14 @@ extension AddCarbs { } } } + +public extension Color { + static func randomGreen(randomOpacity: Bool = false) -> Color { + Color( + red: .random(in: 0 ... 1), + green: .random(in: 0.4 ... 0.7), + blue: .random(in: 0.2 ... 1), + opacity: randomOpacity ? .random(in: 0.8 ... 1) : 1 + ) + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 26f7e4203e..cfcb8aae16 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,5 +1,3 @@ - -import CoreData import LoopKit import SwiftUI import Swinject @@ -14,8 +12,6 @@ extension Bolus { @Injected() var settings: SettingsManager! @Injected() var nsManager: NightscoutManager! - let coredataContext = CoreDataStack.shared.persistentContainer.viewContext - @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 8d66170cbd..a075c1341d 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import CoreData import SwiftUI import Swinject From 5c339b1de53e9cb3d1b7cf4668b542c9387855c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 7 Nov 2023 15:03:26 +0100 Subject: [PATCH 187/405] New wording --- FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index a2c06acaf0..f432fd6cba 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -60,7 +60,7 @@ extension AddCarbs { // Summary when combining presets if state.waitersNotepad() != "" { HStack { - Text("Serving") + Text("Total") let test = state.waitersNotepad().components(separatedBy: ", ").removeDublicates() HStack(spacing: 0) { ForEach(test, id: \.self) { From 25686ca3735c4140fc146f3cd0b0f6c337719931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 03:07:30 +0100 Subject: [PATCH 188/405] Chart for predictions --- FreeAPS.xcodeproj/project.pbxproj | 8 +- FreeAPS/Sources/Models/Charts.swift | 17 ++++ FreeAPS/Sources/Models/TIRforChart.swift | 8 -- .../View/AlternativeBolusCalcRootView.swift | 85 +++++++++++++++++++ 4 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 FreeAPS/Sources/Models/Charts.swift delete mode 100644 FreeAPS/Sources/Models/TIRforChart.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index ac5c0d98d8..7d70254c3d 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -40,7 +40,7 @@ 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; 19D466A729AA2C22004D5F33 /* FPUConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */; }; 19D466AA29AA3099004D5F33 /* FPUConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */; }; - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */; }; + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* Charts.swift */; }; 19DA48E829CD339B00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48E929CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48EA29CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; @@ -568,7 +568,7 @@ 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigProvider.swift; sourceTree = ""; }; 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigStateModel.swift; sourceTree = ""; }; 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigRootView.swift; sourceTree = ""; }; - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TIRforChart.swift; sourceTree = ""; }; + 19D4E4EA29FC6A9F00351451 /* Charts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Charts.swift; sourceTree = ""; }; 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 19DC677E29CA675700FD9EC4 /* OverrideProfilesDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesDataFlow.swift; sourceTree = ""; }; 19DC678029CA676A00FD9EC4 /* OverrideProfilesProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesProvider.swift; sourceTree = ""; }; @@ -1655,7 +1655,7 @@ FE41E4D529463EE20047FD55 /* NightscoutPreferences.swift */, 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */, + 19D4E4EA29FC6A9F00351451 /* Charts.swift */, 19A910352A24D6D700C8951B /* DateFilter.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, @@ -2862,7 +2862,7 @@ 0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */, 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */, BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */, - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */, + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */, FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */, F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */, 3862CC1F273FDC9200BF832C /* CalibrationsChart.swift in Sources */, diff --git a/FreeAPS/Sources/Models/Charts.swift b/FreeAPS/Sources/Models/Charts.swift new file mode 100644 index 0000000000..82896af45b --- /dev/null +++ b/FreeAPS/Sources/Models/Charts.swift @@ -0,0 +1,17 @@ + +import Foundation + +struct ShapeModel: Identifiable { + var type: String + var percent: Decimal + var id = UUID() +} + +struct ChartData: Identifiable { + var date: Date + var iob: Double + var zt: Double + var cob: Double + var uam: Double + var id = UUID() +} diff --git a/FreeAPS/Sources/Models/TIRforChart.swift b/FreeAPS/Sources/Models/TIRforChart.swift deleted file mode 100644 index bdbc13e384..0000000000 --- a/FreeAPS/Sources/Models/TIRforChart.swift +++ /dev/null @@ -1,8 +0,0 @@ - -import Foundation - -struct ShapeModel: Identifiable { - var type: String - var percent: Decimal - var id = UUID() -} diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index f5999be92a..6bb5b0015b 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import Charts import CoreData import SwiftUI import Swinject @@ -56,6 +57,13 @@ extension Bolus { var body: some View { Form { + Section { + chart() + } header: { + Text("Predictions") + } + + Section {} if fetch { Section { mealEntries @@ -186,6 +194,83 @@ extension Bolus { } } + func chart() -> some View { + // Data Source + let iob = state.provider.suggestion?.predictions?.iob ?? [Int]() + let cob = state.provider.suggestion?.predictions?.cob ?? [Int]() + let uam = state.provider.suggestion?.predictions?.uam ?? [Int]() + let zt = state.provider.suggestion?.predictions?.zt ?? [Int]() + let count = max(iob.count, cob.count, uam.count, zt.count) + var now = Date.now + var startIndex = 0 + let conversion = state.units == .mmolL ? 0.0555 : 1 + // Organize the data needed for prediction chart. + var data = [ChartData]() + repeat { + now = now.addingTimeInterval(5.minutes.timeInterval) + if startIndex < count { + let addedData = ChartData( + date: now, + iob: startIndex < iob.count ? Double(iob[startIndex]) * conversion : 0, + zt: startIndex < zt.count ? Double(zt[startIndex]) * conversion : 0, + cob: startIndex < cob.count ? Double(cob[startIndex]) * conversion : 0, + uam: startIndex < uam.count ? Double(uam[startIndex]) * conversion : 0, + id: UUID() + ) + data.append(addedData) + } + startIndex += 1 + } while startIndex < count + // Chart + return Chart(data) { item in + // Remove 0 (empty) values + if item.iob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("IOB", item.iob), + series: .value("IOB", "A") + ) + .foregroundStyle(Color(.insulin)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.uam != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("UAM", item.uam), + series: .value("UAM", "B") + ) + .foregroundStyle(Color(.UAM)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.cob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("COB", item.cob), + series: .value("COB", "C") + ) + .foregroundStyle(Color(.loopYellow)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.zt != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("ZT", item.zt), + series: .value("ZT", "D") + ) + .foregroundStyle(Color(.ZT)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + } + .frame(minHeight: 150) + .chartForegroundStyleScale([ + "IOB": Color(.insulin), + "UAM": Color(.UAM), + "COB": Color(.loopYellow), + "ZT": Color(.ZT) + ]) + .chartYAxisLabel("Glucose (" + state.units.rawValue + ")") + } + // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { From db99798ed9f3fafd6cae14752302d84b1a8982c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 8 Nov 2023 04:09:24 +0100 Subject: [PATCH 189/405] New Meal view and bolus views (#310) * Chart for predictions Bolus view * A bit cleaner Carbs View with better presets summary * Back button and view meal entries in Bolus views --- .../de.lproj/Localizable.strings | 4 +- .../it.lproj/Localizable.strings | 6 +- FreeAPS.xcodeproj/project.pbxproj | 8 +- .../Main/de.lproj/Localizable.strings | 52 ++-- .../Main/it.lproj/Localizable.strings | 90 +++--- .../Main/nl.lproj/Localizable.strings | 26 +- .../Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Models/Charts.swift | 17 ++ FreeAPS/Sources/Models/TIRforChart.swift | 8 - .../Modules/AddCarbs/AddCarbsStateModel.swift | 32 ++- .../AddCarbs/View/AddCarbsRootView.swift | 261 +++++++++++------- .../Modules/Bolus/BolusStateModel.swift | 4 - .../View/AlternativeBolusCalcRootView.swift | 117 +++++++- .../Bolus/View/DefaultBolusCalcRootView.swift | 121 ++++---- .../StatConfig/View/StatConfigRootView.swift | 2 +- 15 files changed, 459 insertions(+), 291 deletions(-) create mode 100644 FreeAPS/Sources/Models/Charts.swift delete mode 100644 FreeAPS/Sources/Models/TIRforChart.swift diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index cce909e92f..5ca3fcc5ee 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -1,5 +1,5 @@ /* No glucose value representation (3 dashes for mg/dL) */ -"– – –" = "– – –"; +"– – –" = ""; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; @@ -99,7 +99,7 @@ "Sensor failed" = "Sensorfehler"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Starte den Sensor"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Signal\nVerlust"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings index 0e7c629332..02213ad8e2 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings @@ -2,7 +2,7 @@ "– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/minuto"; +"%@/min" = "%@/min"; /* No comment provided by engineer. */ "Are you sure you want to delete this CGM?" = "Sei sicuro di voler cancellare questo CGM?"; @@ -63,7 +63,7 @@ "Name" = "Nome"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scansiona per nuovo sensore"; +"Scan for new sensor" = "Scansiona nuovo sensore"; /* title for g7 settings connection status when scanning */ "Scanning" = "Lettura"; @@ -99,7 +99,7 @@ "Sensor failed" = "Sensore fallito"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Avvia sensore"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Perdita segnale \n"; diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index ac5c0d98d8..7d70254c3d 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -40,7 +40,7 @@ 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; 19D466A729AA2C22004D5F33 /* FPUConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */; }; 19D466AA29AA3099004D5F33 /* FPUConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */; }; - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */; }; + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* Charts.swift */; }; 19DA48E829CD339B00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48E929CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48EA29CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; @@ -568,7 +568,7 @@ 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigProvider.swift; sourceTree = ""; }; 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigStateModel.swift; sourceTree = ""; }; 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigRootView.swift; sourceTree = ""; }; - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TIRforChart.swift; sourceTree = ""; }; + 19D4E4EA29FC6A9F00351451 /* Charts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Charts.swift; sourceTree = ""; }; 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 19DC677E29CA675700FD9EC4 /* OverrideProfilesDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesDataFlow.swift; sourceTree = ""; }; 19DC678029CA676A00FD9EC4 /* OverrideProfilesProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesProvider.swift; sourceTree = ""; }; @@ -1655,7 +1655,7 @@ FE41E4D529463EE20047FD55 /* NightscoutPreferences.swift */, 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */, + 19D4E4EA29FC6A9F00351451 /* Charts.swift */, 19A910352A24D6D700C8951B /* DateFilter.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, @@ -2862,7 +2862,7 @@ 0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */, 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */, BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */, - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */, + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */, FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */, F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */, 3862CC1F273FDC9200BF832C /* CalibrationsChart.swift in Sources */, diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 6d3fcd8e66..79e1f22eef 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Fehler um"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Mahlzeitenübersicht"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Mahlzeit bearbeiten"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Mahlzeit hinzufügen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolusübersicht"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Berechnungen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Fette Mahlzeit"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Voller Bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fraktion"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Fettspeise Faktor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Ergebnis"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Dein eingegebener Wert wurde durch deine maximale Bolus-Einstellung von %d%@ begrenzt"; /* Home title */ "Home" = "Hauptseite"; @@ -348,43 +348,43 @@ Enact a temp Basal or a temp target */ "Remote control" = "Fernbedienung"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nBitte überprüfen Sie jetzt alle Ihre neuen Einstellungen gründlich:\n\n* Basaleinstellungen\n * Carb Ratios\n * Glukose-Ziele\n * Insulinempfindlichkeiten\n * DIA\n\n in iAPS-Einstellungen > Konfiguration.\n\nSchlechte oder ungültige Profileinstellungen können abscheuliche Effekte haben."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Dies wird einige oder alle deine aktuellen Pumpeneinstellungen ersetzen. Bist du sicher, dass du die Profileinstellungen von Nightscout importieren möchtest?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nUngültige Nightcsout Basal-Einstellungen. \n\nImport abgebrochen. Bitte überprüfen Sie Ihre Nightscout Profil Basal-Einstellungen!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nEinstellungen wurden importiert, aber die Basalen konnten nicht in Pumpe gespeichert werden (keine Pump). Überprüfen Sie Ihre Basiseinstellungen und tippen Sie auf Speichern auf Pump, um die neuen Basiseinstellungen zu synchronisieren"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Fehler beim Import"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Ja, importieren"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Einstellungen von Nightscout importieren"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Einstellungen importieren?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Einstellungen von Nightscout importieren"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Einstellungen importiert"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nFalsch übereinstimmende Glukoseeinheiten in Nightscout und Pump-Einstellungen. Import abgebrochen."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Kann das Standard-Nightscout-Profil nicht finden."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Blutzucker Einheit"; /* Add Medtronic pump */ "Add Medtronic" = "Medtronic-Pumpe hinzufügen"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisch"; /* External insulin treatments */ -"External" = "External"; +"External" = "Externe"; /* */ "Other" = "Sonstiges"; @@ -1134,7 +1134,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Nur Autotune Basalinsulin"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Als deine normalen Basalraten speichern"; /* */ "Save on Pump" = "Auf Pumpe speichern"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 3956fe1536..d71b6eba05 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Continua senza eseguire un bolo"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLa quantità è superiore all'impostazione del bolo massimo! \nSei sicuro di voler aggiungere?"; /* Header */ "Enact Bolus" = "Esegui bolo"; @@ -56,37 +56,37 @@ "Error at" = "Errore a"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Riepilogo Pasti"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Modifica pasto"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Aggiungi Pasto"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Riepilogo boli"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Calcolo in corso"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Pasto Grasso"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Bolo Completo"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Frazione"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Fattore Pasto Grasso"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Risultato"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Il tuo importo inserito è stato limitato dalla tua impostazione del Bolo massimo di %d%@"; /* Home title */ "Home" = "Home"; @@ -95,7 +95,7 @@ "looping" = "in loop"; /* min ago since last loop */ -"min ago" = "minuti fa"; +"min ago" = "min fa"; /* Status Title */ "No suggestion" = "Nessun suggerimento"; @@ -348,43 +348,43 @@ Enact a temp Basal or a temp target */ "Remote control" = "Controllo remoto"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nOra verifica attentamente tutte le nuove impostazioni:\n\n* Impostazioni basali\n * Rapporti carboidrati\n * Obiettivi glucosio\n * Sensibilità insulinica\n * DIA\n\n in Impostazioni iAPS > Configurazione.\n\nImpostazioni del profilo errate o non valide potrebbero avere effetti disastrosi."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Questo sostituirà alcune o tutte le impostazioni attuali del microinfusore. Sei sicuro di voler importare le impostazioni del profilo da Nightscout?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nImpostazioni Basali Nightscout non valide. \n\nImportazione annullata. Si prega di controllare le impostazioni Basali del profilo Nightscout!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nLe impostazioni sono state importate ma non è stato possibile salvare le basali nel microinfusore (nessun microinfusore). Controlla le impostazioni basali e tocca \"Salva sul microinfusore\" per sincronizzare le nuove impostazioni basali"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Errore d'importazione"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Sì, Importa"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importa impostazioni da Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Importa impostazioni?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importa da Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Impostazioni importate"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nUnità di glicemie non corrispondenti nelle impostazioni di Nightscout e della Pompa. Importa impostazioni interrotte."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Impossibile trovare il profilo predefinito di Nightscout."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Prova Glicemia"; /* Add Medtronic pump */ "Add Medtronic" = "Aggiungi microinfusore Medtronic"; @@ -477,19 +477,19 @@ Enact a temp Basal or a temp target */ "Pump" = "Microinfusore"; /* */ -"Watch" = "Watch"; +"Watch" = "Orologio"; /* */ -"Watch Configuration" = "Watch"; +"Watch Configuration" = "Orologio"; /* */ -"Apple Watch" = "Apple Watch"; +"Apple Watch" = "Orologio Apple"; /* */ -"Display on Watch" = "Mostra sul Watch"; +"Display on Watch" = "Mostra sull'orologio"; /* */ -"Garmin Watch" = "Garmin Watch"; +"Garmin Watch" = "Orologio Garmin"; /* */ "Add devices" = "Aggiungi dispositivi"; @@ -543,10 +543,10 @@ Enact a temp Basal or a temp target */ "History" = "Storia"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Carica"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Consenti caricamenti"; /* Type of CGM or glucose source */ "Type" = "Tipo"; @@ -594,16 +594,16 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Calibrazioni"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Crea eventi nel calendario"; /* */ "Calendar" = "Calendario"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatico"; /* External insulin treatments */ -"External" = "External"; +"External" = "Esterno"; /* */ "Other" = "Altro"; @@ -1041,7 +1041,7 @@ Enact a temp Basal or a temp target */ "Bolus failed" = "Bolo fallito"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Bolo massimo superato!"; /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolo fallito o impreciso. Controlla la cronologia del microinfusore prima di ripetere."; @@ -1071,7 +1071,7 @@ Enact a temp Basal or a temp target */ " day(s)" = " giorno/i"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Mostra FC su Watch"; +"Display HR on Watch" = "Mostra FC sull'orologio"; /* Headers for settings ----------------------- */ @@ -1128,13 +1128,13 @@ Enact a temp Basal or a temp target */ "Autosense" = "Autosensibilità"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Sensibilità Dinamica"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Solo Insulina Basale Autotune"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Salva come Tassi Basali Normali"; /* */ "Save on Pump" = "Salva sul microinfusore"; @@ -1183,13 +1183,13 @@ Enact a temp Basal or a temp target */ "Apple Health" = "Apple Salute"; /* */ -"Connect to Apple Health" = "Connetti con Apple Health"; +"Connect to Apple Health" = "Connetti con Apple Salute"; /* Show when have not permissions for writing to Health */ "For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Per scrivere dati su Apple Health devi dare il permesso in Impostazioni > Salute > Accesso dati"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Questo permette a iAPS di leggere e scrivere su Apple Salute. È necessario anche dare i permessi in Impostazioni > Salute > Accesso dati. Se immetti un valore di glucosio in Apple Salute apri iAPS per confermarlo."; /* New ALerts ------------------------- */ /* Info title */ @@ -1208,7 +1208,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Insulina Esterna"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Basale manuale temporanea"; @@ -1898,7 +1898,7 @@ Enact a temp Basal or a temp target */ "Max COB" = "Max COB"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Il valore predefinito di maxCOB è di 120. (Se qualcuno inserisce più carboidrati in una o più voci, iAPS limiterà il COB a maxCOB e lo manterrà a maxCOB fino a quando i carboidrati entrati sopra il maxCOB non avranno mostrato di essere assorbiti. Essenzialmente, questo limita solo UAM come un cappuccio di sicurezza contro calcoli COB strani a causa di dati fluidi.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Bolo posticipato - Divisore DIA"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index cb8f8bb17a..202d39c659 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Foutmelding op"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Maaltijd overzicht"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Wijzig maaltijd"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Maaltijd toevoegen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus overzicht"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Berekeningen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Vette maaltijd"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Volledige bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fractie"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Vette maaltijd factor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultaat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Je ingevoerde hoeveelheid is beperkt door je maximale bolusinstelling van %d%@"; /* Home title */ "Home" = "Hoofdmenu"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisch"; /* External insulin treatments */ -"External" = "External"; +"External" = "Extern"; /* */ "Other" = "Anders"; @@ -1208,7 +1208,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Externe insuline"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 24bc2dbfd0..ded4010971 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -71,7 +71,7 @@ "Calculations" = "Beräkningar"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fettrik måltid"; +"Fatty Meal" = "Fet mat"; /* For the Bolus View pop-up */ "Full Bolus" = "Total mängd"; diff --git a/FreeAPS/Sources/Models/Charts.swift b/FreeAPS/Sources/Models/Charts.swift new file mode 100644 index 0000000000..82896af45b --- /dev/null +++ b/FreeAPS/Sources/Models/Charts.swift @@ -0,0 +1,17 @@ + +import Foundation + +struct ShapeModel: Identifiable { + var type: String + var percent: Decimal + var id = UUID() +} + +struct ChartData: Identifiable { + var date: Date + var iob: Double + var zt: Double + var cob: Double + var uam: Double + var id = UUID() +} diff --git a/FreeAPS/Sources/Models/TIRforChart.swift b/FreeAPS/Sources/Models/TIRforChart.swift deleted file mode 100644 index bdbc13e384..0000000000 --- a/FreeAPS/Sources/Models/TIRforChart.swift +++ /dev/null @@ -1,8 +0,0 @@ - -import Foundation - -struct ShapeModel: Identifiable { - var type: String - var percent: Decimal - var id = UUID() -} diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 1ede5768a5..7decc6441a 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -140,16 +140,16 @@ extension AddCarbs { var addedString = "" if extracarbs > 0, filteredArray.isNotEmpty { - addedString += "Additional carbs: \(extracarbs) " + addedString += "Additional carbs: \(extracarbs) ," } else if extracarbs < 0 { addedString += "Removed carbs: \(extracarbs) " } if extraFat > 0, filteredArray.isNotEmpty { - addedString += "Additional fat: \(extraFat) " - } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) " } + addedString += "Additional fat: \(extraFat) ," + } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) ," } if extraProtein > 0, filteredArray.isNotEmpty { - addedString += "Additional protein: \(extraProtein) " - } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) " } + addedString += "Additional protein: \(extraProtein) ," + } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) ," } if addedString != "" { waitersNotepad.append(addedString) @@ -170,7 +170,7 @@ extension AddCarbs { func loadEntries(_ editMode: Bool) { if editMode { - coredataContext.perform { + coredataContext.performAndWait { var mealToEdit = [Meals]() let requestMeal = Meals.fetchRequest() as NSFetchRequest let sortMeal = NSSortDescriptor(key: "createdAt", ascending: false) @@ -188,15 +188,17 @@ extension AddCarbs { } func saveToCoreData(_ stored: [CarbsEntry]) { - let save = Meals(context: coredataContext) - save.createdAt = stored.first?.createdAt ?? .distantPast - save.id = stored.first?.collectionID ?? "" - save.carbs = Double(stored.first?.carbs ?? 0) - save.fat = Double(stored.first?.fat ?? 0) - save.protein = Double(stored.first?.protein ?? 0) - save.note = stored.first?.note ?? "" - if coredataContext.hasChanges { - try? coredataContext.save() + coredataContext.performAndWait { + let save = Meals(context: coredataContext) + if let entry = stored.first { + save.createdAt = Date.now + save.id = entry.collectionID ?? "" + save.carbs = Double(entry.carbs) + save.fat = Double(entry.fat ?? 0) + save.protein = Double(entry.protein ?? 0) + save.note = entry.note + try? coredataContext.save() + } } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index b05230b362..f432fd6cba 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -10,6 +10,7 @@ extension AddCarbs { @State var dish: String = "" @State var isPromptPresented = false @State var saved = false + @State var pushed = false @State private var showAlert = false @FocusState private var isFocused: Bool @@ -29,12 +30,12 @@ extension AddCarbs { var body: some View { Form { - if let carbsReq = state.carbsRequired { + if let carbsReq = state.carbsRequired, state.carbs < carbsReq { Section { HStack { Text("Carbs required") Spacer() - Text(formatter.string(from: carbsReq as NSNumber)! + " g") + Text((formatter.string(from: carbsReq as NSNumber) ?? "") + " g") } } } @@ -50,11 +51,55 @@ extension AddCarbs { cleanInput: true ) Text("grams").foregroundColor(.secondary) - }.padding(.vertical) + } if state.useFPUconversion { proteinAndFat() } + + // Summary when combining presets + if state.waitersNotepad() != "" { + HStack { + Text("Total") + let test = state.waitersNotepad().components(separatedBy: ", ").removeDublicates() + HStack(spacing: 0) { + ForEach(test, id: \.self) { + Text($0).foregroundStyle(Color.randomGreen()).font(.footnote) + Text($0 == test[test.count - 1] ? "" : ", ") + } + }.frame(maxWidth: .infinity, alignment: .trailing) + } + } + + // Time + HStack { + let now = Date.now + Text("Time") + Spacer() + if !pushed { + Button { + pushed = true + } label: { Text("Now") }.buttonStyle(.borderless).foregroundColor(.secondary).padding(.trailing, 5) + } else { + Button { state.date = state.date.addingTimeInterval(-10.minutes.timeInterval) } + label: { Image(systemName: "minus.circle") }.tint(.blue).buttonStyle(.borderless) + DatePicker( + "Time", + selection: $state.date, + in: ...now, + displayedComponents: [.hourAndMinute] + ).controlSize(.mini) + .labelsHidden() + Button { + if state.date.addingTimeInterval(5.minutes.timeInterval) < now { + state.date = state.date.addingTimeInterval(10.minutes.timeInterval) + } + } + label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) + } + } + + // Optional meal note HStack { Text("Note").foregroundColor(.secondary) TextField("", text: $state.note).multilineTextAlignment(.trailing) @@ -62,14 +107,11 @@ extension AddCarbs { Button { isFocused = false } label: { Image(systemName: "keyboard.chevron.compact.down") } .controlSize(.mini) } - }.focused($isFocused) - .popover(isPresented: $isPromptPresented) { - presetPopover - } - } - - Section { - mealPresets + } + .focused($isFocused) + .popover(isPresented: $isPromptPresented) { + presetPopover + } } Section { @@ -77,10 +119,11 @@ extension AddCarbs { label: { Text(state.skipBolus ? "Save" : "Continue") } .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) .frame(maxWidth: .infinity, alignment: .center) - } footer: { Text(state.waitersNotepad().description) } + }.listRowBackground(!empty ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) Section { - DatePicker("Date", selection: $state.date) + mealPresets } } .onAppear { @@ -93,7 +136,7 @@ extension AddCarbs { .navigationBarItems(leading: Button("Close", action: state.hideModal)) } - var presetPopover: some View { + private var presetPopover: some View { Form { Section { TextField("Name Of Dish", text: $dish) @@ -121,114 +164,125 @@ extension AddCarbs { } } - var notEmpty: Bool { - state.carbs > 0 || state.protein > 0 || state.fat > 0 + private var empty: Bool { + state.carbs <= 0 && state.fat <= 0 && state.protein <= 0 + } + + private var minusButton: some View { + Button { + if state.carbs != 0, + (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) + } else { state.carbs = 0 } + + if state.fat != 0, + (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) + } else { state.fat = 0 } + + if state.protein != 0, + (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) + } else { state.protein = 0 } + + state.removePresetFromNewMeal() + if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } + } + label: { Image(systemName: "minus.circle") } + .disabled( + state + .selection == nil || + ( + !state.summation + .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" + ) + ) + .buttonStyle(.borderless) + .tint(.blue) + } + + private var plusButton: some View { + Button { + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + + state.addPresetToNewMeal() + } + label: { Image(systemName: "plus.circle") } + .disabled(state.selection == nil) + .buttonStyle(.borderless) + .tint(.blue) } - var mealPresets: some View { + private var mealPresets: some View { Section { HStack { - Button { - isPromptPresented = true + if state.selection != nil { + minusButton } - label: { Text("Save as Preset") } - .buttonStyle(BorderlessButtonStyle()) - .disabled( - !notEmpty || - ( - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state - .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state - .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state - .protein - ) - ) - - Picker("Select a Preset", selection: $state.selection) { - Text("Presets").tag(nil as Presets?) + Picker("Preset", selection: $state.selection) { + Text("Saved Food").tag(nil as Presets?) ForEach(carbPresets, id: \.self) { (preset: Presets) in Text(preset.dish ?? "").tag(preset as Presets?) } } .labelsHidden() - .frame(maxWidth: .infinity, alignment: .trailing) + .frame(maxWidth: .infinity, alignment: .center) ._onBindingChange($state.selection) { _ in state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal state.addToSummation() } + if state.selection != nil { + plusButton + } } - if state.selection != nil { - HStack { - Button("Delete Preset") { - showAlert.toggle() - } - .disabled(state.selection == nil) - .tint(.orange) - .buttonStyle(BorderlessButtonStyle()) - .alert( - "Delete preset '\(state.selection?.dish ?? "")'?", - isPresented: $showAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.deletePreset() + HStack { + Button("Delete Preset") { + showAlert.toggle() + } + .disabled(state.selection == nil) + .tint(.orange) + .buttonStyle(.borderless) + .alert( + "Delete preset '\(state.selection?.dish ?? "")'?", + isPresented: $showAlert, + actions: { + Button("No", role: .cancel) {} + Button("Yes", role: .destructive) { + state.deletePreset() - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal - state.addPresetToNewMeal() - } + state.addPresetToNewMeal() } - ) - Button { - if state.carbs != 0, - (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) - } else { state.carbs = 0 } - - if state.fat != 0, - (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) - } else { state.fat = 0 } - - if state.protein != 0, - (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) - } else { state.protein = 0 } - - state.removePresetFromNewMeal() - if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } } - label: { Text("[ -1 ]") } - .disabled( - state - .selection == nil || - ( - !state.summation - .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" - ) - ) - .buttonStyle(BorderlessButtonStyle()) - .frame(maxWidth: .infinity, alignment: .trailing) - .tint(.minus) - Button { - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + ) - state.addPresetToNewMeal() - } - label: { Text("[ +1 ]") } - .disabled(state.selection == nil) - .buttonStyle(BorderlessButtonStyle()) - .tint(.blue) + Spacer() + + Button { + isPromptPresented = true } + label: { Text("Save as Preset") } + .buttonStyle(.borderless) + .disabled( + empty || + ( + (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state + .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state + .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state + .protein + ) + ) } } } @@ -262,3 +316,14 @@ extension AddCarbs { } } } + +public extension Color { + static func randomGreen(randomOpacity: Bool = false) -> Color { + Color( + red: .random(in: 0 ... 1), + green: .random(in: 0.4 ... 0.7), + blue: .random(in: 0.2 ... 1), + opacity: randomOpacity ? .random(in: 0.8 ... 1) : 1 + ) + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 26f7e4203e..cfcb8aae16 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,5 +1,3 @@ - -import CoreData import LoopKit import SwiftUI import Swinject @@ -14,8 +12,6 @@ extension Bolus { @Injected() var settings: SettingsManager! @Injected() var nsManager: NightscoutManager! - let coredataContext = CoreDataStack.shared.persistentContainer.viewContext - @Published var suggestion: Suggestion? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 24ad7ca0f9..6bb5b0015b 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import Charts import CoreData import SwiftUI import Swinject @@ -56,25 +57,19 @@ extension Bolus { var body: some View { Form { + Section { + chart() + } header: { + Text("Predictions") + } + + Section {} if fetch { Section { mealEntries } header: { Text("Meal Summary") } } - Section { - Button { - let id_ = meal.first?.id ?? "" - if fetch { - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) - } else { - state.showModal(for: .addCarbs(editMode: false)) - } - } - label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } header: { Text(!fetch ? "Meal Summary" : "") } - Section { HStack { Button(action: { @@ -142,7 +137,7 @@ extension Bolus { } } } - } header: { Text("Bolus Summary") } + } header: { Text("Bolus") } if state.amount > 0 { Section { @@ -172,7 +167,12 @@ extension Bolus { .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems( - leading: Button { state.hideModal() } + leading: Button { + carbssView() + } + label: { Text(fetch ? "Back" : "Meal") }, + + trailing: Button { state.hideModal() } label: { Text("Close") } ) .onAppear { @@ -194,6 +194,83 @@ extension Bolus { } } + func chart() -> some View { + // Data Source + let iob = state.provider.suggestion?.predictions?.iob ?? [Int]() + let cob = state.provider.suggestion?.predictions?.cob ?? [Int]() + let uam = state.provider.suggestion?.predictions?.uam ?? [Int]() + let zt = state.provider.suggestion?.predictions?.zt ?? [Int]() + let count = max(iob.count, cob.count, uam.count, zt.count) + var now = Date.now + var startIndex = 0 + let conversion = state.units == .mmolL ? 0.0555 : 1 + // Organize the data needed for prediction chart. + var data = [ChartData]() + repeat { + now = now.addingTimeInterval(5.minutes.timeInterval) + if startIndex < count { + let addedData = ChartData( + date: now, + iob: startIndex < iob.count ? Double(iob[startIndex]) * conversion : 0, + zt: startIndex < zt.count ? Double(zt[startIndex]) * conversion : 0, + cob: startIndex < cob.count ? Double(cob[startIndex]) * conversion : 0, + uam: startIndex < uam.count ? Double(uam[startIndex]) * conversion : 0, + id: UUID() + ) + data.append(addedData) + } + startIndex += 1 + } while startIndex < count + // Chart + return Chart(data) { item in + // Remove 0 (empty) values + if item.iob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("IOB", item.iob), + series: .value("IOB", "A") + ) + .foregroundStyle(Color(.insulin)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.uam != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("UAM", item.uam), + series: .value("UAM", "B") + ) + .foregroundStyle(Color(.UAM)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.cob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("COB", item.cob), + series: .value("COB", "C") + ) + .foregroundStyle(Color(.loopYellow)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.zt != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("ZT", item.zt), + series: .value("ZT", "D") + ) + .foregroundStyle(Color(.ZT)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + } + .frame(minHeight: 150) + .chartForegroundStyleScale([ + "IOB": Color(.insulin), + "UAM": Color(.UAM), + "COB": Color(.loopYellow), + "ZT": Color(.ZT) + ]) + .chartYAxisLabel("Glucose (" + state.units.rawValue + ")") + } + // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { @@ -265,6 +342,16 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } + func carbssView() { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + var mealEntries: some View { VStack { if let carbs = meal.first?.carbs, carbs > 0 { diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 00e7bd7aa6..a075c1341d 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import CoreData import SwiftUI import Swinject @@ -37,55 +38,10 @@ extension Bolus { Form { if fetch { Section { - VStack { - if let carbs = meal.first?.carbs, carbs > 0 { - HStack { - Text("Carbs") - Spacer() - Text(carbs.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let fat = meal.first?.fat, fat > 0 { - HStack { - Text("Fat") - Spacer() - Text(fat.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let protein = meal.first?.protein, protein > 0 { - HStack { - Text("Protein") - Spacer() - Text(protein.formatted()) - Text("g") - }.foregroundColor(.secondary) - } - if let note = meal.first?.note, note != "" { - HStack { - Text("Note") - Spacer() - Text(note) - }.foregroundColor(.secondary) - } - } + mealEntries } header: { Text("Meal Summary") } } - Section { - Button { - let id_ = meal.first?.id ?? "" - if fetch { - keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) - } else { - state.showModal(for: .addCarbs(editMode: false)) - } - } - label: { Text(fetch ? "Edit Meal" : "Add Meal") }.frame(maxWidth: .infinity, alignment: .center) - } header: { Text(!fetch ? "Meal Summary" : "") } - Section { if state.waitForSuggestion { HStack { @@ -129,8 +85,7 @@ extension Bolus { Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } } - } - header: { Text("Bolus Summary") } + } header: { Text("Bolus") } if !state.waitForSuggestion { if state.amount > 0 { @@ -146,14 +101,14 @@ extension Bolus { ) } } - if state.amount <= 0 { - Section { - Button { - keepForNextWiew = true - state.showModal(for: nil) - } - label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) + } + if state.amount <= 0 { + Section { + Button { + keepForNextWiew = true + state.showModal(for: nil) } + label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } } @@ -187,7 +142,15 @@ extension Bolus { .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems( + leading: Button { + carbssView() + } + label: { Text(fetch ? "Back" : "Meal") }, + + trailing: Button { state.hideModal() } + label: { Text("Close") } + ) .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) { bolusInfo } @@ -201,6 +164,52 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } + func carbssView() { + let id_ = meal.first?.id ?? "" + if fetch { + keepForNextWiew = true + state.backToCarbsView(complexEntry: fetch, id_) + } else { + state.showModal(for: .addCarbs(editMode: false)) + } + } + + var mealEntries: some View { + VStack { + if let carbs = meal.first?.carbs, carbs > 0 { + HStack { + Text("Carbs") + Spacer() + Text(carbs.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let fat = meal.first?.fat, fat > 0 { + HStack { + Text("Fat") + Spacer() + Text(fat.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let protein = meal.first?.protein, protein > 0 { + HStack { + Text("Protein") + Spacer() + Text(protein.formatted()) + Text("g") + }.foregroundColor(.secondary) + } + if let note = meal.first?.note, note != "" { + HStack { + Text("Note") + Spacer() + Text(note) + }.foregroundColor(.secondary) + } + } + } + var bolusInfo: some View { VStack { // Variables diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index 56a934c3a8..6a2cd08b9f 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -62,7 +62,7 @@ extension StatConfig { } header: { Text("Add Meal View settings ") } } .onAppear(perform: configureView) - .navigationBarTitle("UI/UX Settings") + .navigationBarTitle("UI/UX") .navigationBarTitleDisplayMode(.automatic) } } From ec02ba749d4939d21434f5f76088c9dc0acd5c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 14:39:26 +0100 Subject: [PATCH 190/405] Add Predictions to both bolus views. Prevent force unwrapping of nil values. --- FreeAPS.xcodeproj/project.pbxproj | 4 + .../Modules/Bolus/BolusStateModel.swift | 7 ++ .../View/AlternativeBolusCalcRootView.swift | 81 ++--------------- .../Bolus/View/DefaultBolusCalcRootView.swift | 15 ++++ .../Modules/Bolus/View/Predictions.swift | 90 +++++++++++++++++++ 5 files changed, 122 insertions(+), 75 deletions(-) create mode 100644 FreeAPS/Sources/Modules/Bolus/View/Predictions.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 7d70254c3d..ebd4e222d9 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 190EBCC829FF13AA00BA767D /* StatConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCC729FF13AA00BA767D /* StatConfigStateModel.swift */; }; 190EBCCB29FF13CB00BA767D /* StatConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */; }; 191F62682AD6B05A004D7911 /* NightscoutSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */; }; + 19229B962AFBB84800CD91CA /* Predictions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19229B952AFBB84800CD91CA /* Predictions.swift */; }; 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; }; 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; }; 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193F6CDC2A512C8F001240FD /* Loops.swift */; }; @@ -508,6 +509,7 @@ 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatConfigRootView.swift; sourceTree = ""; }; 1918333A26ADA46800F45722 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutSettings.swift; sourceTree = ""; }; + 19229B952AFBB84800CD91CA /* Predictions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Predictions.swift; sourceTree = ""; }; 1927C8E92744611700347C69 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EA2744611800347C69 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EB2744611900347C69 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; @@ -2084,6 +2086,7 @@ 10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */, BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */, BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */, + 19229B952AFBB84800CD91CA /* Predictions.swift */, ); path = View; sourceTree = ""; @@ -2830,6 +2833,7 @@ 1967DFBE29D052C200759F30 /* Icons.swift in Sources */, 38E8754F275556FA00975559 /* WatchManager.swift in Sources */, A228DF96647338139F152B15 /* PreferencesEditorDataFlow.swift in Sources */, + 19229B962AFBB84800CD91CA /* Predictions.swift in Sources */, 389ECE052601144100D86C4F /* ConcurrentMap.swift in Sources */, CE7CA3562A064973004BE681 /* StateIntentRequest.swift in Sources */, E4984C5262A90469788754BB /* PreferencesEditorProvider.swift in Sources */, diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index cfcb8aae16..5d47b58dc2 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -13,6 +13,7 @@ extension Bolus { @Injected() var nsManager: NightscoutManager! @Published var suggestion: Suggestion? + @Published var predictions: Predictions? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 @Published var insulinRequired: Decimal = 0 @@ -89,6 +90,12 @@ extension Bolus { } }.store(in: &lifetime) } + if let notNilSugguestion = provider.suggestion { + suggestion = notNilSugguestion + if let notNilPredictions = suggestion?.predictions { + predictions = notNilPredictions + } + } } func getDeltaBG() { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 6bb5b0015b..96496289ef 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -58,7 +58,7 @@ extension Bolus { var body: some View { Form { Section { - chart() + predictionChart } header: { Text("Predictions") } @@ -194,81 +194,12 @@ extension Bolus { } } - func chart() -> some View { - // Data Source - let iob = state.provider.suggestion?.predictions?.iob ?? [Int]() - let cob = state.provider.suggestion?.predictions?.cob ?? [Int]() - let uam = state.provider.suggestion?.predictions?.uam ?? [Int]() - let zt = state.provider.suggestion?.predictions?.zt ?? [Int]() - let count = max(iob.count, cob.count, uam.count, zt.count) - var now = Date.now - var startIndex = 0 - let conversion = state.units == .mmolL ? 0.0555 : 1 - // Organize the data needed for prediction chart. - var data = [ChartData]() - repeat { - now = now.addingTimeInterval(5.minutes.timeInterval) - if startIndex < count { - let addedData = ChartData( - date: now, - iob: startIndex < iob.count ? Double(iob[startIndex]) * conversion : 0, - zt: startIndex < zt.count ? Double(zt[startIndex]) * conversion : 0, - cob: startIndex < cob.count ? Double(cob[startIndex]) * conversion : 0, - uam: startIndex < uam.count ? Double(uam[startIndex]) * conversion : 0, - id: UUID() - ) - data.append(addedData) - } - startIndex += 1 - } while startIndex < count - // Chart - return Chart(data) { item in - // Remove 0 (empty) values - if item.iob != 0 { - LineMark( - x: .value("Time", item.date), - y: .value("IOB", item.iob), - series: .value("IOB", "A") - ) - .foregroundStyle(Color(.insulin)) - .lineStyle(StrokeStyle(lineWidth: 2)) - } - if item.uam != 0 { - LineMark( - x: .value("Time", item.date), - y: .value("UAM", item.uam), - series: .value("UAM", "B") - ) - .foregroundStyle(Color(.UAM)) - .lineStyle(StrokeStyle(lineWidth: 2)) - } - if item.cob != 0 { - LineMark( - x: .value("Time", item.date), - y: .value("COB", item.cob), - series: .value("COB", "C") - ) - .foregroundStyle(Color(.loopYellow)) - .lineStyle(StrokeStyle(lineWidth: 2)) - } - if item.zt != 0 { - LineMark( - x: .value("Time", item.date), - y: .value("ZT", item.zt), - series: .value("ZT", "D") - ) - .foregroundStyle(Color(.ZT)) - .lineStyle(StrokeStyle(lineWidth: 2)) - } + var predictionChart: some View { + ZStack { + PredictionView( + predictions: $state.predictions, units: $state.units + ) } - .frame(minHeight: 150) - .chartForegroundStyleScale([ - "IOB": Color(.insulin), - "UAM": Color(.UAM), - "COB": Color(.loopYellow), - "ZT": Color(.ZT) - ]) - .chartYAxisLabel("Glucose (" + state.units.rawValue + ")") } // Pop-up diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index a075c1341d..e7ee6ae988 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import Charts import CoreData import SwiftUI import Swinject @@ -36,6 +37,12 @@ extension Bolus { var body: some View { Form { + Section { + predictionChart + } header: { + Text("Predictions") + } + if fetch { Section { mealEntries @@ -156,6 +163,14 @@ extension Bolus { } } + var predictionChart: some View { + ZStack { + PredictionView( + predictions: $state.predictions, units: $state.units + ) + } + } + var changed: Bool { ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift new file mode 100644 index 0000000000..de3198ceda --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -0,0 +1,90 @@ +import Charts +import CoreData +import SwiftUI +import Swinject + +struct PredictionView: View { + @Binding var predictions: Predictions? + @Binding var units: GlucoseUnits + + var body: some View { + chart() + } + + func chart() -> some View { + // Data Source + let iob = predictions?.iob ?? [Int]() + let cob = predictions?.cob ?? [Int]() + let uam = predictions?.uam ?? [Int]() + let zt = predictions?.zt ?? [Int]() + let count = max(iob.count, cob.count, uam.count, zt.count) + var now = Date.now + var startIndex = 0 + let conversion = units == .mmolL ? 0.0555 : 1 + // Organize the data needed for prediction chart. + var data = [ChartData]() + repeat { + now = now.addingTimeInterval(5.minutes.timeInterval) + if startIndex < count { + let addedData = ChartData( + date: now, + iob: startIndex < iob.count ? Double(iob[startIndex]) * conversion : 0, + zt: startIndex < zt.count ? Double(zt[startIndex]) * conversion : 0, + cob: startIndex < cob.count ? Double(cob[startIndex]) * conversion : 0, + uam: startIndex < uam.count ? Double(uam[startIndex]) * conversion : 0, + id: UUID() + ) + data.append(addedData) + } + startIndex += 1 + } while startIndex < count + // Chart + return Chart(data) { item in + // Remove 0 (empty) values + if item.iob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("IOB", item.iob), + series: .value("IOB", "A") + ) + .foregroundStyle(Color(.insulin)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.uam != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("UAM", item.uam), + series: .value("UAM", "B") + ) + .foregroundStyle(Color(.UAM)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.cob != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("COB", item.cob), + series: .value("COB", "C") + ) + .foregroundStyle(Color(.loopYellow)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + if item.zt != 0 { + LineMark( + x: .value("Time", item.date), + y: .value("ZT", item.zt), + series: .value("ZT", "D") + ) + .foregroundStyle(Color(.ZT)) + .lineStyle(StrokeStyle(lineWidth: 2)) + } + } + .frame(minHeight: 150) + .chartForegroundStyleScale([ + "IOB": Color(.insulin), + "UAM": Color(.UAM), + "COB": Color(.loopYellow), + "ZT": Color(.ZT) + ]) + .chartYAxisLabel("Glucose (" + units.rawValue + ")") + } +} From c6689d5ec3498fa81c5f58aafe5f42a695d109ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 14:53:27 +0100 Subject: [PATCH 191/405] Save the standing or lying Chart setting. --- FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 269fe8db6f..398f611e6d 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -24,6 +24,7 @@ extension StatConfig { subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } + subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } subscribeSetting(\.low, on: $low, initial: { let value = max(min($0, 90), 40) From 0d3dde37307b5cc7396fd2ee7d3da9dc1d9bed01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 14:53:27 +0100 Subject: [PATCH 192/405] Save the standing or lying Chart setting. --- FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 269fe8db6f..398f611e6d 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -24,6 +24,7 @@ extension StatConfig { subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } + subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } subscribeSetting(\.low, on: $low, initial: { let value = max(min($0, 90), 40) From a96d22002673ba129c91901850a2f7ee3d4aa2d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 17:18:39 +0100 Subject: [PATCH 193/405] Add Eventual Glucose --- .../Modules/Bolus/BolusStateModel.swift | 1 - .../View/AlternativeBolusCalcRootView.swift | 2 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 2 +- .../Modules/Bolus/View/Predictions.swift | 32 +++++++++++-------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 5d47b58dc2..46c47c72af 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -57,7 +57,6 @@ extension Bolus { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var useFattyMealCorrectionFactor: Bool = false - @Published var eventualBG: Int = 0 @Published var meal: [CarbsEntry]? @Published var carbs: Decimal = 0 diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 96496289ef..406e00dd98 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -197,7 +197,7 @@ extension Bolus { var predictionChart: some View { ZStack { PredictionView( - predictions: $state.predictions, units: $state.units + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target ) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index e7ee6ae988..d781527335 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -166,7 +166,7 @@ extension Bolus { var predictionChart: some View { ZStack { PredictionView( - predictions: $state.predictions, units: $state.units + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target ) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index de3198ceda..ea5c6e50c5 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -6,6 +6,8 @@ import Swinject struct PredictionView: View { @Binding var predictions: Predictions? @Binding var units: GlucoseUnits + @Binding var eventualBG: Int + @Binding var target: Decimal var body: some View { chart() @@ -21,6 +23,8 @@ struct PredictionView: View { var now = Date.now var startIndex = 0 let conversion = units == .mmolL ? 0.0555 : 1 + let eventualRounded: String = (Double(eventualBG) * conversion) + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(units == .mmolL ? 1 : 0))) // Organize the data needed for prediction chart. var data = [ChartData]() repeat { @@ -39,39 +43,39 @@ struct PredictionView: View { startIndex += 1 } while startIndex < count // Chart - return Chart(data) { item in + return Chart(data) { // Remove 0 (empty) values - if item.iob != 0 { + if $0.iob != 0 { LineMark( - x: .value("Time", item.date), - y: .value("IOB", item.iob), + x: .value("Time", $0.date), + y: .value("IOB", $0.iob), series: .value("IOB", "A") ) .foregroundStyle(Color(.insulin)) .lineStyle(StrokeStyle(lineWidth: 2)) } - if item.uam != 0 { + if $0.uam != 0 { LineMark( - x: .value("Time", item.date), - y: .value("UAM", item.uam), + x: .value("Time", $0.date), + y: .value("UAM", $0.uam), series: .value("UAM", "B") ) .foregroundStyle(Color(.UAM)) .lineStyle(StrokeStyle(lineWidth: 2)) } - if item.cob != 0 { + if $0.cob != 0 { LineMark( - x: .value("Time", item.date), - y: .value("COB", item.cob), + x: .value("Time", $0.date), + y: .value("COB", $0.cob), series: .value("COB", "C") ) .foregroundStyle(Color(.loopYellow)) .lineStyle(StrokeStyle(lineWidth: 2)) } - if item.zt != 0 { + if $0.zt != 0 { LineMark( - x: .value("Time", item.date), - y: .value("ZT", item.zt), + x: .value("Time", $0.date), + y: .value("ZT", $0.zt), series: .value("ZT", "D") ) .foregroundStyle(Color(.ZT)) @@ -85,6 +89,6 @@ struct PredictionView: View { "COB": Color(.loopYellow), "ZT": Color(.ZT) ]) - .chartYAxisLabel("Glucose (" + units.rawValue + ")") + .chartYAxisLabel("Eventual Glucose: " + eventualRounded + " " + units.rawValue, alignment: .center) } } From 020290aef171c8c6ac9b7c84e53ea1595fc78689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 19:00:55 +0100 Subject: [PATCH 194/405] Use same buttons in both bolus views --- .../Bolus/View/AlternativeBolusCalcRootView.swift | 11 +++++++---- .../Modules/Bolus/View/DefaultBolusCalcRootView.swift | 10 +++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 406e00dd98..4dda694c4d 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -147,10 +147,9 @@ extension Bolus { } label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } .frame(maxWidth: .infinity, alignment: .center) - .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) + .disabled(disabled) + .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) } } if state.amount <= 0 { @@ -265,6 +264,10 @@ extension Bolus { ) } + private var disabled: Bool { + state.amount <= 0 || state.amount > state.maxBolus + } + var changed: Bool { ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index d781527335..51420b05f4 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -103,9 +103,9 @@ extension Bolus { } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) + .disabled(disabled) + .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) } } } @@ -163,6 +163,10 @@ extension Bolus { } } + var disabled: Bool { + state.amount <= 0 || state.amount > state.maxBolus + } + var predictionChart: some View { ZStack { PredictionView( From c388dbd0a33f3442db19c945b3b2640a040c455b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 23:05:59 +0100 Subject: [PATCH 195/405] Display Eventual Gluose better Wait for new suggestion --- .../View/AlternativeBolusCalcRootView.swift | 6 ++++- .../Bolus/View/DefaultBolusCalcRootView.swift | 6 ++++- .../Modules/Bolus/View/Predictions.swift | 24 +++++++++++++++---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 4dda694c4d..d436c51748 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -58,7 +58,11 @@ extension Bolus { var body: some View { Form { Section { - predictionChart + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } } header: { Text("Predictions") } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 51420b05f4..df94423cd1 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -38,7 +38,11 @@ extension Bolus { var body: some View { Form { Section { - predictionChart + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } } header: { Text("Predictions") } diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index ea5c6e50c5..f2e639fbe5 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -10,7 +10,20 @@ struct PredictionView: View { @Binding var target: Decimal var body: some View { - chart() + VStack { + chart() + HStack { + let conversion = units == .mmolL ? 0.0555 : 1 + Text("Eventual Glucose") + Spacer() + Text( + (Double(eventualBG) * conversion) + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(units == .mmolL ? 1 : 0))) + ) + Text(units.rawValue).foregroundStyle(.secondary) + Divider() + }.font(.callout) + } } func chart() -> some View { @@ -23,8 +36,6 @@ struct PredictionView: View { var now = Date.now var startIndex = 0 let conversion = units == .mmolL ? 0.0555 : 1 - let eventualRounded: String = (Double(eventualBG) * conversion) - .formatted(.number.grouping(.never).rounded().precision(.fractionLength(units == .mmolL ? 1 : 0))) // Organize the data needed for prediction chart. var data = [ChartData]() repeat { @@ -89,6 +100,11 @@ struct PredictionView: View { "COB": Color(.loopYellow), "ZT": Color(.ZT) ]) - .chartYAxisLabel("Eventual Glucose: " + eventualRounded + " " + units.rawValue, alignment: .center) + .chartYAxisLabel("Glucose, " + units.rawValue, alignment: .center) + .chartXAxis { + AxisMarks(values: .stride(by: .hour)) { _ in + AxisValueLabel(format: .dateTime.hour()) + } + } } } From 5402f2e681a6f255b6e30756819b98c2686ed092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 23:17:34 +0100 Subject: [PATCH 196/405] Revert axis change --- FreeAPS/Sources/Modules/Bolus/View/Predictions.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index f2e639fbe5..a0ca2c0616 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -101,10 +101,5 @@ struct PredictionView: View { "ZT": Color(.ZT) ]) .chartYAxisLabel("Glucose, " + units.rawValue, alignment: .center) - .chartXAxis { - AxisMarks(values: .stride(by: .hour)) { _ in - AxisValueLabel(format: .dateTime.hour()) - } - } } } From f4fd2f53a567aac6386aa2b3c1d41ed7fb51cf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 23:39:16 +0100 Subject: [PATCH 197/405] Config --- .../Bolus/View/AlternativeBolusCalcRootView.swift | 4 +--- .../Bolus/View/DefaultBolusCalcRootView.swift | 4 +--- .../Sources/Modules/Bolus/View/Predictions.swift | 15 ++++++++++----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index d436c51748..b60a9fc350 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -63,9 +63,7 @@ extension Bolus { } else { predictionChart } - } header: { - Text("Predictions") - } + } header: { Text("Predictions") } Section {} if fetch { diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index df94423cd1..166755aaa4 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -43,9 +43,7 @@ extension Bolus { } else { predictionChart } - } header: { - Text("Predictions") - } + } header: { Text("Predictions") } if fetch { Section { diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index a0ca2c0616..fa753d54de 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -9,6 +9,11 @@ struct PredictionView: View { @Binding var eventualBG: Int @Binding var target: Decimal + private enum Config { + static let height: CGFloat = 160 + static let lineWidth: CGFloat = 2 + } + var body: some View { VStack { chart() @@ -63,7 +68,7 @@ struct PredictionView: View { series: .value("IOB", "A") ) .foregroundStyle(Color(.insulin)) - .lineStyle(StrokeStyle(lineWidth: 2)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) } if $0.uam != 0 { LineMark( @@ -72,7 +77,7 @@ struct PredictionView: View { series: .value("UAM", "B") ) .foregroundStyle(Color(.UAM)) - .lineStyle(StrokeStyle(lineWidth: 2)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) } if $0.cob != 0 { LineMark( @@ -81,7 +86,7 @@ struct PredictionView: View { series: .value("COB", "C") ) .foregroundStyle(Color(.loopYellow)) - .lineStyle(StrokeStyle(lineWidth: 2)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) } if $0.zt != 0 { LineMark( @@ -90,10 +95,10 @@ struct PredictionView: View { series: .value("ZT", "D") ) .foregroundStyle(Color(.ZT)) - .lineStyle(StrokeStyle(lineWidth: 2)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) } } - .frame(minHeight: 150) + .frame(minHeight: Config.height) .chartForegroundStyleScale([ "IOB": Color(.insulin), "UAM": Color(.UAM), From 080d8aff9f83e4f8653efe18e1b3455cf921dbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 23:46:23 +0100 Subject: [PATCH 198/405] New strings --- .../Localizations/Main/en.lproj/Localizable.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index aa9173ed6f..cfdc0f36ec 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -121,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1400,6 +1403,15 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %$" = "Glucose, %$"; + + + + + /* */ "Target Glucose" = "Target Glucose"; From e9d940893edc8269214dbd568e116007a4d2ad82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 8 Nov 2023 23:51:47 +0100 Subject: [PATCH 199/405] Update version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 2d57d6bd6a..53495d2b4d 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.7 +APP_VERSION = 2.2.8 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 3da8847d0d56d49445994389e153d0988162d211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 00:12:45 +0100 Subject: [PATCH 200/405] Typo --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index cfdc0f36ec..6bcf9b5241 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1406,11 +1406,7 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %$" = "Glucose, %$"; - - - - +"Glucose, %@" = "Glucose, %%"; /* */ "Target Glucose" = "Target Glucose"; From 73e71084ba5a66119cfa7bb12b667fe789761b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 00:17:37 +0100 Subject: [PATCH 201/405] Typo --- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 6bcf9b5241..91f2bf9026 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1406,7 +1406,7 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %%"; +"Glucose, %@" = "Glucose, %@"; /* */ "Target Glucose" = "Target Glucose"; From 5cbf9bc3aa2a59ff9976d69aac85a7620610d160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 9 Nov 2023 00:36:12 +0100 Subject: [PATCH 202/405] Crowdin updates (#307) --- .../CGMBLEKitUI/de.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 2 +- .../G7SensorKit/de.lproj/Localizable.strings | 6 +-- .../Main/ar.lproj/Localizable.strings | 11 ++++++ .../Main/da.lproj/Localizable.strings | 11 ++++++ .../Main/de.lproj/Localizable.strings | 11 ++++++ .../Main/es.lproj/Localizable.strings | 11 ++++++ .../Main/fi.lproj/Localizable.strings | 11 ++++++ .../Main/fr.lproj/Localizable.strings | 11 ++++++ .../Main/he.lproj/Localizable.strings | 11 ++++++ .../Main/it.lproj/Localizable.strings | 17 +++++++-- .../Main/nb.lproj/Localizable.strings | 35 ++++++++++++------ .../Main/nl.lproj/Localizable.strings | 11 ++++++ .../Main/pl.lproj/Localizable.strings | 11 ++++++ .../Main/pt-BR.lproj/Localizable.strings | 11 ++++++ .../Main/pt-PT.lproj/Localizable.strings | 11 ++++++ .../Main/ru.lproj/Localizable.strings | 37 ++++++++++++------- .../Main/sk.lproj/Localizable.strings | 11 ++++++ .../Main/sv.lproj/Localizable.strings | 11 ++++++ .../Main/tr.lproj/Localizable.strings | 11 ++++++ .../Main/uk.lproj/Localizable.strings | 11 ++++++ .../Main/zh-Hans.lproj/Localizable.strings | 11 ++++++ 22 files changed, 242 insertions(+), 33 deletions(-) diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings index d3217ad239..99cf84b4de 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings @@ -39,7 +39,7 @@ Title text for the button to remove a CGM from Loop */ "Remote Data Synchronization" = "Remote Daten Synchronisation"; /* Title describing sensor expiration */ -"Sensor Expires" = "Sensor-Ablaufzeitpunkt"; +"Sensor Expires" = "Sensor läuft ab"; /* Title describing past sensor expiration */ "Sensor Expired" = "Sensor abgelaufen"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index 5ca3fcc5ee..e9ae6ef1bf 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Letzte Messung"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten vom G7 direkt lesen. Zum Verbinden, Kalibrieren und weiteres Sensor Management braucht man die G7 App."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertem Sensor Management benötigt man die G7 App."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NIEDRIG"; diff --git a/Dependencies/G7SensorKit/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/de.lproj/Localizable.strings index 16733d4cb7..ac6fad5f77 100644 --- a/Dependencies/G7SensorKit/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/de.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten vom G7 direkt lesen. Zum Verbinden, Kalibrieren und weiteres Sensor Management braucht man die G7 App."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertes Sensor Management benötigt man die G7 App."; /* Button title for starting setup */ "Continue" = "Fortsetzen"; @@ -11,7 +11,7 @@ "Cancel" = "Abbrechen"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Blutzuckerwerte sind nicht verfügbar"; +"Glucose data is unavailable" = "Glukosewerte sind nicht verfügbar"; /* The description of sensor algorithm state when sensor is ok. */ "Sensor is OK" = "Sensor ist OK"; @@ -70,7 +70,7 @@ "Configuration" = "Konfiguration"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload von Messwerten"; +"Upload Readings" = "Werte hochladen"; /* Button */ "Scan for new sensor" = "Nach neuem Sensor suchen"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 2a918bab32..a4c97a7024 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 21cff8d8b4..b576f23860 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Fortsæt"; + /* Home title */ "Home" = "Hjem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Krævede kulhydrater"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Er du sikker?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventuelt Glukoseniveau"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 79e1f22eef..7a0d7e035c 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Dein eingegebener Wert wurde durch deine maximale Bolus-Einstellung von %d%@ begrenzt"; +/* Bolus View Continue Button */ +"Continue" = "Fortsetzen"; + /* Home title */ "Home" = "Hauptseite"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Kohlenhydrate erforderlich"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Sind Sie sicher?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Prognostizierte Glukose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Ziel Glukose"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 369c7e2604..d292a9ee5b 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuar"; + /* Home title */ "Home" = "Inicio"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Se requieren carbohidratos"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "¿Estás seguro?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 19596ed75f..36459d38bf 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Jatka"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index edfd6baa11..a018281585 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuer"; + /* Home title */ "Home" = "Page d'accueil"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Glucides requis"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Êtes-vous sûr ?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 2a918bab32..a4c97a7024 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index d71b6eba05..11070d45ee 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Il tuo importo inserito è stato limitato dalla tua impostazione del Bolo massimo di %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continua"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carboidrati necessari"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Sei sicuro?"; @@ -1029,7 +1035,7 @@ Enact a temp Basal or a temp target */ "Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; /* Glucose badge */ -"Show glucose on the app badge" = "Mostra il glicemie sul badge dell'app"; +"Show glucose on the app badge" = "Mostra le glicemie sul badge dell'app"; /* */ "Backfill glucose" = "Riempi glicemia"; @@ -1134,7 +1140,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Solo Insulina Basale Autotune"; /* */ -"Save as your Normal Basal Rates" = "Salva come Tassi Basali Normali"; +"Save as your Normal Basal Rates" = "Salva come Profilo Basale Normale"; /* */ "Save on Pump" = "Salva sul microinfusore"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "previsione glicemica"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glicemia"; @@ -1556,7 +1567,7 @@ Enact a temp Basal or a temp target */ "Total Delivery" = "Totale Consegnata"; /* */ -"Add Omnipod Dash" = "Agg Omnipod Dash"; +"Add Omnipod Dash" = "Aggiungi Omnipod Dash"; /* */ "Insert Cannula" = "Inserisci cannula"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index e1e2c6e8b9..a37a1a1bbe 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -56,37 +56,40 @@ "Error at" = "Feil kl."; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Oppsummering av måltid"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Endre måltid"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Legg til måltid"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus-sammendrag"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Beregninger"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Fett måltid"; /* For the Bolus View pop-up */ "Full Bolus" = "Full Bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Brøkdel"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Brøkdel for fett måltid"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Mengden du la inn ble begrenset av innstillingen for Maks Bolus på %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Fortsett"; /* Home title */ "Home" = "Hjem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Karbo nødvendig"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Er du sikker?"; @@ -603,7 +609,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisk"; /* External insulin treatments */ -"External" = "External"; +"External" = "Ekstern"; /* */ "Other" = "Annet"; @@ -1208,7 +1214,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Eksternt insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell basal"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Beregnet blodsukker"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Blodsukkermål"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 202d39c659..e343bd77a2 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Je ingevoerde hoeveelheid is beperkt door je maximale bolusinstelling van %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Vervolg"; + /* Home title */ "Home" = "Hoofdmenu"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Koolhydraten benodigd"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Weet je het zeker?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Voorspelde glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Doel glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 576a542c36..7199dadbbc 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Kontynuuj"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Czy jesteś pewien?"; @@ -1398,6 +1404,11 @@ Połączono z Nightscout!"; /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index d91200004c..95ee3eb092 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuar"; + /* Home title */ "Home" = "Tela inicial"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbos necessários"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Tem certeza?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 78e5d78110..10a944286b 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Tela inicial"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbos necessários"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Tem certeza?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 73483ee460..e73c85b37d 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -56,37 +56,40 @@ "Error at" = "Ошибка в"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Итог питания"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Изменить еду"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Добавить еду"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Болюс суммарно"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Вычисления"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Жирная пища"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Полный болюс"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Доля"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Фактор жирной пищи"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Итого"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Доза была ограничена Вашей настройкой максимального болюса в размере %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Продолжить"; /* Home title */ "Home" = "Главная"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Требуются углеводы"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Вы уверены?"; @@ -603,7 +609,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Автоматически"; /* External insulin treatments */ -"External" = "External"; +"External" = "Внешний"; /* */ "Other" = "Прочее"; @@ -1208,7 +1214,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Внешний инсулин"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручная ВБС"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Возможная глюкоза"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Целевая глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index edc3c93cd5..85094b83c1 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Pokračovať"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index ded4010971..4cfbc99247 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Du har angivit en insulinmängd som är över din maxinställning på %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Fortsätt"; + /* Home title */ "Home" = "Hem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Kolhydrater krävs"; +/* Saved Food Presets */ +"Saved Food" = "Mat"; + /* */ "Are you sure?" = "Är du säker?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Blodsockerprognos"; +/* */ +"Please wait" = "Vänta..."; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Målvärde"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index ce64317a61..82e8d804a1 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Devam et"; + /* Home title */ "Home" = "Ana sayfa"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Gerekli karbonhidrat"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Emin misiniz?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 65ddbb630d..b4d2d58ff4 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Введена вами сума була обмежена налаштуванням максимального болюсу %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Продовжити"; + /* Home title */ "Home" = "Головна"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Введіть кількість вуглеводів"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Ви впевнені?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Можлива глюкоза"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Цільова Глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 3324c2533a..b2cc936279 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "继续"; + /* Home title */ "Home" = "主页"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "所需碳水化合物"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "确定?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; From 1d16a49e5f2acba06c5d9ea2f65fc8bcf33c0451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 00:51:13 +0100 Subject: [PATCH 203/405] Localizations --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 ++- .../Sources/Localizations/Main/sv.lproj/Localizable.strings | 3 ++- FreeAPS/Sources/Modules/Bolus/View/Predictions.swift | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 91f2bf9026..ab02a1432d 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1406,7 +1406,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 4cfbc99247..8646f0066b 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Vänta..."; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Blodsocker, "; /* */ "Target Glucose" = "Målvärde"; diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index fa753d54de..1556bb3ea3 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -105,6 +105,6 @@ struct PredictionView: View { "COB": Color(.loopYellow), "ZT": Color(.ZT) ]) - .chartYAxisLabel("Glucose, " + units.rawValue, alignment: .center) + .chartYAxisLabel(NSLocalizedString("Glucose, ", comment: "") + units.rawValue, alignment: .center) } } From c81273e71b6e45dc141e8b42630c71c716b666df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 03:29:53 +0100 Subject: [PATCH 204/405] Allow to overrde skip bolus setting when coming from bolus -> carbs view --- Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents | 11 +++++++++++ .../Sources/Modules/AddCarbs/AddCarbsStateModel.swift | 4 ++-- .../Modules/AddCarbs/View/AddCarbsRootView.swift | 7 ++++--- FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift | 2 +- .../Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- .../Modules/Bolus/View/DefaultBolusCalcRootView.swift | 8 ++++---- FreeAPS/Sources/Modules/Home/HomeStateModel.swift | 2 +- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- FreeAPS/Sources/Router/Screen.swift | 6 +++--- 9 files changed, 28 insertions(+), 16 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index fefaa04c75..3a617a7a32 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,16 @@ + + + + + + + + + + + diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 7decc6441a..6fe3a4742c 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -31,7 +31,7 @@ extension AddCarbs { useFPUconversion = settingsManager.settings.useFPUconversion } - func add() { + func add(_ continue_: Bool) { guard carbs > 0 || fat > 0 || protein > 0 else { showModal(for: nil) return @@ -51,7 +51,7 @@ extension AddCarbs { )] carbsStorage.storeCarbs(carbsToStore) - if skipBolus { + if skipBolus, !continue_ { apsManager.determineBasalSync() showModal(for: nil) } else if carbs > 0 { diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index f432fd6cba..a659bb45ab 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -6,6 +6,7 @@ extension AddCarbs { struct RootView: BaseView { let resolver: Resolver let editMode: Bool + let override: Bool @StateObject var state = StateModel() @State var dish: String = "" @State var isPromptPresented = false @@ -115,9 +116,9 @@ extension AddCarbs { } Section { - Button { state.add() } - label: { Text(state.skipBolus ? "Save" : "Continue") } - .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) + Button { state.add(override) } + label: { Text((state.skipBolus && !override) ? "Save" : "Continue") } + .disabled(empty) .frame(maxWidth: .infinity, alignment: .center) }.listRowBackground(!empty ? Color(.systemBlue) : Color(.systemGray4)) .tint(.white) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 46c47c72af..4f1884076a 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -224,7 +224,7 @@ extension Bolus { func backToCarbsView(complexEntry: Bool, _ id: String) { delete(deleteTwice: complexEntry, id: id) - showModal(for: .addCarbs(editMode: complexEntry)) + showModal(for: .addCarbs(editMode: complexEntry, override: false)) } func delete(deleteTwice: Bool, id: String) { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b60a9fc350..c167a664c7 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -284,7 +284,7 @@ extension Bolus { keepForNextWiew = true state.backToCarbsView(complexEntry: fetch, id_) } else { - state.showModal(for: .addCarbs(editMode: false)) + state.showModal(for: .addCarbs(editMode: false, override: true)) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 166755aaa4..97ee1455da 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -153,7 +153,7 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - carbssView() + !fetch ? carbsView(override: true) : carbsView(override: false) } label: { Text(fetch ? "Back" : "Meal") }, @@ -185,13 +185,13 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - func carbssView() { + func carbsView(override: Bool) { let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true state.backToCarbsView(complexEntry: fetch, id_) - } else { - state.showModal(for: .addCarbs(editMode: false)) + } else if override { + state.showModal(for: .addCarbs(editMode: false, override: true)) } } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 2075d544b6..50d737ead9 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -196,7 +196,7 @@ extension Home { } func addCarbs() { - showModal(for: .addCarbs(editMode: false)) + showModal(for: .addCarbs(editMode: false, override: false)) } func runLoop() { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index acc79ac51f..ed4c3645fd 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -481,7 +481,7 @@ extension Home { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { - Button { state.showModal(for: .addCarbs(editMode: false)) } + Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image("carbs") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 23f83f4a93..55a634de8f 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -14,7 +14,7 @@ enum Screen: Identifiable, Hashable { case crEditor case targetsEditor case preferencesEditor - case addCarbs(editMode: Bool) + case addCarbs(editMode: Bool, override: Bool) case addTempTarget case bolus(waitForSuggestion: Bool, fetch: Bool) case manualTempBasal @@ -65,8 +65,8 @@ extension Screen { TargetsEditor.RootView(resolver: resolver) case .preferencesEditor: PreferencesEditor.RootView(resolver: resolver) - case let .addCarbs(editMode): - AddCarbs.RootView(resolver: resolver, editMode: editMode) + case let .addCarbs(editMode, override): + AddCarbs.RootView(resolver: resolver, editMode: editMode, override: override) case .addTempTarget: AddTempTarget.RootView(resolver: resolver) case let .bolus(waitForSuggestion, fetch): From 9774723f5d7e61e4a203913a1f162074144c745c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 15:51:34 +0100 Subject: [PATCH 205/405] Combine Skip Bolus and Override same setting... Needs refactoring. Hard to overview. --- .../Modules/AddCarbs/AddCarbsStateModel.swift | 4 +- .../AddCarbs/View/AddCarbsRootView.swift | 4 +- .../Modules/Bolus/BolusStateModel.swift | 4 +- .../View/AlternativeBolusCalcRootView.swift | 45 +++++++------- .../Bolus/View/DefaultBolusCalcRootView.swift | 58 +++++++++---------- 5 files changed, 57 insertions(+), 58 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 6fe3a4742c..c10114e6f8 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -31,7 +31,7 @@ extension AddCarbs { useFPUconversion = settingsManager.settings.useFPUconversion } - func add(_ continue_: Bool) { + func add(_ continue_: Bool, fetch: Bool) { guard carbs > 0 || fat > 0 || protein > 0 else { showModal(for: nil) return @@ -51,7 +51,7 @@ extension AddCarbs { )] carbsStorage.storeCarbs(carbsToStore) - if skipBolus, !continue_ { + if skipBolus, !continue_, !fetch { apsManager.determineBasalSync() showModal(for: nil) } else if carbs > 0 { diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index a659bb45ab..c0b9a028b3 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -116,8 +116,8 @@ extension AddCarbs { } Section { - Button { state.add(override) } - label: { Text((state.skipBolus && !override) ? "Save" : "Continue") } + Button { state.add(override, fetch: editMode) } + label: { Text((state.skipBolus && !override && !editMode) ? "Save" : "Continue") } .disabled(empty) .frame(maxWidth: .infinity, alignment: .center) }.listRowBackground(!empty ? Color(.systemBlue) : Color(.systemGray4)) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 4f1884076a..cc64987ee4 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -222,9 +222,9 @@ extension Bolus { } } - func backToCarbsView(complexEntry: Bool, _ id: String) { + func backToCarbsView(complexEntry: Bool, _ id: String, override: Bool) { delete(deleteTwice: complexEntry, id: id) - showModal(for: .addCarbs(editMode: complexEntry, override: false)) + showModal(for: .addCarbs(editMode: complexEntry, override: override)) } func delete(deleteTwice: Bool, id: String) { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index c167a664c7..7427593dc6 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -118,27 +118,26 @@ extension Bolus { .onTapGesture { state.amount = state.insulinCalculated } } - if !state.waitForSuggestion { - HStack { - Text("Bolus") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: false, - cleanInput: true - ) - Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) - } - .onChange(of: state.amount) { newValue in - if newValue > state.maxBolus { - exceededMaxBolus = true - } else { - exceededMaxBolus = false - } + HStack { + Text("Bolus") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true + ) + Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) + } + .onChange(of: state.amount) { newValue in + if newValue > state.maxBolus { + exceededMaxBolus = true + } else { + exceededMaxBolus = false } } + } header: { Text("Bolus") } if state.amount > 0 { @@ -169,7 +168,7 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - carbssView() + carbsView() } label: { Text(fetch ? "Back" : "Meal") }, @@ -278,13 +277,13 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - func carbssView() { + func carbsView() { let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) + state.backToCarbsView(complexEntry: fetch, id_, override: false) } else { - state.showModal(for: .addCarbs(editMode: false, override: true)) + state.backToCarbsView(complexEntry: false, id_, override: true) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 97ee1455da..3ad2b7b235 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -80,37 +80,37 @@ extension Bolus { else { state.amount = state.insulinRecommended } } }.contentShape(Rectangle()) + } - HStack { - Text("Amount") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: true, - cleanInput: true - ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) - } + HStack { + Text("Amount") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: true, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } + } header: { Text("Bolus") } - if !state.waitForSuggestion { - if state.amount > 0 { - Section { - Button { - keepForNextWiew = true - state.add() - } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled(disabled) - .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) - .tint(.white) + if state.amount > 0 { + Section { + Button { + keepForNextWiew = true + state.add() } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled(disabled) + .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) } } + if state.amount <= 0 { Section { Button { @@ -153,7 +153,7 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - !fetch ? carbsView(override: true) : carbsView(override: false) + carbsView() } label: { Text(fetch ? "Back" : "Meal") }, @@ -185,13 +185,13 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - func carbsView(override: Bool) { + func carbsView() { let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) - } else if override { - state.showModal(for: .addCarbs(editMode: false, override: true)) + state.backToCarbsView(complexEntry: fetch, id_, override: false) + } else { + state.backToCarbsView(complexEntry: false, id_, override: true) } } From d6f817543e73ab5f52a0408edb88b1822424bc6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:18:04 +0100 Subject: [PATCH 206/405] Update Bolus View and Meal View Meal View * Make presets UX/UI a bit cleaner (still far from perfect now) * Make a summary for all presets and other entries used * Make the important buttons blue and white (similar to Loop). * Prevent inadvertently changing the date of entry. Now you need to tap twice to change. Also allow for + - of 10 minute increments (also similar to Loop) with small button. Bolus View * Display all of the glucose predictions in bolus view * Display the future Eventual Glucose (end time depends on your DIA) * Whilst waiting for the recommendation (including predictions) allow a manual bolus entry. * Make the "Enact bolus" button blue, like in Loop. * Allow to add end edit a meal also when you have Skip Bolus setting on. Bolus->Carbs->Bolus sequence is now allowed. --- Config.xcconfig | 2 +- .../Core_Data.xcdatamodel/contents | 11 + .../CGMBLEKitUI/de.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 2 +- .../G7SensorKit/de.lproj/Localizable.strings | 6 +- FreeAPS.xcodeproj/project.pbxproj | 12 +- .../Main/ar.lproj/Localizable.strings | 11 + .../Main/da.lproj/Localizable.strings | 11 + .../Main/de.lproj/Localizable.strings | 11 + .../Main/en.lproj/Localizable.strings | 9 + .../Main/es.lproj/Localizable.strings | 11 + .../Main/fi.lproj/Localizable.strings | 11 + .../Main/fr.lproj/Localizable.strings | 11 + .../Main/he.lproj/Localizable.strings | 11 + .../Main/it.lproj/Localizable.strings | 17 +- .../Main/nb.lproj/Localizable.strings | 35 ++- .../Main/nl.lproj/Localizable.strings | 11 + .../Main/pl.lproj/Localizable.strings | 11 + .../Main/pt-BR.lproj/Localizable.strings | 11 + .../Main/pt-PT.lproj/Localizable.strings | 11 + .../Main/ru.lproj/Localizable.strings | 37 ++- .../Main/sk.lproj/Localizable.strings | 11 + .../Main/sv.lproj/Localizable.strings | 12 + .../Main/tr.lproj/Localizable.strings | 11 + .../Main/uk.lproj/Localizable.strings | 11 + .../Main/zh-Hans.lproj/Localizable.strings | 11 + FreeAPS/Sources/Models/Charts.swift | 17 ++ FreeAPS/Sources/Models/TIRforChart.swift | 8 - .../Modules/AddCarbs/AddCarbsStateModel.swift | 36 +-- .../AddCarbs/View/AddCarbsRootView.swift | 268 +++++++++++------- .../Modules/Bolus/BolusStateModel.swift | 16 +- .../View/AlternativeBolusCalcRootView.swift | 74 +++-- .../Bolus/View/DefaultBolusCalcRootView.swift | 78 +++-- .../Modules/Bolus/View/Predictions.swift | 110 +++++++ .../Sources/Modules/Home/HomeStateModel.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 2 +- FreeAPS/Sources/Router/Screen.swift | 6 +- 37 files changed, 696 insertions(+), 231 deletions(-) create mode 100644 FreeAPS/Sources/Models/Charts.swift delete mode 100644 FreeAPS/Sources/Models/TIRforChart.swift create mode 100644 FreeAPS/Sources/Modules/Bolus/View/Predictions.swift diff --git a/Config.xcconfig b/Config.xcconfig index 2d57d6bd6a..53495d2b4d 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.7 +APP_VERSION = 2.2.8 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index fefaa04c75..3a617a7a32 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,16 @@ + + + + + + + + + + + diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings index d3217ad239..99cf84b4de 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings @@ -39,7 +39,7 @@ Title text for the button to remove a CGM from Loop */ "Remote Data Synchronization" = "Remote Daten Synchronisation"; /* Title describing sensor expiration */ -"Sensor Expires" = "Sensor-Ablaufzeitpunkt"; +"Sensor Expires" = "Sensor läuft ab"; /* Title describing past sensor expiration */ "Sensor Expired" = "Sensor abgelaufen"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings index 5ca3fcc5ee..e9ae6ef1bf 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings @@ -54,7 +54,7 @@ "Last Reading" = "Letzte Messung"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten vom G7 direkt lesen. Zum Verbinden, Kalibrieren und weiteres Sensor Management braucht man die G7 App."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertem Sensor Management benötigt man die G7 App."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "NIEDRIG"; diff --git a/Dependencies/G7SensorKit/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/de.lproj/Localizable.strings index 16733d4cb7..ac6fad5f77 100644 --- a/Dependencies/G7SensorKit/de.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/de.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten vom G7 direkt lesen. Zum Verbinden, Kalibrieren und weiteres Sensor Management braucht man die G7 App."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertes Sensor Management benötigt man die G7 App."; /* Button title for starting setup */ "Continue" = "Fortsetzen"; @@ -11,7 +11,7 @@ "Cancel" = "Abbrechen"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Blutzuckerwerte sind nicht verfügbar"; +"Glucose data is unavailable" = "Glukosewerte sind nicht verfügbar"; /* The description of sensor algorithm state when sensor is ok. */ "Sensor is OK" = "Sensor ist OK"; @@ -70,7 +70,7 @@ "Configuration" = "Konfiguration"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload von Messwerten"; +"Upload Readings" = "Werte hochladen"; /* Button */ "Scan for new sensor" = "Nach neuem Sensor suchen"; diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index ac5c0d98d8..ebd4e222d9 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 190EBCC829FF13AA00BA767D /* StatConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCC729FF13AA00BA767D /* StatConfigStateModel.swift */; }; 190EBCCB29FF13CB00BA767D /* StatConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */; }; 191F62682AD6B05A004D7911 /* NightscoutSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */; }; + 19229B962AFBB84800CD91CA /* Predictions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19229B952AFBB84800CD91CA /* Predictions.swift */; }; 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; }; 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; }; 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193F6CDC2A512C8F001240FD /* Loops.swift */; }; @@ -40,7 +41,7 @@ 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; 19D466A729AA2C22004D5F33 /* FPUConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */; }; 19D466AA29AA3099004D5F33 /* FPUConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */; }; - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */; }; + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D4E4EA29FC6A9F00351451 /* Charts.swift */; }; 19DA48E829CD339B00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48E929CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; 19DA48EA29CD339C00EEA1E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */; }; @@ -508,6 +509,7 @@ 190EBCCA29FF13CB00BA767D /* StatConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatConfigRootView.swift; sourceTree = ""; }; 1918333A26ADA46800F45722 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutSettings.swift; sourceTree = ""; }; + 19229B952AFBB84800CD91CA /* Predictions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Predictions.swift; sourceTree = ""; }; 1927C8E92744611700347C69 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EA2744611800347C69 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8EB2744611900347C69 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; @@ -568,7 +570,7 @@ 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigProvider.swift; sourceTree = ""; }; 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigStateModel.swift; sourceTree = ""; }; 19D466A929AA3099004D5F33 /* FPUConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigRootView.swift; sourceTree = ""; }; - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TIRforChart.swift; sourceTree = ""; }; + 19D4E4EA29FC6A9F00351451 /* Charts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Charts.swift; sourceTree = ""; }; 19DA487F29CD2B8400EEA1E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 19DC677E29CA675700FD9EC4 /* OverrideProfilesDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesDataFlow.swift; sourceTree = ""; }; 19DC678029CA676A00FD9EC4 /* OverrideProfilesProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesProvider.swift; sourceTree = ""; }; @@ -1655,7 +1657,7 @@ FE41E4D529463EE20047FD55 /* NightscoutPreferences.swift */, 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, - 19D4E4EA29FC6A9F00351451 /* TIRforChart.swift */, + 19D4E4EA29FC6A9F00351451 /* Charts.swift */, 19A910352A24D6D700C8951B /* DateFilter.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, @@ -2084,6 +2086,7 @@ 10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */, BDFD165B2AE40688007F0DDA /* DefaultBolusCalcRootView.swift */, BDFD16592AE40438007F0DDA /* AlternativeBolusCalcRootView.swift */, + 19229B952AFBB84800CD91CA /* Predictions.swift */, ); path = View; sourceTree = ""; @@ -2830,6 +2833,7 @@ 1967DFBE29D052C200759F30 /* Icons.swift in Sources */, 38E8754F275556FA00975559 /* WatchManager.swift in Sources */, A228DF96647338139F152B15 /* PreferencesEditorDataFlow.swift in Sources */, + 19229B962AFBB84800CD91CA /* Predictions.swift in Sources */, 389ECE052601144100D86C4F /* ConcurrentMap.swift in Sources */, CE7CA3562A064973004BE681 /* StateIntentRequest.swift in Sources */, E4984C5262A90469788754BB /* PreferencesEditorProvider.swift in Sources */, @@ -2862,7 +2866,7 @@ 0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */, 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */, BDFD165C2AE40688007F0DDA /* DefaultBolusCalcRootView.swift in Sources */, - 19D4E4EB29FC6A9F00351451 /* TIRforChart.swift in Sources */, + 19D4E4EB29FC6A9F00351451 /* Charts.swift in Sources */, FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */, F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */, 3862CC1F273FDC9200BF832C /* CalibrationsChart.swift in Sources */, diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 2a918bab32..a4c97a7024 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 21cff8d8b4..b576f23860 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Fortsæt"; + /* Home title */ "Home" = "Hjem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Krævede kulhydrater"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Er du sikker?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventuelt Glukoseniveau"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 79e1f22eef..7a0d7e035c 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Dein eingegebener Wert wurde durch deine maximale Bolus-Einstellung von %d%@ begrenzt"; +/* Bolus View Continue Button */ +"Continue" = "Fortsetzen"; + /* Home title */ "Home" = "Hauptseite"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Kohlenhydrate erforderlich"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Sind Sie sicher?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Prognostizierte Glukose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Ziel Glukose"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index aa9173ed6f..ab02a1432d 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -121,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1400,6 +1403,12 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +/* */ +"Glucose, " = "Glucose, "; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 369c7e2604..d292a9ee5b 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuar"; + /* Home title */ "Home" = "Inicio"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Se requieren carbohidratos"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "¿Estás seguro?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 19596ed75f..36459d38bf 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Jatka"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index edfd6baa11..a018281585 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuer"; + /* Home title */ "Home" = "Page d'accueil"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Glucides requis"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Êtes-vous sûr ?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 2a918bab32..a4c97a7024 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index d71b6eba05..11070d45ee 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Il tuo importo inserito è stato limitato dalla tua impostazione del Bolo massimo di %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continua"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carboidrati necessari"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Sei sicuro?"; @@ -1029,7 +1035,7 @@ Enact a temp Basal or a temp target */ "Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; /* Glucose badge */ -"Show glucose on the app badge" = "Mostra il glicemie sul badge dell'app"; +"Show glucose on the app badge" = "Mostra le glicemie sul badge dell'app"; /* */ "Backfill glucose" = "Riempi glicemia"; @@ -1134,7 +1140,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Solo Insulina Basale Autotune"; /* */ -"Save as your Normal Basal Rates" = "Salva come Tassi Basali Normali"; +"Save as your Normal Basal Rates" = "Salva come Profilo Basale Normale"; /* */ "Save on Pump" = "Salva sul microinfusore"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "previsione glicemica"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glicemia"; @@ -1556,7 +1567,7 @@ Enact a temp Basal or a temp target */ "Total Delivery" = "Totale Consegnata"; /* */ -"Add Omnipod Dash" = "Agg Omnipod Dash"; +"Add Omnipod Dash" = "Aggiungi Omnipod Dash"; /* */ "Insert Cannula" = "Inserisci cannula"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index e1e2c6e8b9..a37a1a1bbe 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -56,37 +56,40 @@ "Error at" = "Feil kl."; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Oppsummering av måltid"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Endre måltid"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Legg til måltid"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus-sammendrag"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Beregninger"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Fett måltid"; /* For the Bolus View pop-up */ "Full Bolus" = "Full Bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Brøkdel"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Brøkdel for fett måltid"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Mengden du la inn ble begrenset av innstillingen for Maks Bolus på %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Fortsett"; /* Home title */ "Home" = "Hjem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Karbo nødvendig"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Er du sikker?"; @@ -603,7 +609,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisk"; /* External insulin treatments */ -"External" = "External"; +"External" = "Ekstern"; /* */ "Other" = "Annet"; @@ -1208,7 +1214,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Eksternt insulin"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Manuell basal"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Beregnet blodsukker"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Blodsukkermål"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 202d39c659..e343bd77a2 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Je ingevoerde hoeveelheid is beperkt door je maximale bolusinstelling van %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Vervolg"; + /* Home title */ "Home" = "Hoofdmenu"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Koolhydraten benodigd"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Weet je het zeker?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Voorspelde glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Doel glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 576a542c36..7199dadbbc 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Kontynuuj"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Czy jesteś pewien?"; @@ -1398,6 +1404,11 @@ Połączono z Nightscout!"; /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index d91200004c..95ee3eb092 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continuar"; + /* Home title */ "Home" = "Tela inicial"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbos necessários"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Tem certeza?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 78e5d78110..10a944286b 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Continue"; + /* Home title */ "Home" = "Tela inicial"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbos necessários"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Tem certeza?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 73483ee460..e73c85b37d 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -56,37 +56,40 @@ "Error at" = "Ошибка в"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Итог питания"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Изменить еду"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Добавить еду"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Болюс суммарно"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Вычисления"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Жирная пища"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Полный болюс"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Доля"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Фактор жирной пищи"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Итого"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Доза была ограничена Вашей настройкой максимального болюса в размере %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Продолжить"; /* Home title */ "Home" = "Главная"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Требуются углеводы"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Вы уверены?"; @@ -603,7 +609,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Автоматически"; /* External insulin treatments */ -"External" = "External"; +"External" = "Внешний"; /* */ "Other" = "Прочее"; @@ -1208,7 +1214,7 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Внешний инсулин"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Ручная ВБС"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Возможная глюкоза"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Целевая глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index edc3c93cd5..85094b83c1 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Pokračovať"; + /* Home title */ "Home" = "Home"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Carbs required"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Are you sure?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index ded4010971..8646f0066b 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Du har angivit en insulinmängd som är över din maxinställning på %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Fortsätt"; + /* Home title */ "Home" = "Hem"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Kolhydrater krävs"; +/* Saved Food Presets */ +"Saved Food" = "Mat"; + /* */ "Are you sure?" = "Är du säker?"; @@ -1396,6 +1402,12 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Blodsockerprognos"; +/* */ +"Please wait" = "Vänta..."; + +/* */ +"Glucose, " = "Blodsocker, "; + /* */ "Target Glucose" = "Målvärde"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index ce64317a61..82e8d804a1 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Devam et"; + /* Home title */ "Home" = "Ana sayfa"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Gerekli karbonhidrat"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Emin misiniz?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 65ddbb630d..b4d2d58ff4 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Введена вами сума була обмежена налаштуванням максимального болюсу %d%@"; +/* Bolus View Continue Button */ +"Continue" = "Продовжити"; + /* Home title */ "Home" = "Головна"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "Введіть кількість вуглеводів"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "Ви впевнені?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Можлива глюкоза"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Цільова Глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 3324c2533a..b2cc936279 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -88,6 +88,9 @@ /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +/* Bolus View Continue Button */ +"Continue" = "继续"; + /* Home title */ "Home" = "主页"; @@ -118,6 +121,9 @@ /* */ "Carbs required" = "所需碳水化合物"; +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + /* */ "Are you sure?" = "确定?"; @@ -1396,6 +1402,11 @@ Enact a temp Basal or a temp target */ /* */ "Eventual Glucose" = "Eventual Glucose"; +/* */ +"Please wait" = "Please wait"; + +"Glucose, %@" = "Glucose, %@"; + /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Models/Charts.swift b/FreeAPS/Sources/Models/Charts.swift new file mode 100644 index 0000000000..82896af45b --- /dev/null +++ b/FreeAPS/Sources/Models/Charts.swift @@ -0,0 +1,17 @@ + +import Foundation + +struct ShapeModel: Identifiable { + var type: String + var percent: Decimal + var id = UUID() +} + +struct ChartData: Identifiable { + var date: Date + var iob: Double + var zt: Double + var cob: Double + var uam: Double + var id = UUID() +} diff --git a/FreeAPS/Sources/Models/TIRforChart.swift b/FreeAPS/Sources/Models/TIRforChart.swift deleted file mode 100644 index bdbc13e384..0000000000 --- a/FreeAPS/Sources/Models/TIRforChart.swift +++ /dev/null @@ -1,8 +0,0 @@ - -import Foundation - -struct ShapeModel: Identifiable { - var type: String - var percent: Decimal - var id = UUID() -} diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index f309a95b72..c10114e6f8 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -31,7 +31,7 @@ extension AddCarbs { useFPUconversion = settingsManager.settings.useFPUconversion } - func add() { + func add(_ continue_: Bool, fetch: Bool) { guard carbs > 0 || fat > 0 || protein > 0 else { showModal(for: nil) return @@ -51,7 +51,7 @@ extension AddCarbs { )] carbsStorage.storeCarbs(carbsToStore) - if skipBolus { + if skipBolus, !continue_, !fetch { apsManager.determineBasalSync() showModal(for: nil) } else if carbs > 0 { @@ -140,16 +140,16 @@ extension AddCarbs { var addedString = "" if extracarbs > 0, filteredArray.isNotEmpty { - addedString += "Additional carbs: \(extracarbs) " + addedString += "Additional carbs: \(extracarbs) ," } else if extracarbs < 0 { addedString += "Removed carbs: \(extracarbs) " } if extraFat > 0, filteredArray.isNotEmpty { - addedString += "Additional fat: \(extraFat) " - } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) " } + addedString += "Additional fat: \(extraFat) ," + } else if extraFat < 0 { addedString += "Removed fat: \(extraFat) ," } if extraProtein > 0, filteredArray.isNotEmpty { - addedString += "Additional protein: \(extraProtein) " - } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) " } + addedString += "Additional protein: \(extraProtein) ," + } else if extraProtein < 0 { addedString += "Removed protein: \(extraProtein) ," } if addedString != "" { waitersNotepad.append(addedString) @@ -170,7 +170,7 @@ extension AddCarbs { func loadEntries(_ editMode: Bool) { if editMode { - coredataContext.perform { + coredataContext.performAndWait { var mealToEdit = [Meals]() let requestMeal = Meals.fetchRequest() as NSFetchRequest let sortMeal = NSSortDescriptor(key: "createdAt", ascending: false) @@ -188,15 +188,17 @@ extension AddCarbs { } func saveToCoreData(_ stored: [CarbsEntry]) { - let save = Meals(context: coredataContext) - save.createdAt = Date.now - save.id = stored.first?.collectionID ?? "" - save.carbs = Double(stored.first?.carbs ?? 0) - save.fat = Double(stored.first?.fat ?? 0) - save.protein = Double(stored.first?.protein ?? 0) - save.note = stored.first?.note ?? "" - if coredataContext.hasChanges { - try? coredataContext.save() + coredataContext.performAndWait { + let save = Meals(context: coredataContext) + if let entry = stored.first { + save.createdAt = Date.now + save.id = entry.collectionID ?? "" + save.carbs = Double(entry.carbs) + save.fat = Double(entry.fat ?? 0) + save.protein = Double(entry.protein ?? 0) + save.note = entry.note + try? coredataContext.save() + } } } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index b05230b362..c0b9a028b3 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -6,10 +6,12 @@ extension AddCarbs { struct RootView: BaseView { let resolver: Resolver let editMode: Bool + let override: Bool @StateObject var state = StateModel() @State var dish: String = "" @State var isPromptPresented = false @State var saved = false + @State var pushed = false @State private var showAlert = false @FocusState private var isFocused: Bool @@ -29,12 +31,12 @@ extension AddCarbs { var body: some View { Form { - if let carbsReq = state.carbsRequired { + if let carbsReq = state.carbsRequired, state.carbs < carbsReq { Section { HStack { Text("Carbs required") Spacer() - Text(formatter.string(from: carbsReq as NSNumber)! + " g") + Text((formatter.string(from: carbsReq as NSNumber) ?? "") + " g") } } } @@ -50,11 +52,55 @@ extension AddCarbs { cleanInput: true ) Text("grams").foregroundColor(.secondary) - }.padding(.vertical) + } if state.useFPUconversion { proteinAndFat() } + + // Summary when combining presets + if state.waitersNotepad() != "" { + HStack { + Text("Total") + let test = state.waitersNotepad().components(separatedBy: ", ").removeDublicates() + HStack(spacing: 0) { + ForEach(test, id: \.self) { + Text($0).foregroundStyle(Color.randomGreen()).font(.footnote) + Text($0 == test[test.count - 1] ? "" : ", ") + } + }.frame(maxWidth: .infinity, alignment: .trailing) + } + } + + // Time + HStack { + let now = Date.now + Text("Time") + Spacer() + if !pushed { + Button { + pushed = true + } label: { Text("Now") }.buttonStyle(.borderless).foregroundColor(.secondary).padding(.trailing, 5) + } else { + Button { state.date = state.date.addingTimeInterval(-10.minutes.timeInterval) } + label: { Image(systemName: "minus.circle") }.tint(.blue).buttonStyle(.borderless) + DatePicker( + "Time", + selection: $state.date, + in: ...now, + displayedComponents: [.hourAndMinute] + ).controlSize(.mini) + .labelsHidden() + Button { + if state.date.addingTimeInterval(5.minutes.timeInterval) < now { + state.date = state.date.addingTimeInterval(10.minutes.timeInterval) + } + } + label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) + } + } + + // Optional meal note HStack { Text("Note").foregroundColor(.secondary) TextField("", text: $state.note).multilineTextAlignment(.trailing) @@ -62,25 +108,23 @@ extension AddCarbs { Button { isFocused = false } label: { Image(systemName: "keyboard.chevron.compact.down") } .controlSize(.mini) } - }.focused($isFocused) - .popover(isPresented: $isPromptPresented) { - presetPopover - } - } - - Section { - mealPresets + } + .focused($isFocused) + .popover(isPresented: $isPromptPresented) { + presetPopover + } } Section { - Button { state.add() } - label: { Text(state.skipBolus ? "Save" : "Continue") } - .disabled(state.carbs <= 0 && state.fat <= 0 && state.protein <= 0) + Button { state.add(override, fetch: editMode) } + label: { Text((state.skipBolus && !override && !editMode) ? "Save" : "Continue") } + .disabled(empty) .frame(maxWidth: .infinity, alignment: .center) - } footer: { Text(state.waitersNotepad().description) } + }.listRowBackground(!empty ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) Section { - DatePicker("Date", selection: $state.date) + mealPresets } } .onAppear { @@ -93,7 +137,7 @@ extension AddCarbs { .navigationBarItems(leading: Button("Close", action: state.hideModal)) } - var presetPopover: some View { + private var presetPopover: some View { Form { Section { TextField("Name Of Dish", text: $dish) @@ -121,114 +165,125 @@ extension AddCarbs { } } - var notEmpty: Bool { - state.carbs > 0 || state.protein > 0 || state.fat > 0 + private var empty: Bool { + state.carbs <= 0 && state.fat <= 0 && state.protein <= 0 + } + + private var minusButton: some View { + Button { + if state.carbs != 0, + (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) + } else { state.carbs = 0 } + + if state.fat != 0, + (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) + } else { state.fat = 0 } + + if state.protein != 0, + (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 + { + state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) + } else { state.protein = 0 } + + state.removePresetFromNewMeal() + if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } + } + label: { Image(systemName: "minus.circle") } + .disabled( + state + .selection == nil || + ( + !state.summation + .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" + ) + ) + .buttonStyle(.borderless) + .tint(.blue) + } + + private var plusButton: some View { + Button { + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + + state.addPresetToNewMeal() + } + label: { Image(systemName: "plus.circle") } + .disabled(state.selection == nil) + .buttonStyle(.borderless) + .tint(.blue) } - var mealPresets: some View { + private var mealPresets: some View { Section { HStack { - Button { - isPromptPresented = true + if state.selection != nil { + minusButton } - label: { Text("Save as Preset") } - .buttonStyle(BorderlessButtonStyle()) - .disabled( - !notEmpty || - ( - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state - .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state - .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state - .protein - ) - ) - - Picker("Select a Preset", selection: $state.selection) { - Text("Presets").tag(nil as Presets?) + Picker("Preset", selection: $state.selection) { + Text("Saved Food").tag(nil as Presets?) ForEach(carbPresets, id: \.self) { (preset: Presets) in Text(preset.dish ?? "").tag(preset as Presets?) } } .labelsHidden() - .frame(maxWidth: .infinity, alignment: .trailing) + .frame(maxWidth: .infinity, alignment: .center) ._onBindingChange($state.selection) { _ in state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal state.addToSummation() } + if state.selection != nil { + plusButton + } } - if state.selection != nil { - HStack { - Button("Delete Preset") { - showAlert.toggle() - } - .disabled(state.selection == nil) - .tint(.orange) - .buttonStyle(BorderlessButtonStyle()) - .alert( - "Delete preset '\(state.selection?.dish ?? "")'?", - isPresented: $showAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.deletePreset() + HStack { + Button("Delete Preset") { + showAlert.toggle() + } + .disabled(state.selection == nil) + .tint(.orange) + .buttonStyle(.borderless) + .alert( + "Delete preset '\(state.selection?.dish ?? "")'?", + isPresented: $showAlert, + actions: { + Button("No", role: .cancel) {} + Button("Yes", role: .destructive) { + state.deletePreset() - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal + state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal + state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal - state.addPresetToNewMeal() - } + state.addPresetToNewMeal() } - ) - Button { - if state.carbs != 0, - (state.carbs - (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.carbs -= (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) - } else { state.carbs = 0 } - - if state.fat != 0, - (state.fat - (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.fat -= (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) - } else { state.fat = 0 } - - if state.protein != 0, - (state.protein - (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) as Decimal) >= 0 - { - state.protein -= (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) - } else { state.protein = 0 } - - state.removePresetFromNewMeal() - if state.carbs == 0, state.fat == 0, state.protein == 0 { state.summation = [] } } - label: { Text("[ -1 ]") } - .disabled( - state - .selection == nil || - ( - !state.summation - .contains(state.selection?.dish ?? "") && (state.selection?.dish ?? "") != "" - ) - ) - .buttonStyle(BorderlessButtonStyle()) - .frame(maxWidth: .infinity, alignment: .trailing) - .tint(.minus) - Button { - state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal - state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal - state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal + ) - state.addPresetToNewMeal() - } - label: { Text("[ +1 ]") } - .disabled(state.selection == nil) - .buttonStyle(BorderlessButtonStyle()) - .tint(.blue) + Spacer() + + Button { + isPromptPresented = true } + label: { Text("Save as Preset") } + .buttonStyle(.borderless) + .disabled( + empty || + ( + (((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal) == state + .carbs && (((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal) == state + .fat && (((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal) == state + .protein + ) + ) } } } @@ -262,3 +317,14 @@ extension AddCarbs { } } } + +public extension Color { + static func randomGreen(randomOpacity: Bool = false) -> Color { + Color( + red: .random(in: 0 ... 1), + green: .random(in: 0.4 ... 0.7), + blue: .random(in: 0.2 ... 1), + opacity: randomOpacity ? .random(in: 0.8 ... 1) : 1 + ) + } +} diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 26f7e4203e..cc64987ee4 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -1,5 +1,3 @@ - -import CoreData import LoopKit import SwiftUI import Swinject @@ -14,9 +12,8 @@ extension Bolus { @Injected() var settings: SettingsManager! @Injected() var nsManager: NightscoutManager! - let coredataContext = CoreDataStack.shared.persistentContainer.viewContext - @Published var suggestion: Suggestion? + @Published var predictions: Predictions? @Published var amount: Decimal = 0 @Published var insulinRecommended: Decimal = 0 @Published var insulinRequired: Decimal = 0 @@ -60,7 +57,6 @@ extension Bolus { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var useFattyMealCorrectionFactor: Bool = false - @Published var eventualBG: Int = 0 @Published var meal: [CarbsEntry]? @Published var carbs: Decimal = 0 @@ -93,6 +89,12 @@ extension Bolus { } }.store(in: &lifetime) } + if let notNilSugguestion = provider.suggestion { + suggestion = notNilSugguestion + if let notNilPredictions = suggestion?.predictions { + predictions = notNilPredictions + } + } } func getDeltaBG() { @@ -220,9 +222,9 @@ extension Bolus { } } - func backToCarbsView(complexEntry: Bool, _ id: String) { + func backToCarbsView(complexEntry: Bool, _ id: String, override: Bool) { delete(deleteTwice: complexEntry, id: id) - showModal(for: .addCarbs(editMode: complexEntry)) + showModal(for: .addCarbs(editMode: complexEntry, override: override)) } func delete(deleteTwice: Bool, id: String) { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index f5999be92a..7427593dc6 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -1,3 +1,4 @@ +import Charts import CoreData import SwiftUI import Swinject @@ -56,6 +57,15 @@ extension Bolus { var body: some View { Form { + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } + + Section {} if fetch { Section { mealEntries @@ -108,27 +118,26 @@ extension Bolus { .onTapGesture { state.amount = state.insulinCalculated } } - if !state.waitForSuggestion { - HStack { - Text("Bolus") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: false, - cleanInput: true - ) - Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) - } - .onChange(of: state.amount) { newValue in - if newValue > state.maxBolus { - exceededMaxBolus = true - } else { - exceededMaxBolus = false - } + HStack { + Text("Bolus") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: false, + cleanInput: true + ) + Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) + } + .onChange(of: state.amount) { newValue in + if newValue > state.maxBolus { + exceededMaxBolus = true + } else { + exceededMaxBolus = false } } + } header: { Text("Bolus") } if state.amount > 0 { @@ -139,10 +148,9 @@ extension Bolus { } label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } .frame(maxWidth: .infinity, alignment: .center) - .foregroundColor(exceededMaxBolus ? .loopRed : .accentColor) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) + .disabled(disabled) + .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) } } if state.amount <= 0 { @@ -160,7 +168,7 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - carbssView() + carbsView() } label: { Text(fetch ? "Back" : "Meal") }, @@ -186,6 +194,14 @@ extension Bolus { } } + var predictionChart: some View { + ZStack { + PredictionView( + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target + ) + } + } + // Pop-up var bolusInfoAlternativeCalculator: some View { VStack { @@ -249,6 +265,10 @@ extension Bolus { ) } + private var disabled: Bool { + state.amount <= 0 || state.amount > state.maxBolus + } + var changed: Bool { ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } @@ -257,13 +277,13 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - func carbssView() { + func carbsView() { let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) + state.backToCarbsView(complexEntry: fetch, id_, override: false) } else { - state.showModal(for: .addCarbs(editMode: false)) + state.backToCarbsView(complexEntry: false, id_, override: true) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 8d66170cbd..3ad2b7b235 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -1,3 +1,5 @@ +import Charts +import CoreData import SwiftUI import Swinject @@ -35,6 +37,14 @@ extension Bolus { var body: some View { Form { + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } + if fetch { Section { mealEntries @@ -70,37 +80,37 @@ extension Bolus { else { state.amount = state.insulinRecommended } } }.contentShape(Rectangle()) + } - HStack { - Text("Amount") - Spacer() - DecimalTextField( - "0", - value: $state.amount, - formatter: formatter, - autofocus: true, - cleanInput: true - ) - Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) - } + HStack { + Text("Amount") + Spacer() + DecimalTextField( + "0", + value: $state.amount, + formatter: formatter, + autofocus: true, + cleanInput: true + ) + Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } + } header: { Text("Bolus") } - if !state.waitForSuggestion { - if state.amount > 0 { - Section { - Button { - keepForNextWiew = true - state.add() - } - label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } - .frame(maxWidth: .infinity, alignment: .center) - .disabled( - state.amount <= 0 || state.amount > state.maxBolus - ) + if state.amount > 0 { + Section { + Button { + keepForNextWiew = true + state.add() } + label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } + .frame(maxWidth: .infinity, alignment: .center) + .disabled(disabled) + .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) + .tint(.white) } } + if state.amount <= 0 { Section { Button { @@ -143,7 +153,7 @@ extension Bolus { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading: Button { - carbssView() + carbsView() } label: { Text(fetch ? "Back" : "Meal") }, @@ -155,6 +165,18 @@ extension Bolus { } } + var disabled: Bool { + state.amount <= 0 || state.amount > state.maxBolus + } + + var predictionChart: some View { + ZStack { + PredictionView( + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target + ) + } + } + var changed: Bool { ((meal.first?.carbs ?? 0) > 0) || ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } @@ -163,13 +185,13 @@ extension Bolus { ((meal.first?.fat ?? 0) > 0) || ((meal.first?.protein ?? 0) > 0) } - func carbssView() { + func carbsView() { let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_) + state.backToCarbsView(complexEntry: fetch, id_, override: false) } else { - state.showModal(for: .addCarbs(editMode: false)) + state.backToCarbsView(complexEntry: false, id_, override: true) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift new file mode 100644 index 0000000000..1556bb3ea3 --- /dev/null +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -0,0 +1,110 @@ +import Charts +import CoreData +import SwiftUI +import Swinject + +struct PredictionView: View { + @Binding var predictions: Predictions? + @Binding var units: GlucoseUnits + @Binding var eventualBG: Int + @Binding var target: Decimal + + private enum Config { + static let height: CGFloat = 160 + static let lineWidth: CGFloat = 2 + } + + var body: some View { + VStack { + chart() + HStack { + let conversion = units == .mmolL ? 0.0555 : 1 + Text("Eventual Glucose") + Spacer() + Text( + (Double(eventualBG) * conversion) + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(units == .mmolL ? 1 : 0))) + ) + Text(units.rawValue).foregroundStyle(.secondary) + Divider() + }.font(.callout) + } + } + + func chart() -> some View { + // Data Source + let iob = predictions?.iob ?? [Int]() + let cob = predictions?.cob ?? [Int]() + let uam = predictions?.uam ?? [Int]() + let zt = predictions?.zt ?? [Int]() + let count = max(iob.count, cob.count, uam.count, zt.count) + var now = Date.now + var startIndex = 0 + let conversion = units == .mmolL ? 0.0555 : 1 + // Organize the data needed for prediction chart. + var data = [ChartData]() + repeat { + now = now.addingTimeInterval(5.minutes.timeInterval) + if startIndex < count { + let addedData = ChartData( + date: now, + iob: startIndex < iob.count ? Double(iob[startIndex]) * conversion : 0, + zt: startIndex < zt.count ? Double(zt[startIndex]) * conversion : 0, + cob: startIndex < cob.count ? Double(cob[startIndex]) * conversion : 0, + uam: startIndex < uam.count ? Double(uam[startIndex]) * conversion : 0, + id: UUID() + ) + data.append(addedData) + } + startIndex += 1 + } while startIndex < count + // Chart + return Chart(data) { + // Remove 0 (empty) values + if $0.iob != 0 { + LineMark( + x: .value("Time", $0.date), + y: .value("IOB", $0.iob), + series: .value("IOB", "A") + ) + .foregroundStyle(Color(.insulin)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) + } + if $0.uam != 0 { + LineMark( + x: .value("Time", $0.date), + y: .value("UAM", $0.uam), + series: .value("UAM", "B") + ) + .foregroundStyle(Color(.UAM)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) + } + if $0.cob != 0 { + LineMark( + x: .value("Time", $0.date), + y: .value("COB", $0.cob), + series: .value("COB", "C") + ) + .foregroundStyle(Color(.loopYellow)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) + } + if $0.zt != 0 { + LineMark( + x: .value("Time", $0.date), + y: .value("ZT", $0.zt), + series: .value("ZT", "D") + ) + .foregroundStyle(Color(.ZT)) + .lineStyle(StrokeStyle(lineWidth: Config.lineWidth)) + } + } + .frame(minHeight: Config.height) + .chartForegroundStyleScale([ + "IOB": Color(.insulin), + "UAM": Color(.UAM), + "COB": Color(.loopYellow), + "ZT": Color(.ZT) + ]) + .chartYAxisLabel(NSLocalizedString("Glucose, ", comment: "") + units.rawValue, alignment: .center) + } +} diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 2075d544b6..50d737ead9 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -196,7 +196,7 @@ extension Home { } func addCarbs() { - showModal(for: .addCarbs(editMode: false)) + showModal(for: .addCarbs(editMode: false, override: false)) } func runLoop() { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index acc79ac51f..ed4c3645fd 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -481,7 +481,7 @@ extension Home { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) HStack { - Button { state.showModal(for: .addCarbs(editMode: false)) } + Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image("carbs") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 23f83f4a93..55a634de8f 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -14,7 +14,7 @@ enum Screen: Identifiable, Hashable { case crEditor case targetsEditor case preferencesEditor - case addCarbs(editMode: Bool) + case addCarbs(editMode: Bool, override: Bool) case addTempTarget case bolus(waitForSuggestion: Bool, fetch: Bool) case manualTempBasal @@ -65,8 +65,8 @@ extension Screen { TargetsEditor.RootView(resolver: resolver) case .preferencesEditor: PreferencesEditor.RootView(resolver: resolver) - case let .addCarbs(editMode): - AddCarbs.RootView(resolver: resolver, editMode: editMode) + case let .addCarbs(editMode, override): + AddCarbs.RootView(resolver: resolver, editMode: editMode, override: override) case .addTempTarget: AddTempTarget.RootView(resolver: resolver) case let .bolus(waitForSuggestion, fetch): From 2bdb147b610ebe0a59d08acf92f72f8701e96bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:27:54 +0100 Subject: [PATCH 207/405] Crowdin updates (#311) --- .../OmniBLE/Localizations/nl.lproj/Localizable.strings | 2 +- .../OmniKitUI/Resources/nl.lproj/Localizable.strings | 2 +- .../Localizations/Main/ar.lproj/Localizable.strings | 3 ++- .../Localizations/Main/da.lproj/Localizable.strings | 3 ++- .../Localizations/Main/de.lproj/Localizable.strings | 7 ++++--- .../Localizations/Main/es.lproj/Localizable.strings | 3 ++- .../Localizations/Main/fi.lproj/Localizable.strings | 3 ++- .../Localizations/Main/fr.lproj/Localizable.strings | 3 ++- .../Localizations/Main/he.lproj/Localizable.strings | 3 ++- .../Localizations/Main/it.lproj/Localizable.strings | 3 ++- .../Localizations/Main/nb.lproj/Localizable.strings | 3 ++- .../Localizations/Main/nl.lproj/Localizable.strings | 7 ++++--- .../Localizations/Main/pl.lproj/Localizable.strings | 3 ++- .../Localizations/Main/pt-BR.lproj/Localizable.strings | 3 ++- .../Localizations/Main/pt-PT.lproj/Localizable.strings | 3 ++- .../Localizations/Main/ru.lproj/Localizable.strings | 7 ++++--- .../Localizations/Main/sk.lproj/Localizable.strings | 3 ++- .../Localizations/Main/tr.lproj/Localizable.strings | 3 ++- .../Localizations/Main/uk.lproj/Localizable.strings | 7 ++++--- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 3 ++- 20 files changed, 46 insertions(+), 28 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 2349a8da16..65c9f796be 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -571,7 +571,7 @@ "Critical Alerts" = "Kritieke waarschuwingen"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "De bovenstaande meldingen waarschuwen zonder geluid als je apparaat in de modus Stil of Niet storen staat.\n\nEr zijn andere belangrijke Pod waarschuwingen en -alarmen die wel klinken, zelfs als je apparaat in de modus Stil of Niet storen staat."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "De bovenstaande meldingen waarschuwen zonder geluid als je apparaat in de modus 'Stil' of 'Niet storen' staat.\n\nEr zijn andere belangrijke Pod waarschuwingen en -alarmen die wel klinken, zelfs als je apparaat in de modus 'Stil' of 'Niet storen' staat."; /* navigation title for notification settings */ "Notification Settings" = "Instellingen voor meldingen"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 2e12fb737e..6138e64402 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -681,7 +681,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level." = "iAPS geeft een melding wanneer de hoeveelheid insuline in de Pod dit niveau bereikt."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Bovenstaande herinneringen zijn niet hoorbaar wanneer je apparaat in de modus Stil of Niet Storen staat.\n\nAndere kritieke Podmeldingen en Podalarmen gaan wel af, zelfs als je apparaat op de modus Stil of Niet Storen staat."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Bovenstaande herinneringen zijn niet hoorbaar wanneer je apparaat in de modus 'Stil' of 'Niet storen' staat.\n\nAndere kritieke Podmeldingen en Podalarmen gaan wel af, zelfs als je apparaat op de modus 'Stil' of 'Niet storen' staat."; /* Message for pod sync time action sheet */ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "De tijd op je pomp is anders dan de huidige tijd. Wil je de tijd op je pomp bijwerken naar de huidige tijd?"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index a4c97a7024..1597de3f5e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index b576f23860..7eeafc2684 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 7a0d7e035c..bc54c5adc8 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Kohlenhydrate erforderlich"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Gespeichertes Essen"; /* */ "Are you sure?" = "Sind Sie sicher?"; @@ -1403,9 +1403,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Prognostizierte Glukose"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Bitte warten"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Blutzucker, "; /* */ "Target Glucose" = "Ziel Glukose"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index d292a9ee5b..edf64dcdaa 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 36459d38bf..e258f97b27 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index a018281585..6769eff5cd 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index a4c97a7024..1597de3f5e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 11070d45ee..1a38a461b3 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glicemia"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index a37a1a1bbe..671d84abb7 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Blodsukkermål"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index e343bd77a2..6c830ddbdd 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Koolhydraten benodigd"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Bewaarde maaltijd"; /* */ "Are you sure?" = "Weet je het zeker?"; @@ -1403,9 +1403,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Voorspelde glucose"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Even geduld"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucosewaarde, "; /* */ "Target Glucose" = "Doel glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 7199dadbbc..cc5c6b8a54 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1407,7 +1407,8 @@ Połączono z Nightscout!"; /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 95ee3eb092..23942ac3b9 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 10a944286b..236041691e 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index e73c85b37d..9a9b394926 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Требуются углеводы"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Сохранённая еда"; /* */ "Are you sure?" = "Вы уверены?"; @@ -1403,9 +1403,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Возможная глюкоза"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Подождите"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Глюкоза, "; /* */ "Target Glucose" = "Целевая глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 85094b83c1..845e05d5d5 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 82e8d804a1..561b0a7dbb 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index b4d2d58ff4..ab5bad639f 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Введіть кількість вуглеводів"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Збережена їжа"; /* */ "Are you sure?" = "Ви впевнені?"; @@ -1403,9 +1403,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Можлива глюкоза"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Будь ласка, зачекайте"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Глюкоза, "; /* */ "Target Glucose" = "Цільова Глюкоза"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index b2cc936279..44c41a7046 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1405,7 +1405,8 @@ Enact a temp Basal or a temp target */ /* */ "Please wait" = "Please wait"; -"Glucose, %@" = "Glucose, %@"; +/* */ +"Glucose, " = "Glucose, "; /* */ "Target Glucose" = "Target Glucose"; From 466ad8c29c752624175dc3a766d6b7821a811ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 9 Nov 2023 17:41:51 +0100 Subject: [PATCH 208/405] Fix types --- FreeAPS/Sources/Modules/Bolus/View/Predictions.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index 1556bb3ea3..27e9ca6a08 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -101,9 +101,9 @@ struct PredictionView: View { .frame(minHeight: Config.height) .chartForegroundStyleScale([ "IOB": Color(.insulin), - "UAM": Color(.UAM), + "UAM": .uam, "COB": Color(.loopYellow), - "ZT": Color(.ZT) + "ZT": .zt ]) .chartYAxisLabel(NSLocalizedString("Glucose, ", comment: "") + units.rawValue, alignment: .center) } From 4ba70d3dc367612a04d0cbd5b2541ad032d131e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 10 Nov 2023 01:37:58 +0100 Subject: [PATCH 209/405] Crowdin Italian translations (#313) --- .../Localizations/Main/it.lproj/Localizable.strings | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 1a38a461b3..ae83898f2b 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Carboidrati necessari"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Cibo Salvato"; /* */ "Are you sure?" = "Sei sicuro?"; @@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */ "Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa"; /* Glucose badge */ -"Show glucose on the app badge" = "Mostra le glicemie sul badge dell'app"; +"Show glucose on the app badge" = "Mostra le glicemie sull'icona dell'app"; /* */ "Backfill glucose" = "Riempi glicemia"; @@ -1403,10 +1403,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "previsione glicemica"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Attendere prego"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Glicemie, "; /* */ "Target Glucose" = "Target Glicemia"; From a7f2857e171f727c7d9901b8cf1ccfc3b3efe823 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Fri, 10 Nov 2023 05:02:51 -0800 Subject: [PATCH 210/405] Change slider numbering position and add spacing #291 (#316) --- .../View/OverrideProfilesRootView.swift | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index de691d474f..a43883b0e3 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -72,6 +72,14 @@ extension OverrideProfilesConfig { } Section { VStack { + Spacer() + Text("\(state.percentage.formatted(.number)) %") + .foregroundColor( + state + .percentage >= 130 ? .red : + (isEditing ? .orange : .blue) + ) + .font(.largeTitle) Slider( value: $state.percentage, in: 10 ... 200, @@ -80,13 +88,6 @@ extension OverrideProfilesConfig { isEditing = editing } ).accentColor(state.percentage >= 130 ? .red : .blue) - Text("\(state.percentage.formatted(.number)) %") - .foregroundColor( - state - .percentage >= 130 ? .red : - (isEditing ? .orange : .blue) - ) - .font(.largeTitle) Spacer() Toggle(isOn: $state._indefinite) { Text("Enable indefinitely") From d5f4103482c6edb2bb35ede4a1318300723d5662 Mon Sep 17 00:00:00 2001 From: sethgagnon <597958+sethgagnon@users.noreply.github.com> Date: Fri, 10 Nov 2023 08:08:25 -0500 Subject: [PATCH 211/405] Update build_iAPS.yml (#318) Trying latest Xcode version --- .github/workflows/build_iAPS.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_iAPS.yml b/.github/workflows/build_iAPS.yml index 3931c5d8c0..fd44274b13 100644 --- a/.github/workflows/build_iAPS.yml +++ b/.github/workflows/build_iAPS.yml @@ -22,7 +22,7 @@ jobs: steps: # Uncomment to manually select Xcode version if needed - name: Select Xcode version - run: "sudo xcode-select --switch /Applications/Xcode_14.3.app/Contents/Developer" + run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" # Checks-out the repo - name: Checkout Repo @@ -64,4 +64,4 @@ jobs: name: build-artifacts path: | artifacts - buildlog \ No newline at end of file + buildlog From f3e4dc0348681275b7e100702ae863083b173740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:20:05 +0100 Subject: [PATCH 212/405] New translations localizable.string (Swedish) (#315) --- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 8646f0066b..45beae40de 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Kolhydrater krävs"; /* Saved Food Presets */ -"Saved Food" = "Mat"; +"Saved Food" = "Sparad mat"; /* */ "Are you sure?" = "Är du säker?"; From 6c701dd9c8fde6dc0e9f5e6462cd6af16c7c88b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 10 Nov 2023 18:50:58 +0100 Subject: [PATCH 213/405] New strings --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index ab02a1432d..d21db022e6 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1392,6 +1392,9 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ From 62c2affb79b99d7b505c8a89901c9ac2ca854bc5 Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:51:00 -0800 Subject: [PATCH 214/405] Change temp target slider number position consistent with #291 (#321) --- .../View/AddTempTargetRootView.swift | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift index d7d1a09be7..7aa646936e 100644 --- a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift +++ b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift @@ -41,10 +41,12 @@ extension AddTempTarget { } if state.viewPercantage { - Section( - header: Text("") - ) { + Section { VStack { + Text("\(state.percentage.formatted(.number)) % Insulin") + .foregroundColor(isEditing ? .orange : .blue) + .font(.largeTitle) + .padding(.vertical) Slider( value: $state.percentage, in: 15 ... @@ -54,33 +56,27 @@ extension AddTempTarget { isEditing = editing } ) - HStack { - Text("\(state.percentage.formatted(.number)) % Insulin") - .foregroundColor(isEditing ? .orange : .blue) - .font(.largeTitle) - } // Only display target slider when not 100 % if state.percentage != 100 { + Spacer() Divider() + Text( + ( + state + .units == .mmolL ? + "\(state.computeTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L" : + "\(state.computeTarget().formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) mg/dl" + ) + + NSLocalizedString(" Target Glucose", comment: "") + ) + .foregroundColor(.green) + .padding(.vertical) Slider( value: $state.hbt, in: 101 ... 295, step: 1 ).accentColor(.green) - - HStack { - Text( - ( - state - .units == .mmolL ? - "\(state.computeTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L" : - "\(state.computeTarget().formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) mg/dl" - ) - + NSLocalizedString(" Target Glucose", comment: "") - ) - .foregroundColor(.green) - } } } } From f781fec66e06648d6d30d431c8ce2effee4e2dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:00:20 +0100 Subject: [PATCH 215/405] Bolus from watch (#326) Use same calculator on Watch as on iPhone app. --- .../Core_Data.xcdatamodel/contents | 1 + FreeAPS.xcodeproj/project.pbxproj | 4 + .../Sources/APS/Storage/CoreDataStorage.swift | 34 ++++++ .../Sources/APS/Storage/GlucoseStorage.swift | 3 + FreeAPS/Sources/Models/DateFilter.swift | 1 + .../Sources/Modules/Bolus/BolusProvider.swift | 16 +-- .../Modules/Bolus/BolusStateModel.swift | 5 +- .../Services/WatchManager/WatchManager.swift | 115 +++++++++++++----- .../DataFlow.swift | 1 + .../WatchStateModel.swift | 2 + 10 files changed, 137 insertions(+), 45 deletions(-) create mode 100644 FreeAPS/Sources/APS/Storage/CoreDataStorage.swift diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 3a617a7a32..372848b776 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -129,6 +129,7 @@ + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index ebd4e222d9..aaac0746ad 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; }; 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; }; 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193F6CDC2A512C8F001240FD /* Loops.swift */; }; + 1956FB212AFF79E200C7B4FF /* CoreDataStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */; }; 195D80B42AF6973A00D25097 /* DynamicRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B32AF6973A00D25097 /* DynamicRootView.swift */; }; 195D80B72AF697B800D25097 /* DynamicDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */; }; 195D80B92AF697F700D25097 /* DynamicProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B82AF697F700D25097 /* DynamicProvider.swift */; }; @@ -532,6 +533,7 @@ 1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 1935363F28496F7D001E0B16 /* Oref2_variables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oref2_variables.swift; sourceTree = ""; }; 193F6CDC2A512C8F001240FD /* Loops.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loops.swift; sourceTree = ""; }; + 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataStorage.swift; sourceTree = ""; }; 195D80B32AF6973A00D25097 /* DynamicRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicRootView.swift; sourceTree = ""; }; 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicDataFlow.swift; sourceTree = ""; }; 195D80B82AF697F700D25097 /* DynamicProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicProvider.swift; sourceTree = ""; }; @@ -1706,6 +1708,7 @@ 38FCF3FC25E997A80078B0D1 /* PumpHistoryStorage.swift */, 38F3B2EE25ED8E2A005C48AA /* TempTargetsStorage.swift */, CE82E02428E867BA00473A9C /* AlertStorage.swift */, + 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */, ); path = Storage; sourceTree = ""; @@ -2905,6 +2908,7 @@ E25073BC86C11C3D6A42F5AC /* CalibrationsStateModel.swift in Sources */, BA90041DC8991147E5C8C3AA /* CalibrationsRootView.swift in Sources */, E3A08AAE59538BC8A8ABE477 /* NotificationsConfigDataFlow.swift in Sources */, + 1956FB212AFF79E200C7B4FF /* CoreDataStorage.swift in Sources */, 0F7A65FBD2CD8D6477ED4539 /* NotificationsConfigProvider.swift in Sources */, 3171D2818C7C72CD1584BB5E /* NotificationsConfigStateModel.swift in Sources */, CD78BB94E43B249D60CC1A1B /* NotificationsConfigRootView.swift in Sources */, diff --git a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift new file mode 100644 index 0000000000..c0caa2fd7d --- /dev/null +++ b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift @@ -0,0 +1,34 @@ +import CoreData +import Foundation +import SwiftDate +import Swinject + +final class CoreDataStorage { + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // newBackgroundContext() + + func fetchGlucose(interval: NSDate) -> [Readings] { + var fetchGlucose = [Readings]() + coredataContext.performAndWait { + let requestReadings = Readings.fetchRequest() as NSFetchRequest + let sort = NSSortDescriptor(key: "date", ascending: false) + requestReadings.sortDescriptors = [sort] + requestReadings.predicate = NSPredicate( + format: "glucose > 0 AND date > %@", interval + ) + try? fetchGlucose = self.coredataContext.fetch(requestReadings) + } + return fetchGlucose + } + + func fetchLatestOverride() -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.fetchLimit = 1 + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } +} diff --git a/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift b/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift index d731e9fd56..838eed0821 100644 --- a/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift +++ b/FreeAPS/Sources/APS/Storage/GlucoseStorage.swift @@ -71,11 +71,13 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable { var bg_ = 0 var bgDate = Date() var id = "" + var direction = "" if glucose.isNotEmpty { bg_ = glucose[0].glucose ?? 0 bgDate = glucose[0].dateString id = glucose[0].id + direction = glucose[0].direction?.symbol ?? "↔︎" } if bg_ != 0 { @@ -84,6 +86,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable { dataForForStats.date = bgDate dataForForStats.glucose = Int16(bg_) dataForForStats.id = id + dataForForStats.direction = direction try? self.coredataContext.save() } } diff --git a/FreeAPS/Sources/Models/DateFilter.swift b/FreeAPS/Sources/Models/DateFilter.swift index 42a8b7dbe8..466b699f98 100644 --- a/FreeAPS/Sources/Models/DateFilter.swift +++ b/FreeAPS/Sources/Models/DateFilter.swift @@ -2,6 +2,7 @@ import Foundation struct DateFilter { + var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate var today = Calendar.current.startOfDay(for: Date()) as NSDate var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate diff --git a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift index 962fd47f1d..a4bda5bfce 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusProvider.swift @@ -1,8 +1,6 @@ -import CoreData - extension Bolus { final class Provider: BaseProvider, BolusProvider { - let coredataContext = CoreDataStack.shared.persistentContainer.viewContext + let coreDataStorage = CoreDataStorage() var suggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) @@ -15,17 +13,7 @@ extension Bolus { } func fetchGlucose() -> [Readings] { - var fetchGlucose = [Readings]() - coredataContext.performAndWait { - let requestReadings = Readings.fetchRequest() as NSFetchRequest - let sort = NSSortDescriptor(key: "date", ascending: true) - requestReadings.sortDescriptors = [sort] - requestReadings.predicate = NSPredicate( - format: "glucose > 0 AND date > %@", - Date().addingTimeInterval(-1.hours.timeInterval) as NSDate - ) - try? fetchGlucose = self.coredataContext.fetch(requestReadings) - } + let fetchGlucose = coreDataStorage.fetchGlucose(interval: DateFilter().twoHours) return fetchGlucose } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index cc64987ee4..ecbc2a28bd 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -100,15 +100,14 @@ extension Bolus { func getDeltaBG() { let glucose = provider.fetchGlucose() guard glucose.count >= 3 else { return } - let lastGlucose = glucose.last?.glucose ?? 0 - let thirdLastGlucose = glucose[glucose.count - 3] + let lastGlucose = glucose.first?.glucose ?? 0 + let thirdLastGlucose = glucose[2] let delta = Decimal(lastGlucose) - Decimal(thirdLastGlucose.glucose) deltaBG = delta } // CALCULATIONS FOR THE BOLUS CALCULATOR func calculateInsulin() -> Decimal { - // for mmol conversion var conversion: Decimal = 1.0 if units == .mmolL { conversion = 0.0555 diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index 16df25d2b4..e4d3b6d53d 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -1,4 +1,3 @@ -import CoreData import Foundation import Swinject import WatchConnectivity @@ -12,14 +11,13 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { @Injected() private var broadcaster: Broadcaster! @Injected() private var settingsManager: SettingsManager! - @Injected() private var glucoseStorage: GlucoseStorage! @Injected() private var apsManager: APSManager! @Injected() private var storage: FileStorage! @Injected() private var carbsStorage: CarbsStorage! @Injected() private var tempTargetsStorage: TempTargetsStorage! @Injected() private var garmin: GarminManager! - let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // newBackgroundContext() + let coreDataStorage = CoreDataStorage() private var lifetime = Lifetime() @@ -57,12 +55,13 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { private func configureState() { processQueue.async { - let glucoseValues = self.glucoseText() + let readings = self.coreDataStorage.fetchGlucose(interval: DateFilter().twoHours) + let glucoseValues = self.glucoseText(readings) self.state.glucose = glucoseValues.glucose self.state.trend = glucoseValues.trend self.state.delta = glucoseValues.delta - self.state.trendRaw = self.glucoseStorage.recent().last?.direction?.rawValue - self.state.glucoseDate = self.glucoseStorage.recent().last?.dateString + self.state.trendRaw = readings.first?.direction ?? "↔︎" + self.state.glucoseDate = readings.first?.date ?? .distantPast self.state.glucoseDateInterval = self.state.glucoseDate.map { UInt64($0.timeIntervalSince1970) } self.state.lastLoopDate = self.enactedSuggestion?.recieved == true ? self.enactedSuggestion?.deliverAt : self .apsManager.lastLoopDate @@ -76,16 +75,26 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.carbsRequired = self.suggestion?.carbsReq var insulinRequired = self.suggestion?.insulinReq ?? 0 + var double: Decimal = 2 - if (self.suggestion?.cob ?? 0) > 0 { - if self.suggestion?.manualBolusErrorString == 0 { - insulinRequired = self.suggestion?.insulinForManualBolus ?? 0 - double = 1 - } + if self.suggestion?.manualBolusErrorString == 0 { + insulinRequired = self.suggestion?.insulinForManualBolus ?? 0 + double = 1 } - self.state.bolusRecommended = self.apsManager - .roundBolus(amount: max(insulinRequired * (self.settingsManager.settings.insulinReqPercentage / 100) * double, 0)) + self.state.useNewCalc = self.settingsManager.settings.useCalc + + if !(self.state.useNewCalc ?? false) { + self.state.bolusRecommended = self.apsManager + .roundBolus(amount: max( + insulinRequired * (self.settingsManager.settings.insulinReqPercentage / 100) * double, + 0 + )) + } else { + let recommended = self.newBolusCalc(delta: readings, suggestion: self.suggestion) + self.state.bolusRecommended = self.apsManager + .roundBolus(amount: max(recommended, 0)) + } self.state.iob = self.suggestion?.iob self.state.cob = self.suggestion?.cob @@ -113,12 +122,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.isf = self.suggestion?.isf - var overrideArray = [Override]() - let requestOverrides = Override.fetchRequest() as NSFetchRequest - let sortOverride = NSSortDescriptor(key: "date", ascending: false) - requestOverrides.sortDescriptors = [sortOverride] - requestOverrides.fetchLimit = 1 - try? overrideArray = self.coredataContext.fetch(requestOverrides) + let overrideArray = self.coreDataStorage.fetchLatestOverride() if overrideArray.first?.enabled ?? false { let percentString = "\((overrideArray.first?.percentage ?? 100).formatted(.number)) %" @@ -147,26 +151,25 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { } } - private func glucoseText() -> (glucose: String, trend: String, delta: String) { - let glucose = glucoseStorage.recent() + private func glucoseText(_ glucose: [Readings]) -> (glucose: String, trend: String, delta: String) { + let glucoseValue = glucose.first?.glucose ?? 0 - guard let lastGlucose = glucose.last, let glucoseValue = lastGlucose.glucose else { return ("--", "--", "--") } + guard !glucose.isEmpty else { return ("--", "--", "--") } - let delta = glucose.count >= 2 ? glucoseValue - (glucose[glucose.count - 2].glucose ?? 0) : nil + let delta = glucose.count >= 2 ? glucoseValue - glucose[1].glucose : nil let units = settingsManager.settings.units let glucoseText = glucoseFormatter .string(from: Double( - units == .mmolL ? glucoseValue - .asMmolL : Decimal(glucoseValue) + units == .mmolL ? Decimal(glucoseValue).asMmolL : Decimal(glucoseValue) ) as NSNumber)! - let directionText = lastGlucose.direction?.symbol ?? "↔︎" + + let directionText = glucose.first?.direction ?? "↔︎" let deltaText = delta .map { self.deltaFormatter .string(from: Double( - units == .mmolL ? $0 - .asMmolL : Decimal($0) + units == .mmolL ? Decimal($0).asMmolL : Decimal($0) ) as NSNumber)! } ?? "--" @@ -200,6 +203,62 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { )! } + private func newBolusCalc(delta: [Readings], suggestion _: Suggestion?) -> Decimal { + var conversion: Decimal = 1 + // Settings + if settingsManager.settings.units == .mmolL { + conversion = 0.0555 + } + let isf = state.isf ?? 0 + let target = suggestion?.current_target ?? 0 + let carbratio = suggestion?.carbRatio ?? 0 + let bg = delta.first?.glucose ?? 0 + let cob = state.cob ?? 0 + let iob = state.iob ?? 0 + let useFattyMealCorrectionFactor = settingsManager.settings.fattyMeals + let fattyMealFactor = settingsManager.settings.fattyMealFactor + let maxBolus = settingsManager.pumpSettings.maxBolus + var insulinCalculated: Decimal = 0 + // insulin needed for the current blood glucose + let targetDifference = (Decimal(bg) - target) * conversion + let targetDifferenceInsulin = targetDifference / isf + // more or less insulin because of bg trend in the last 15 minutes + var bgDelta: Int = 0 + if delta.count >= 3 { + bgDelta = Int((delta.first?.glucose ?? 0) - delta[2].glucose) + } + let fifteenMinInsulin = (Decimal(bgDelta) * conversion) / isf + // determine whole COB for which we want to dose insulin for and then determine insulin for wholeCOB + let wholeCobInsulin = cob / carbratio + // determine how much the calculator reduces/ increases the bolus because of IOB + let iobInsulinReduction = (-1) * iob + // adding everything together + // add a calc for the case that no fifteenMinInsulin is available + var wholeCalc: Decimal = 0 + if bgDelta != 0 { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin + fifteenMinInsulin) + } else { + // add (rare) case that no glucose value is available -> maybe display warning? + // if no bg is available, ?? sets its value to 0 + if bg == 0 { + wholeCalc = (iobInsulinReduction + wholeCobInsulin) + } else { + wholeCalc = (targetDifferenceInsulin + iobInsulinReduction + wholeCobInsulin) + } + } + // apply custom factor at the end of the calculations + let result = wholeCalc * settingsManager.settings.overrideFactor + // apply custom factor if fatty meal toggle in bolus calc config settings is on and the box for fatty meals is checked (in RootView) + if useFattyMealCorrectionFactor { + insulinCalculated = result * fattyMealFactor + } else { + insulinCalculated = result + } + // Not 0 or over maxBolus + insulinCalculated = max(min(insulinCalculated, maxBolus), 0) + return insulinCalculated + } + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal diff --git a/FreeAPSWatch WatchKit Extension/DataFlow.swift b/FreeAPSWatch WatchKit Extension/DataFlow.swift index cf4b81602d..d6f7848c13 100644 --- a/FreeAPSWatch WatchKit Extension/DataFlow.swift +++ b/FreeAPSWatch WatchKit Extension/DataFlow.swift @@ -22,6 +22,7 @@ struct WatchState: Codable { var eventualBGRaw: String? var displayOnWatch: AwConfig? var displayFatAndProteinOnWatch: Bool? + var useNewCalc: Bool? var isf: Decimal? var override: String? } diff --git a/FreeAPSWatch WatchKit Extension/WatchStateModel.swift b/FreeAPSWatch WatchKit Extension/WatchStateModel.swift index 8d5a7b20ba..387e0920be 100644 --- a/FreeAPSWatch WatchKit Extension/WatchStateModel.swift +++ b/FreeAPSWatch WatchKit Extension/WatchStateModel.swift @@ -34,6 +34,7 @@ class WatchStateModel: NSObject, ObservableObject { @Published var isBolusViewActive = false @Published var displayOnWatch: AwConfig = .BGTarget @Published var displayFatAndProteinOnWatch = false + @Published var useNewCalc = false @Published var eventualBG = "" @Published var isConfirmationViewActive = false { didSet { @@ -174,6 +175,7 @@ class WatchStateModel: NSObject, ObservableObject { eventualBG = state.eventualBG ?? "" displayOnWatch = state.displayOnWatch ?? .BGTarget displayFatAndProteinOnWatch = state.displayFatAndProteinOnWatch ?? false + useNewCalc = state.useNewCalc ?? false isf = state.isf override = state.override } From 3220f533e353feda7db2483c072dd260ad6af82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 11 Nov 2023 17:08:26 +0100 Subject: [PATCH 216/405] New string --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index d21db022e6..46f2d6f106 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1395,6 +1395,9 @@ Enact a temp Basal or a temp target */ /* */ "Predictions" = "Predictions"; +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ From 7d6e51616c0bcf945fae05b6c89920245ccd42b4 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Sun, 12 Nov 2023 02:19:24 -0800 Subject: [PATCH 217/405] Omnipod update bundle with Silence Pod mode & Diagnostics support (#324) * Update bundle with various improvements and new functionality including Silence Pod mode & Diagnostics support from freeaps_dev to SwiftUI Various fault event code updates + Add missing 0x4E code and description for SAW Trim Error + Fix typo in rtcInterruptHandlerInconsistentState string + Improved description string for the testInProgress fault + Use more generic name for the values do not match case + Add codes for the 0xD6 & 0xD7 reset faults of unknown origin + Add codes for the mystery 0xCB, 0xD4, 0xD5, 0xD8 & 0xD9 faults Various Omnipod message decode improvements + Round RateEntry rate calculation to 2 digits + Round RateEntry duration calculation to nearest second + Add missing comma to RateEntry debugDescription + New timeIntervalStr TimeInterval var for pod interval debug info + Update some command commenting to be more consistent and useful + Add debugDescription for CancelDeliveryCommand DeliveryType + Add additional PodInfoTest checking and comments + Whitespace tweaks for OmniKit & OmniBLE consistency Remove some overly verbose OmniBLE Bluetooth logging messages + Add {public} specifier to some non-debug logging messages New operation mode that suppresses all pod alerts & beeping + New CustomDebugStringConvertible extension for AlertTrigger + Add new optional silent Bool parameter to AlertConfiguration struct + Updated CustomDebugStringConvertible extension for AlertConfiguration + Add new optional silent Bool associated value for most PodAlert enum values + Add new offset TimeInterval associated value for time based PodAlert enum values + Updated AlertSlot naming to make slot to alert mappings consistent + Use consistent ascending alert ordering for all switch statements + New alertSetString func to return suitable String for a given AlertSet + New func to create corresponding PodAlerts for current pod time and silent values + Add new silent Bool to ConfigureAlertsCommand struct + Sort alert configurations in ConfigureAlertsCommand for easier analysis + Have ConfigureAlertsCommand enforce the max alert duration value + Rework pump manager code to use new silencePod var + Use { } instead of ({ }) for {set,modify}State for consistency & clarity + Add timeActive var to pump manager for more accurate pod active time + Have acknowlegePodAlerts() use AlertSet instead of [AlertSlot: PodAlert] + New setSilencePod pump manager func to change the pod's silence state + Add some additional pump manager error logging statements + Add new silencePod var to the pump manager state + Rework PodAlerts creation for new podActive time offset and silence values + New PodState var's to manage pod time active state + Remove no longer needed activeAlerts PodState var func + Update updatePodTimes func to manages new time active var's + Update all unit tests as needed for new names & members + Rework UI to use updated simplied interfaces for alertStrings from AlertSlots + Add new Pod Settings button for Silence Pod and Unsilence Pod + Update UI to use new new pod active pod state + Have Pod Settings UI set the pod's expiration reminder alert + Various commenting additions/updates/improvements/corrections Read Pod Status display and consistency updates + Add new faultDescription var for FaultEventCode + Display errorEventInfo details for Pod fault details + Various AlertSlot comment updates for consistency + Make PumpManager silencePod and confirmationBeeps vars read-only + Consistency updates for setTempBasal result handling + Improved OmniBLE PodCommsError recoverySuggestion for noResponse and podNotConnected + Change OmniKit acknowledgeAlerts() to acknowledgePodAlerts() for consistency + New Silence Pod option and View + Update pulseLogString newlines for SwiftUI output + Replace pumpmanager mutateState() with discardableResult with setState() + Restore getDetailedStatus() pumpmanager funcs + enactTempBasal() func skips unneeded pod cancel if running scheduled basal + Restore deliveryStatus PodState variable to verify pod delivery state + Restore lastCommsOK PodState variable for additional comms verification + Add bulletproofing for all insulin commands to prevent 0x31 faults + Updated Notification Settings & Confidence Reminders text for silent pod + New Diagnostics command section at end of Pump Settings > Restore Loop 2.x/FreeAPS Read Pod Status diagnostic command > Restore Loop 2.x/FreeAPS Read Pulse Log diagnostic command > Restore Loop 2.x/FreeAPS Play Test Beeps diagnostic command > New Pump Manager Details diagnostic command + Fix some mismatched comments for some copied LocalizedString's + Update a couple of messages to avoid using the word "Loop" + Add missing LocalizedString funcs for various buttons + Print Pod Details View Sequence # as a zero padded 7-digit value + Fix typo in Pod Details View LocalizedString comment + Updated Pod Fault display with decimal & hex values & separate description line + Prevent immediate low reservoir pod alerts if setting a value higher than current + Improved debugDescription formatting for various PumpManager related state + Allow expiration reminder to be triggered more than once + Acknowledge all pod alerts when toggling silence pod state for safety + Fix to prevent podState expiresAt jumping after a reset pod fault + New PumpManagerAlert to post and clear any unexpected pod alerts + Cleaned up some uneeded PumpManagerAlert related cruft + Improved SwiftUI previews for many views + Fixed various comment typos and errors + Convert some inconsistent uses of NSLocalizedString to LocalizedString + Remove some uneeded and inconsistent semicolons in OmnipodSettingsView + White space cleanup to minimize OmniKit & OmniBLE source file differences + New configuredAlertsString func for detailed info on configured alerts + Renamed alertString func to alertSetString func for better clarity + Clearer PumpManager debug strings for optional current & previous PodState + Clearer PodState debug strings for optional Fault and pdmRef + Add additional bulletproofing for suspend time expired alert clearing Reworked and improved pump manager settings layout + Device Details -> Pod Details + Previous Pod Information -> Previous Pod Details + Remove Pod -> Deactivate Pod Improved alert handling when toggling pod silence state during suspend + reset suspendTimeExpired alert if active and alert not acknowledged + fix logic error which caused podSuspendedReminder alert not to be reset Pod suspend alert handling improvements + Don't clear suspend time expired pod alert to continue beeping until resume + Keep suspend time expired pod beeps on 15m intervals when toggling Silence Pod Make pod fault code, description and ref string info more available + Added the decimal fault # to the reservoir display for a faulted pod + Deactivate pod view includes notification string for common faults + Deactivate pod includes fault # & Ref string for unexpected pod faults Disable selective pod settings commands based on pod state + Disable Set Temporary Basal Rate when pod is faulted or not active + Disable Play Test Beeps Diagnostic when pod is faulted or not active + Disable Read Pod Status and Read Pulse Log Diagnostics with no pod Add missing OmniKitUI.xcassets for Cannula Inserted & reservoir masks * Fix logic error for fault display text during Pod Deactvation Improve OmniBLE/PumpManagerUI directory Xcode sorting --- .../OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 56 +- .../OmniBLE/Bluetooth/BluetoothServices.swift | 2 - .../Bluetooth/EnDecrypt/EnDecrypt.swift | 12 - .../Bluetooth/PeripheralManager+OmniBLE.swift | 9 - .../OmniBLE/Bluetooth/PodProtocolError.swift | 2 +- .../OmniBLE/OmnipodCommon/AlertSlot.swift | 627 ++++++++++++++---- .../OmnipodCommon/BasalDeliveryTable.swift | 12 +- .../OmniBLE/OmnipodCommon/BasalSchedule.swift | 6 +- .../OmnipodCommon/BeepPreference.swift | 4 +- .../OmniBLE/OmniBLE/OmnipodCommon/CRC16.swift | 2 +- .../OmnipodCommon/FaultEventCode.swift | 605 ++++++++--------- .../MessageBlocks/CancelDeliveryCommand.swift | 56 +- .../ConfigureAlertsCommand.swift | 16 +- .../MessageBlocks/DeactivatePodCommand.swift | 5 +- .../MessageBlocks/DetailedStatus.swift | 46 +- .../MessageBlocks/PodInfoPulseLog.swift | 6 +- .../MessageBlocks/StatusResponse.swift | 6 +- .../MessageBlocks/TempBasalExtraCommand.swift | 2 +- .../OmnipodCommon/PendingCommand.swift | 15 +- .../OmniBLE/OmniBLE/OmnipodCommon/Pod.swift | 6 +- .../OmnipodCommon/PumpManagerAlert.swift | 82 +-- .../OmnipodCommon/SilencePodPreference.swift | 32 + .../OmnipodCommon/UnfinalizedDose.swift | 8 +- .../PumpManager/MessageTransport.swift | 9 +- .../PumpManager/OmniBLEPumpManager.swift | 357 +++++++--- .../PumpManager/OmniBLEPumpManagerState.swift | 18 +- .../OmniBLE/PumpManager/PodCommsSession.swift | 57 +- .../OmniBLE/PumpManager/PodState.swift | 106 ++- .../ViewControllers/DashUICoordinator.swift | 2 +- .../ViewModels/DeactivatePodViewModel.swift | 53 +- .../ViewModels/OmniBLESettingsViewModel.swift | 48 +- .../ViewModels/PodLifeState.swift | 2 +- .../PumpManagerUI/Views/ActivityView.swift | 36 + .../PumpManagerUI/Views/AttachPodView.swift | 2 +- .../Views/BeepPreferenceSelectionView.swift | 10 +- .../Views/ExpirationReminderPickerView.swift | 2 +- .../PumpManagerUI/Views/FirstAppear.swift | 30 + .../Views/ManualTempBasalEntryView.swift | 7 +- .../Views/NotificationSettingsView.swift | 19 +- .../Views/OmniBLESettingsView.swift | 78 ++- .../Views/PlayTestBeepsView.swift | 101 +++ .../PumpManagerUI/Views/PodDetailsView.swift | 11 +- .../Views/PumpManagerDetailsView.swift | 100 +++ .../Views/ReadPodStatusView.swift | 167 +++++ .../Views/ReadPulseLogView.swift | 128 ++++ .../Views/SilencePodSelectionView.swift | 143 ++++ .../Views/UncertaintyRecoveredView.swift | 4 +- .../OmniKit/OmniKit.xcodeproj/project.pbxproj | 98 ++- .../OmniKit/OmnipodCommon/AlertSlot.swift | 609 +++++++++++++---- .../OmnipodCommon/BasalDeliveryTable.swift | 12 +- .../OmnipodCommon/BeepPreference.swift | 4 +- .../OmnipodCommon/FaultEventCode.swift | 526 +++++++-------- .../MessageBlocks/CancelDeliveryCommand.swift | 56 +- .../ConfigureAlertsCommand.swift | 16 +- .../MessageBlocks/DeactivatePodCommand.swift | 5 +- .../MessageBlocks/DetailedStatus.swift | 48 +- .../MessageBlocks/PodInfoPulseLog.swift | 8 +- .../MessageBlocks/StatusResponse.swift | 2 +- .../MessageBlocks/TempBasalExtraCommand.swift | 2 +- .../OmniKit/OmniKit/OmnipodCommon/Pod.swift | 3 - .../OmnipodCommon/PumpManagerAlert.swift | 40 +- .../OmnipodCommon/SilencePodPreference.swift | 32 + .../PumpManager/OmnipodPumpManager.swift | 339 +++++++--- .../PumpManager/OmnipodPumpManagerState.swift | 23 +- .../OmniKit/PumpManager/PodComms.swift | 1 - .../OmniKit/PumpManager/PodCommsSession.swift | 55 +- .../OmniKit/PumpManager/PodState.swift | 93 ++- .../OmniKit/OmniKitTests/PodInfoTests.swift | 8 +- .../CannulaInserted.png | Bin 0 -> 36749 bytes .../Cannula Inserted.imageset/Contents.json | 21 + .../Contents.json | 16 + .../pod_reservoir_mask.svg | 55 ++ .../Contents.json | 15 + .../pod_reservoir.svg | 59 ++ .../OmnipodUICoordinator.swift | 2 +- .../ViewModels/DeactivatePodViewModel.swift | 41 +- .../ViewModels/OmnipodSettingsViewModel.swift | 44 +- .../OmniKitUI/ViewModels/PodLifeState.swift | 2 +- .../OmniKitUI/Views/ActivityView.swift | 36 + .../OmniKitUI/Views/AttachPodView.swift | 4 +- .../Views/BeepPreferenceSelectionView.swift | 12 +- .../Views/CheckInsertedCannulaView.swift | 2 +- .../OmniKitUI/Views/DeactivatePodView.swift | 2 +- .../Views/ExpirationReminderSetupView.swift | 2 +- .../OmniKit/OmniKitUI/Views/FirstAppear.swift | 30 + .../OmniKitUI/Views/InsertCannulaView.swift | 2 +- .../Views/InsulinTypeConfirmation.swift | 2 +- .../Views/LowReservoirReminderSetupView.swift | 2 +- .../Views/ManualTempBasalEntryView.swift | 7 +- .../Views/NotificationSettingsView.swift | 21 +- .../OmniKitUI/Views/OmnipodSettingsView.swift | 81 ++- .../OmniKit/OmniKitUI/Views/PairPodView.swift | 4 +- .../OmniKitUI/Views/PlayTestBeepsView.swift | 100 +++ .../OmniKitUI/Views/PodDetailsView.swift | 9 +- .../OmniKitUI/Views/PodSetupView.swift | 2 +- .../Views/PumpManagerDetailsView.swift | 100 +++ .../OmniKitUI/Views/ReadPodStatusView.swift | 168 +++++ .../OmniKitUI/Views/ReadPulseLogView.swift | 128 ++++ .../OmniKitUI/Views/SetupCompleteView.swift | 4 +- .../Views/SilencePodSelectionView.swift | 144 ++++ .../Views/UncertaintyRecoveredView.swift | 5 +- 101 files changed, 4614 insertions(+), 1595 deletions(-) create mode 100644 Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ActivityView.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/FirstAppear.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/SilencePodSelectionView.swift create mode 100644 Dependencies/OmniKit/OmniKit/OmnipodCommon/SilencePodPreference.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/CannulaInserted.png create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/Contents.json create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/Contents.json create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/pod_reservoir_mask.svg create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/Contents.json create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/pod_reservoir.svg create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/ActivityView.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/FirstAppear.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/SilencePodSelectionView.swift diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index 59cee9826c..4bb73b4b48 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -168,6 +168,14 @@ D802CD0A27DD98C10072E3A1 /* TempBasalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD0527DD98C10072E3A1 /* TempBasalTests.swift */; }; D802CD1027DD99AB0072E3A1 /* CRC16Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD0F27DD99AB0072E3A1 /* CRC16Tests.swift */; }; D802CD1227DD9AE10072E3A1 /* BasalScheduleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD1127DD9AE10072E3A1 /* BasalScheduleTests.swift */; }; + D845A1332AF89DB500EA0853 /* SilencePodPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */; }; + D845A1372AF89F5500EA0853 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1362AF89F5500EA0853 /* ActivityView.swift */; }; + D845A1392AF89F6300EA0853 /* FirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1382AF89F6300EA0853 /* FirstAppear.swift */; }; + D845A13B2AF89F7100EA0853 /* PlayTestBeepsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */; }; + D845A13F2AF89F8400EA0853 /* ReadPodStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */; }; + D845A1402AF89F8400EA0853 /* ReadPulseLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */; }; + D845A1412AF89F8400EA0853 /* PumpManagerDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */; }; + D845A1432AF89F9200EA0853 /* SilencePodSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */; }; D8896C6227890E6B00E09A96 /* DetailedStatus+OmniBLE.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8896C6127890E6B00E09A96 /* DetailedStatus+OmniBLE.swift */; }; D895BF5B275DE64000D51FC7 /* StringLengthPrefixEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D895BF5A275DE64000D51FC7 /* StringLengthPrefixEncoding.swift */; }; D897B06B29347ED500FDB009 /* BolusDeliveryTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D897B06A29347ED500FDB009 /* BolusDeliveryTable.swift */; }; @@ -420,6 +428,14 @@ D802CD0527DD98C10072E3A1 /* TempBasalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempBasalTests.swift; sourceTree = ""; }; D802CD0F27DD99AB0072E3A1 /* CRC16Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CRC16Tests.swift; sourceTree = ""; }; D802CD1127DD9AE10072E3A1 /* BasalScheduleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasalScheduleTests.swift; sourceTree = ""; }; + D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SilencePodPreference.swift; path = "/Users/Joe_1/Documents/iaps/iaps-11-05-19-dev/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift"; sourceTree = ""; }; + D845A1362AF89F5500EA0853 /* ActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; + D845A1382AF89F6300EA0853 /* FirstAppear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstAppear.swift; sourceTree = ""; }; + D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayTestBeepsView.swift; sourceTree = ""; }; + D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodStatusView.swift; sourceTree = ""; }; + D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPulseLogView.swift; sourceTree = ""; }; + D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PumpManagerDetailsView.swift; sourceTree = ""; }; + D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodSelectionView.swift; sourceTree = ""; }; D8896C6127890E6B00E09A96 /* DetailedStatus+OmniBLE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DetailedStatus+OmniBLE.swift"; sourceTree = ""; }; D895BF5A275DE64000D51FC7 /* StringLengthPrefixEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringLengthPrefixEncoding.swift; sourceTree = ""; }; D897B06A29347ED500FDB009 /* BolusDeliveryTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusDeliveryTable.swift; sourceTree = ""; }; @@ -477,6 +493,7 @@ 1016325627185EE4007A3BC2 /* PodProgressStatus.swift */, C1F67ED927979E400017487F /* PumpManagerAlert.swift */, C1F67EE127985F580017487F /* ReservoirLevel.swift */, + D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */, 1016325827185EE4007A3BC2 /* UnfinalizedDose.swift */, ); path = OmnipodCommon; @@ -705,12 +722,12 @@ 8475311D26ED8246009FD801 /* PumpManagerUI */ = { isa = PBXGroup; children = ( - C1F67EBB27975F060017487F /* ViewModels */, + C1F67EDF2797B1EF0017487F /* OmniBLEHUDProvider.swift */, 1029AE4A27094DDC00B7F5B6 /* OmniBLEPumpManager+UI.swift */, 1029AE4E27094E1900B7F5B6 /* OmniBLEUI.xcassets */, 8475312626ED838A009FD801 /* ViewControllers */, + C1F67EBB27975F060017487F /* ViewModels */, 8475311E26ED838A009FD801 /* Views */, - C1F67EDF2797B1EF0017487F /* OmniBLEHUDProvider.swift */, ); path = PumpManagerUI; sourceTree = ""; @@ -718,34 +735,41 @@ 8475311E26ED838A009FD801 /* Views */ = { isa = PBXGroup; children = ( - C1C001C327A2351D00533D35 /* OmniBLEReservoirView.swift */, - C1C001C227A2351D00533D35 /* OmniBLEReservoirView.xib */, - C1F67EB227975E710017487F /* DesignElements */, + D845A1362AF89F5500EA0853 /* ActivityView.swift */, C1F67E7327975B830017487F /* AttachPodView.swift */, C1F67E7A27975B830017487F /* BasalStateView.swift */, + C1ED1E7127BAE44E00FED71C /* BeepPreferenceSelectionView.swift */, C1F67E8027975B830017487F /* CheckInsertedCannulaView.swift */, - C1F67E7727975B830017487F /* OmniBLESettingsView.swift */, C1F67E7927975B830017487F /* DeactivatePodView.swift */, C1F67E8227975B830017487F /* DeliveryUncertaintyRecoveryView.swift */, + C1F67EB227975E710017487F /* DesignElements */, C1F67E7B27975B830017487F /* ExpirationReminderPickerView.swift */, C1F67E7827975B830017487F /* ExpirationReminderSetupView.swift */, + D845A1382AF89F6300EA0853 /* FirstAppear.swift */, C1F67E7D27975B830017487F /* HUDAssets.xcassets */, C1F67E8527975B830017487F /* InsertCannulaView.swift */, + C187C190278FCEC9006E3557 /* InsulinTypeConfirmation.swift */, C1F67E8627975B830017487F /* LowReservoirReminderEditView.swift */, C1F67E7C27975B830017487F /* LowReservoirReminderSetupView.swift */, + C1DBD512282FF79D009FCF74 /* ManualTempBasalEntryView.swift */, C1F67E8127975B830017487F /* NotificationSettingsView.swift */, + C1C001C327A2351D00533D35 /* OmniBLEReservoirView.swift */, + C1C001C227A2351D00533D35 /* OmniBLEReservoirView.xib */, + C1F67E7727975B830017487F /* OmniBLESettingsView.swift */, C1F67E7F27975B830017487F /* PairPodView.swift */, + D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */, C1F67E8A27975B830017487F /* PodDetailsView.swift */, + 8475311F26ED838A009FD801 /* PodLifeHUDView.swift */, + 8475312426ED838A009FD801 /* PodLifeHUDView.xib */, C1F67E8827975B830017487F /* PodSetupView.swift */, + D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */, + D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */, + D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */, C1F67E7427975B830017487F /* ScheduledExpirationReminderEditView.swift */, C1F67E8727975B830017487F /* SetupCompleteView.swift */, + D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */, C1F67E7627975B830017487F /* TimeView.swift */, C1F67E8427975B830017487F /* UncertaintyRecoveredView.swift */, - 8475311F26ED838A009FD801 /* PodLifeHUDView.swift */, - 8475312426ED838A009FD801 /* PodLifeHUDView.xib */, - C187C190278FCEC9006E3557 /* InsulinTypeConfirmation.swift */, - C1ED1E7127BAE44E00FED71C /* BeepPreferenceSelectionView.swift */, - C1DBD512282FF79D009FCF74 /* ManualTempBasalEntryView.swift */, ); path = Views; sourceTree = ""; @@ -836,10 +860,10 @@ C1F67EBB27975F060017487F /* ViewModels */ = { isa = PBXGroup; children = ( - C1F67EC227975F360017487F /* OmniBLESettingsViewModel.swift */, C1F67EC027975F360017487F /* DeactivatePodViewModel.swift */, C1F67EC127975F360017487F /* DeliveryUncertaintyRecoveryViewModel.swift */, C1F67EBD27975F360017487F /* InsertCannulaViewModel.swift */, + C1F67EC227975F360017487F /* OmniBLESettingsViewModel.swift */, C1F67EBE27975F360017487F /* PairPodViewModel.swift */, C1F67EC327975F360017487F /* PodLifeState.swift */, ); @@ -1059,6 +1083,7 @@ 1029AE4927094D0E00B7F5B6 /* OmniBLEPumpManagerState.swift in Sources */, 10289E7D2739F893000339E6 /* Milenage.swift in Sources */, 10389A3A26FF7841002115E9 /* SetInsulinScheduleCommand.swift in Sources */, + D845A13B2AF89F7100EA0853 /* PlayTestBeepsView.swift in Sources */, 10389A3826FF7841002115E9 /* DetailedStatus.swift in Sources */, C1F67E9927975B830017487F /* NotificationSettingsView.swift in Sources */, 10389A2B26FF7841002115E9 /* PlaceholderMessageBlock.swift in Sources */, @@ -1103,6 +1128,7 @@ C1ED1E7227BAE44E00FED71C /* BeepPreferenceSelectionView.swift in Sources */, 84752EDE26ED13F5009FD801 /* PeripheralManagerError.swift in Sources */, 10389A2526FF7841002115E9 /* PodInfoActivationTime.swift in Sources */, + D845A1432AF89F9200EA0853 /* SilencePodSelectionView.swift in Sources */, C1F67E9A27975B830017487F /* DeliveryUncertaintyRecoveryView.swift in Sources */, 1021114D2709467400784F13 /* PodComms.swift in Sources */, 10289E6E27309327000339E6 /* CBPeripheral.swift in Sources */, @@ -1120,6 +1146,8 @@ C1F67EC927975F360017487F /* DeliveryUncertaintyRecoveryViewModel.swift in Sources */, 1016325C27185EE5007A3BC2 /* BasalDeliveryTable.swift in Sources */, 84752EE326ED13F5009FD801 /* BLEPacket.swift in Sources */, + D845A1402AF89F8400EA0853 /* ReadPulseLogView.swift in Sources */, + D845A1332AF89DB500EA0853 /* SilencePodPreference.swift in Sources */, 102111472709462300784F13 /* PodState.swift in Sources */, 1021114B2709462300784F13 /* BasalSchedule+LoopKit.swift in Sources */, 84752EE626ED13F5009FD801 /* LTKExchanger.swift in Sources */, @@ -1129,6 +1157,7 @@ C1F67E9227975B830017487F /* BasalStateView.swift in Sources */, 1024E32B27446DB000DE01F2 /* MessagePacket.swift in Sources */, 10289E7B2739F886000339E6 /* EapMessage.swift in Sources */, + D845A1392AF89F6300EA0853 /* FirstAppear.swift in Sources */, C1C001C127A2349D00533D35 /* OmniBLE.swift in Sources */, 10389A3326FF7841002115E9 /* CancelDeliveryCommand.swift in Sources */, C1DBD513282FF79D009FCF74 /* ManualTempBasalEntryView.swift in Sources */, @@ -1136,6 +1165,7 @@ C1F67EA027975B830017487F /* PodSetupView.swift in Sources */, C1ED1E7027BAE1A600FED71C /* BeepPreference.swift in Sources */, 10389A3B26FF7841002115E9 /* ConfigureAlertsCommand.swift in Sources */, + D845A13F2AF89F8400EA0853 /* ReadPodStatusView.swift in Sources */, D8896C6227890E6B00E09A96 /* DetailedStatus+OmniBLE.swift in Sources */, 10389A3926FF7841002115E9 /* PodInfoResponse.swift in Sources */, 84752EE226ED13F5009FD801 /* PayloadJoiner.swift in Sources */, @@ -1145,6 +1175,7 @@ C1F67EC827975F360017487F /* DeactivatePodViewModel.swift in Sources */, C1F67E9127975B830017487F /* DeactivatePodView.swift in Sources */, 84752EE726ED13F5009FD801 /* PairResult.swift in Sources */, + D845A1412AF89F8400EA0853 /* PumpManagerDetailsView.swift in Sources */, 8475315D26EDA193009FD801 /* Data.swift in Sources */, C1F67E9427975B830017487F /* LowReservoirReminderSetupView.swift in Sources */, C1F67EB627975E710017487F /* RoundedCard.swift in Sources */, @@ -1162,6 +1193,7 @@ 10389A2E26FF7841002115E9 /* FaultConfigCommand.swift in Sources */, C1F67E9F27975B830017487F /* SetupCompleteView.swift in Sources */, C1F67EE227985F580017487F /* ReservoirLevel.swift in Sources */, + D845A1372AF89F5500EA0853 /* ActivityView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Dependencies/OmniBLE/OmniBLE/Bluetooth/BluetoothServices.swift b/Dependencies/OmniBLE/OmniBLE/Bluetooth/BluetoothServices.swift index ec9a0904f0..21d88c876d 100644 --- a/Dependencies/OmniBLE/OmniBLE/Bluetooth/BluetoothServices.swift +++ b/Dependencies/OmniBLE/OmniBLE/Bluetooth/BluetoothServices.swift @@ -56,7 +56,6 @@ extension PeripheralManager.Configuration { guard let characteristic = manager.peripheral.getCommandCharacteristic() else { return } guard let value = characteristic.value else { return } - manager.log.default("CMD <<< %{public}@", value.hexadecimalString) manager.queueLock.lock() manager.cmdQueue.append(value) manager.queueLock.signal() @@ -66,7 +65,6 @@ extension PeripheralManager.Configuration { guard let characteristic = manager.peripheral.getDataCharacteristic() else { return } guard let value = characteristic.value else { return } - manager.log.default("DATA <<< %{public}@", value.hexadecimalString) manager.queueLock.lock() manager.dataQueue.append(value) manager.queueLock.signal() diff --git a/Dependencies/OmniBLE/OmniBLE/Bluetooth/EnDecrypt/EnDecrypt.swift b/Dependencies/OmniBLE/OmniBLE/Bluetooth/EnDecrypt/EnDecrypt.swift index 44dbf3f61c..17dcaebf5c 100644 --- a/Dependencies/OmniBLE/OmniBLE/Bluetooth/EnDecrypt/EnDecrypt.swift +++ b/Dependencies/OmniBLE/OmniBLE/Bluetooth/EnDecrypt/EnDecrypt.swift @@ -26,15 +26,9 @@ class EnDecrypt { let header = msg.asData(forEncryption: false).subdata(in: 0..<16) let n = nonce.toData(sqn: nonceSeq, podReceiving: false) - log.debug("Decrypt ck %@", ck.hexadecimalString) - log.debug("Decrypt header %@", header.hexadecimalString) - log.debug("Decrypt payload: %@", payload.hexadecimalString) - log.debug("Decrypt Nonce %@", n.hexadecimalString) - log.debug("Decrypt Tag: %@", Data(payload).subdata(in: (payload.count - MAC_SIZE)..>> %{public}@", Data([command.rawValue]).hexadecimalString) try writeValue(Data([command.rawValue]), for: characteristic, type: .withResponse, timeout: timeout) } @@ -157,8 +155,6 @@ extension PeripheralManager { func waitForCommand(_ command: PodCommand, timeout: TimeInterval = 5) throws { dispatchPrecondition(condition: .onQueue(queue)) - log.debug("waitForCommand %{public}@", Data([command.rawValue]).hexadecimalString) - // Wait for data to be read. queueLock.lock() if (cmdQueue.count == 0) { @@ -199,8 +195,6 @@ extension PeripheralManager { throw PeripheralManagerError.notReady } - log.default("DATA >>> %{public}@", value.hexadecimalString) - try writeValue(value, for: characteristic, type: .withResponse, timeout: timeout) } @@ -208,8 +202,6 @@ extension PeripheralManager { func waitForData(sequence: UInt8, timeout: TimeInterval) throws -> Data { dispatchPrecondition(condition: .onQueue(queue)) - log.default("waitForData sequence %02x", sequence) - // Wait for data to be read. queueLock.lock() if (dataQueue.count == 0) { @@ -235,7 +227,6 @@ extension PeripheralManager { log.error("waitForData failed data[0] != sequence (%d != %d).", data[0], sequence) throw PeripheralManagerError.incorrectResponse } - log.default("waitForData success %{public}@", data.hexadecimalString) return data } diff --git a/Dependencies/OmniBLE/OmniBLE/Bluetooth/PodProtocolError.swift b/Dependencies/OmniBLE/OmniBLE/Bluetooth/PodProtocolError.swift index 7c428a1252..07e8361691 100644 --- a/Dependencies/OmniBLE/OmniBLE/Bluetooth/PodProtocolError.swift +++ b/Dependencies/OmniBLE/OmniBLE/Bluetooth/PodProtocolError.swift @@ -1,6 +1,6 @@ // // PodProtocolError.swift -// OmnipodKit +// OmniBLE // // Created by Randall Knutson on 8/3/21. // diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/AlertSlot.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/AlertSlot.swift index cef58d31b4..d61dd190ba 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/AlertSlot.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/AlertSlot.swift @@ -9,11 +9,29 @@ import Foundation +fileprivate let defaultShutdownImminentTime = Pod.serviceDuration - Pod.endOfServiceImminentWindow +fileprivate let defaultExpirationReminderTime = Pod.nominalPodLife - Pod.defaultExpirationReminderOffset +fileprivate let defaultExpiredTime = Pod.nominalPodLife + +// PDM and pre-SwiftUI use every1MinuteFor3MinutesAndRepeatEvery15Minutes, but with SwiftUI use every15Minutes +fileprivate let suspendTimeExpiredBeepRepeat = BeepRepeat.every15Minutes + public enum AlertTrigger { case unitsRemaining(Double) case timeUntilAlert(TimeInterval) } +extension AlertTrigger: CustomDebugStringConvertible { + public var debugDescription: String { + switch self { + case .unitsRemaining(let units): + return "\(Int(units))U" + case .timeUntilAlert(let triggerTime): + return "triggerTime=\(triggerTime.timeIntervalStr)" + } + } +} + public enum BeepRepeat: UInt8 { case once = 0 case every1MinuteFor3MinutesAndRepeatEvery60Minutes = 1 @@ -30,29 +48,48 @@ public enum BeepRepeat: UInt8 { public struct AlertConfiguration { let slot: AlertSlot - let trigger: AlertTrigger let active: Bool let duration: TimeInterval + let trigger: AlertTrigger let beepRepeat: BeepRepeat let beepType: BeepType + let silent: Bool let autoOffModifier: Bool static let length = 6 - public init(alertType: AlertSlot, active: Bool = true, autoOffModifier: Bool = false, duration: TimeInterval, trigger: AlertTrigger, beepRepeat: BeepRepeat, beepType: BeepType) { + public init(alertType: AlertSlot, active: Bool = true, duration: TimeInterval = 0, trigger: AlertTrigger, beepRepeat: BeepRepeat, beepType: BeepType, silent: Bool = false, autoOffModifier: Bool = false) + { self.slot = alertType self.active = active - self.autoOffModifier = autoOffModifier self.duration = duration self.trigger = trigger self.beepRepeat = beepRepeat self.beepType = beepType + self.silent = silent + self.autoOffModifier = autoOffModifier } } extension AlertConfiguration: CustomDebugStringConvertible { public var debugDescription: String { - return "AlertConfiguration(slot:\(slot), active:\(active), autoOffModifier:\(autoOffModifier), duration:\(duration), trigger:\(trigger), beepRepeat:\(beepRepeat), beepType:\(beepType))" + var str = "slot:\(slot)" + if !active { + str += ", active:\(active)" + } + if duration != 0 { + str += ", duration:\(duration.timeIntervalStr)" + } + str += ", trigger:\(trigger), beepRepeat:\(beepRepeat)" + if beepType != .noBeepNonCancel { + str += ", beepType:\(beepType)" + } else { + str += ", silent:\(silent)" + } + if autoOffModifier { + str += ", autoOffModifier:\(autoOffModifier)" + } + return "\nAlertConfiguration(\(str))" } } @@ -61,54 +98,73 @@ extension AlertConfiguration: CustomDebugStringConvertible { public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { public typealias RawValue = [String: Any] - // 2 hours long, time for user to start pairing process - case waitingForPairingReminder + // slot0AutoOff: auto-off timer; requires user input every x minutes -- NOT IMPLEMENTED + case autoOff(active: Bool, offset: TimeInterval, countdownDuration: TimeInterval, silent: Bool = false) - // 1 hour long, time for user to finish priming, cannula insertion - case finishSetupReminder + // slot1NotUsed + case notUsed - // User configurable with PDM (1-24 hours before 72 hour expiration) "Change Pod Soon" - case expirationReminder(TimeInterval) + // slot2ShutdownImminent: 79 hour alarm (1 hour before shutdown) + // 2 sets of beeps every 15 minutes for 1 hour + case shutdownImminent(offset: TimeInterval, absAlertTime: TimeInterval, silent: Bool = false) - // 72 hour alarm - case expired(alertTime: TimeInterval, duration: TimeInterval) + // slot3ExpirationReminder: User configurable with PDM (1-24 hours before 72 hour expiration) + // 2 sets of beeps every minute for 3 minutes and repeat every 15 minutes + // The PDM doesn't use a duration for this alert (presumably because it is limited to 2^9-1 minutes or 8h31m) + case expirationReminder(offset: TimeInterval, absAlertTime: TimeInterval, duration: TimeInterval = 0, silent: Bool = false) - // 79 hour alarm (1 hour before shutdown) - case shutdownImminent(TimeInterval) + // slot4LowReservoir: reservoir below configured value alert + case lowReservoir(units: Double, silent: Bool = false) - // reservoir below configured value alert - case lowReservoir(Double) + // slot5SuspendedReminder: pod suspended reminder, before suspendTime; + // short beep every 15 minutes if > 30 min, else short beep every 5 minutes + case podSuspendedReminder(active: Bool, offset: TimeInterval, suspendTime: TimeInterval, timePassed: TimeInterval = 0, silent: Bool = false) - // auto-off timer; requires user input every x minutes - case autoOff(active: Bool, countdownDuration: TimeInterval) + // slot6SuspendTimeExpired: pod suspend time expired alarm, after suspendTime; + // 2 sets of beeps every minute for 3 minutes repeated every 15 minutes (PDM & pre-SwiftUI implementations) + // 2 sets of beeps every 15 minutes (for SwiftUI PumpManagerAlerts implementations) + case suspendTimeExpired(offset: TimeInterval, suspendTime: TimeInterval, silent: Bool = false) - // pod suspended reminder, before suspendTime; short beep every 15 minutes if > 30 min, else every 5 minutes - case podSuspendedReminder(active: Bool, suspendTime: TimeInterval) + // slot7Expired: 2 hours long, time for user to start pairing process + case waitingForPairingReminder - // pod suspend time expired alarm, after suspendTime; 2 sets of beeps every min for 3 minutes repeated every 15 minutes - case suspendTimeExpired(suspendTime: TimeInterval) + // slot7Expired: 1 hour long, time for user to finish priming, cannula insertion + case finishSetupReminder + + // slot7Expired: 72 hour alarm + case expired(offset: TimeInterval, absAlertTime: TimeInterval, duration: TimeInterval, silent: Bool = false) public var description: String { var alertName: String switch self { - case .waitingForPairingReminder: - return LocalizedString("Waiting for pairing reminder", comment: "Description waiting for pairing reminder") - case .finishSetupReminder: - return LocalizedString("Finish setup reminder", comment: "Description for finish setup reminder") - case .expirationReminder: - alertName = LocalizedString("Expiration alert", comment: "Description for expiration alert") - case .expired: - alertName = LocalizedString("Expiration advisory", comment: "Description for expiration advisory") - case .shutdownImminent: - alertName = LocalizedString("Shutdown imminent", comment: "Description for shutdown imminent") - case .lowReservoir(let units): - alertName = String(format: LocalizedString("Low reservoir advisory (%1$gU)", comment: "Format string for description for low reservoir advisory (1: reminder units)"), units) + // slot0AutoOff case .autoOff: - alertName = LocalizedString("Auto-off", comment: "Description for auto-off") + alertName = LocalizedString("Auto-off", comment: "Description for auto-off alert") + // slot1NotUsed + case .notUsed: + alertName = LocalizedString("Not used", comment: "Description for not used slot alert") + // slot2ShutdownImminent + case .shutdownImminent: + alertName = LocalizedString("Shutdown imminent", comment: "Description for shutdown imminent alert") + // slot3ExpirationReminder + case .expirationReminder: + alertName = LocalizedString("Expiration reminder", comment: "Description for expiration reminder alert") + // slot4LowReservoir + case .lowReservoir: + alertName = LocalizedString("Low reservoir", comment: "Format string for description for low reservoir alert") + // slot5SuspendedReminder case .podSuspendedReminder: - alertName = LocalizedString("Pod suspended reminder", comment: "Description for pod suspended reminder") + alertName = LocalizedString("Pod suspended reminder", comment: "Description for pod suspended reminder alert") + // slot6SuspendTimeExpired case .suspendTimeExpired: - alertName = LocalizedString("Suspend time expired", comment: "Description for suspend time expired") + alertName = LocalizedString("Suspend time expired", comment: "Description for suspend time expired alert") + // slot7Expired + case .waitingForPairingReminder: + alertName = LocalizedString("Waiting for pairing reminder", comment: "Description waiting for pairing reminder alert") + case .finishSetupReminder: + alertName = LocalizedString("Finish setup reminder", comment: "Description for finish setup reminder alert") + case .expired: + alertName = LocalizedString("Pod expired", comment: "Description for pod expired alert") } if self.configuration.active == false { alertName += LocalizedString(" (inactive)", comment: "Description for an inactive alert modifier") @@ -118,71 +174,126 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { public var configuration: AlertConfiguration { switch self { - case .waitingForPairingReminder: - return AlertConfiguration(alertType: .slot7, duration: .minutes(110), trigger: .timeUntilAlert(.minutes(10)), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .finishSetupReminder: - return AlertConfiguration(alertType: .slot7, duration: .minutes(55), trigger: .timeUntilAlert(.minutes(5)), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .expirationReminder(let alertTime): - let active = alertTime != 0 // disable if alertTime is 0 - return AlertConfiguration(alertType: .slot3, active: active, duration: 0, trigger: .timeUntilAlert(alertTime), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .expired(let alarmTime, let duration): - let active = alarmTime != 0 // disable if alarmTime is 0 - return AlertConfiguration(alertType: .slot7, active: active, duration: duration, trigger: .timeUntilAlert(alarmTime), beepRepeat: .every60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .shutdownImminent(let alarmTime): - let active = alarmTime != 0 // disable if alarmTime is 0 - return AlertConfiguration(alertType: .slot2, active: active, duration: 0, trigger: .timeUntilAlert(alarmTime), beepRepeat: .every15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .lowReservoir(let units): + // slot0AutoOff + case .autoOff(let active, _, let countdownDuration, let silent): + return AlertConfiguration(alertType: .slot0AutoOff, active: active, duration: .minutes(15), trigger: .timeUntilAlert(countdownDuration), beepRepeat: .every1MinuteFor15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent, autoOffModifier: true) + + // slot1NotUsed + case .notUsed: + return AlertConfiguration(alertType: .slot1NotUsed, duration: .minutes(55), trigger: .timeUntilAlert(.minutes(5)), beepRepeat: .every5Minutes, beepType: .noBeepNonCancel) + + // slot2ShutdownImminent + case .shutdownImminent(let offset, let absAlertTime, let silent): + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = 0 + } + return AlertConfiguration(alertType: .slot2ShutdownImminent, active: active, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot3ExpirationReminder + case .expirationReminder(let offset, let absAlertTime, let duration, let silent): + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = 0 + } + return AlertConfiguration(alertType: .slot3ExpirationReminder, active: active, duration: duration, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot4LowReservoir + case .lowReservoir(let units, let silent): let active = units != 0 // disable if units is 0 - return AlertConfiguration(alertType: .slot4, active: active, duration: 0, trigger: .unitsRemaining(units), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .autoOff(let active, let countdownDuration): - return AlertConfiguration(alertType: .slot0, active: active, autoOffModifier: true, duration: .minutes(15), trigger: .timeUntilAlert(countdownDuration), beepRepeat: .every1MinuteFor15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .podSuspendedReminder(let active, let suspendTime): - // A suspendTime of 0 is an untimed suspend + return AlertConfiguration(alertType: .slot4LowReservoir, active: active, trigger: .unitsRemaining(units), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot5SuspendedReminder + // A suspendTime of 0 is an untimed suspend + // timePassed will be > 0 for an existing pod suspended reminder changing its silent state + case .podSuspendedReminder(let active, _, let suspendTime, let timePassed, let silent): let reminderInterval, duration: TimeInterval - let trigger: AlertTrigger - let beepRepeat: BeepRepeat + var beepRepeat: BeepRepeat let beepType: BeepType - if active { - if suspendTime >= TimeInterval(minutes :30) { - // Use 15-minute pod suspended reminder beeps for longer scheduled suspend times as per PDM. - reminderInterval = TimeInterval(minutes: 15) - beepRepeat = .every15Minutes - } else { - // Use 5-minute pod suspended reminder beeps for shorter scheduled suspend times. - reminderInterval = TimeInterval(minutes: 5) - beepRepeat = .every5Minutes - } + let trigger: AlertTrigger + var isActive: Bool = active + + if suspendTime == 0 || suspendTime >= TimeInterval(minutes: 30) { + // Use 15-minute pod suspended reminder beeps for untimed or longer scheduled suspend times. + reminderInterval = TimeInterval(minutes: 15) + beepRepeat = .every15Minutes + } else { + // Use 5-minute pod suspended reminder beeps for shorter scheduled suspend times. + reminderInterval = TimeInterval(minutes: 5) + beepRepeat = .every5Minutes + } + + // Make alert inactive if there isn't enough remaining in suspend time for a reminder beep. + let suspendTimeRemaining = suspendTime - timePassed + if suspendTime != 0 && suspendTimeRemaining <= reminderInterval { + isActive = false + } + + if isActive { + // Compute the alert trigger time as the interval until the next upcoming reminder interval + let triggerTime: TimeInterval = .seconds(reminderInterval - Double((Int(timePassed) % Int(reminderInterval)))) + if suspendTime == 0 { duration = 0 // Untimed suspend, no duration - } else if suspendTime > reminderInterval { - duration = suspendTime - reminderInterval // End after suspendTime total time } else { - duration = .minutes(1) // Degenerate case, end ASAP + // duration is from triggerTime to suspend time remaining + duration = suspendTimeRemaining - triggerTime } - trigger = .timeUntilAlert(reminderInterval) // Start after reminderInterval has passed + trigger = .timeUntilAlert(triggerTime) // time to next reminder interval with the suspend time beepType = .beep } else { + beepRepeat = .once duration = 0 trigger = .timeUntilAlert(.minutes(0)) - beepRepeat = .once beepType = .noBeepCancel } - return AlertConfiguration(alertType: .slot5, active: active, duration: duration, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType) - case .suspendTimeExpired(let suspendTime): + return AlertConfiguration(alertType: .slot5SuspendedReminder, active: isActive, duration: duration, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType, silent: silent) + + // slot6SuspendTimeExpired + case .suspendTimeExpired(_, let suspendTime, let silent): let active = suspendTime != 0 // disable if suspendTime is 0 let trigger: AlertTrigger let beepRepeat: BeepRepeat let beepType: BeepType if active { trigger = .timeUntilAlert(suspendTime) - beepRepeat = .every1MinuteFor3MinutesAndRepeatEvery15Minutes + beepRepeat = suspendTimeExpiredBeepRepeat beepType = .bipBeepBipBeepBipBeepBipBeep } else { trigger = .timeUntilAlert(.minutes(0)) beepRepeat = .once beepType = .noBeepCancel } - return AlertConfiguration(alertType: .slot6, active: active, duration: 0, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType) + return AlertConfiguration(alertType: .slot6SuspendTimeExpired, active: active, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType, silent: silent) + + // slot7Expired + case .waitingForPairingReminder: + // After pod is powered up, beep every 10 minutes for up to 2 hours before pairing before failing + let totalDuration: TimeInterval = .hours(2) + let startOffset: TimeInterval = .minutes(10) + return AlertConfiguration(alertType: .slot7Expired, duration: totalDuration - startOffset, trigger: .timeUntilAlert(startOffset), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) + case .finishSetupReminder: + // After pod is paired, beep every 5 minutes for up to 1 hour for pod setup to complete before failing + let totalDuration: TimeInterval = .hours(1) + let startOffset: TimeInterval = .minutes(5) + return AlertConfiguration(alertType: .slot7Expired, duration: totalDuration - startOffset, trigger: .timeUntilAlert(startOffset), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) + case .expired(let offset, let absAlertTime, let duration, let silent): + // Normally used to alert at Pod.nominalPodLife (72 hours) for Pod.expirationAdvisoryWindow (7 hours) + // 2 sets of beeps repeating every 60 minutes + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = .minutes(0) + } + return AlertConfiguration(alertType: .slot7Expired, active: active, duration: duration, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) } } @@ -195,51 +306,92 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { } switch name { - case "waitingForPairingReminder": - self = .waitingForPairingReminder - case "finishSetupReminder": - self = .finishSetupReminder - case "expirationReminder": - guard let alertTime = rawValue["alertTime"] as? Double else { - return nil - } - self = .expirationReminder(TimeInterval(alertTime)) - case "expired": - guard let alarmTime = rawValue["alarmTime"] as? Double, - let duration = rawValue["duration"] as? Double else + case "autoOff": + guard let active = rawValue["active"] as? Bool, + let countdownDuration = rawValue["countdownDuration"] as? TimeInterval else { return nil } - self = .expired(alertTime: TimeInterval(alarmTime), duration: TimeInterval(duration)) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .autoOff(active: active, offset: offset, countdownDuration: countdownDuration, silent: silent) case "shutdownImminent": - guard let alarmTime = rawValue["alarmTime"] as? Double else { + guard let alarmTime = rawValue["alarmTime"] as? TimeInterval else { return nil } - self = .shutdownImminent(alarmTime) - case "lowReservoir": - guard let units = rawValue["units"] as? Double else { + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultShutdownImminentTime + offsetToUse = absAlertTime - alarmTime + } else { + absAlertTime = offset + alarmTime + offsetToUse = offset + } + let silent = rawValue["silent"] as? Bool ?? false + self = .shutdownImminent(offset: offsetToUse, absAlertTime: absAlertTime, silent: silent) + case "expirationReminder": + guard let alertTime = rawValue["alertTime"] as? TimeInterval else { return nil } - self = .lowReservoir(units) - case "autoOff": - guard let active = rawValue["active"] as? Bool, - let countdownDuration = rawValue["countdownDuration"] as? Double else - { + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultExpirationReminderTime + offsetToUse = absAlertTime - alertTime + } else { + absAlertTime = offset + alertTime + offsetToUse = offset + } + let duration = rawValue["duration"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .expirationReminder(offset: offsetToUse, absAlertTime: absAlertTime, duration: duration, silent: silent) + case "lowReservoir": + guard let units = rawValue["units"] as? Double else { return nil } - self = .autoOff(active: active, countdownDuration: TimeInterval(countdownDuration)) + let silent = rawValue["silent"] as? Bool ?? false + self = .lowReservoir(units: units, silent: silent) case "podSuspendedReminder": guard let active = rawValue["active"] as? Bool, - let suspendTime = rawValue["suspendTime"] as? Double else + let suspendTime = rawValue["suspendTime"] as? TimeInterval else { return nil } - self = .podSuspendedReminder(active: active, suspendTime: suspendTime) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .podSuspendedReminder(active: active, offset: offset, suspendTime: suspendTime, silent: silent) case "suspendTimeExpired": guard let suspendTime = rawValue["suspendTime"] as? Double else { return nil } - self = .suspendTimeExpired(suspendTime: suspendTime) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .suspendTimeExpired(offset: offset, suspendTime: suspendTime, silent: silent) + case "waitingForPairingReminder": + self = .waitingForPairingReminder + case "finishSetupReminder": + self = .finishSetupReminder + case "expired": + guard let alarmTime = rawValue["alarmTime"] as? TimeInterval, + let duration = rawValue["duration"] as? TimeInterval else + { + return nil + } + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultExpiredTime + offsetToUse = absAlertTime - alarmTime + } else { + absAlertTime = offset + alarmTime + offsetToUse = offset + } + let silent = rawValue["silent"] as? Bool ?? false + self = .expired(offset: offsetToUse, absAlertTime: absAlertTime, duration: duration, silent: silent) default: return nil } @@ -249,50 +401,65 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { let name: String = { switch self { - case .waitingForPairingReminder: - return "waitingForPairingReminder" - case .finishSetupReminder: - return "finishSetupReminder" - case .expirationReminder: - return "expirationReminder" - case .expired: - return "expired" + case .autoOff: + return "autoOff" + case .notUsed: + return "notUsed" case .shutdownImminent: return "shutdownImminent" + case .expirationReminder: + return "expirationReminder" case .lowReservoir: return "lowReservoir" - case .autoOff: - return "autoOff" case .podSuspendedReminder: return "podSuspendedReminder" case .suspendTimeExpired: return "suspendTimeExpired" + case .waitingForPairingReminder: + return "waitingForPairingReminder" + case .finishSetupReminder: + return "finishSetupReminder" + case .expired: + return "expired" } }() - var rawValue: RawValue = [ "name": name, ] switch self { - case .expirationReminder(let alertTime): - rawValue["alertTime"] = alertTime - case .expired(let alarmTime, let duration): - rawValue["alarmTime"] = alarmTime - rawValue["duration"] = duration - case .shutdownImminent(let alarmTime): - rawValue["alarmTime"] = alarmTime - case .lowReservoir(let units): - rawValue["units"] = units - case .autoOff(let active, let countdownDuration): + case .autoOff(let active, let offset, let countdownDuration, let silent): rawValue["active"] = active + rawValue["offset"] = offset rawValue["countdownDuration"] = countdownDuration - case .podSuspendedReminder(let active, let suspendTime): + rawValue["silent"] = silent + case .shutdownImminent(let offset, let absAlertTime, let silent): + rawValue["offset"] = offset + rawValue["alarmTime"] = absAlertTime - offset + rawValue["silent"] = silent + case .expirationReminder(let offset, let absAlertTime, let duration, let silent): + rawValue["offset"] = offset + rawValue["alertTime"] = absAlertTime - offset + rawValue["duration"] = duration + rawValue["silent"] = silent + case .lowReservoir(let units, let silent): + rawValue["units"] = units + rawValue["silent"] = silent + case .podSuspendedReminder(let active, let offset, let suspendTime, _, let silent): rawValue["active"] = active + rawValue["offset"] = offset rawValue["suspendTime"] = suspendTime - case .suspendTimeExpired(let suspendTime): + rawValue["silent"] = silent + case .suspendTimeExpired(let offset, let suspendTime, let silent): + rawValue["offset"] = offset rawValue["suspendTime"] = suspendTime + rawValue["silent"] = silent + case .expired(let offset, let absAlertTime, let duration, let silent): + rawValue["offset"] = offset + rawValue["alarmTime"] = absAlertTime - offset + rawValue["duration"] = duration + rawValue["silent"] = silent default: break } @@ -302,42 +469,42 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { } public enum AlertSlot: UInt8 { - case slot0 = 0x00 - case slot1 = 0x01 - case slot2 = 0x02 - case slot3 = 0x03 - case slot4 = 0x04 - case slot5 = 0x05 - case slot6 = 0x06 - case slot7 = 0x07 + case slot0AutoOff = 0x00 + case slot1NotUsed = 0x01 + case slot2ShutdownImminent = 0x02 + case slot3ExpirationReminder = 0x03 + case slot4LowReservoir = 0x04 + case slot5SuspendedReminder = 0x05 + case slot6SuspendTimeExpired = 0x06 + case slot7Expired = 0x07 public var bitMaskValue: UInt8 { return 1< AlertSlot { return elements[index] } - + public func index(after i: Int) -> Int { return i+1 } - + public var description: String { if elements.count == 0 { return LocalizedString("No alerts", comment: "Pod alert state when no alerts are active") @@ -374,9 +541,179 @@ public struct AlertSet: RawRepresentable, Collection, CustomStringConvertible, E // Returns true if there are any active suspend related alerts public func hasActiveSuspendAlert(configuredAlerts: [AlertSlot : PodAlert]) -> Bool { - // slot5 is for podSuspendedReminder and slot6 is for suspendTimeExpired - if configuredAlerts.contains(where: { ($0.key == .slot5 || $0.key == .slot6) && $0.value.configuration.active }) { + if configuredAlerts.contains(where: { ($0.key == .slot5SuspendedReminder || $0.key == .slot6SuspendTimeExpired) && $0.value.configuration.active }) + { return true } return false } + +// Returns a descriptive string for all the alerts in alertSet +public func alertSetString(alertSet: AlertSet) -> String { + + if alertSet.isEmpty { + // Don't bother displaying any additional info for an inactive alert + return String(describing: alertSet) + } + + let alertDescription = alertSet.map { (slot) -> String in + switch slot { + case .slot0AutoOff: + return PodAlert.autoOff(active: true, offset: 0, countdownDuration: 0).description + case .slot1NotUsed: + return PodAlert.notUsed.description + case .slot2ShutdownImminent: + return PodAlert.shutdownImminent(offset: 0, absAlertTime: defaultShutdownImminentTime).description + case .slot3ExpirationReminder: + return PodAlert.expirationReminder(offset: 0, absAlertTime: defaultExpirationReminderTime).description + case .slot4LowReservoir: + return PodAlert.lowReservoir(units: Pod.maximumReservoirReading).description + case .slot5SuspendedReminder: + return PodAlert.podSuspendedReminder(active: true, offset: 0, suspendTime: .minutes(30)).description + case .slot6SuspendTimeExpired: + return PodAlert.suspendTimeExpired(offset: 0, suspendTime: .minutes(30)).description + case .slot7Expired: + return PodAlert.expired(offset: 0, absAlertTime: defaultExpiredTime, duration: Pod.expirationAdvisoryWindow).description + } + } + + return alertDescription.joined(separator: ", ") +} + +func configuredAlertsString(configuredAlerts: [AlertSlot : PodAlert]) -> String { + + if configuredAlerts.isEmpty { + return String(describing: configuredAlerts) + } + + let configuredAlertString = configuredAlerts.map { (configuredAlert) -> String in + + let podAlert = configuredAlert.value + let description = podAlert.description + guard podAlert.configuration.active else { + return description + } + + switch podAlert { + case .shutdownImminent(_, let absAlertTime, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + case .expirationReminder(_, let absAlertTime, _, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + case .lowReservoir(let unitTrigger, _): + return String(format: "%@ @ %dU", description, Int(unitTrigger)) + case .podSuspendedReminder(_, let offset, let suspendTime, _, _): + return String(format: "%@ ending @ %@ after %@", description, (offset + suspendTime).timeIntervalStr, suspendTime.timeIntervalStr) + case .suspendTimeExpired(let offset, let suspendTime, _): + return String(format: "%@ @ %@ after %@", description, (offset + suspendTime).timeIntervalStr, suspendTime.timeIntervalStr) + case .expired(_, let absAlertTime, _, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + default: + return "" + } + } + + return configuredAlertString.joined(separator: ", ") +} + +// Returns an array of appropriate PodAlerts with the specified silent value +// for all the configuredAlerts given all the current pod conditions. +func regeneratePodAlerts(silent: Bool, configuredAlerts: [AlertSlot: PodAlert], activeAlertSlots: AlertSet, currentPodTime: TimeInterval, currentReservoirLevel: Double) -> [PodAlert] { + var podAlerts: [PodAlert] = [] + + for alert in configuredAlerts { + // Just skip this alert if not previously active + guard alert.value.configuration.active else { + continue + } + + // Map alerts to corresponding appropriate new ones at the current pod time using the specified silent value. + switch alert.value { + + case .shutdownImminent(let offset, let alertTime, _): + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultShutdownImminentTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + } + // create new shutdownImminent podAlert using the current timeActive and the original absolute alert time + podAlerts.append(PodAlert.shutdownImminent(offset: currentPodTime, absAlertTime: absAlertTime, silent: silent)) + + case .expirationReminder(let offset, let alertTime, let alertDuration, _): + let duration: TimeInterval + + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultExpirationReminderTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + duration = 0 + } else { + duration = alertDuration + } + // create new expirationReminder podAlert using the current active time and the original absolute alert time and duration + podAlerts.append(PodAlert.expirationReminder(offset: currentPodTime, absAlertTime: absAlertTime, duration: duration, silent: silent)) + + case .lowReservoir(let unitTrigger, _): + let units: Double + if currentReservoirLevel > unitTrigger { + units = unitTrigger + } else { + // reservoir is no longer more than the unitTrigger, make inactive using a 0 value + units = 0 + } + podAlerts.append(PodAlert.lowReservoir(units: units, silent: silent)) + + case .podSuspendedReminder(let active, let offset, let suspendTime, _, _): + let timePassed: TimeInterval = min(currentPodTime - offset, .hours(2)) + // Pass along the computed time passed since alert was originally set so creation routine can + // do all the grunt work dealing with varying reminder intervals and time passing scenarios. + podAlerts.append(PodAlert.podSuspendedReminder(active: active, offset: offset, suspendTime: suspendTime, timePassed: timePassed, silent: silent)) + + case .suspendTimeExpired(let lastOffset, let lastSuspendTime, _): + let absAlertTime = lastOffset + lastSuspendTime + let suspendTime: TimeInterval + if currentPodTime >= absAlertTime { + // alert trigger is no longer in the future + if activeAlertSlots.contains(where: { $0 == .slot6SuspendTimeExpired } ) { + // The suspendTimeExpired alert has yet been acknowledged, + // set up a suspendTimeExpired alert for the next 15m interval. + // Compute a new suspendTime that is a multiple of 15 minutes + // from lastOffset which is at least one minute in the future. + let newOffsetSuspendTime = ceil((currentPodTime - lastOffset) / .minutes(15)) * .minutes(15) + let newAbsAlertTime = lastOffset + newOffsetSuspendTime + suspendTime = max(newAbsAlertTime - currentPodTime, .minutes(1)) + } else { + // The suspendTimeExpired alert was already been acknowledged, + // so now make this alert inactive by using a 0 suspendTime. + suspendTime = 0 + } + } else { + // recompute a new suspendTime based on the current pod time + suspendTime = absAlertTime - currentPodTime + print("setting new suspendTimeExpired suspendTime of \(suspendTime) with currentPodTime\(currentPodTime) and absAlertTime=\(absAlertTime)") + } + // create a new suspendTimeExpired PodAlert using the current active time and the computed suspendTime (if any) + podAlerts.append(PodAlert.suspendTimeExpired(offset: currentPodTime, suspendTime: suspendTime, silent: silent)) + + case .expired(let offset, let alertTime, let alertDuration, _): + let duration: TimeInterval + + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultExpiredTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + duration = 0 + } else { + duration = alertDuration + } + // create new expired podAlert using the current active time and the original absolute alert time and duration + podAlerts.append(PodAlert.expired(offset: currentPodTime, absAlertTime: absAlertTime, duration: duration, silent: silent)) + + default: + break + } + } + return podAlerts +} diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift index c49b627b30..e11b273462 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift @@ -164,8 +164,9 @@ public struct RateEntry { // Eros zero TB is the only case not using pulses return 0 } else { - // Use delayBetweenPulses to compute rate, works for non-Eros near zero rates - return (.hours(1) / delayBetweenPulses) / Pod.pulsesPerUnit + // Use delayBetweenPulses to compute rate which will also work for non-Eros near zero rates. + // Round the rate calculation to a two digit value to avoid slightly off values for some cases. + return round(((.hours(1) / delayBetweenPulses) / Pod.pulsesPerUnit) * 100) / 100.0 } } @@ -174,8 +175,9 @@ public struct RateEntry { // Eros zero TB case uses fixed 30 minute rate entries return TimeInterval(minutes: 30) } else { - // Use delayBetweenPulses to compute duration, works for non-Eros near zero rates - return delayBetweenPulses * totalPulses + // Use delayBetweenPulses to compute duration which will also work for non-Eros near zero rates. + // Round to nearest second to not be slightly off of the 30 minute rate entry boundary for some cases. + return round(delayBetweenPulses * totalPulses) } } @@ -231,6 +233,6 @@ public struct RateEntry { extension RateEntry: CustomDebugStringConvertible { public var debugDescription: String { - return "RateEntry(rate:\(rate) duration:\(duration.stringValue))" + return "RateEntry(rate:\(rate), duration:\(duration.timeIntervalStr))" } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalSchedule.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalSchedule.swift index 26a22ac147..29b437b6a2 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalSchedule.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalSchedule.swift @@ -25,7 +25,7 @@ public struct BasalScheduleEntry: RawRepresentable, Equatable { self.rate = rrate self.startTime = startTime } - + // MARK: - RawRepresentable public init?(rawValue: RawValue) { @@ -61,13 +61,13 @@ public struct BasalSchedule: RawRepresentable, Equatable { let (_, entry, _) = lookup(offset: offset) return entry.rate } - + // Only valid for fixed offset timezones public func currentRate(using calendar: Calendar, at date: Date = Date()) -> Double { let midnight = calendar.startOfDay(for: date) return rateAt(offset: date.timeIntervalSince(midnight)) } - + // Returns index, entry, and time remaining func lookup(offset: TimeInterval) -> (Int, BasalScheduleEntry, TimeInterval) { guard offset >= 0 && offset < .hours(24) else { diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BeepPreference.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BeepPreference.swift index b912521754..981f4ed0af 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BeepPreference.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BeepPreference.swift @@ -29,9 +29,9 @@ public enum BeepPreference: Int, CaseIterable { case .silent: return LocalizedString("No confidence reminders are used.", comment: "Description for BeepPreference.silent") case .manualCommands: - return LocalizedString("Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used.", comment: "Description for BeepPreference.manualCommands") + return LocalizedString("Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used.", comment: "Description for BeepPreference.manualCommands") case .extended: - return LocalizedString("Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate.", comment: "Description for BeepPreference.extended") + return LocalizedString("Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate.", comment: "Description for BeepPreference.extended") } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/CRC16.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/CRC16.swift index 406fad53aa..16f4ee5844 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/CRC16.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/CRC16.swift @@ -4,7 +4,7 @@ // // From OmniKit/MessageTransport/CRC16.swift // Created by Pete Schwamb on 10/14/17. -// Copyright © 2017 Pete Schwambs. All rights reserved. +// Copyright © 2017 Pete Schwamb. All rights reserved. // import Foundation diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/FaultEventCode.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/FaultEventCode.swift index 7af8c45e7f..835ae6e332 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/FaultEventCode.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/FaultEventCode.swift @@ -26,6 +26,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case invalidBeepRepeatPattern = 0x09 case bf0notEqualToBF1 = 0x0A case tableCorruptionTempBasalSubcommand = 0x0B + case resetDueToCOP = 0x0D case resetDueToIllegalOpcode = 0x0E case resetDueToIllegalAddress = 0x0F @@ -76,6 +77,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case testInProgress = 0x3C case problemWithPumpAnchor = 0x3D case errorFlashWrite = 0x3E + case encoderCountTooHigh = 0x40 case encoderCountExcessiveVariance = 0x41 case encoderCountTooLow = 0x42 @@ -90,6 +92,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case trimICSTooCloseTo0x1FF = 0x4B case problemFindingBestTrimValue = 0x4C case badSetTPM1MultiCasesValue = 0x4D + case sawTrimError = 0x4E case unexpectedRFErrorFlagDuringReset = 0x4F case timerPulseWidthModulatorOverflow = 0x50 case tickcntError = 0x51 @@ -110,11 +113,13 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case occlusionCheckStartup1 = 0x60 case occlusionCheckStartup2 = 0x61 case occlusionCheckTimeouts1 = 0x62 + case occlusionCheckTimeouts2 = 0x66 case occlusionCheckTimeouts3 = 0x67 case occlusionCheckPulseIssue = 0x68 case occlusionCheckBolusProblem = 0x69 case occlusionCheckAboveThreshold = 0x6A + case basalUnderInfusion = 0x80 case basalOverInfusion = 0x81 case tempBasalUnderInfusion = 0x82 @@ -138,9 +143,11 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case illegalInterLockChan = 0x95 case badStateInClearBolusIST2AndVars = 0x96 case badStateInMaybeInc33D = 0x97 + case bleTimeout = 0xA0 case bleInitiated = 0xA1 case bleUnkAlarm = 0xA2 + case bleIaas = 0xA6 case crcFailure = 0xA8 case bleWdPingTimeout = 0xA9 @@ -148,6 +155,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case bleNakError = 0xAB case bleReqHighTimeout = 0xAC case bleUnknownResp = 0xAD + case bleReqStuckHigh = 0xAF case bleStateMachine1 = 0xB1 case bleStateMachine2 = 0xB2 @@ -155,7 +163,17 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case bleEr48DualNack = 0xC0 case bleQnExceedMaxRetry = 0xC1 case bleQnCritVarFail = 0xC2 - case valuesDoNotMatchOrAreGreaterThan0xC2 = 0xC3 + + case unknown0xCB = 0xCB + + case unknown0xD4 = 0xD4 + case unknown0xD5 = 0xD5 + case resetFault0xD6 = 0xD6 + case resetFault0xD7 = 0xD7 + case unknown0xD8 = 0xD8 + case unknown0xD9 = 0xD9 + + case valuesDoNotMatch = 0xFF } public var faultType: FaultEventType? { @@ -165,302 +183,297 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { init(rawValue: UInt8) { self.rawValue = rawValue } - - public var description: String { - let faultDescription: String - - if let faultType = faultType { - faultDescription = { - switch faultType { - case .noFaults: - return "No fault" - case .failedFlashErase: - return "Flash erase failed" - case .failedFlashStore: - return "Flash store failed" - case .tableCorruptionBasalSubcommand: - return "Basal subcommand table corruption" - case .basalPulseTableCorruption: - return "Basal pulse table corruption" - case .corruptionByte720: - return "Corruption in byte_720" - case .dataCorruptionInTestRTCInterrupt: - return "Data corruption error in test_RTC_interrupt" - case .rtcInterruptHandlerInconsistentState: - return "RTC interrupt handler called with inconstent state" - case .valueGreaterThan8: - return "Value > 8" - case .invalidBeepRepeatPattern: - return "Invalid beep repeat pattern" - case .bf0notEqualToBF1: - return "Corruption in byte_BF0" - case .tableCorruptionTempBasalSubcommand: - return "Temp basal subcommand table corruption" - case .resetDueToCOP: - return "Reset due to COP" - case .resetDueToIllegalOpcode: - return "Reset due to illegal opcode" - case .resetDueToIllegalAddress: - return "Reset due to illegal address" - case .resetDueToSAWCOP: - return "Reset due to SAWCOP" - case .corruptionInByte_866: - return "Corruption in byte_866" - case .resetDueToLVD: - return "Reset due to LVD" - case .messageLengthTooLong: - return "Message length too long" - case .occluded: - return "Occluded" - case .corruptionInWord129: - return "Corruption in word_129 table/word_86A/dword_86E" - case .corruptionInByte868: - return "Corruption in byte_868" - case .corruptionInAValidatedTable: - return "Corruption in a validated table" - case .reservoirEmpty: - return "Reservoir empty or exceeded maximum pulse delivery" - case .badPowerSwitchArrayValue1: - return "Bad Power Switch Array Status and Control Register value 1 before starting pump" - case .badPowerSwitchArrayValue2: - return "Bad Power Switch Array Status and Control Register value 2 before starting pump" - case .badLoadCnthValue: - return "Bad LOADCNTH value when running pump" - case .exceededMaximumPodLife80Hrs: - return "Exceeded maximum Pod life of 80 hours" - case .badStateCommand1AScheduleParse: - return "Unexpected internal state in command_1A_schedule_parse_routine_wrapper" - case .unexpectedStateInRegisterUponReset: - return "Unexpected commissioned state in status and control register upon reset" - case .wrongSummaryForTable129: - return "Sum mismatch for word_129 table" - case .validateCountErrorWhenBolusing: - return "Validate encoder count error when bolusing" - case .badTimerVariableState: - return "Bad timer variable state" - case .unexpectedRTCModuleValueDuringReset: - return "Unexpected RTC Modulo Register value during reset" - case .problemCalibrateTimer: - return "Problem in calibrate_timer_case_3" - case .tickcntErrorRTC: - return "Tick count error RTC" - case .tickFailure: - return "Tick failure" - case .rtcInterruptHandlerUnexpectedCall: - return "RTC interrupt handler unexpectedly called" - case .missing2hourAlertToFillTank: - return "Failed to set up 2 hour alert for tank fill operation" - case .faultEventSetupPod: - return "Bad arg or state in update_insulin_variables, verify_and_start_pump or main_loop_control_pump" - case .autoOff0: - return "Alert #0 auto-off timeout" - case .autoOff1: - return "Alert #1 auto-off timeout" - case .autoOff2: - return "Alert #2 auto-off timeout" - case .autoOff3: - return "Alert #3 auto-off timeout" - case .autoOff4: - return "Alert #4 auto-off timeout" - case .autoOff5: - return "Alert #5 auto-off timeout" - case .autoOff6: - return "Alert #6 auto-off timeout" - case .autoOff7: - return "Alert #7 auto-off timeout" - case .insulinDeliveryCommandError: - return "Incorrect pod state for command or error during insulin command setup" - case .badValueStartupTest: - return "Bad value during startup testing" - case .connectedPodCommandTimeout: - return "Connected Pod command timeout" - case .resetFromUnknownCause: - return "Reset from unknown cause" - case .vetoNotSet: - return "Veto not set" - case .errorFlashInitialization: - return "Flash initialization error" - case .badPiezoValue: - return "Bad piezo value" - case .unexpectedValueByte358: - return "Unexpected byte_358 value" - case .problemWithLoad1and2: - return "Problem with LOAD1/LOAD2" - case .aGreaterThan7inMessage: - return "A > 7 in message processing" - case .failedTestSawReset: - return "SAW reset testing fail" - case .testInProgress: - return "402D is 'Z' - test in progress" - case .problemWithPumpAnchor: - return "Problem with pump anchor" - case .errorFlashWrite: - return "Flash initialization or write error" - case .encoderCountTooHigh: - return "Encoder count too high" - case .encoderCountExcessiveVariance: - return "Encoder count excessive variance" - case .encoderCountTooLow: - return "Encoder count too low" - case .encoderCountProblem: - return "Encoder count problem" - case .checkVoltageOpenWire1: - return "Check voltage open wire 1 problem" - case .checkVoltageOpenWire2: - return "Check voltage open wire 2 problem" - case .problemWithLoad1and2type46: - return "Problem with LOAD1/LOAD2" - case .problemWithLoad1and2type47: - return "Problem with LOAD1/LOAD2" - case .badTimerCalibration: - return "Bad timer calibration" - case .badTimerRatios: - return "Bad timer values: COP timer ratio bad" - case .badTimerValues: - return "Bad timer values" - case .trimICSTooCloseTo0x1FF: - return "ICS trim too close to 0x1FF" - case .problemFindingBestTrimValue: - return "find_best_trim_value problem" - case .badSetTPM1MultiCasesValue: - return "Bad set_TPM1_multi_cases value" - case .unexpectedRFErrorFlagDuringReset: - return "Unexpected TXSCR2 RF Tranmission Error Flag set during reset" - case .timerPulseWidthModulatorOverflow: - return "Timer pulse-width modulator overflow" - case .tickcntError: - return "Bad tick count state before starting pump" - case .badRfmXtalStart: - return "TXOK issue in process_input_buffer" - case .badRxSensitivity: - return "Bad Rx word_107 sensitivity value during input message processing" - case .packetFrameLengthTooLong: - return "Packet frame length too long" - case .unexpectedIRQHighinTimerTick: - return "Unexpected IRQ high in timer_tick" - case .unexpectedIRQLowinTimerTick: - return "Unexpected IRQ low in timer_tick" - case .badArgToGetEntry: - return "Corrupt constants table at byte_37A[] or flash byte_4036[]" - case .badArgToUpdate37ATable: - return "Bad argument to update_37A_table" - case .errorUpdating37ATable: - return "Error updating constants byte_37A table" - case .occlusionCheckValueTooHigh: - return "Occlusion check value too high for detection" - case .loadTableCorruption: - return "Load table corruption" - case .primeOpenCountTooLow: - return "Prime open count too low" - case .badValueByte109: - return "Bad byte_109 value" - case .disableFlashSecurityFailed: - return "Write flash byte to disable flash security failed" - case .checkVoltageFailure: - return "Two check voltage failures before starting pump" - case .occlusionCheckStartup1: - return "Occlusion check startup problem 1" - case .occlusionCheckStartup2: - return "Occlusion check startup problem 2" - case .occlusionCheckTimeouts1: - return "Occlusion check excess timeouts 1" - case .occlusionCheckTimeouts2: - return "Occlusion check excess timeouts 2" - case .occlusionCheckTimeouts3: - return "Occlusion check excess timeouts 3" - case .occlusionCheckPulseIssue: - return "Occlusion check pulse issue" - case .occlusionCheckBolusProblem: - return "Occlusion check bolus problem" - case .occlusionCheckAboveThreshold: - return "Occlusion check above threshold" - case .basalUnderInfusion: - return "Basal under infusion" - case .basalOverInfusion: - return "Basal over infusion" - case .tempBasalUnderInfusion: - return "Temp basal under infusion" - case .tempBasalOverInfusion: - return "Temp basal over infusion" - case .bolusUnderInfusion: - return "Bolus under infusion" - case .bolusOverInfusion: - return "Bolus over infusion" - case .basalOverInfusionPulse: - return "Basal over infusion pulse" - case .tempBasalOverInfusionPulse: - return "Temp basal over infusion pulse" - case .bolusOverInfusionPulse: - return "Bolus over infusion pulse" - case .immediateBolusOverInfusionPulse: - return "Immediate bolus under infusion pulse" - case .extendedBolusOverInfusionPulse: - return "Extended bolus over infusion pulse" - case .corruptionOfTables: - return "Corruption of $283/$2E3/$315 tables" - case .unrecognizedPulse: - return "Bad pulse value to verify_and_start_pump" - case .syncWithoutTempActive: - return "Pump sync req 5 with no temp basal active" - case .command1AParseUnexpectedFailed: - return "Command 1A parse routine unexpected failed" - case .illegalChanParam: - return "Bad parameter for $283/$2E3/$315 channel table specification" - case .basalPulseChanInactive: - return "Pump basal request with basal IST not set" - case .tempPulseChanInactive: - return "Pump temp basal request with temp basal IST not set" - case .bolusPulseChanInactive: - return "Pump bolus request and bolus IST not set" - case .intSemaphoreNotSet: - return "Bad table specifier field6 in 1A command" - case .illegalInterLockChan: - return "Illegal interlock channel" - case .badStateInClearBolusIST2AndVars: - return "Bad variable state in clear_Bolus_IST2_and_vars" - case .badStateInMaybeInc33D: - return "Bad variable state in maybe_inc_33D" - case .bleTimeout: - return "BLE timeout" - case .bleInitiated: - return "BLE initiated" - case .bleUnkAlarm: - return "BLE unknown alarm" - case .bleIaas: - return "BLE IAAS" - case .crcFailure: - return "CRC failure" - case .bleWdPingTimeout: - return "BLE WD ping timeout" - case .bleExcessiveResets: - return "BLE excessive resets" - case .bleNakError: - return "BLE NAK error" - case .bleReqHighTimeout: - return "BLE request high timeout" - case .bleUnknownResp: - return "BLE unknown response" - case .bleReqStuckHigh: - return "BLE request stuck high" - case .bleStateMachine1: - return "BLE state machine 1" - case .bleStateMachine2: - return "BLE state machine 2" - case .bleArbLost: - return "BLE arbitration lost" - case .bleEr48DualNack: - return "BLE dual Nack" - case .bleQnExceedMaxRetry: - return "BLE QN exceed max retry" - case .bleQnCritVarFail: - return "BLE QN critical variable fail" - case .valuesDoNotMatchOrAreGreaterThan0xC2: - return "Unknown fault code" - } - }() - } else { - faultDescription = "Unknown Fault" + + public var faultDescription: String { + switch faultType { + case .noFaults: + return "No fault" + case .failedFlashErase: + return "Flash erase failed" + case .failedFlashStore: + return "Flash store failed" + case .tableCorruptionBasalSubcommand: + return "Basal subcommand table corruption" + case .basalPulseTableCorruption: + return "Basal pulse table corruption" + case .corruptionByte720: + return "Corruption in byte_720" + case .dataCorruptionInTestRTCInterrupt: + return "Data corruption error in test_RTC_interrupt" + case .rtcInterruptHandlerInconsistentState: + return "RTC interrupt handler called with inconstent state" + case .valueGreaterThan8: + return "Value > 8" + case .invalidBeepRepeatPattern: + return "Invalid beep repeat pattern" + case .bf0notEqualToBF1: + return "Corruption in byte_BF0" + case .tableCorruptionTempBasalSubcommand: + return "Temp basal subcommand table corruption" + case .resetDueToCOP: + return "Reset due to COP" + case .resetDueToIllegalOpcode: + return "Reset due to illegal opcode" + case .resetDueToIllegalAddress: + return "Reset due to illegal address" + case .resetDueToSAWCOP: + return "Reset due to SAWCOP" + case .corruptionInByte_866: + return "Corruption in byte_866" + case .resetDueToLVD: + return "Reset due to LVD" + case .messageLengthTooLong: + return "Message length too long" + case .occluded: + return "Occluded" + case .corruptionInWord129: + return "Corruption in word_129 table/word_86A/dword_86E" + case .corruptionInByte868: + return "Corruption in byte_868" + case .corruptionInAValidatedTable: + return "Corruption in a validated table" + case .reservoirEmpty: + return "Reservoir empty or exceeded maximum pulse delivery" + case .badPowerSwitchArrayValue1: + return "Bad Power Switch Array Status and Control Register value 1 before starting pump" + case .badPowerSwitchArrayValue2: + return "Bad Power Switch Array Status and Control Register value 2 before starting pump" + case .badLoadCnthValue: + return "Bad LOADCNTH value when running pump" + case .exceededMaximumPodLife80Hrs: + return "Exceeded maximum Pod life of 80 hours" + case .badStateCommand1AScheduleParse: + return "Unexpected internal state in command_1A_schedule_parse_routine_wrapper" + case .unexpectedStateInRegisterUponReset: + return "Unexpected commissioned state in status and control register upon reset" + case .wrongSummaryForTable129: + return "Sum mismatch for word_129 table" + case .validateCountErrorWhenBolusing: + return "Validate encoder count error when bolusing" + case .badTimerVariableState: + return "Bad timer variable state" + case .unexpectedRTCModuleValueDuringReset: + return "Unexpected RTC Modulo Register value during reset" + case .problemCalibrateTimer: + return "Problem in calibrate_timer_case_3" + case .tickcntErrorRTC: + return "Tick count error RTC" + case .tickFailure: + return "Tick failure" + case .rtcInterruptHandlerUnexpectedCall: + return "RTC interrupt handler unexpectedly called" + case .missing2hourAlertToFillTank: + return "Failed to set up 2 hour alert for tank fill operation" + case .faultEventSetupPod: + return "Bad arg or state in update_insulin_variables, verify_and_start_pump or main_loop_control_pump" + case .autoOff0: + return "Alert #0 auto-off timeout" + case .autoOff1: + return "Alert #1 auto-off timeout" + case .autoOff2: + return "Alert #2 auto-off timeout" + case .autoOff3: + return "Alert #3 auto-off timeout" + case .autoOff4: + return "Alert #4 auto-off timeout" + case .autoOff5: + return "Alert #5 auto-off timeout" + case .autoOff6: + return "Alert #6 auto-off timeout" + case .autoOff7: + return "Alert #7 auto-off timeout" + case .insulinDeliveryCommandError: + return "Incorrect pod state for command or error during insulin command setup" + case .badValueStartupTest: + return "Bad value during startup testing" + case .connectedPodCommandTimeout: + return "Connected Pod command timeout" + case .resetFromUnknownCause: + return "Reset from unknown cause" + case .vetoNotSet: + return "Veto not set" + case .errorFlashInitialization: + return "Flash initialization error" + case .badPiezoValue: + return "Bad piezo value" + case .unexpectedValueByte358: + return "Unexpected byte_358 value" + case .problemWithLoad1and2: + return "Problem with LOAD1/LOAD2" + case .aGreaterThan7inMessage: + return "A > 7 in message processing" + case .failedTestSawReset: + return "SAW reset testing fail" + case .testInProgress: + return "test in progress" + case .problemWithPumpAnchor: + return "Problem with pump anchor" + case .errorFlashWrite: + return "Flash initialization or write error" + case .encoderCountTooHigh: + return "Encoder count too high" + case .encoderCountExcessiveVariance: + return "Encoder count excessive variance" + case .encoderCountTooLow: + return "Encoder count too low" + case .encoderCountProblem: + return "Encoder count problem" + case .checkVoltageOpenWire1: + return "Check voltage open wire 1 problem" + case .checkVoltageOpenWire2: + return "Check voltage open wire 2 problem" + case .problemWithLoad1and2type46: + return "Problem with LOAD1/LOAD2" + case .problemWithLoad1and2type47: + return "Problem with LOAD1/LOAD2" + case .badTimerCalibration: + return "Bad timer calibration" + case .badTimerRatios: + return "Bad timer values: COP timer ratio bad" + case .badTimerValues: + return "Bad timer values" + case .trimICSTooCloseTo0x1FF: + return "ICS trim too close to 0x1FF" + case .problemFindingBestTrimValue: + return "find_best_trim_value problem" + case .badSetTPM1MultiCasesValue: + return "Bad set_TPM1_multi_cases value" + case .unexpectedRFErrorFlagDuringReset: + return "Unexpected TXSCR2 RF Tranmission Error Flag set during reset" + case .timerPulseWidthModulatorOverflow: + return "Timer pulse-width modulator overflow" + case .tickcntError: + return "Bad tick count state before starting pump" + case .badRfmXtalStart: + return "TXOK issue in process_input_buffer" + case .badRxSensitivity: + return "Bad Rx word_107 sensitivity value during input message processing" + case .packetFrameLengthTooLong: + return "Packet frame length too long" + case .unexpectedIRQHighinTimerTick: + return "Unexpected IRQ high in timer_tick" + case .unexpectedIRQLowinTimerTick: + return "Unexpected IRQ low in timer_tick" + case .badArgToGetEntry: + return "Corrupt constants table at byte_37A[] or flash byte_4036[]" + case .badArgToUpdate37ATable: + return "Bad argument to update_37A_table" + case .errorUpdating37ATable: + return "Error updating constants byte_37A table" + case .occlusionCheckValueTooHigh: + return "Occlusion check value too high for detection" + case .loadTableCorruption: + return "Load table corruption" + case .primeOpenCountTooLow: + return "Prime open count too low" + case .badValueByte109: + return "Bad byte_109 value" + case .disableFlashSecurityFailed: + return "Write flash byte to disable flash security failed" + case .checkVoltageFailure: + return "Two check voltage failures before starting pump" + case .occlusionCheckStartup1: + return "Occlusion check startup problem 1" + case .occlusionCheckStartup2: + return "Occlusion check startup problem 2" + case .occlusionCheckTimeouts1: + return "Occlusion check excess timeouts 1" + case .occlusionCheckTimeouts2: + return "Occlusion check excess timeouts 2" + case .occlusionCheckTimeouts3: + return "Occlusion check excess timeouts 3" + case .occlusionCheckPulseIssue: + return "Occlusion check pulse issue" + case .occlusionCheckBolusProblem: + return "Occlusion check bolus problem" + case .occlusionCheckAboveThreshold: + return "Occlusion check above threshold" + case .basalUnderInfusion: + return "Basal under infusion" + case .basalOverInfusion: + return "Basal over infusion" + case .tempBasalUnderInfusion: + return "Temp basal under infusion" + case .tempBasalOverInfusion: + return "Temp basal over infusion" + case .bolusUnderInfusion: + return "Bolus under infusion" + case .bolusOverInfusion: + return "Bolus over infusion" + case .basalOverInfusionPulse: + return "Basal over infusion pulse" + case .tempBasalOverInfusionPulse: + return "Temp basal over infusion pulse" + case .bolusOverInfusionPulse: + return "Bolus over infusion pulse" + case .immediateBolusOverInfusionPulse: + return "Immediate bolus under infusion pulse" + case .extendedBolusOverInfusionPulse: + return "Extended bolus over infusion pulse" + case .corruptionOfTables: + return "Corruption of $283/$2E3/$315 tables" + case .unrecognizedPulse: + return "Bad pulse value to verify_and_start_pump" + case .syncWithoutTempActive: + return "Pump sync req 5 with no temp basal active" + case .command1AParseUnexpectedFailed: + return "Command 1A parse routine unexpected failed" + case .illegalChanParam: + return "Bad parameter for $283/$2E3/$315 channel table specification" + case .basalPulseChanInactive: + return "Pump basal request with basal IST not set" + case .tempPulseChanInactive: + return "Pump temp basal request with temp basal IST not set" + case .bolusPulseChanInactive: + return "Pump bolus request and bolus IST not set" + case .intSemaphoreNotSet: + return "Bad table specifier field6 in 1A command" + case .illegalInterLockChan: + return "Illegal interlock channel" + case .badStateInClearBolusIST2AndVars: + return "Bad variable state in clear_Bolus_IST2_and_vars" + case .badStateInMaybeInc33D: + return "Bad variable state in maybe_inc_33D" + case .bleTimeout: + return "BLE timeout" + case .bleInitiated: + return "BLE initiated" + case .bleUnkAlarm: + return "BLE unknown alarm" + case .bleIaas: + return "BLE IAAS" + case .crcFailure: + return "CRC failure" + case .bleWdPingTimeout: + return "BLE WD ping timeout" + case .bleExcessiveResets: + return "BLE excessive resets" + case .bleNakError: + return "BLE NAK error" + case .bleReqHighTimeout: + return "BLE request high timeout" + case .bleUnknownResp: + return "BLE unknown response" + case .bleReqStuckHigh: + return "BLE request stuck high" + case .bleStateMachine1: + return "BLE state machine 1" + case .bleStateMachine2: + return "BLE state machine 2" + case .bleArbLost: + return "BLE arbitration lost" + case .bleEr48DualNack: + return "BLE dual Nack" + case .bleQnExceedMaxRetry: + return "BLE QN exceed max retry" + case .bleQnCritVarFail: + return "BLE QN critical variable fail" + default: + return "Unknown fault code" } + } + + public var description: String { return String(format: "Fault Event Code 0x%02x: %@", rawValue, faultDescription) } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift index 618227b236..d493c74704 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift @@ -10,30 +10,24 @@ import Foundation - public struct CancelDeliveryCommand : NonceResyncableMessageBlock { - + public let blockType: MessageBlockType = .cancelDelivery - - // ID1:1f00ee84 PTYPE:PDM SEQ:26 ID2:1f00ee84 B9:ac BLEN:7 MTYPE:1f05 BODY:e1f78752078196 CRC:03 - - // Cancel bolus - // 1f 05 be1b741a 64 - 1U - // 1f 05 a00a1a95 64 - 1U over 1hr - // 1f 05 ff52f6c8 64 - 1U immediate, 1U over 1hr - - // Cancel temp basal - // 1f 05 f76d34c4 62 - 30U/hr - // 1f 05 156b93e8 62 - ? - // 1f 05 62723698 62 - 0% - // 1f 05 2933db73 62 - 03ea - - // Suspend is a Cancel delivery, followed by a configure alerts command (0x19) - // 1f 05 50f02312 03 191050f02312580f000f06046800001e0302 - - // Deactivate pod: + // OFF 1 2 3 4 5 6 + // 1F 05 NNNNNNNN AX + + // Cancel bolus (with confirmation beep) + // 1f 05 be1b741a 64 + + // Cancel temp basal (with confirmation beep) + // 1f 05 f76d34c4 62 + + // Cancel all (before deactivate pod) // 1f 05 e1f78752 07 - + + // Cancel basal & temp basal for a suspend, followed by a configure alerts command (0x19) for alerts 5 & 6 + // 1f 05 50f02312 03 19 10 50f02312 580f 000f 0604 6800 001e 0302 + public struct DeliveryType: OptionSet, Equatable { public let rawValue: UInt8 @@ -48,7 +42,23 @@ public struct CancelDeliveryCommand : NonceResyncableMessageBlock { public init(rawValue: UInt8) { self.rawValue = rawValue } - + + var debugDescription: String { + switch self { + case .none: + return "None" + case .basal: + return "Basal" + case .tempBasal: + return "TempBasal" + case .all: + return "All" + case .allButBasal: + return "AllButBasal" + default: + return "\(self.rawValue)" + } + } } public let deliveryType: DeliveryType @@ -85,6 +95,6 @@ public struct CancelDeliveryCommand : NonceResyncableMessageBlock { extension CancelDeliveryCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "CancelDeliveryCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), deliveryType:\(deliveryType), beepType:\(beepType))" + return "CancelDeliveryCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), deliveryType:\(deliveryType.debugDescription), beepType:\(beepType))" } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift index 22c1779bc4..ae26517773 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift @@ -22,7 +22,9 @@ public struct ConfigureAlertsCommand : NonceResyncableMessageBlock { UInt8(4 + configurations.count * AlertConfiguration.length), ]) data.appendBigEndian(nonce) - for config in configurations { + // Sorting the alerts not required, but it can be helpful for log analysis + let sorted = configurations.sorted { $0.slot.rawValue < $1.slot.rawValue } + for config in sorted { data.append(contentsOf: config.data) } return data @@ -93,6 +95,7 @@ extension AlertConfiguration { } self.beepType = beepType + self.silent = (beepType == .noBeepNonCancel) } public var data: Data { @@ -105,12 +108,16 @@ extension AlertConfiguration { if autoOffModifier { firstByte += 1 << 1 } + + // The 9-bit duration is limited to 2^9-1 minutes max value + let durationMinutes = min(UInt(duration.minutes), 0x1ff) + // High bit of duration - firstByte += UInt8((Int(duration.minutes) >> 8) & 0x1) + firstByte += UInt8((durationMinutes >> 8) & 0x1) var data = Data([ firstByte, - UInt8(Int(duration.minutes) & 0xff) + UInt8(durationMinutes & 0xff) ]) switch trigger { @@ -123,7 +130,8 @@ extension AlertConfiguration { data.appendBigEndian(minutes) } data.append(beepRepeat.rawValue) - data.append(beepType.rawValue) + let beepTypeToSet: BeepType = silent ? .noBeepNonCancel : beepType + data.append(beepTypeToSet.rawValue) return data } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift index ca21873b5c..382dd3a1c1 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift @@ -10,14 +10,13 @@ import Foundation public struct DeactivatePodCommand : NonceResyncableMessageBlock { - - // ID1:1f00ee84 PTYPE:PDM SEQ:09 ID2:1f00ee84 B9:34 BLEN:6 MTYPE:1c04 BODY:0f7dc4058344 CRC:f1 + // OFF 1 2 3 4 5 + // 1C 04 NNNNNNNN public let blockType: MessageBlockType = .deactivatePod public var nonce: UInt32 - // e1f78752 07 8196 public var data: Data { var data = Data([ blockType.rawValue, diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift index edc437dbc0..009b927186 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift @@ -88,7 +88,7 @@ public struct DetailedStatus : PodInfo, Equatable { // For Eros, encodedData[19] (XX) byte is the same previousPodProgressStatus nibble in the VV byte on fault. // For Dash, encodedData[19] (XX) byte is uninitialized or unknown, so use VV byte for previousPodProgressStatus. - + // Decode YYYY based on whether there was a pod fault if encodedData[8] == 0 { // For non-faults, YYYY contents not valid (either uninitialized data for Eros or some unknown content for Dash). @@ -119,9 +119,8 @@ extension DetailedStatus: CustomDebugStringConvertible { "* bolusNotDelivered: \(bolusNotDelivered.twoDecimals) U", "* lastProgrammingMessageSeqNum: \(lastProgrammingMessageSeqNum)", "* totalInsulinDelivered: \(totalInsulinDelivered.twoDecimals) U", - "* faultEventCode: \(faultEventCode.description)", - "* reservoirLevel: \(reservoirLevel > Pod.maximumReservoirReading ? "50+" : reservoirLevel.twoDecimals) U", - "* timeActive: \(timeActive.stringValue)", + "* reservoirLevel: \(reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : reservoirLevel.twoDecimals) U", + "* timeActive: \(timeActive.timeIntervalStr)", "* unacknowledgedAlerts: \(unacknowledgedAlerts)", "", ].joined(separator: "\n") @@ -134,8 +133,9 @@ extension DetailedStatus: CustomDebugStringConvertible { } if faultEventCode.faultType != .noFaults { result += [ + "* faultEventCode: \(faultEventCode.description)", "* faultAccessingTables: \(faultAccessingTables)", - "* faultEventTimeSinceActivation: \(faultEventTimeSinceActivation?.stringValue ?? "NA")", + "* faultEventTimeSinceActivation: \(faultEventTimeSinceActivation?.timeIntervalStr ?? "NA")", "* errorEventInfo: \(errorEventInfo?.description ?? "NA")", "* previousPodProgressStatus: \(previousPodProgressStatus?.description ?? "NA")", "* possibleFaultCallingAddress: \(possibleFaultCallingAddress != nil ? String(format: "0x%04x", possibleFaultCallingAddress!) : "NA")", @@ -161,21 +161,21 @@ extension DetailedStatus: RawRepresentable { } extension TimeInterval { - var stringValue: String { - let totalSeconds = self - let minutes = Int(totalSeconds / 60) % 60 - let hours = Int(totalSeconds / 3600) - (Int(self / 3600)/24 * 24) - let days = Int((totalSeconds / 3600) / 24) - var pluralFormOfDays = "days" - if days == 1 { - pluralFormOfDays = "day" + var timeIntervalStr: String { + var str: String = "" + let hours = UInt(self / 3600) + let minutes = UInt(self / 60) % 60 + let seconds = UInt(self) % 60 + if hours != 0 { + str += String(format: "%uh", hours) } - let timeComponent = String(format: "%02d:%02d", hours, minutes) - if days > 0 { - return String(format: "%d \(pluralFormOfDays) plus %@", days, timeComponent) - } else { - return timeComponent + if minutes != 0 || hours != 0 { + str += String(format: "%um", minutes) + } + if seconds != 0 || str.isEmpty { + str += String(format: "%us", seconds) } + return str } } @@ -192,11 +192,11 @@ extension Double { // dddd: Pod Progress at time of first logged fault event // public struct ErrorEventInfo: CustomStringConvertible, Equatable { - let rawValue: UInt8 - let insulinStateTableCorruption: Bool // 'a' bit - let occlusionType: Int // 'bb' 2-bit occlusion type - let immediateBolusInProgress: Bool // 'c' bit - let podProgressStatus: PodProgressStatus // 'dddd' bits + public let rawValue: UInt8 + public let insulinStateTableCorruption: Bool // 'a' bit + public let occlusionType: Int // 'bb' 2-bit occlusion type + public let immediateBolusInProgress: Bool // 'c' bit + public let podProgressStatus: PodProgressStatus // 'dddd' bits public var errorEventInfo: ErrorEventInfo? { return ErrorEventInfo(rawValue: rawValue) diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift index 6a233f1f72..a27fdc12b4 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift @@ -91,13 +91,13 @@ extension BinaryInteger { } func pulseLogString(pulseLogEntries: [UInt32], lastPulseNumber: Int) -> String { - var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg\n" + var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg" var index = pulseLogEntries.count - 1 var pulseNumber = lastPulseNumber while index >= 0 { - str += String(format: "%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription + "\n" + str += String(format: "\n%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription index -= 1 pulseNumber -= 1 } - return str + "\n" + return str } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/StatusResponse.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/StatusResponse.swift index 4f0594e687..0881c16352 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/StatusResponse.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/StatusResponse.swift @@ -52,9 +52,9 @@ public struct StatusResponse : MessageBlock { self.lastProgrammingMessageSeqNum = (encodedData[4] >> 3) & 0xf self.bolusNotDelivered = Double((Int(encodedData[4] & 0x3) << 8) | Int(encodedData[5])) / Pod.pulsesPerUnit - + self.alerts = AlertSet(rawValue: ((encodedData[6] & 0x7f) << 1) | (encodedData[7] >> 7)) - + self.reservoirLevel = Double((Int(encodedData[8] & 0x3) << 8) + Int(encodedData[9])) / Pod.pulsesPerUnit } @@ -95,7 +95,7 @@ public struct StatusResponse : MessageBlock { extension StatusResponse: CustomDebugStringConvertible { public var debugDescription: String { - return "StatusResponse(deliveryStatus:\(deliveryStatus), progressStatus:\(podProgressStatus), timeActive:\(timeActive.stringValue), reservoirLevel:\(String(describing: reservoirLevel)), delivered:\(insulinDelivered), bolusNotDelivered:\(bolusNotDelivered), lastProgrammingMessageSeqNum:\(lastProgrammingMessageSeqNum), alerts:\(alerts))" + return "StatusResponse(deliveryStatus:\(deliveryStatus.description), progressStatus:\(podProgressStatus), timeActive:\(timeActive.timeIntervalStr), reservoirLevel:\(reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : reservoirLevel.twoDecimals), insulinDelivered:\(insulinDelivered.twoDecimals), bolusNotDelivered:\(bolusNotDelivered.twoDecimals), lastProgrammingMessageSeqNum:\(lastProgrammingMessageSeqNum), alerts:\(alerts))" } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift index 5685e413cd..02d301e6e2 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift @@ -75,6 +75,6 @@ public struct TempBasalExtraCommand : MessageBlock { extension TempBasalExtraCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "TempBasalExtraCommand(completionBeep:\(completionBeep), programReminderInterval:\(programReminderInterval.stringValue) remainingPulses:\(remainingPulses), delayUntilFirstPulse:\(delayUntilFirstPulse.stringValue), rateEntries:\(rateEntries))" + return "TempBasalExtraCommand(completionBeep:\(completionBeep), programReminderInterval:\(programReminderInterval.timeIntervalStr), remainingPulses:\(remainingPulses), delayUntilFirstPulse:\(delayUntilFirstPulse.timeIntervalStr), rateEntries:\(rateEntries))" } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PendingCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PendingCommand.swift index 8890a80f40..fc00d57517 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PendingCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PendingCommand.swift @@ -16,11 +16,11 @@ public enum StartProgram: RawRepresentable { case bolus(volume: Double, automatic: Bool) case basalProgram(schedule: BasalSchedule) case tempBasal(unitsPerHour: Double, duration: TimeInterval, isHighTemp: Bool, automatic: Bool) - + private enum StartProgramType: Int { case bolus, basalProgram, tempBasal } - + public var rawValue: RawValue { switch self { case .bolus(let volume, let automatic): @@ -77,7 +77,7 @@ public enum StartProgram: RawRepresentable { self = .tempBasal(unitsPerHour: unitsPerHour, duration: duration, isHighTemp: isHighTemp, automatic: automatic) } } - + public static func == (lhs: StartProgram, rhs: StartProgram) -> Bool { switch(lhs, rhs) { case (.bolus(let lhsVolume, let lhsAutomatic), .bolus(let rhsVolume, let rhsAutomatic)): @@ -97,7 +97,7 @@ public enum PendingCommand: RawRepresentable, Equatable { case program(StartProgram, Int, Date, Bool = true) case stopProgram(CancelDeliveryCommand.DeliveryType, Int, Date, Bool = true) - + private enum PendingCommandType: Int { case startProgram, stopProgram } @@ -142,7 +142,7 @@ public enum PendingCommand: RawRepresentable, Equatable { guard let rawPendingCommandType = rawValue["type"] as? PendingCommandType.RawValue else { return nil } - + guard let commandDate = rawValue["date"] as? Date else { return nil } @@ -176,7 +176,7 @@ public enum PendingCommand: RawRepresentable, Equatable { public var rawValue: RawValue { var rawValue: RawValue = [:] - + switch self { case .program(let program, let sequence, let date, let inflight): rawValue["type"] = PendingCommandType.startProgram.rawValue @@ -193,7 +193,7 @@ public enum PendingCommand: RawRepresentable, Equatable { } return rawValue } - + public static func == (lhs: PendingCommand, rhs: PendingCommand) -> Bool { switch(lhs, rhs) { case (.program(let lhsProgram, let lhsSequence, let lhsDate, let lhsInflight), .program(let rhsProgram, let rhsSequence, let rhsDate, let rhsInflight)): @@ -206,3 +206,4 @@ public enum PendingCommand: RawRepresentable, Equatable { } } + diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift index 70fcb9fb48..55a5e8dc1d 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift @@ -85,13 +85,13 @@ public struct Pod { public static let defaultExpirationReminderOffset = TimeInterval(hours: 2) public static let expirationReminderAlertMinHoursBeforeExpiration = 1 public static let expirationReminderAlertMaxHoursBeforeExpiration = 24 - + // Threshold used to display pod end of life warnings public static let timeRemainingWarningThreshold = TimeInterval(days: 1) - + // Default low reservoir alert limit in Units public static let defaultLowReservoirReminder: Double = 10 - + // Allowed Low Reservoir reminder values public static let allowedLowReservoirReminderValues = Array(stride(from: 10, through: 50, by: 1)) } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PumpManagerAlert.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PumpManagerAlert.swift index b53cd0b4fd..52d46c78d2 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PumpManagerAlert.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/PumpManagerAlert.swift @@ -1,5 +1,5 @@ // -// PodAlert.swift +// PumpManagerAlert.swift // OmniBLE // // Created by Pete Schwamb on 7/9/20. @@ -11,7 +11,6 @@ import LoopKit import HealthKit public enum PumpManagerAlert: Hashable { - case multiCommand(triggeringSlot: AlertSlot?) case podExpireImminent(triggeringSlot: AlertSlot?) case userPodExpiration(triggeringSlot: AlertSlot?, scheduledExpirationReminderOffset: TimeInterval) case lowReservoir(triggeringSlot: AlertSlot?, lowReservoirReminderValue: Double) @@ -19,12 +18,13 @@ public enum PumpManagerAlert: Hashable { case suspendEnded(triggeringSlot: AlertSlot?) case podExpiring(triggeringSlot: AlertSlot?) case finishSetupReminder(triggeringSlot: AlertSlot?) + case unexpectedAlert(triggeringSlot: AlertSlot?) case timeOffsetChangeDetected - + var isRepeating: Bool { return repeatInterval != nil } - + var repeatInterval: TimeInterval? { switch self { case .suspendEnded: @@ -33,11 +33,9 @@ public enum PumpManagerAlert: Hashable { return nil } } - + var contentTitle: String { switch self { - case .multiCommand: - return LocalizedString("Multiple Command Alert", comment: "Alert content title for multiCommand pod alert") case .userPodExpiration: return LocalizedString("Pod Expiration Reminder", comment: "Alert content title for userPodExpiration pod alert") case .podExpiring: @@ -52,15 +50,15 @@ public enum PumpManagerAlert: Hashable { return LocalizedString("Resume Insulin", comment: "Alert content title for suspendEnded pod alert") case .finishSetupReminder: return LocalizedString("Pod Pairing Incomplete", comment: "Alert content title for finishSetupReminder pod alert") + case .unexpectedAlert: + return LocalizedString("Unexpected Alert", comment: "Alert content title for unexpected pod alert") case .timeOffsetChangeDetected: return LocalizedString("Time Change Detected", comment: "Alert content title for timeOffsetChangeDetected pod alert") } } - + var contentBody: String { switch self { - case .multiCommand: - return LocalizedString("Multiple Command Alert", comment: "Alert content body for multiCommand pod alert") case .userPodExpiration(_, let offset): let formatter = DateComponentsFormatter() formatter.allowedUnits = [.hour] @@ -81,15 +79,16 @@ public enum PumpManagerAlert: Hashable { return LocalizedString("The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes.", comment: "Alert content body for suspendEnded pod alert") case .finishSetupReminder: return LocalizedString("Please finish pairing your pod.", comment: "Alert content body for finishSetupReminder pod alert") + case .unexpectedAlert(let triggeringSlot): + let slotNumberString = triggeringSlot != nil ? String(describing: triggeringSlot!.rawValue) : "?" + return String(format: LocalizedString("Unexpected Pod Alert #%1@!", comment: "Alert content body for unexpected pod alert (1: slotNumberString)"), slotNumberString) case .timeOffsetChangeDetected: return LocalizedString("The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings.", comment: "Alert content body for timeOffsetChangeDetected pod alert") } } - + var triggeringSlot: AlertSlot? { switch self { - case .multiCommand(let slot): - return slot case .userPodExpiration(let slot, _): return slot case .podExpiring(let slot): @@ -104,17 +103,19 @@ public enum PumpManagerAlert: Hashable { return slot case .finishSetupReminder(let slot): return slot + case .unexpectedAlert(let slot): + return slot case .timeOffsetChangeDetected: return nil } } - + // Override background (UserNotification) content - + var backgroundContentTitle: String { return contentTitle } - + var backgroundContentBody: String { switch self { case .suspendEnded: @@ -124,23 +125,21 @@ public enum PumpManagerAlert: Hashable { } } - + var actionButtonLabel: String { return LocalizedString("Ok", comment: "Action button default text for PodAlerts") } - + var foregroundContent: Alert.Content { return Alert.Content(title: contentTitle, body: contentBody, acknowledgeActionButtonLabel: actionButtonLabel) } - + var backgroundContent: Alert.Content { return Alert.Content(title: backgroundContentTitle, body: backgroundContentBody, acknowledgeActionButtonLabel: actionButtonLabel) } - + var alertIdentifier: String { switch self { - case .multiCommand: - return "multiCommand" case .userPodExpiration: return "userPodExpiration" case .podExpiring: @@ -153,38 +152,38 @@ public enum PumpManagerAlert: Hashable { return "suspendInProgress" case .suspendEnded: return "suspendEnded" - case .timeOffsetChangeDetected: - return "timeOffsetChangeDetected" case .finishSetupReminder: return "finishSetupReminder" + case .unexpectedAlert: + return "unexpectedAlert" + case .timeOffsetChangeDetected: + return "timeOffsetChangeDetected" } } - + var repeatingAlertIdentifier: String { return alertIdentifier + "-repeating" } } extension PumpManagerAlert: RawRepresentable { - + public typealias RawValue = [String: Any] - + public init?(rawValue: RawValue) { guard let identifier = rawValue["identifier"] as? String else { return nil } - + let slot: AlertSlot? - + if let rawSlot = rawValue["slot"] as? AlertSlot.RawValue { slot = AlertSlot(rawValue: rawSlot) } else { slot = nil } - + switch identifier { - case "multiCommand": - self = .multiCommand(triggeringSlot: slot) case "userPodExpiration": guard let offset = rawValue["offset"] as? TimeInterval, offset > 0 else { return nil @@ -203,6 +202,8 @@ extension PumpManagerAlert: RawRepresentable { self = .suspendInProgress(triggeringSlot: slot) case "suspendEnded": self = .suspendEnded(triggeringSlot: slot) + case "unexpectedAlert": + self = .unexpectedAlert(triggeringSlot: slot) case "timeOffsetChangeDetected": self = .timeOffsetChangeDetected default: @@ -214,9 +215,9 @@ extension PumpManagerAlert: RawRepresentable { var rawValue: RawValue = [ "identifier": alertIdentifier ] - + rawValue["slot"] = triggeringSlot?.rawValue - + switch self { case .lowReservoir(_, lowReservoirReminderValue: let value): rawValue["value"] = value @@ -225,18 +226,7 @@ extension PumpManagerAlert: RawRepresentable { default: break } - - return rawValue - } -} -extension PodAlert { - var isIgnored: Bool { - switch self { - case .podSuspendedReminder, .finishSetupReminder: - return true - default: - return false - } + return rawValue } } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift new file mode 100644 index 0000000000..2596b476f0 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift @@ -0,0 +1,32 @@ +// +// SilencePodPreference.swift +// OmniBLE +// +// Created by Joe Moran on 8/30/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import Foundation + +public enum SilencePodPreference: Int, CaseIterable { + case disabled + case enabled + + var title: String { + switch self { + case .disabled: + return LocalizedString("Disabled", comment: "Title string for SilencePodPreference.disabled") + case .enabled: + return LocalizedString("Silenced", comment: "Title string for SilencePodPreference.enabled") + } + } + + var description: String { + switch self { + case .disabled: + return LocalizedString("Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled.", comment: "Description for SilencePodPreference.disabled") + case .enabled: + return LocalizedString("All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts.", comment: "Description for SilencePodPreference.enabled") + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift index 7e8a31e43b..cc8e2487d2 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift @@ -202,13 +202,13 @@ public struct UnfinalizedDose: RawRepresentable, Equatable, CustomStringConverti public var eventTitle: String { switch doseType { case .bolus: - return NSLocalizedString("Bolus", comment: "Pump Event title for UnfinalizedDose with doseType of .bolus") + return LocalizedString("Bolus", comment: "Pump Event title for UnfinalizedDose with doseType of .bolus") case .resume: - return NSLocalizedString("Resume", comment: "Pump Event title for UnfinalizedDose with doseType of .resume") + return LocalizedString("Resume", comment: "Pump Event title for UnfinalizedDose with doseType of .resume") case .suspend: - return NSLocalizedString("Suspend", comment: "Pump Event title for UnfinalizedDose with doseType of .suspend") + return LocalizedString("Suspend", comment: "Pump Event title for UnfinalizedDose with doseType of .suspend") case .tempBasal: - return NSLocalizedString("Temp Basal", comment: "Pump Event title for UnfinalizedDose with doseType of .tempBasal") + return LocalizedString("Temp Basal", comment: "Pump Event title for UnfinalizedDose with doseType of .tempBasal") } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/MessageTransport.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/MessageTransport.swift index 3844c82176..9a1fa5fbad 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/MessageTransport.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/MessageTransport.swift @@ -246,8 +246,6 @@ class PodMessageTransport: MessageTransport { payloads: [cmd.encoded(), Data()] ) - log.debug("Sending command: %@", wrapped.hexadecimalString) - let msg = MessagePacket( type: MessageType.ENCRYPTED, source: self.myId, @@ -272,14 +270,11 @@ class PodMessageTransport: MessageTransport { incrementNonceSeq() let decrypted = try enDecrypt.decrypt(readMessage, nonceSeq) - log.debug("Received response: %@", decrypted.payload.hexadecimalString) - let response = try parseResponse(decrypted: decrypted) incrementMsgSeq() incrementNonceSeq() let ack = try getAck(response: decrypted) - log.debug("Sending ACK: %@ in packet $ack", ack.payload.hexadecimalString) let ackResult = manager.sendMessagePacket(ack) guard case .sentWithAcknowledgment = ackResult else { throw PodProtocolError.messageIOException("Could not write $msgType: \(ackResult)") @@ -296,14 +291,14 @@ class PodMessageTransport: MessageTransport { private func parseResponse(decrypted: MessagePacket) throws -> Message { let data = try StringLengthPrefixEncoding.parseKeys([RESPONSE_PREFIX], decrypted.payload)[0] - log.info("Received decrypted response: %@ in packet: %@", data.hexadecimalString, decrypted.payload.hexadecimalString) + log.debug("Received decrypted response: %{public}@ in packet: %{public}@", data.hexadecimalString, decrypted.payload.hexadecimalString) // Dash pods generates a CRC16 for Omnipod Messages, but the actual algorithm is not understood and doesn't match the CRC16 // that the pod enforces for incoming Omnipod command message. The Dash PDM explicitly ignores the CRC16 for incoming messages, // so we ignore them as well and rely on higher level BLE & Dash message data checking to provide data corruption protection. let response = try Message(encodedData: data, checkCRC: false) - log.default("Recv(Hex): %@", data.hexadecimalString) + log.default("Recv(Hex): %{public}@", data.hexadecimalString) messageLogger?.didReceive(data) return response diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift index af0516f8d7..0683da998c 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -135,14 +135,6 @@ public class OmniBLEPumpManager: DeviceManager { return setStateWithResult(changes) } - @discardableResult - private func mutateState(_ changes: (_ state: inout OmniBLEPumpManagerState) -> Void) -> OmniBLEPumpManagerState { - return setStateWithResult({ (state) -> OmniBLEPumpManagerState in - changes(&state) - return state - }) - } - // Status can change even when state does not, because some status changes // purely based on time. This provides a mechanism to evaluate status changes // as time progresses and trigger status updates to clients. @@ -285,13 +277,15 @@ public class OmniBLEPumpManager: DeviceManager { public var debugDescription: String { let lines = [ "## OmniBLEPumpManager", - "podComms: \(String(reflecting: podComms))", "provideHeartbeat: \(provideHeartbeat)", "connected: \(isConnected)", - "state: \(String(reflecting: state))", + "", + "podComms: \(String(reflecting: podComms))", + "statusObservers.count: \(statusObservers.cleanupDeallocatedElements().count)", "status: \(String(describing: status))", + "", "podStateObservers.count: \(podStateObservers.cleanupDeallocatedElements().count)", - "statusObservers.count: \(statusObservers.cleanupDeallocatedElements().count)", + "state: \(String(reflecting: state))", ] return lines.joined(separator: "\n") } @@ -419,10 +413,22 @@ extension OmniBLEPumpManager { return false } + + private var podTime: TimeInterval { + get { + guard let podState = state.podState else { + return 0 + } + let elapsed = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podActiveTime = podState.podTime + elapsed + return podActiveTime + } + } + // Returns a suitable beep command MessageBlock based the current beep preferences and // whether there is an unfinializedDose for a manual temp basal &/or a manual bolus. private func beepMessageBlock(beepType: BeepType) -> MessageBlock? { - guard self.beepPreference.shouldBeepForManualCommand else { + guard self.beepPreference.shouldBeepForManualCommand && !self.silencePod else { return nil } @@ -505,6 +511,13 @@ extension OmniBLEPumpManager { } } + // Thread-safe + public var silencePod: Bool { + get { + return state.silencePod + } + } + // From last status response public var reservoirLevel: ReservoirLevel? { return state.reservoirLevel @@ -526,7 +539,7 @@ extension OmniBLEPumpManager { public var defaultExpirationReminderOffset: TimeInterval { set { - mutateState { (state) in + setState { (state) in state.defaultExpirationReminderOffset = newValue } } @@ -537,7 +550,7 @@ extension OmniBLEPumpManager { public var lowReservoirReminderValue: Double { set { - mutateState { (state) in + setState { (state) in state.lowReservoirReminderValue = newValue } } @@ -548,7 +561,7 @@ extension OmniBLEPumpManager { public var podAttachmentConfirmed: Bool { set { - mutateState { (state) in + setState { (state) in state.podAttachmentConfirmed = newValue } } @@ -559,7 +572,7 @@ extension OmniBLEPumpManager { public var initialConfigurationCompleted: Bool { set { - mutateState { (state) in + setState { (state) in state.initialConfigurationCompleted = newValue } } @@ -935,15 +948,13 @@ extension OmniBLEPumpManager { } } - let expiration = self.podExpiresAt ?? Date().addingTimeInterval(Pod.nominalPodLife) - let timeUntilExpirationReminder = expiration.addingTimeInterval(-self.state.defaultExpirationReminderOffset).timeIntervalSince(self.dateGenerator()) - + let expirationReminderTime = Pod.nominalPodLife - self.state.defaultExpirationReminderOffset let alerts: [PodAlert] = [ - .expirationReminder(self.state.defaultExpirationReminderOffset > 0 ? timeUntilExpirationReminder : 0), - .lowReservoir(self.state.lowReservoirReminderValue) + .expirationReminder(offset: self.podTime, absAlertTime: self.state.defaultExpirationReminderOffset > 0 ? expirationReminderTime : 0), + .lowReservoir(units: self.state.lowReservoirReminderValue) ] - let finishWait = try session.insertCannula(optionalAlerts: alerts) + let finishWait = try session.insertCannula(optionalAlerts: alerts, silent: self.silencePod) completion(.success(finishWait)) } catch let error { completion(.failure(.communication(error))) @@ -1004,15 +1015,44 @@ extension OmniBLEPumpManager { } } + public func getDetailedStatus(completion: ((_ result: PumpManagerResult) -> Void)? = nil) { + + // use hasSetupPod here instead of hasActivePod as DetailedStatus can be read with a faulted Pod + guard self.hasSetupPod else { + completion?(.failure(PumpManagerError.configuration(OmniBLEPumpManagerError.noPodPaired))) + return + } + + podComms.runSession(withName: "Get detailed status") { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .bipBip) + let detailedStatus = try session.getDetailedStatus(beepBlock: beepBlock) + session.dosesForStorage({ (doses) -> Bool in + self.store(doses: doses, in: session) + }) + completion?(.success(detailedStatus)) + case .failure(let error): + throw error + } + } catch let error { + completion?(.failure(.communication(error as? LocalizedError))) + self.log.error("Failed to fetch detailed status: %{public}@", String(describing: error)) + } + } + } + + // MARK: - Pump Commands - public func acknowledgePodAlerts(_ alertsToAcknowledge: AlertSet, completion: @escaping (_ alerts: [AlertSlot: PodAlert]?) -> Void) { + public func acknowledgePodAlerts(_ alertsToAcknowledge: AlertSet, completion: @escaping (_ alerts: AlertSet?) -> Void) { guard self.hasActivePod else { completion(nil) return } - self.podComms.runSession(withName: "Acknowledge Alarms") { (result) in + self.podComms.runSession(withName: "Acknowledge Alerts") { (result) in let session: PodCommsSession switch result { case .success(let s): @@ -1049,7 +1089,7 @@ extension OmniBLEPumpManager { switch result { case .success(let session): do { - let beep = self.beepPreference.shouldBeepForManualCommand + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let _ = try session.setTime(timeZone: timeZone, basalSchedule: self.state.basalSchedule, date: Date(), acknowledgementBeep: beep) self.clearSuspendReminder() self.setState { (state) in @@ -1107,7 +1147,7 @@ extension OmniBLEPumpManager { case .success: break } - let beep = self.beepPreference.shouldBeepForManualCommand + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let _ = try session.setBasalSchedule(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: beep) self.clearSuspendReminder() @@ -1169,12 +1209,12 @@ extension OmniBLEPumpManager { self.podComms.runSession(withName: "Play Test Beeps") { (result) in switch result { case .success(let session): - // preserve Pod completion beep state for any unfinalized manual insulin delivery - let beep = self.beepPreference.shouldBeepForManualCommand + // preserve the pod's completion beep state which gets reset playing beeps + let enabled: Bool = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let result = session.beepConfig( beepType: .bipBeepBipBeepBipBeepBipBeep, - tempBasalCompletionBeep: beep && self.hasUnfinalizedManualTempBasal, - bolusCompletionBeep: beep && self.hasUnfinalizedManualBolus + tempBasalCompletionBeep: enabled && self.hasUnfinalizedManualTempBasal, + bolusCompletionBeep: enabled && self.hasUnfinalizedManualBolus ) switch result { @@ -1227,16 +1267,20 @@ extension OmniBLEPumpManager { } public func setConfirmationBeeps(newPreference: BeepPreference, completion: @escaping (OmniBLEPumpManagerError?) -> Void) { - self.log.default("Set Confirmation Beeps to %s", String(describing: newPreference)) - guard self.hasActivePod else { + + // If there isn't an active pod or the pod is currently silenced, + // just need to update the internal state without any pod commands. + let name = String(format: "Set Beep Preference to %@", String(describing: newPreference)) + if !self.hasActivePod || self.silencePod { + self.log.default("%{public}@ for internal state only", name) self.setState { state in - state.confirmationBeeps = newPreference // set here to allow changes on a faulted Pod + state.confirmationBeeps = newPreference } completion(nil) return } - self.podComms.runSession(withName: "Set Confirmation Beeps Preference") { (result) in + self.podComms.runSession(withName: name) { (result) in switch result { case .success(let session): // enable/disable Pod completion beep state for any unfinalized manual insulin delivery @@ -1262,6 +1306,75 @@ extension OmniBLEPumpManager { } } } + + // Reconfigures all active alerts in pod to be silent or not as well as sets/clears the + // self.silencePod state variable which silences all confirmation beeping when enabled. + public func setSilencePod(silencePod: Bool, completion: @escaping (OmniBLEPumpManagerError?) -> Void) { + + let name = String(format: "%@ Pod", silencePod ? "Silence" : "Unsilence") + // allow Silence Pod changes without an active Pod + guard self.hasActivePod else { + self.log.default("%{public}@", name) + self.setState { state in + state.silencePod = silencePod + } + completion(nil) + return + } + + self.podComms.runSession(withName: name) { (result) in + + let session: PodCommsSession + switch result { + case .success(let s): + session = s + case .failure(let error): + completion(.communication(error)) + return + } + + guard let configuredAlerts = self.state.podState?.configuredAlerts, + let activeAlertSlots = self.state.podState?.activeAlertSlots, + let reservoirLevel = self.state.podState?.lastInsulinMeasurements?.reservoirLevel?.rawValue else + { + self.log.error("Missing podState") // should never happen + completion(OmniBLEPumpManagerError.noPodPaired) + return + } + + let beepBlock: MessageBlock? + if !self.beepPreference.shouldBeepForManualCommand { + // No enabled completion beeps to worry about for any in-progress manual delivery + beepBlock = nil + } else if silencePod { + // Disable completion beeps for any in-progress manual delivery w/o beeping + beepBlock = BeepConfigCommand(beepType: .noBeepNonCancel) + } else { + // Emit a confirmation beep and enable completion beeps for any in-progress manual delivery + beepBlock = BeepConfigCommand( + beepType: .bipBip, + tempBasalCompletionBeep: self.hasUnfinalizedManualTempBasal, + bolusCompletionBeep: self.hasUnfinalizedManualBolus + ) + } + + let podAlerts = regeneratePodAlerts(silent: silencePod, configuredAlerts: configuredAlerts, activeAlertSlots: activeAlertSlots, currentPodTime: self.podTime, currentReservoirLevel: reservoirLevel) + do { + // Since non-responsive pod comms are currently only resolved for insulin related commands, + // it's possible that a previous pod alert was successfully configured will lose its response + // and thus the alert won't get reset when reconfiguring pod alerts with a new silence pod state. + // So acknowledge all alerts now to be absolutely sure that no triggered alert will be forgotten. + try session.configureAlerts(podAlerts, acknowledgeAll: true, beepBlock: beepBlock) + self.setState { (state) in + state.silencePod = silencePod + } + completion(nil) + } catch { + self.log.error("Configure alerts %{public}@ failed: %{public}@", String(describing: podAlerts), String(describing: error)) + completion(.communication(error)) + } + } + } } // MARK: - PumpManager @@ -1425,7 +1538,7 @@ extension OmniBLEPumpManager: PumpManager { // Use a beepBlock for the confirmation beep to avoid getting 3 beeps using cancel command beeps! let beepBlock = self.beepMessageBlock(beepType: .beeeeeep) - let result = session.suspendDelivery(suspendReminder: suspendReminder, beepBlock: beepBlock) + let result = session.suspendDelivery(suspendReminder: suspendReminder, silent: self.silencePod, beepBlock: beepBlock) switch result { case .certainFailure(let error): self.log.error("Failed to suspend: %{public}@", String(describing: error)) @@ -1471,7 +1584,7 @@ extension OmniBLEPumpManager: PumpManager { do { let scheduleOffset = self.state.timeZone.scheduleOffset(forDate: Date()) - let beep = self.beepPreference.shouldBeepForManualCommand + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let _ = try session.resumeBasal(schedule: self.state.basalSchedule, scheduleOffset: scheduleOffset, acknowledgementBeep: beep) self.clearSuspendReminder() session.dosesForStorage() { (doses) -> Bool in @@ -1536,8 +1649,14 @@ extension OmniBLEPumpManager: PumpManager { // Round to nearest supported volume let enactUnits = roundToSupportedBolusVolume(units: units) - let acknowledgementBeep = self.beepPreference.shouldBeepForCommand(automatic: activationType.isAutomatic) - let completionBeep = beepPreference.shouldBeepForManualCommand && !activationType.isAutomatic + let acknowledgementBeep, completionBeep: Bool + if self.silencePod { + acknowledgementBeep = false + completionBeep = false + } else { + acknowledgementBeep = self.beepPreference.shouldBeepForCommand(automatic: activationType.isAutomatic) + completionBeep = beepPreference.shouldBeepForManualCommand && !activationType.isAutomatic + } self.podComms.runSession(withName: "Bolus") { (result) in let session: PodCommsSession @@ -1626,8 +1745,8 @@ extension OmniBLEPumpManager: PumpManager { } // when cancelling a bolus use the built-in type 6 beeeeeep to match PDM if confirmation beeps are enabled - let beeptype: BeepType = self.beepPreference.shouldBeepForManualCommand ? .beeeeeep : .noBeepCancel - let result = session.cancelDelivery(deliveryType: .bolus, beepType: beeptype) + let beepType: BeepType = self.beepPreference.shouldBeepForManualCommand && !self.silencePod ? .beeeeeep : .noBeepCancel + let result = session.cancelDelivery(deliveryType: .bolus, beepType: beepType) switch result { case .certainFailure(let error): throw error @@ -1660,8 +1779,14 @@ extension OmniBLEPumpManager: PumpManager { // Round to nearest supported rate let rate = roundToSupportedBasalRate(unitsPerHour: unitsPerHour) - let acknowledgementBeep = beepPreference.shouldBeepForCommand(automatic: automatic) - let completionBeep = beepPreference.shouldBeepForManualCommand && !automatic + let acknowledgementBeep, completionBeep: Bool + if self.silencePod { + acknowledgementBeep = false + completionBeep = false + } else { + acknowledgementBeep = beepPreference.shouldBeepForCommand(automatic: automatic) + completionBeep = beepPreference.shouldBeepForManualCommand && !automatic + } self.podComms.runSession(withName: "Enact Temp Basal") { (result) in self.log.info("Enact temp basal %.03fU/hr for %ds", rate, Int(duration)) @@ -1689,28 +1814,37 @@ extension OmniBLEPumpManager: PumpManager { throw PodCommsError.unfinalizedBolus } - let status: StatusResponse + // Did the last message have comms issues or is the last delivery status not verified correctly? + let uncertainDeliveryStatus = self.state.podState?.lastCommsOK == false || self.state.podState?.deliveryStatusVerified == false - // if resuming scheduled basal delivery & an acknowledgement beep is needed, use the cancel TB beep - let beepType: BeepType = resumingScheduledBasal && acknowledgementBeep ? .beep : .noBeepCancel - let result = session.cancelDelivery(deliveryType: .tempBasal, beepType: beepType) - switch result { - case .certainFailure(let error): - throw error - case .unacknowledged(let error): - throw error - case .success(let cancelTempStatus, _): - status = cancelTempStatus - } + // Do the cancel temp basal command if currently running a temp basal OR + // if resuming scheduled basal delivery OR if the delivery status is uncertain. + if self.state.podState?.unfinalizedTempBasal != nil || resumingScheduledBasal || uncertainDeliveryStatus { + let status: StatusResponse - // If pod is bolusing, fail if not resuming the scheduled basal - guard !status.deliveryStatus.bolusing || resumingScheduledBasal else { - throw PodCommsError.unfinalizedBolus - } + // if resuming scheduled basal delivery & an acknowledgement beep is needed, use the cancel TB beep + let beepType: BeepType = resumingScheduledBasal && acknowledgementBeep ? .beep : .noBeepCancel + let result = session.cancelDelivery(deliveryType: .tempBasal, beepType: beepType) + switch result { + case .certainFailure(let error): + throw error + case .unacknowledged(let error): + throw error + case .success(let cancelTempStatus, _): + status = cancelTempStatus + } - guard status.deliveryStatus != .suspended else { - self.log.info("Canceling temp basal because status return indicates pod is suspended.") - throw PodCommsError.podSuspended + // If pod is bolusing, fail if not resuming the scheduled basal + guard !status.deliveryStatus.bolusing || resumingScheduledBasal else { + throw PodCommsError.unfinalizedBolus + } + + guard status.deliveryStatus != .suspended else { + self.log.info("Canceling temp basal because status return indicates pod is suspended.") + throw PodCommsError.podSuspended + } + } else { + self.log.info("Skipped Cancel TB command before enacting temp basal") } defer { @@ -1778,7 +1912,7 @@ extension OmniBLEPumpManager: PumpManager { } public func syncDeliveryLimits(limits deliveryLimits: DeliveryLimits, completion: @escaping (Result) -> Void) { - mutateState { state in + setState { state in if let rate = deliveryLimits.maximumBasalRate?.doubleValue(for: .internationalUnitsPerHour) { state.maximumTempBasalRate = rate completion(.success(deliveryLimits)) @@ -1823,16 +1957,25 @@ extension OmniBLEPumpManager: PumpManager { return } - var timeUntilReminder : TimeInterval = 0 + let podTime = self.podTime + var expirationReminderPodTime: TimeInterval = 0 // default to expiration reminder alert inactive + + // If the interval before expiration is not a positive value (e.g., it's in the past), + // then the pod alert will get the default alert time of 0 making this alert inactive. if let intervalBeforeExpiration = intervalBeforeExpiration, intervalBeforeExpiration > 0 { - timeUntilReminder = expiresAt.addingTimeInterval(-intervalBeforeExpiration).timeIntervalSince(self.dateGenerator()) + let timeUntilReminder = expiresAt.addingTimeInterval(-intervalBeforeExpiration).timeIntervalSince(self.dateGenerator()) + // Only bother to set an expiration reminder pod alert if it is still at least a couple of minutes in the future + if timeUntilReminder > .minutes(2) { + expirationReminderPodTime = podTime + timeUntilReminder + self.log.debug("Update Expiration timeUntilReminder=%@, podTime=%@, expirationReminderPodTime=%@", timeUntilReminder.timeIntervalStr, podTime.timeIntervalStr, expirationReminderPodTime.timeIntervalStr) + } } - let expirationReminder = PodAlert.expirationReminder(timeUntilReminder) + let expirationReminder = PodAlert.expirationReminder(offset: podTime, absAlertTime: expirationReminderPodTime, silent: self.silencePod) do { let beepBlock = self.beepMessageBlock(beepType: .beep) try session.configureAlerts([expirationReminder], beepBlock: beepBlock) - self.mutateState({ (state) in + self.setState({ (state) in state.scheduledExpirationReminderOffset = intervalBeforeExpiration }) completion(nil) @@ -1856,7 +1999,8 @@ extension OmniBLEPumpManager: PumpManager { expiration.addingTimeInterval(.hours(Double(i))) } let now = dateGenerator() - return allDates.filter { $0.timeIntervalSince(now) > 0 } + // Have a couple minutes of slop to avoid confusion trying to set an expiration reminder too close to now + return allDates.filter { $0.timeIntervalSince(now) > .minutes(2) } } public var scheduledExpirationReminder: Date? { @@ -1869,9 +2013,26 @@ extension OmniBLEPumpManager: PumpManager { return expiration.addingTimeInterval(-.hours(round(offset.hours))) } + // Updates the low reservior reminder value both for the current pod (when applicable) and for future pods public func updateLowReservoirReminder(_ value: Int, completion: @escaping (OmniBLEPumpManagerError?) -> Void) { + + let supportedValue = min(max(0, Double(value)), Pod.maximumReservoirReading) + let setLowReservoirReminderValue = { + self.log.default("Set Low Reservoir Reminder to %d U", value) + self.lowReservoirReminderValue = supportedValue + completion(nil) + } + guard self.hasActivePod else { - completion(OmniBLEPumpManagerError.noPodPaired) + // no active pod, just set the internal state for the next pod + setLowReservoirReminderValue() + return + } + + guard let currentReservoirLevel = self.reservoirLevel?.rawValue, currentReservoirLevel > supportedValue else { + // Since the new low reservoir alert level is not below the current reservoir value, + // just set the internal state for the next pod to prevent an immediate low reservoir alert. + setLowReservoirReminderValue() return } @@ -1886,13 +2047,11 @@ extension OmniBLEPumpManager: PumpManager { return } - let lowReservoirReminder = PodAlert.lowReservoir(Double(value)) + let lowReservoirReminder = PodAlert.lowReservoir(units: supportedValue, silent: self.silencePod) do { let beepBlock = self.beepMessageBlock(beepType: .beep) try session.configureAlerts([lowReservoirReminder], beepBlock: beepBlock) - self.mutateState({ (state) in - state.lowReservoirReminderValue = Double(value) - }) + self.lowReservoirReminderValue = supportedValue completion(nil) } catch { completion(.communication(error)) @@ -1917,7 +2076,7 @@ extension OmniBLEPumpManager: PumpManager { } } - self.mutateState { (state) in + self.setState { (state) in state.activeAlerts.insert(alert) } } @@ -1933,7 +2092,7 @@ extension OmniBLEPumpManager: PumpManager { delegate?.retractAlert(identifier: repeatingIdentifier) } } - self.mutateState { (state) in + self.setState { (state) in state.activeAlerts.remove(alert) } } @@ -1954,6 +2113,8 @@ extension OmniBLEPumpManager: PumpManager { } } else { log.error("Unconfigured alert slot triggered: %{public}@", String(describing: slot)) + let pumpManagerAlert = PumpManagerAlert.unexpectedAlert(triggeringSlot: slot) + issueAlert(alert: pumpManagerAlert) } } for alert in removed { @@ -1962,34 +2123,24 @@ extension OmniBLEPumpManager: PumpManager { } private func getPumpManagerAlert(for podAlert: PodAlert, slot: AlertSlot) -> PumpManagerAlert? { - guard let podState = state.podState, let expiresAt = podState.expiresAt else { - preconditionFailure("trying to lookup alert info without podState") - } - - guard !podAlert.isIgnored else { - return nil - } switch podAlert { - case .podSuspendedReminder: - return PumpManagerAlert.suspendInProgress(triggeringSlot: slot) + case .shutdownImminent: + return PumpManagerAlert.podExpireImminent(triggeringSlot: slot) case .expirationReminder: - guard let offset = state.scheduledExpirationReminderOffset, offset > 0 else { - return nil + guard let podState = state.podState, let expiresAt = podState.expiresAt else { + preconditionFailure("trying to lookup expiresAt") } let timeToExpiry = TimeInterval(hours: expiresAt.timeIntervalSince(dateGenerator()).hours.rounded()) return PumpManagerAlert.userPodExpiration(triggeringSlot: slot, scheduledExpirationReminderOffset: timeToExpiry) - case .expired: - return PumpManagerAlert.podExpiring(triggeringSlot: slot) - case .shutdownImminent: - return PumpManagerAlert.podExpireImminent(triggeringSlot: slot) - case .lowReservoir(let units): + case .lowReservoir(let units, _): return PumpManagerAlert.lowReservoir(triggeringSlot: slot, lowReservoirReminderValue: units) - case .finishSetupReminder, .waitingForPairingReminder: - return PumpManagerAlert.finishSetupReminder(triggeringSlot: slot) case .suspendTimeExpired: return PumpManagerAlert.suspendEnded(triggeringSlot: slot) + case .expired: + return PumpManagerAlert.podExpiring(triggeringSlot: slot) default: + // No PumpManagerAlerts are used for any other pod alerts (including suspendInProgress). return nil } } @@ -2006,7 +2157,7 @@ extension OmniBLEPumpManager: PumpManager { } catch { return } - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) state.alertsWithPendingAcknowledgment.remove(alert) } @@ -2149,7 +2300,7 @@ extension OmniBLEPumpManager: PodCommsDelegate { } } else { // Resetting podState - mutateState { state in + setState { state in state.updatePodStateFromPodComms(podState) } } @@ -2178,6 +2329,13 @@ extension OmniBLEPumpManager { if alert.alertIdentifier == alertIdentifier { // If this alert was triggered by the pod find the slot to clear it. if let slot = alert.triggeringSlot { + if case .some(.suspended) = self.state.podState?.suspendState, slot == .slot6SuspendTimeExpired { + // Don't clear this pod alert here with the pod still suspended so that the suspend time expired + // pod alert beeping will continue until the pod is resumed which will then deactivate this alert. + log.default("Skipping acknowledgement of suspend time expired alert with a suspended pod") + completion(nil) + return + } self.podComms.runSession(withName: "Acknowledge Alert") { (result) in switch result { case .success(let session): @@ -2185,27 +2343,26 @@ extension OmniBLEPumpManager { let beepBlock = self.beepMessageBlock(beepType: .beep) let _ = try session.acknowledgeAlerts(alerts: AlertSet(slots: [slot]), beepBlock: beepBlock) } catch { - self.mutateState { state in + self.setState { state in state.alertsWithPendingAcknowledgment.insert(alert) } completion(error) return } - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) } completion(nil) case .failure(let error): - self.mutateState { state in + self.setState { state in state.alertsWithPendingAcknowledgment.insert(alert) } completion(error) - return } } } else { // Non-pod alert - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) if alert == .timeOffsetChangeDetected { state.acknowledgedTimeOffsetAlert = true @@ -2228,7 +2385,7 @@ extension FaultEventCode { case .exceededMaximumPodLife80Hrs: return LocalizedString("Pod Expired", comment: "The title for Pod Expired alarm notification") default: - return LocalizedString("Critical Pod Error", comment: "The title for AlarmCode.other notification") + return String(format: LocalizedString("Critical Pod Fault %1$03d", comment: "The title for AlarmCode.other notification: (1: fault code value)"), self.rawValue) } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManagerState.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManagerState.swift index b4d7c41ac0..d86ce58d93 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManagerState.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManagerState.swift @@ -30,6 +30,8 @@ public struct OmniBLEPumpManagerState: RawRepresentable, Equatable { public var unstoredDoses: [UnfinalizedDose] + public var silencePod: Bool + public var confirmationBeeps: BeepPreference public var controllerId: UInt32 = 0 @@ -96,6 +98,7 @@ public struct OmniBLEPumpManagerState: RawRepresentable, Equatable { self.timeZone = timeZone self.basalSchedule = basalSchedule self.unstoredDoses = [] + self.silencePod = false self.confirmationBeeps = .manualCommands if controllerId != nil && podId != nil { self.controllerId = controllerId! @@ -192,6 +195,8 @@ public struct OmniBLEPumpManagerState: RawRepresentable, Equatable { self.unstoredDoses = [] } + self.silencePod = rawValue["silencePod"] as? Bool ?? false + if let rawBeeps = rawValue["confirmationBeeps"] as? BeepPreference.RawValue, let confirmationBeeps = BeepPreference(rawValue: rawBeeps) { self.confirmationBeeps = confirmationBeeps } else { @@ -246,6 +251,7 @@ public struct OmniBLEPumpManagerState: RawRepresentable, Equatable { "timeZone": timeZone.secondsFromGMT(), "basalSchedule": basalSchedule.rawValue, "unstoredDoses": unstoredDoses.map { $0.rawValue }, + "silencePod": silencePod, "confirmationBeeps": confirmationBeeps.rawValue, "activeAlerts": activeAlerts.map { $0.rawValue }, "podAttachmentConfirmed": podAttachmentConfirmed, @@ -299,20 +305,24 @@ extension OmniBLEPumpManagerState: CustomDebugStringConvertible { "* tempBasalEngageState: \(String(describing: tempBasalEngageState))", "* lastPumpDataReportDate: \(String(describing: lastPumpDataReportDate))", "* isPumpDataStale: \(String(describing: isPumpDataStale))", + "* silencePod: \(String(describing: silencePod))", "* confirmationBeeps: \(String(describing: confirmationBeeps))", "* controllerId: \(String(format: "%08X", controllerId))", "* podId: \(String(format: "%08X", podId))", "* insulinType: \(String(describing: insulinType))", - "* scheduledExpirationReminderOffset: \(String(describing: scheduledExpirationReminderOffset))", - "* defaultExpirationReminderOffset: \(defaultExpirationReminderOffset)", + "* scheduledExpirationReminderOffset: \(String(describing: scheduledExpirationReminderOffset?.timeIntervalStr))", + "* defaultExpirationReminderOffset: \(defaultExpirationReminderOffset.timeIntervalStr)", "* lowReservoirReminderValue: \(lowReservoirReminderValue)", "* podAttachmentConfirmed: \(podAttachmentConfirmed)", "* activeAlerts: \(activeAlerts)", "* alertsWithPendingAcknowledgment: \(alertsWithPendingAcknowledgment)", "* acknowledgedTimeOffsetAlert: \(acknowledgedTimeOffsetAlert)", "* initialConfigurationCompleted: \(initialConfigurationCompleted)", - String(reflecting: podState), - "* PreviousPodState: \(String(reflecting: previousPodState))" + "", + "* PodState: " + (podState == nil ? "nil" : String(describing: podState!)), + "", + "* PreviousPodState: " + (previousPodState == nil ? "nil" : String(describing: previousPodState!)), + "", ].joined(separator: "\n") } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift index 2434eb95a3..b3664040db 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift @@ -1,6 +1,6 @@ // // PodCommsSession.swift -// OmnipodKit +// OmniBLE // // From OmniKit/PumpManager/PodCommsSession.swift // Created by Pete Schwamb on 10/13/17. @@ -274,6 +274,7 @@ public class PodCommsSession { let message = Message(address: podState.address, messageBlocks: blocksToSend, sequenceNum: messageNumber, expectFollowOnMessage: expectFollowOnMessage) + self.podState.lastCommsOK = false // mark last comms as not OK until we get the expected response let response = try transport.sendMessage(message) // Simulate fault @@ -282,6 +283,7 @@ public class PodCommsSession { if let responseMessageBlock = response.messageBlocks[0] as? T { log.info("POD Response: %{public}@", String(describing: responseMessageBlock)) + self.podState.lastCommsOK = true // message successfully sent and expected response received return responseMessageBlock } @@ -379,10 +381,16 @@ public class PodCommsSession { } @discardableResult - func configureAlerts(_ alerts: [PodAlert], beepBlock: MessageBlock? = nil) throws -> StatusResponse { + func configureAlerts(_ alerts: [PodAlert], acknowledgeAll: Bool = false, beepBlock: MessageBlock? = nil) throws -> StatusResponse { let configurations = alerts.map { $0.configuration } let configureAlerts = ConfigureAlertsCommand(nonce: podState.currentNonce, configurations: configurations) - let status: StatusResponse = try send([configureAlerts], beepBlock: beepBlock) + var blocksToSend: [MessageBlock] = [configureAlerts] + if acknowledgeAll { + // requested to acknowledge any possible pending pod alerts out of an abundnace of caution + let acknowledgeAll = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) + blocksToSend += [acknowledgeAll] + } + let status: StatusResponse = try send(blocksToSend, beepBlock: beepBlock) for alert in alerts { podState.registerConfiguredAlert(slot: alert.configuration.slot, alert: alert) } @@ -415,11 +423,11 @@ public class PodCommsSession { } } - public func insertCannula(optionalAlerts: [PodAlert] = []) throws -> TimeInterval { + public func insertCannula(optionalAlerts: [PodAlert] = [], silent: Bool) throws -> TimeInterval { let cannulaInsertionUnits = Pod.cannulaInsertionUnits + Pod.cannulaInsertionUnitsExtra let insertionWait: TimeInterval = .seconds(cannulaInsertionUnits / Pod.primeDeliveryRate) - guard let activatedAt = podState.activatedAt else { + guard podState.activatedAt != nil else { throw PodCommsError.noPodPaired } @@ -438,12 +446,12 @@ public class PodCommsSession { } podState.updateFromStatusResponse(status, at: currentDate) } else { - // Configure all the non-optional Pod Alarms - let expirationTime = activatedAt + Pod.nominalPodLife - let timeUntilExpirationAdvisory = expirationTime.timeIntervalSinceNow - let expirationAdvisoryAlarm = PodAlert.expired(alertTime: timeUntilExpirationAdvisory, duration: Pod.expirationAdvisoryWindow) - let endOfServiceTime = activatedAt + Pod.serviceDuration - let shutdownImminentAlarm = PodAlert.shutdownImminent((endOfServiceTime - Pod.endOfServiceImminentWindow).timeIntervalSinceNow) + let elapsed: TimeInterval = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podTime = podState.podTime + elapsed + + // Configure the mandatory Pod Alerts for shutdown imminent alert (79 hours) and pod expiration alert (72 hours) along with any optional alerts + let shutdownImminentAlarm = PodAlert.shutdownImminent(offset: podTime, absAlertTime: Pod.serviceDuration - Pod.endOfServiceImminentWindow, silent: silent) + let expirationAdvisoryAlarm = PodAlert.expired(offset: podTime, absAlertTime: Pod.nominalPodLife, duration: Pod.expirationAdvisoryWindow, silent: silent) try configureAlerts([expirationAdvisoryAlarm, shutdownImminentAlarm] + optionalAlerts) } @@ -494,7 +502,9 @@ public class PodCommsSession { let timeBetweenPulses = TimeInterval(seconds: Pod.secondsPerBolusPulse) let bolusScheduleCommand = SetInsulinScheduleCommand(nonce: podState.currentNonce, units: units, timeBetweenPulses: timeBetweenPulses, extendedUnits: extendedUnits, extendedDuration: extendedDuration) - if podState.unfinalizedBolus != nil { + // Do a getstatus to verify that there isn't an on-going bolus in progress if the last bolus command is still + // finalized, if the last delivery status wasn't successfully verified or the last comms attempt wasn't OK + if podState.unfinalizedBolus != nil || !podState.deliveryStatusVerified || !podState.lastCommsOK { var ongoingBolus = true if let statusResponse: StatusResponse = try? send([GetStatusCommand()]) { podState.updateFromStatusResponse(statusResponse, at: currentDate) @@ -596,7 +606,8 @@ public class PodCommsSession { // A suspendReminder of 0 is an untimed suspend which only uses podSuspendedReminder alert beeps. // A suspendReminder of 1-5 minutes will only use suspendTimeExpired alert beeps. // A suspendReminder of > 5 min will have periodic podSuspendedReminder beeps followed by suspendTimeExpired alerts. - public func suspendDelivery(suspendReminder: TimeInterval? = nil, beepBlock: MessageBlock? = nil) -> CancelDeliveryResult { + // The configured alerts will set up as silent pod alerts if silent is true. + public func suspendDelivery(suspendReminder: TimeInterval? = nil, silent: Bool, beepBlock: MessageBlock? = nil) -> CancelDeliveryResult { guard podState.unacknowledgedCommand == nil else { return .certainFailure(error: .unacknowledgedCommandPending) @@ -607,6 +618,9 @@ public class PodCommsSession { var podSuspendedReminderAlert: PodAlert? = nil var suspendTimeExpiredAlert: PodAlert? = nil let suspendTime: TimeInterval = suspendReminder != nil ? suspendReminder! : 0 + let elapsed: TimeInterval = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podTime = podState.podTime + elapsed + log.debug("suspendDelivery: podState.podTime=%@, elapsed=%.2fs, computed timeActive %@", podState.podTime.timeIntervalStr, elapsed, podTime.timeIntervalStr) let cancelDeliveryCommand = CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel) var commandsToSend: [MessageBlock] = [cancelDeliveryCommand] @@ -614,14 +628,14 @@ public class PodCommsSession { // podSuspendedReminder provides a periodic pod suspended reminder beep until the specified suspend time. if suspendReminder != nil && (suspendTime == 0 || suspendTime > .minutes(5)) { // using reminder beeps for an untimed or long enough suspend time requiring pod suspended reminders - podSuspendedReminderAlert = PodAlert.podSuspendedReminder(active: true, suspendTime: suspendTime) + podSuspendedReminderAlert = PodAlert.podSuspendedReminder(active: true, offset: podTime, suspendTime: suspendTime, silent: silent) alertConfigurations += [podSuspendedReminderAlert!.configuration] } // suspendTimeExpired provides suspend time expired alert beeping after the expected suspend time has passed. if suspendTime > 0 { // a timed suspend using a suspend time expired alert - suspendTimeExpiredAlert = PodAlert.suspendTimeExpired(suspendTime: suspendTime) + suspendTimeExpiredAlert = PodAlert.suspendTimeExpired(offset: podTime, suspendTime: suspendTime, silent: silent) alertConfigurations += [suspendTimeExpiredAlert!.configuration] } @@ -661,8 +675,8 @@ public class PodCommsSession { private func cancelSuspendAlerts() throws -> StatusResponse { do { - let podSuspendedReminder = PodAlert.podSuspendedReminder(active: false, suspendTime: 0) - let suspendTimeExpired = PodAlert.suspendTimeExpired(suspendTime: 0) // A suspendTime of 0 deactivates this alert + let podSuspendedReminder = PodAlert.podSuspendedReminder(active: false, offset: 0, suspendTime: 0) + let suspendTimeExpired = PodAlert.suspendTimeExpired(offset: 0, suspendTime: 0) // A suspendTime of 0 deactivates this alert let status = try configureAlerts([podSuspendedReminder, suspendTimeExpired]) return status @@ -727,6 +741,11 @@ public class PodCommsSession { let basalExtraCommand = BasalScheduleExtraCommand.init(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: acknowledgementBeep, programReminderInterval: programReminderInterval) do { + if !(podState.lastCommsOK && podState.deliveryStatusVerified) { + // Can't trust the current delivery state -- do a cancel all + // to be sure that setting a basal program won't fault the pod. + let _: StatusResponse = try send([CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel)]) + } var status: StatusResponse = try send([basalScheduleCommand, basalExtraCommand]) let now = currentDate podState.suspendState = .resumed(now) @@ -911,11 +930,11 @@ public class PodCommsSession { } } - public func acknowledgeAlerts(alerts: AlertSet, beepBlock: MessageBlock? = nil) throws -> [AlertSlot: PodAlert] { + public func acknowledgeAlerts(alerts: AlertSet, beepBlock: MessageBlock? = nil) throws -> AlertSet { let cmd = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: alerts) let status: StatusResponse = try send([cmd], beepBlock: beepBlock) podState.updateFromStatusResponse(status, at: currentDate) - return podState.activeAlerts + return podState.activeAlertSlots } func dosesForStorage(_ storageHandler: ([UnfinalizedDose]) -> Bool) { diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodState.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodState.swift index ecc0b92e12..31fc77a9f7 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodState.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodState.swift @@ -1,6 +1,6 @@ // // PodState.swift -// OmnipodKit +// OmniBLE // // Based on OmniKit/PumpManager/PodState.swift // Created by Pete Schwamb on 10/13/17. @@ -58,9 +58,12 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl public var bleIdentifier: String public var activatedAt: Date? - public var expiresAt: Date? // set based on StatusResponse timeActive and can change with Pod clock drift and/or system time change + public var expiresAt: Date? // set based on timeActive and can change with Pod clock drift and/or system time change public var activeTime: TimeInterval? // Useful after pod deactivated or faulted. + public var podTime: TimeInterval // pod time from the last response, always whole minute values + public var podTimeUpdated: Date? // time that the podTime value was last updated + public var setupUnitsDelivered: Double? public let firmwareVersion: String @@ -68,7 +71,7 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl public let lotNo: UInt32 public let lotSeq: UInt32 public let productId: UInt8 - var activeAlertSlots: AlertSet + public var activeAlertSlots: AlertSet public var lastInsulinMeasurements: PodInsulinMeasurements? public var unacknowledgedCommand: PendingCommand? @@ -100,16 +103,6 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl public var configuredAlerts: [AlertSlot: PodAlert] public var insulinType: InsulinType - public var activeAlerts: [AlertSlot: PodAlert] { - var active = [AlertSlot: PodAlert]() - for slot in activeAlertSlots { - if let alert = configuredAlerts[slot] { - active[slot] = alert - } - } - return active - } - // Allow a grace period while the unacknowledged command is first being sent. public var needsCommsRecovery: Bool { if let unacknowledgedCommand = unacknowledgedCommand, !unacknowledgedCommand.isInFlight { @@ -117,7 +110,11 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl } return false } - + + // the following two vars are not persistent across app restarts + public var deliveryStatusVerified: Bool + public var lastCommsOK: Bool + public init(address: UInt32, ltk: Data, firmwareVersion: String, bleFirmwareVersion: String, lotNo: UInt32, lotSeq: UInt32, productId: UInt8, messageTransportState: MessageTransportState? = nil, bleIdentifier: String, insulinType: InsulinType) { self.address = address self.ltk = ltk @@ -134,9 +131,12 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl self.messageTransportState = messageTransportState ?? MessageTransportState(ck: nil, noncePrefix: nil) self.primeFinishTime = nil self.setupProgress = .addressAssigned - self.configuredAlerts = [.slot7: .waitingForPairingReminder] + self.configuredAlerts = [.slot7Expired: .waitingForPairingReminder] self.bleIdentifier = bleIdentifier self.insulinType = insulinType + self.deliveryStatusVerified = false + self.lastCommsOK = false + self.podTime = 0 } public var unfinishedSetup: Bool { @@ -171,18 +171,30 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl public mutating func advanceToNextNonce() { // Dash nonce is a fixed value and is never advanced } - + public var currentNonce: UInt32 { - let fixedNonceValue: UInt32 = 0x494E532E // Dash uses a fixed value for pod nonce - return fixedNonceValue // not clear if the actual value even matters + let fixedNonceValue: UInt32 = 0x494E532E // Dash pods require this particular fixed value + return fixedNonceValue } - + public mutating func resyncNonce(syncWord: UInt16, sentNonce: UInt32, messageSequenceNum: Int) { - assert(false) // XXX ?should never be called for Dash? + print("resyncNonce expectedly called!") // Should never be called for Dash! } - + + // Saves the current pod timeActive and will initialize the activatedAtComputed at + // pod startup and updates the expiresAt value to account for pod clock differences. private mutating func updatePodTimes(timeActive: TimeInterval) -> Date { let now = Date() + + guard timeActive >= self.podTime else { + // The pod active time went backwards and thus we have an apparent reset fault. + // Don't update any times or displayed expiresAt time will expectedly jump. + return now + } + + self.podTime = timeActive + self.podTimeUpdated = now + let activatedAtComputed = now - timeActive if activatedAt == nil { self.activatedAt = activatedAtComputed @@ -194,7 +206,6 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl // The computed expiresAt time is earlier than or more than a minute later than the current expiresAt time, // so use the computed expiresAt time instead to handle Pod clock drift and/or system time changes issues. // The more than a minute later test prevents oscillation of expiresAt based on the timing of the responses. - // TODO: A significant deviation expiresAt from activatedAt + nominalPodLife should generate a critical alert self.expiresAt = expiresAtComputed } return now @@ -285,13 +296,25 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl private mutating func updateDeliveryStatus(deliveryStatus: DeliveryStatus, podProgressStatus: PodProgressStatus, bolusNotDelivered: Double, at date: Date) { + deliveryStatusVerified = true // See if the pod deliveryStatus indicates an active bolus or temp basal that the PodState isn't tracking (possible Loop restart) if deliveryStatus.bolusing && unfinalizedBolus == nil { // active bolus that Loop doesn't know about? if podProgressStatus.readyForDelivery { + deliveryStatusVerified = false // remember that we had inconsistent (bolus) delivery status // Create an unfinalizedBolus with the remaining bolus amount to capture what we can. unfinalizedBolus = UnfinalizedDose(bolusAmount: bolusNotDelivered, startTime: date, scheduledCertainty: .certain, insulinType: insulinType, automatic: false) } } + if deliveryStatus.tempBasalRunning && unfinalizedTempBasal == nil { // active temp basal that app isn't tracking + deliveryStatusVerified = false // remember that we had inconsistent (temp basal) delivery status + // unfinalizedTempBasal = UnfinalizedDose(tempBasalRate: 0, startTime: Date(), duration: .minutes(30), isHighTemp: false, scheduledCertainty: .certain, insulinType: insulinType) + } + if deliveryStatus != .suspended && isSuspended { // active basal that app isn't tracking + deliveryStatusVerified = false // remember that we had inconsistent (basal) delivery status + let resumeStartTime = Date() + suspendState = .resumed(resumeStartTime) + unfinalizedResume = UnfinalizedDose(resumeStartTime: resumeStartTime, scheduledCertainty: .certain, insulinType: insulinType) + } if var bolus = unfinalizedBolus, !deliveryStatus.bolusing { // Due to clock drift or comms delays, boluses can finish earlier than we expect @@ -362,6 +385,16 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl } } + if let podTime = rawValue["podTime"] as? TimeInterval, + let podTimeUpdated = rawValue["podTimeUpdated"] as? Date + { + self.podTime = podTime + self.podTimeUpdated = podTimeUpdated + } else { + self.podTime = 0 + self.podTimeUpdated = Date() + } + if let setupUnitsDelivered = rawValue["setupUnitsDelivered"] as? Double { self.setupUnitsDelivered = setupUnitsDelivered } @@ -461,12 +494,12 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl } else { // Assume migration, and set up with alerts that are normally configured self.configuredAlerts = [ - .slot2: .shutdownImminent(0), - .slot3: .expirationReminder(0), - .slot4: .lowReservoir(0), - .slot5: .podSuspendedReminder(active: false, suspendTime: 0), - .slot6: .suspendTimeExpired(suspendTime: 0), - .slot7: .expired(alertTime: 0, duration: 0) + .slot2ShutdownImminent: .shutdownImminent(offset: 0, absAlertTime: 0), + .slot3ExpirationReminder: .expirationReminder(offset: 0, absAlertTime: 0), + .slot4LowReservoir: .lowReservoir(units: 0), + .slot5SuspendedReminder: .podSuspendedReminder(active: false, offset: 0, suspendTime: 0), + .slot6SuspendTimeExpired: .suspendTimeExpired(offset: 0, suspendTime: 0), + .slot7Expired: .expired(offset: 0, absAlertTime: 0, duration: 0) ] } @@ -477,6 +510,9 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl } else { self.insulinType = .novolog } + + self.deliveryStatusVerified = false + self.lastCommsOK = false } public var rawValue: RawValue { @@ -508,6 +544,8 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl rawValue["primeFinishTime"] = primeFinishTime rawValue["activatedAt"] = activatedAt rawValue["expiresAt"] = expiresAt + rawValue["podTime"] = podTime + rawValue["podTimeUpdated"] = podTimeUpdated rawValue["setupUnitsDelivered"] = setupUnitsDelivered rawValue["activeTime"] = activeTime @@ -529,6 +567,8 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl "* bleIdentifier: \(bleIdentifier)", "* activatedAt: \(String(reflecting: activatedAt))", "* expiresAt: \(String(reflecting: expiresAt))", + "* podTime: \(podTime.timeIntervalStr)", + "* podTimeUpdated: \(String(reflecting: podTimeUpdated))", "* setupUnitsDelivered: \(String(reflecting: setupUnitsDelivered))", "* firmwareVersion: \(firmwareVersion)", "* bleFirmwareVersion: \(bleFirmwareVersion)", @@ -541,16 +581,14 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl "* unfinalizedSuspend: \(String(describing: unfinalizedSuspend))", "* unfinalizedResume: \(String(describing: unfinalizedResume))", "* finalizedDoses: \(String(describing: finalizedDoses))", - "* activeAlerts: \(String(describing: activeAlerts))", + "* activeAlertsSlots: \(alertSetString(alertSet: activeAlertSlots))", "* messageTransportState: \(String(describing: messageTransportState))", "* setupProgress: \(setupProgress)", "* primeFinishTime: \(String(describing: primeFinishTime))", - "* configuredAlerts: \(String(describing: configuredAlerts))", + "* configuredAlerts: \(configuredAlertsString(configuredAlerts: configuredAlerts))", "* insulinType: \(String(describing: insulinType))", - "* pdmRef: \(String(describing: fault?.pdmRef))", - "", - fault != nil ? String(reflecting: fault!) : "fault: nil", - "", + "* pdmRef: " + (fault?.pdmRef == nil ? "nil" : String(describing: fault!.pdmRef!)), + "* Fault: " + (fault == nil ? "nil" : String(describing: fault!)), ].joined(separator: "\n") } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewControllers/DashUICoordinator.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewControllers/DashUICoordinator.swift index 0fd0f68914..7dc5f50352 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewControllers/DashUICoordinator.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewControllers/DashUICoordinator.swift @@ -149,7 +149,7 @@ class DashUICoordinator: UINavigationController, PumpManagerOnboarding, Completi hostedView.navigationItem.title = LocalizedString("Insulin Type", comment: "Title for insulin type selection screen") return hostedView case .deactivate: - let viewModel = DeactivatePodViewModel(podDeactivator: pumpManager, podAttachedToBody: pumpManager.podAttachmentConfirmed) + let viewModel = DeactivatePodViewModel(podDeactivator: pumpManager, podAttachedToBody: pumpManager.podAttachmentConfirmed, fault: pumpManager.state.podState?.fault) viewModel.didFinish = { [weak self] in self?.stepFinished() diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift index 011e16df8e..76064cb3b1 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift @@ -10,8 +10,8 @@ import Foundation import LoopKitUI public protocol PodDeactivater { - func deactivatePod(completion: @escaping (OmniBLEPumpManagerError?) -> ()) - func forgetPod(completion: @escaping () -> ()) + func deactivatePod(completion: @escaping (OmniBLEPumpManagerError?) -> Void) + func forgetPod(completion: @escaping () -> Void) } extension OmniBLEPumpManager: PodDeactivater {} @@ -19,16 +19,6 @@ extension OmniBLEPumpManager: PodDeactivater {} class DeactivatePodViewModel: ObservableObject, Identifiable { - public var podAttachedToBody: Bool - - var instructionText: String { - if podAttachedToBody { - return LocalizedString("Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod.", comment: "Instructions for deactivate pod when pod is on body") - } else { - return LocalizedString("Please deactivate the pod. When deactivation is complete, you may pair a new pod.", comment: "Instructions for deactivate pod when pod not on body") - } - } - enum DeactivatePodViewModelState { case active case deactivating @@ -124,9 +114,38 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { var podDeactivator: PodDeactivater - init(podDeactivator: PodDeactivater, podAttachedToBody: Bool) { + var podAttachedToBody: Bool + + var instructionText: String + + init(podDeactivator: PodDeactivater, podAttachedToBody: Bool, fault: DetailedStatus?) { + + var text: String = "" + if let faultEventCode = fault?.faultEventCode { + let notificationString = faultEventCode.notificationTitle + switch faultEventCode.faultType { + case .exceededMaximumPodLife80Hrs, .reservoirEmpty, .occluded: + // Just prepend a simple sentence with the notification string for these faults. + // Other occluded related 0x6? faults will be treated as a general pod error as per the PDM. + text = String(format: "%@. ", notificationString) + default: + // Display the fault code in decimal and hex, the fault description and the pdmRef string for other errors. + text = String(format: "⚠️ %1$@ (0x%2$02X)\n%3$@\n", notificationString, faultEventCode.rawValue, faultEventCode.faultDescription) + if let pdmRef = fault?.pdmRef { + text += LocalizedString("Ref: ", comment: "PDM Ref string line") + pdmRef + "\n\n" + } + } + } + + if podAttachedToBody { + text += LocalizedString("Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod.", comment: "Instructions for deactivate pod when pod is on body") + } else { + text += LocalizedString("Please deactivate the pod. When deactivation is complete, you may pair a new pod.", comment: "Instructions for deactivate pod when pod not on body") + } + self.podDeactivator = podDeactivator self.podAttachedToBody = podAttachedToBody + self.instructionText = text } public func continueButtonTapped() { @@ -137,7 +156,7 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { podDeactivator.deactivatePod { (error) in DispatchQueue.main.async { if let error = error { - self.state = .resultError(DeactivationError.OmnipodPumpManagerError(error)) + self.state = .resultError(DeactivationError.OmniBLEPumpManagerError(error)) } else { self.discardPod(navigateOnCompletion: false) } @@ -160,18 +179,18 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { } enum DeactivationError : LocalizedError { - case OmnipodPumpManagerError(OmniBLEPumpManagerError) + case OmniBLEPumpManagerError(OmniBLEPumpManagerError) var recoverySuggestion: String? { switch self { - case .OmnipodPumpManagerError: + case .OmniBLEPumpManagerError: return LocalizedString("There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod.", comment: "Format string for recovery suggestion during deactivate pod.") } } var errorDescription: String? { switch self { - case .OmnipodPumpManagerError(let error): + case .OmniBLEPumpManagerError(let error): return error.errorDescription } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift index 6a10108962..8904dcb26d 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift @@ -1,5 +1,5 @@ // -// DashSettingsViewModel.swift +// OmniBLESettingsViewModel.swift // OmniBLE // // Created by Pete Schwamb on 3/8/20. @@ -40,6 +40,8 @@ class OmniBLESettingsViewModel: ObservableObject { @Published var beepPreference: BeepPreference + @Published var silencePodPreference: SilencePodPreference + @Published var podConnected: Bool var activatedAtString: String { @@ -136,7 +138,7 @@ class OmniBLESettingsViewModel: ObservableObject { var recoveryText: String? { if case .fault = podCommState { - return LocalizedString("Insulin delivery stopped. Change Pod now.", comment: "The action string on pod status page when pod faulted") + return LocalizedString("⚠️ Insulin delivery stopped. Change Pod now.", comment: "The action string on pod status page when pod faulted") } else if podOk && isPodDataStale { return LocalizedString("Make sure your phone and pod are close to each other. If communication issues persist, move to a new area.", comment: "The action string on pod status page when pod data is stale") } else if let serviceTimeRemaining = pumpManager.podServiceTimeRemaining, serviceTimeRemaining <= Pod.serviceDuration - Pod.nominalPodLife { @@ -233,6 +235,7 @@ class OmniBLESettingsViewModel: ObservableObject { lowReservoirAlertValue = Int(self.pumpManager.state.lowReservoirReminderValue) podCommState = self.pumpManager.podCommState beepPreference = self.pumpManager.beepPreference + silencePodPreference = self.pumpManager.silencePod ? .enabled : .disabled podConnected = self.pumpManager.isConnected insulinType = self.pumpManager.insulinType podDetails = self.pumpManager.podDetails @@ -262,7 +265,7 @@ class OmniBLESettingsViewModel: ObservableObject { } func stopUsingOmnipodDashTapped() { - self.pumpManager.notifyDelegateOfDeactivation { + pumpManager.notifyDelegateOfDeactivation { DispatchQueue.main.async { self.didFinish?() } @@ -321,10 +324,30 @@ class OmniBLESettingsViewModel: ObservableObject { } } + func readPodStatus(_ completion: @escaping (_ result: PumpManagerResult) -> Void) { + pumpManager.getDetailedStatus() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readPulseLog(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readPulseLog() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + func playTestBeeps(_ completion: @escaping (Error?) -> Void) { pumpManager.playTestBeeps(completion: completion) } + func pumpManagerDetails(_ completion: @escaping (_ result: String) -> Void) { + completion(pumpManager.debugDescription) + } + func setConfirmationBeeps(_ preference: BeepPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) { pumpManager.setConfirmationBeeps(newPreference: preference) { error in DispatchQueue.main.async { @@ -336,6 +359,17 @@ class OmniBLESettingsViewModel: ObservableObject { } } + func setSilencePod(_ silencePodPreference: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) { + pumpManager.setSilencePod(silencePod: silencePodPreference == .enabled) { error in + DispatchQueue.main.async { + if error == nil { + self.silencePodPreference = silencePodPreference + } + completion(error) + } + } + } + func didChangeInsulinType(_ newType: InsulinType?) { self.pumpManager.insulinType = newType } @@ -351,6 +385,10 @@ class OmniBLESettingsViewModel: ObservableObject { } } + var noPod: Bool { + return podCommState == .noPod + } + var podError: String? { switch podCommState { case .fault(let status): @@ -362,11 +400,11 @@ class OmniBLESettingsViewModel: ObservableObject { case .occluded, .occlusionCheckStartup1, .occlusionCheckStartup2, .occlusionCheckTimeouts1, .occlusionCheckTimeouts2, .occlusionCheckTimeouts3, .occlusionCheckPulseIssue, .occlusionCheckBolusProblem, .occlusionCheckAboveThreshold, .occlusionCheckValueTooHigh: return LocalizedString("Pod Occlusion", comment: "Error message for reservoir view when pod occlusion checks failed") default: - return LocalizedString("Pod Error", comment: "Error message for reservoir view during general pod fault") + return String(format: LocalizedString("Pod Fault %1$03d", comment: "Error message for reservoir view during general pod fault: (1: fault code value)"), status.faultEventCode.rawValue) } case .active: if isPodDataStale { - return LocalizedString("Signal Loss", comment: "Error message for reservoir view during general pod fault") + return LocalizedString("Signal Loss", comment: "Error message for reservoir view during signal loss") } else { return nil } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/PodLifeState.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/PodLifeState.swift index bf0b1ed316..4fce7b928e 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/PodLifeState.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/PodLifeState.swift @@ -85,7 +85,7 @@ enum PodLifeState { case .podDeactivating: return LocalizedString("Finish deactivation", comment: "Settings page link description when next lifecycle action is to finish deactivation") default: - return LocalizedString("Replace Pod", comment: "Settings page link description when next lifecycle action is to replace pod") + return LocalizedString("Deactivate Pod", comment: "Settings page link description when next lifecycle action is to deactivate pod") } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ActivityView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ActivityView.swift new file mode 100644 index 0000000000..83aa3e5bb5 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ActivityView.swift @@ -0,0 +1,36 @@ +// +// ActivityView.swift +// OmniBLE +// +// Created by Joe Moran on 9/17/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI + +struct ActivityView: UIViewControllerRepresentable { + @Binding var isPresented: Bool + let activityItems: [Any] + + func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIActivityViewController { + let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + controller.completionWithItemsHandler = { (_, _, _, _) in + self.isPresented = false + } + return controller + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext) { + } +} + +fileprivate struct ActivityViewController: UIViewControllerRepresentable { + var activityItems: [Any] + var applicationActivities: [UIActivity]? = nil + + func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIActivityViewController { + return UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities) + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext) {} +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift index 80cfc691d7..93e8d74025 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift @@ -33,7 +33,7 @@ struct AttachPodView: View { HStack { InstructionList(instructions: [ LocalizedString("Prepare site.", comment: "Label text for step one of attach pod instructions"), - LocalizedString("Remove blue Pod needle cap and check cannula. Then remove paper backing.", comment: "Label text for step two of attach pod instructions"), + LocalizedString("Remove the Pod's blue needle cap and check cannula. Then remove paper backing.", comment: "Label text for step two of attach pod instructions"), LocalizedString("Check Pod, apply to site, then confirm pod attachment.", comment: "Label text for step three of attach pod instructions") ]) } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/BeepPreferenceSelectionView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/BeepPreferenceSelectionView.swift index b6ff6998db..2af381623a 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/BeepPreferenceSelectionView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/BeepPreferenceSelectionView.swift @@ -38,7 +38,7 @@ struct BeepPreferenceSelectionView: View { VStack { List { Section { - Text(LocalizedString("Confidence reminders are beeps from the pod which can be used to acknowledge selected commands.", comment: "Help text for BeepPreferenceSelectionView")).fixedSize(horizontal: false, vertical: true) + Text(LocalizedString("Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced.", comment: "Help text for BeepPreferenceSelectionView")).fixedSize(horizontal: false, vertical: true) .padding(.vertical, 10) } @@ -109,15 +109,15 @@ struct BeepPreferenceSelectionView: View { private var cancelButton: some View { Button(action: { self.presentationMode.wrappedValue.dismiss() } ) { - Text(LocalizedString("Cancel", comment: "Button title for cancelling low reservoir reminder edit")) + Text(LocalizedString("Cancel", comment: "Button title for cancelling confidence reminders edit")) } } var saveButtonText: String { if saving { - return LocalizedString("Saving...", comment: "button title for saving low reservoir reminder while saving") + return LocalizedString("Saving...", comment: "button title for saving confidence reminder while saving") } else { - return LocalizedString("Save", comment: "button title for saving low reservoir reminder") + return LocalizedString("Save", comment: "button title for saving confidence reminder") } } @@ -134,7 +134,7 @@ struct BeepPreferenceSelectionView: View { } -struct ContentView_Previews: PreviewProvider { +struct BeepPreferenceSelectionView_Previews: PreviewProvider { static var previews: some View { NavigationView { BeepPreferenceSelectionView(initialValue: .extended) { selectedValue, completion in diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ExpirationReminderPickerView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ExpirationReminderPickerView.swift index 47918c7ca6..3b8dd06c02 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ExpirationReminderPickerView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ExpirationReminderPickerView.swift @@ -61,6 +61,6 @@ struct ExpirationReminderPickerView: View { struct ExpirationReminderPickerView_Previews: PreviewProvider { static var previews: some View { - ExpirationReminderPickerView(expirationReminderDefault: .constant(2)) + ExpirationReminderPickerView(expirationReminderDefault: .constant(2), showingHourPicker: true) } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/FirstAppear.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/FirstAppear.swift new file mode 100644 index 0000000000..2c042a75c2 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/FirstAppear.swift @@ -0,0 +1,30 @@ +// +// FirstAppear.swift +// OmniBLE +// +// Created by Joe Moran on 9/24/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI + +extension View { + func onFirstAppear(_ action: @escaping () -> ()) -> some View { + modifier(FirstAppear(action: action)) + } +} + +private struct FirstAppear: ViewModifier { + let action: () -> () + + // State used to insure action is invoked here only once + @State private var hasAppeared = false + + func body(content: Content) -> some View { + content.onAppear { + guard !hasAppeared else { return } + hasAppeared = true + action() + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ManualTempBasalEntryView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ManualTempBasalEntryView.swift index 8fbda6ab18..aaed7d32b6 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ManualTempBasalEntryView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ManualTempBasalEntryView.swift @@ -95,7 +95,7 @@ struct ManualTempBasalEntryView: View { .frame(maxHeight: 162.0) .alert(isPresented: $showingMissingConfigAlert, content: { missingConfigAlert }) Section { - Text(LocalizedString("Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled.", comment: "Description text on manual temp basal action sheet")) + Text(LocalizedString("Your insulin delivery will not be automatically adjusted until the temporary basal rate finishes or is canceled.", comment: "Description text on manual temp basal action sheet")) .font(.footnote) .foregroundColor(.secondary) .fixedSize(horizontal: false, vertical: true) @@ -147,7 +147,7 @@ struct ManualTempBasalEntryView: View { var missingConfigAlert: SwiftUI.Alert { return SwiftUI.Alert( title: Text(LocalizedString("Missing Config", comment: "Alert title for missing temp basal configuration")), - message: Text(LocalizedString("This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate.", comment: "Alert format string for missing temp basal configuration.")) + message: Text(LocalizedString("This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Pump Settings in the settings CONFIGURATION section to set a new Max Basal.", comment: "Alert format string for missing temp basal configuration.")) ) } @@ -158,7 +158,4 @@ struct ManualTempBasalEntryView: View { } .accessibility(identifier: "button_cancel") } - } - - diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/NotificationSettingsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/NotificationSettingsView.swift index 259d39ce1d..087c873fbe 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/NotificationSettingsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/NotificationSettingsView.swift @@ -34,15 +34,15 @@ struct NotificationSettingsView: View { var body: some View { RoundedCardScrollView { RoundedCard( - title: LocalizedString("Omnipod Reminders", comment: "Title for omnipod reminders section"), - footer: LocalizedString("The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod.", comment: "Footer text for omnipod reminders section") + title: LocalizedString("Pod Reminders", comment: "Title for pod reminders section"), + footer: LocalizedString("The app configures a reminder on the Pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure by default when pairing a new Pod.", comment: "Footer text for pod reminders section") ) { ExpirationReminderPickerView(expirationReminderDefault: $expirationReminderDefault) } if let allowedDates = allowedScheduledReminderDates { RoundedCard( - footer: LocalizedString("This is a reminder that you scheduled when you paired your current Pod.", comment: "Footer text for scheduled reminder area")) + footer: LocalizedString("The expiration reminder time for the current Pod.", comment: "Footer text for scheduled reminder area")) { Text(LocalizedString("Scheduled Reminder", comment: "Title of scheduled reminder card on NotificationSettingsView")) Divider() @@ -50,13 +50,13 @@ struct NotificationSettingsView: View { } } - RoundedCard(footer: LocalizedString("The App notifies you when the amount of insulin in the Pod reaches this level.", comment: "Footer text for low reservoir value row")) { + RoundedCard(footer: LocalizedString("The app notifies you when the amount of insulin in the Pod reaches this level.", comment: "Footer text for low reservoir value row")) { lowReservoirValueRow } RoundedCard( title: LocalizedString("Critical Alerts", comment: "Title for critical alerts description"), - footer: LocalizedString("The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode.", comment: "Description text for critical alerts") + footer: LocalizedString("The above reminders will not sound in the app if your device is in Silent or Do Not Disturb mode. There are other critical Pod alerts that will sound in the app even if your device is set to Silent or Do Not Disturb mode.\n\nThe Pod will also use audible beeps for all Pod reminders and alerts except when the Pod is Silenced.", comment: "Description text for critical alerts") ) } .navigationBarTitle(LocalizedString("Notification Settings", comment: "navigation title for notification settings")) @@ -66,7 +66,8 @@ struct NotificationSettingsView: View { private func scheduledReminderRow(scheduledDate: Date?, allowedDates: [Date]) -> some View { Group { - if let scheduledDate = scheduledDate, scheduledDate <= Date() { + // Make the expiration reminder time read-only if there aren't any more available times. + if allowedDates.isEmpty { scheduledReminderRowContents(disclosure: false) } else { NavigationLink( @@ -124,14 +125,16 @@ struct NotificationSettingsView: View { struct NotificationSettingsView_Previews: PreviewProvider { static var previews: some View { return Group { + let now = Date() NavigationView { - NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: Date(), allowedScheduledReminderDates: [Date()], lowReservoirReminderValue: 20) + NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: now + TimeInterval(hours: 1), allowedScheduledReminderDates: [now, now - TimeInterval(hours: 2), now - TimeInterval(hours: 3)], lowReservoirReminderValue: 20) .previewDevice(PreviewDevice(rawValue:"iPod touch (7th generation)")) .previewDisplayName("iPod touch (7th generation)") } NavigationView { - NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: Date(), allowedScheduledReminderDates: [Date()], lowReservoirReminderValue: 20) + let now = Date() + NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: now + TimeInterval(hours: 1), allowedScheduledReminderDates: [now, now - TimeInterval(hours: 2), now - TimeInterval(hours: 3)], lowReservoirReminderValue: 20) .colorScheme(.dark) .previewDevice(PreviewDevice(rawValue: "iPhone XS Max")) .previewDisplayName("iPhone XS Max - Dark") diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift index 88085192e3..976334b28c 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift @@ -12,11 +12,11 @@ import LoopKitUI import HealthKit struct OmniBLESettingsView: View { - + @ObservedObject var viewModel: OmniBLESettingsViewModel - + @State private var showingDeleteConfirmation = false - + @State private var showSuspendOptions = false @State private var showManualTempBasalOptions = false @@ -28,7 +28,7 @@ struct OmniBLESettingsView: View { @State private var cancelingTempBasal = false var supportedInsulinTypes: [InsulinType] - + @Environment(\.guidanceColors) var guidanceColors @Environment(\.insulinTintColor) var insulinTintColor @@ -243,7 +243,7 @@ struct OmniBLESettingsView: View { } private var doneButton: some View { - Button("Done", action: { + Button(LocalizedString("Done", comment: "Title of done button on OmniBLESettingsView"), action: { self.viewModel.doneTapped() }) } @@ -279,7 +279,7 @@ struct OmniBLESettingsView: View { headerImage lifecycleProgress - + HStack(alignment: .top) { deliveryStatus Spacer() @@ -302,7 +302,7 @@ struct OmniBLESettingsView: View { }.padding(.vertical, 8) } } - + Section(header: SectionHeader(label: LocalizedString("Activity", comment: "Section header for activity section"))) { suspendResumeRow() .disabled(!self.viewModel.podOk) @@ -343,8 +343,8 @@ struct OmniBLESettingsView: View { manualTempBasalRow } } - .disabled(cancelingTempBasal) - + .disabled(cancelingTempBasal || !self.viewModel.podOk) + Section() { HStack { FrameworkLocalText("Pod Activated", comment: "Label for pod insertion row") @@ -352,7 +352,7 @@ struct OmniBLESettingsView: View { Text(self.viewModel.activatedAtString) .foregroundColor(Color.secondary) } - + HStack { if let expiresAt = viewModel.expiresAt, expiresAt < Date() { FrameworkLocalText("Pod Expired", comment: "Label for pod expiration row, past tense") @@ -363,21 +363,34 @@ struct OmniBLESettingsView: View { Text(self.viewModel.expiresAtString) .foregroundColor(Color.secondary) } - + if let podDetails = self.viewModel.podDetails { - NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Device Details", comment: "title for device details page"))) { - FrameworkLocalText("Device Details", comment: "Text for device details disclosure row").foregroundColor(Color.primary) + NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Pod Details", comment: "title for pod details page"))) { + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row").foregroundColor(Color.primary) + } + } else { + HStack { + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row") + Spacer() + Text("—") + .foregroundColor(Color.secondary) + } + } + + if let previousPodDetails = viewModel.previousPodDetails { + NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row").foregroundColor(Color.primary) } } else { HStack { - FrameworkLocalText("Device Details", comment: "Text for device details disclosure row") + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row") Spacer() Text("—") .foregroundColor(Color.secondary) } } } - + Section() { Button(action: { self.viewModel.navigateTo?(self.viewModel.lifeState.nextPodLifecycleAction) @@ -386,7 +399,7 @@ struct OmniBLESettingsView: View { .foregroundColor(self.viewModel.lifeState.nextPodLifecycleActionColor) } } - + Section(header: SectionHeader(label: LocalizedString("Configuration", comment: "Section header for configuration section"))) { NavigationLink(destination: @@ -409,9 +422,17 @@ struct OmniBLESettingsView: View { .foregroundColor(.secondary) } } + NavigationLink(destination: SilencePodSelectionView(initialValue: viewModel.silencePodPreference, onSave: viewModel.setSilencePod)) { + HStack { + FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link").foregroundColor(Color.primary) + Spacer() + Text(viewModel.silencePodPreference.title) + .foregroundColor(.secondary) + } + } NavigationLink(destination: InsulinTypeSetting(initialValue: viewModel.insulinType, supportedInsulinTypes: supportedInsulinTypes, allowUnsetInsulinType: false, didChange: viewModel.didChangeInsulinType)) { HStack { - FrameworkLocalText("Insulin Type", comment: "Text for confidence reminders navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Insulin Type", comment: "Text for insulin type navigation link").foregroundColor(Color.primary) if let currentTitle = viewModel.insulinType?.brandName { Spacer() Text(currentTitle) @@ -420,7 +441,7 @@ struct OmniBLESettingsView: View { } } } - + Section() { HStack { FrameworkLocalText("Pump Time", comment: "The title of the command to change pump time zone") @@ -451,14 +472,23 @@ struct OmniBLESettingsView: View { } } - if let previousPodDetails = viewModel.previousPodDetails { - Section() { - NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { - FrameworkLocalText("Previous Pod Information", comment: "Text for previous pod information row").foregroundColor(Color.primary) - } + Section(header: SectionHeader(label: LocalizedString("Diagnostics", comment: "Section header for diagnostic section"))) { + NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { + FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link").foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + NavigationLink(destination: ReadPulseLogView(toRun: viewModel.readPulseLog)) { + FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link").foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { + FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link").foregroundColor(Color.primary) + } + .disabled(!self.viewModel.podOk) + NavigationLink(destination: PumpManagerDetailsView(toRun: viewModel.pumpManagerDetails)) { + FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link").foregroundColor(Color.primary) } } - if self.viewModel.lifeState.allowsPumpManagerRemoval { Section() { diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift new file mode 100644 index 0000000000..e004ee2595 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift @@ -0,0 +1,101 @@ +// +// PlayTestBeepsView.swift +// OmniBLE +// +// Created by Joe Moran on 9/1/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + + +struct PlayTestBeepsView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var successMessage = LocalizedString("Play test beeps command sent successfully.\n\nIf you did not hear any beeps from your Pod, the piezo speaker in your Pod may be broken or disabled.", comment: "Success message for play test beeps") + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView = false + + init(toRun: @escaping (_ completion: @escaping (_ result: Error?) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + Text(self.displayString).fixedSize(horizontal: false, vertical: true) + } + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (error) in + if let error = error { + self.displayString = "" + self.error = error + self.alertIsPresented = true + } else { + self.displayString = successMessage + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + } else { + return LocalizedString("Play Test Beeps", comment: "button title to play test beeps") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } + +} + +struct PlayTestBeepsView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + PlayTestBeepsView() { completion in + completion(nil) + } + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDetailsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDetailsView.swift index 95b26dcd1f..dba04387ce 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDetailsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDetailsView.swift @@ -92,12 +92,12 @@ struct PodDetailsView: View { row(LocalizedString("Device Name", comment: "description label for device name pod details row"), value: deviceName) } row(LocalizedString("Lot Number", comment: "description label for lot number pod details row"), value: String(describing: podDetails.lotNumber)) - row(LocalizedString("Sequence Number", comment: "description label for sequence number pod details row"), value: String(describing: podDetails.sequenceNumber)) + row(LocalizedString("Sequence Number", comment: "description label for sequence number pod details row"), value: String(format: "%07d", podDetails.sequenceNumber)) row(LocalizedString("Firmware Version", comment: "description label for firmware version pod details row"), value: podDetails.firmwareVersion) row(LocalizedString("BLE Firmware Version", comment: "description label for ble firmware version pod details row"), value: podDetails.bleFirmwareVersion) row(LocalizedString("Total Delivery", comment: "description label for total delivery pod details row"), value: totalDeliveryText) if let activeTime = podDetails.activeTime, let activatedAt = podDetails.activatedAt { - row(LocalizedString("Pod Activated", comment: "description label for activated at timne pod details row"), value: dateFormatter.string(from: activatedAt)) + row(LocalizedString("Pod Activated", comment: "description label for activated at time pod details row"), value: dateFormatter.string(from: activatedAt)) row(LocalizedString("Active Time", comment: "description label for active time pod details row"), value: activeTimeText(activeTime)) } else { row(LocalizedString("Last Status", comment: "description label for last status date pod details row"), value: lastStatusText) @@ -111,10 +111,7 @@ struct PodDetailsView: View { Text(LocalizedString("Pod Fault Details", comment: "description label for pod fault details")) .fontWeight(.semibold) }.padding(.vertical, 4) - Text(String(describing: fault)) - .fixedSize(horizontal: false, vertical: true) - .foregroundColor(.secondary) - Text("Ref: " + pdmRef) + Text(String(format: LocalizedString("Internal Pod fault code %1$03d\n%2$@\nRef: %3$@\n", comment: "The format string for the pod fault info: (1: fault code) (2: fault description) (3: pdm ref string)"), fault.rawValue, fault.faultDescription, pdmRef)) .fixedSize(horizontal: false, vertical: true) .foregroundColor(.secondary) } @@ -127,6 +124,6 @@ struct PodDetailsView: View { struct PodDetailsView_Previews: PreviewProvider { static var previews: some View { - PodDetailsView(podDetails: PodDetails(lotNumber: 0x1234, sequenceNumber: 0x1234, firmwareVersion: "1.1.1", bleFirmwareVersion: "2.2.2", deviceName: "PreviewPod", totalDelivery: 10, lastStatus: Date(), fault: FaultEventCode(rawValue: 0x67), activatedAt: Date().addingTimeInterval(.days(1))), title: "Device Details") + PodDetailsView(podDetails: PodDetails(lotNumber: 123456789, sequenceNumber: 1234567, firmwareVersion: "4.3.2", bleFirmwareVersion: "1.2.3", deviceName: "DashPreviewPod", totalDelivery: 99, lastStatus: Date(), fault: FaultEventCode(rawValue: 064), activatedAt: Date().addingTimeInterval(.days(2)), pdmRef: "19-02448-09951-064"), title: "Device Details") } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift new file mode 100644 index 0000000000..14b8281ab5 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift @@ -0,0 +1,100 @@ +// +// PumpManagerDetailsView.swift +// OmniBLE +// +// Created by Joe Moran on 9/26/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + + +struct PumpManagerDetailsView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + + @State private var displayString: String = "" + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: String) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + let myFont = Font + .system(size: 12) + .monospaced() + Text(self.displayString) + .font(myFont) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details")) + .navigationBarTitleDisplayMode(.inline) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + self.displayString = result + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + } else { + return LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") + } + } +} + +struct PumpManagerDetailsView_Previews: PreviewProvider { + static var previews: some View { + let examplePumpManagerDetails: String = "## OmniBLEPumpManager\nprovideHeartbeat: false\nconnected: true\n\npodComms: ## PodComms\n* myId: 171637F8\n* podId: 171637FB\ndelegate: true\n\nstatusObservers.count: 2\nstatus: ## PumpManagerStatus\n* timeZone: GMT-0700 (fixed)\n* device: <, name:Omnipod-Dash, manufacturer:Insulet, model:Dash, hardware:4, firmware:4.10.0 1.4.0, software:1.0, localIdentifier:171637FB>\n* pumpBatteryChargeRemaining: nil\n* basalDeliveryState: Optional(LoopKit.PumpManagerStatus.BasalDeliveryState.tempBasal(LoopKit.DoseEntry(type: LoopKit.DoseType.tempBasal, startDate: 2023-10-08 00:21:42 +0000, endDate: 2023-10-08 00:51:42 +0000, value: 1.55, unit: LoopKit.DoseUnit.unitsPerHour, deliveredUnits: nil, description: nil, insulinType: Optional(LoopKit.InsulinType.humalog), automatic: Optional(true), manuallyEntered: false, syncIdentifier: nil, isMutable: true, wasProgrammedByPumpUI: false, scheduledBasalRate: nil)))\n* bolusState: noBolus\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* deliveryIsUncertain: false\n\npodStateObservers.count: 1\nstate: ## OmniBLEPumpManagerState\n* isOnboarded: true\n* timeZone: GMT-0700 (fixed)\n* basalSchedule: BasalSchedule(entries: [OmniBLE.BasalScheduleEntry(rate: 1.0, startTime: 0.0)])\n* maximumTempBasalRate: 5.0\n* unstoredDoses: []\n* suspendEngageState: stable\n* bolusEngageState: stable\n* tempBasalEngageState: stable\n* lastPumpDataReportDate: Optional(2023-09-28 14:03:50 +0000)\n* isPumpDataStale: false\n* silencePod: true\n* confirmationBeeps: extended\n* controllerId: 171637F8\n* podId: 171637FB\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* scheduledExpirationReminderOffset: Optional(22h0m)\n* defaultExpirationReminderOffset: 24h0m\n* lowReservoirReminderValue: 50.0\n* podAttachmentConfirmed: true\n* activeAlerts: []\n* alertsWithPendingAcknowledgment: []\n* acknowledgedTimeOffsetAlert: false\n* initialConfigurationCompleted: true\n* podState: ### PodState\n* address: 171637FB\n* bleIdentifier: 20672963-16E5-D8F8-9C06-1233FEAA61EB\n* activatedAt: Optional(2023-09-25 06:04:36 +0000)\n* expiresAt: Optional(2023-09-28 06:02:46 +0000)\n* timeActive: 79h59m\n* timeActiveUpdated: Optional(2023-09-28 14:03:50 +0000)\n* setupUnitsDelivered: Optional(2.8)\n* firmwareVersion: 4.10.0\n* bleFirmwareVersion: 1.4.0\n* lotNo: 139865265\n* lotSeq: 2770428\n* suspendState: suspended(2023-09-28 14:02:47 +0000)\n* unacknowledgedCommand: nil\n* unfinalizedBolus: nil\n* unfinalizedTempBasal: nil\n* unfinalizedSuspend: Optional(Suspend: 9/28/23, 7:02:47 AM Certain)\n* unfinalizedResume: Optional(Resume: 9/24/23, 11:06:33 PM Certain)\n* finalizedDoses: []\n* activeAlertsSlots: No alerts\n* messageTransportState: ##\nMessageTransportState\neapSeq: 1059\nmsgSeq: 7\nnonceSeq: 6\nmessageNumber: 14\n* setupProgress: completed\n* primeFinishTime: Optional(2023-10-05 05:46:46 +0000)\n* configuredAlerts: [OmniBLE.AlertSlot.slot7Expired: Pod expired, OmniBLE.AlertSlot.slot2ShutdownImminent: Shutdown imminent, OmniBLE.AlertSlot.slot3ExpirationReminder: Expiration reminder, OmniBLE.AlertSlot.slot4LowReservoir: Low reservoir]\n* insulinType: humalog\n* PdmRef: nil\n* Fault: nil\n\nPreviousPodState: nil" + NavigationView { + PumpManagerDetailsView() { completion in + completion(examplePumpManagerDetails) + } + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift new file mode 100644 index 0000000000..255b638f27 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift @@ -0,0 +1,167 @@ +// +// ReadPodStatusView.swift +// OmniBLE +// +// Created by Joe Moran on 8/15/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + +private func podStatusString(status: DetailedStatus) -> String { + var result, str: String + + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .full + formatter.allowedUnits = [.hour, .minute] + formatter.unitsStyle = .short + if let timeStr = formatter.string(from: status.timeActive) { + str = timeStr + } else { + str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) + } + result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) + + result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) + + result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) + + result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) + + result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) + + result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) + + result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) + + result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) + + if status.radioRSSI != 0 { + result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) + result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) + } + + if status.faultEventCode.faultType != .noFaults { + // report the additional fault related information in a separate section + result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) + result += String(format: "\n%1$@", status.faultEventCode.faultDescription) + if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, + let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) + { + result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) + } + if let errorEventInfo = status.errorEventInfo { + result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) + result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) + result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) + result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) + result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) + } + if let pdmRef = status.pdmRef { + result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) + } + } + + return result +} + +struct ReadPodStatusView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var error: LocalizedError? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + Text(self.displayString).fixedSize(horizontal: false, vertical: true) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Read Pod Status", comment: "navigation title for read pod status")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + switch result { + case .success(let detailedStatus): + self.displayString = podStatusString(status: detailedStatus) + case .failure(let error): + self.error = error + self.alertIsPresented = true + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + } else { + return LocalizedString("Read Pod Status", comment: "button title to read pod status") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct ReadPodStatusView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + let detailedStatus = try! DetailedStatus(encodedData: Data([0x02, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc3, 0x6a, 0x02, 0x07, 0x03, 0xff, 0x02, 0x09, 0x20, 0x00, 0x28, 0x00, 0x08, 0x00, 0x82])) + ReadPodStatusView() { completion in + completion(.success(detailedStatus)) + } + } + } + } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift new file mode 100644 index 0000000000..a1220b3766 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift @@ -0,0 +1,128 @@ +// +// ReadPulseLogView.swift +// OmniBLE +// +// Created by Joe Moran on 9/1/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + + +struct ReadPulseLogView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: Result) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + let myFont = Font + .system(size: 12) + .monospaced() + Text(self.displayString) + .font(myFont) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Read Pulse Log", comment: "navigation title for read pulse log")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + switch result { + case .success(let pulseLogString): + self.displayString = pulseLogString + case .failure(let error): + self.displayString = "" + self.error = error + self.alertIsPresented = true + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Reading Pulse Log...", comment: "button title when executing read pulse log") + } else { + return LocalizedString("Read Pulse Log", comment: "button title to read pulse log") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct ReadPulsePodLogView_Previews: PreviewProvider { + static var previews: some View { + ReadPulseLogView() { completion in + let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, + 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, + 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, + 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, + 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, + 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, + 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, + 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, + 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, + 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, + 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, + 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, + 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, + 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) + let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) + completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/SilencePodSelectionView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/SilencePodSelectionView.swift new file mode 100644 index 0000000000..9510992d7d --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/SilencePodSelectionView.swift @@ -0,0 +1,143 @@ +// +// SilencePodSelectionView.swift +// OmniBLE +// +// Created by Joe Moran 8/30/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI + +struct SilencePodSelectionView: View { + + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var initialValue: SilencePodPreference + @State private var preference: SilencePodPreference + private var onSave: ((_ selectedValue: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var error: LocalizedError? + @State private var saving: Bool = false + + + init(initialValue: SilencePodPreference, onSave: @escaping (_ selectedValue: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) -> Void) { + self.initialValue = initialValue + self._preference = State(initialValue: initialValue) + self.onSave = onSave + } + + var body: some View { + contentWithCancel + } + + var content: some View { + VStack { + List { + Section { + Text(LocalizedString("Silence Pod mode suppresses all Pod alert and confirmation reminder beeping.", comment: "Help text for Silence Pod view")).fixedSize(horizontal: false, vertical: true) + .padding(.vertical, 10) + } + Section { + ForEach(SilencePodPreference.allCases, id: \.self) { preference in + HStack { + CheckmarkListItem( + title: Text(preference.title), + description: Text(preference.description), + isSelected: Binding( + get: { self.preference == preference }, + set: { isSelected in + if isSelected { + self.preference = preference + } + } + ) + ) + } + .padding(.vertical, 10) + } + } + .buttonStyle(PlainButtonStyle()) // Disable row highlighting on selection + } + VStack { + Button(action: { + saving = true + onSave?(preference) { (error) in + saving = false + if let error = error { + self.error = error + self.alertIsPresented = true + } else { + self.presentationMode.wrappedValue.dismiss() + } + } + }) { + Text(saveButtonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(saving || !valueChanged) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Silence Pod", comment: "navigation title for Silnce Pod")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + } + + private var contentWithCancel: some View { + if saving { + return AnyView(content + .navigationBarBackButtonHidden(true) + ) + } else if valueChanged { + return AnyView(content + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: cancelButton) + ) + } else { + return AnyView(content) + } + } + + private var cancelButton: some View { + Button(action: { self.presentationMode.wrappedValue.dismiss() } ) { + Text(LocalizedString("Cancel", comment: "Button title for cancelling silence pod edit")) + } + } + + var saveButtonText: String { + if saving { + return LocalizedString("Saving...", comment: "button title for saving silence pod preference while saving") + } else { + return LocalizedString("Save", comment: "button title for saving silence pod preference") + } + } + + private var valueChanged: Bool { + return preference != initialValue + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to update silence pod preference.", comment: "Alert title for error when updating silence pod preference")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct SilencePodSelectionView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + SilencePodSelectionView(initialValue: .disabled) { selectedValue, completion in + print("Selected: \(selectedValue)") + completion(nil) + } + } + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/UncertaintyRecoveredView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/UncertaintyRecoveredView.swift index c9e9f9f8e7..249f6fd956 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/UncertaintyRecoveredView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/UncertaintyRecoveredView.swift @@ -16,8 +16,8 @@ struct UncertaintyRecoveredView: View { var body: some View { GuidePage(content: { - Text("\(self.appName) has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use \(self.appName) normally now.") - .padding([.top, .bottom]) + Text(String(format: LocalizedString("%1$@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %2$@ normally now.", comment: "Text body for page showing insulin uncertainty has been recovered (1: appName) (2: appName)"), self.appName, self.appName)) + .padding([.top, .bottom]) }) { VStack { Button(action: { diff --git a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj index 66dcf7b2c3..62051ea904 100644 --- a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj +++ b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj @@ -157,6 +157,14 @@ CEC751DF29D8834B006E9D24 /* RileyLinkKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1229C1929C7E5BC0066A89C /* RileyLinkKitUI.framework */; }; CEC751E329D88392006E9D24 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC751E229D88392006E9D24 /* LoopKitUI.framework */; }; CEF2639B29D88516009921F1 /* OmniKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C124016C29C7D87A00B32844 /* OmniKit.framework */; }; + D845A1352AF89DEC00EA0853 /* SilencePodPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1342AF89DEC00EA0853 /* SilencePodPreference.swift */; }; + D845A1462AF8A4DA00EA0853 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1452AF8A4DA00EA0853 /* ActivityView.swift */; }; + D845A1482AF8A4E400EA0853 /* FirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1472AF8A4E400EA0853 /* FirstAppear.swift */; }; + D845A14A2AF8A4EF00EA0853 /* PlayTestBeepsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */; }; + D845A14E2AF8A4FB00EA0853 /* ReadPodStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */; }; + D845A14F2AF8A4FB00EA0853 /* ReadPulseLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */; }; + D845A1502AF8A4FB00EA0853 /* PumpManagerDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */; }; + D845A1522AF8A51000EA0853 /* SilencePodSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -402,6 +410,14 @@ C12EDA1729C7E01800435701 /* TimeZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeZone.swift; sourceTree = ""; }; C12EDA1A29C7E06900435701 /* OSLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; }; CEC751E229D88392006E9D24 /* LoopKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LoopKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D845A1342AF89DEC00EA0853 /* SilencePodPreference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodPreference.swift; sourceTree = ""; }; + D845A1452AF8A4DA00EA0853 /* ActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; + D845A1472AF8A4E400EA0853 /* FirstAppear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstAppear.swift; sourceTree = ""; }; + D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayTestBeepsView.swift; sourceTree = ""; }; + D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodStatusView.swift; sourceTree = ""; }; + D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPulseLogView.swift; sourceTree = ""; }; + D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PumpManagerDetailsView.swift; sourceTree = ""; }; + D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodSelectionView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -520,25 +536,26 @@ C124017A29C7D8E900B32844 /* OmnipodCommon */ = { isa = PBXGroup; children = ( + C12401A129C7D8E900B32844 /* AlertSlot.swift */, + C124019D29C7D8E900B32844 /* BasalDeliveryTable.swift */, + C124019C29C7D8E900B32844 /* BasalSchedule+LoopKit.swift */, + C12401A529C7D8E900B32844 /* BasalSchedule.swift */, + C124019A29C7D8E900B32844 /* BeepPreference.swift */, C124017B29C7D8E900B32844 /* BeepType.swift */, - C124017C29C7D8E900B32844 /* PumpManagerAlert.swift */, - C124017D29C7D8E900B32844 /* MessageBlocks */, - C124019729C7D8E900B32844 /* PodDoseProgressEstimator.swift */, + C12401A629C7D8E900B32844 /* BolusDeliveryTable.swift */, + C12401A429C7D8E900B32844 /* CRC16.swift */, C124019829C7D8E900B32844 /* FaultEventCode.swift */, + C12401A229C7D8E900B32844 /* InsulinTableEntry.swift */, C124019929C7D8E900B32844 /* Message.swift */, - C124019A29C7D8E900B32844 /* BeepPreference.swift */, - C124019B29C7D8E900B32844 /* Pod.swift */, - C124019C29C7D8E900B32844 /* BasalSchedule+LoopKit.swift */, - C124019D29C7D8E900B32844 /* BasalDeliveryTable.swift */, + C124017D29C7D8E900B32844 /* MessageBlocks */, C124019E29C7D8E900B32844 /* PendingCommand.swift */, + C124019B29C7D8E900B32844 /* Pod.swift */, + C124019729C7D8E900B32844 /* PodDoseProgressEstimator.swift */, C124019F29C7D8E900B32844 /* PodInsulinMeasurements.swift */, - C12401A029C7D8E900B32844 /* ReservoirLevel.swift */, - C12401A129C7D8E900B32844 /* AlertSlot.swift */, - C12401A229C7D8E900B32844 /* InsulinTableEntry.swift */, C12401A329C7D8E900B32844 /* PodProgressStatus.swift */, - C12401A429C7D8E900B32844 /* CRC16.swift */, - C12401A529C7D8E900B32844 /* BasalSchedule.swift */, - C12401A629C7D8E900B32844 /* BolusDeliveryTable.swift */, + C124017C29C7D8E900B32844 /* PumpManagerAlert.swift */, + C12401A029C7D8E900B32844 /* ReservoirLevel.swift */, + D845A1342AF89DEC00EA0853 /* SilencePodPreference.swift */, C12401A729C7D8E900B32844 /* UnfinalizedDose.swift */, ); path = OmnipodCommon; @@ -669,13 +686,13 @@ C124022529C7DA9700B32844 /* ViewModels */ = { isa = PBXGroup; children = ( - C124022629C7DA9700B32844 /* PairPodViewModel.swift */, + C124022929C7DA9700B32844 /* DeactivatePodViewModel.swift */, C124022729C7DA9700B32844 /* DeliveryUncertaintyRecoveryViewModel.swift */, C124022829C7DA9700B32844 /* InsertCannulaViewModel.swift */, - C124022929C7DA9700B32844 /* DeactivatePodViewModel.swift */, - C124022A29C7DA9700B32844 /* RileyLinkListDataSource.swift */, - C124022B29C7DA9700B32844 /* PodLifeState.swift */, C124022C29C7DA9700B32844 /* OmnipodSettingsViewModel.swift */, + C124022629C7DA9700B32844 /* PairPodViewModel.swift */, + C124022B29C7DA9700B32844 /* PodLifeState.swift */, + C124022A29C7DA9700B32844 /* RileyLinkListDataSource.swift */, ); path = ViewModels; sourceTree = ""; @@ -683,32 +700,39 @@ C124022D29C7DA9700B32844 /* Views */ = { isa = PBXGroup; children = ( - C124022E29C7DA9700B32844 /* PodLifeHUDView.swift */, + D845A1452AF8A4DA00EA0853 /* ActivityView.swift */, + C124024629C7DA9700B32844 /* AttachPodView.swift */, + C124024C29C7DA9700B32844 /* BasalStateView.swift */, + C124024429C7DA9700B32844 /* BeepPreferenceSelectionView.swift */, C124022F29C7DA9700B32844 /* CheckInsertedCannulaView.swift */, + C124024B29C7DA9700B32844 /* DeactivatePodView.swift */, + C124024A29C7DA9700B32844 /* DeliveryUncertaintyRecoveryView.swift */, C124023129C7DA9700B32844 /* DesignElements */, - C124023529C7DA9700B32844 /* LowReservoirReminderEditView.swift */, - C124023629C7DA9700B32844 /* InsertCannulaView.swift */, - C124023729C7DA9700B32844 /* RileyLinkSetupView.swift */, - C124023829C7DA9700B32844 /* SetupCompleteView.swift */, C124023A29C7DA9700B32844 /* ExpirationReminderPickerView.swift */, - C124023B29C7DA9700B32844 /* UncertaintyRecoveredView.swift */, + C124024529C7DA9700B32844 /* ExpirationReminderSetupView.swift */, + D845A1472AF8A4E400EA0853 /* FirstAppear.swift */, + C124023629C7DA9700B32844 /* InsertCannulaView.swift */, C124023C29C7DA9700B32844 /* InsulinTypeConfirmation.swift */, + C124023529C7DA9700B32844 /* LowReservoirReminderEditView.swift */, + C124024229C7DA9700B32844 /* LowReservoirReminderSetupView.swift */, C124023D29C7DA9700B32844 /* ManualTempBasalEntryView.swift */, C124023F29C7DA9700B32844 /* NotificationSettingsView.swift */, + C124024929C7DA9700B32844 /* OmnipodReservoirView.swift */, C124024029C7DA9700B32844 /* OmnipodSettingsView.swift */, - C124024129C7DA9700B32844 /* PodSetupView.swift */, - C124024229C7DA9700B32844 /* LowReservoirReminderSetupView.swift */, C124024329C7DA9700B32844 /* PairPodView.swift */, - C124024429C7DA9700B32844 /* BeepPreferenceSelectionView.swift */, - C124024529C7DA9700B32844 /* ExpirationReminderSetupView.swift */, - C124024629C7DA9700B32844 /* AttachPodView.swift */, - C124024729C7DA9700B32844 /* ScheduledExpirationReminderEditView.swift */, + D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */, C124024829C7DA9700B32844 /* PodDetailsView.swift */, - C124024929C7DA9700B32844 /* OmnipodReservoirView.swift */, - C124024A29C7DA9700B32844 /* DeliveryUncertaintyRecoveryView.swift */, - C124024B29C7DA9700B32844 /* DeactivatePodView.swift */, - C124024C29C7DA9700B32844 /* BasalStateView.swift */, + C124022E29C7DA9700B32844 /* PodLifeHUDView.swift */, + C124024129C7DA9700B32844 /* PodSetupView.swift */, + D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */, + D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */, + D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */, + C124023729C7DA9700B32844 /* RileyLinkSetupView.swift */, + C124024729C7DA9700B32844 /* ScheduledExpirationReminderEditView.swift */, + C124023829C7DA9700B32844 /* SetupCompleteView.swift */, + D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */, C124024D29C7DA9700B32844 /* TimeView.swift */, + C124023B29C7DA9700B32844 /* UncertaintyRecoveredView.swift */, ); path = Views; sourceTree = ""; @@ -1056,6 +1080,7 @@ C12401E329C7D8E900B32844 /* PodComms.swift in Sources */, C12401D429C7D8E900B32844 /* BeepPreference.swift in Sources */, C12401B829C7D8E900B32844 /* PodInfoPulseLog.swift in Sources */, + D845A1352AF89DEC00EA0853 /* SilencePodPreference.swift in Sources */, C12401BE29C7D8E900B32844 /* PodInfoConfiguredAlerts.swift in Sources */, C12401E529C7D8E900B32844 /* PodCommsSession.swift in Sources */, C12401DE29C7D8E900B32844 /* CRC16.swift in Sources */, @@ -1102,13 +1127,16 @@ C124028B29C7DA9700B32844 /* BeepPreferenceSelectionView.swift in Sources */, C12EDA1429C7DFBF00435701 /* TimeInterval.swift in Sources */, C124028D29C7DA9700B32844 /* AttachPodView.swift in Sources */, + D845A14F2AF8A4FB00EA0853 /* ReadPulseLogView.swift in Sources */, C124027229C7DA9700B32844 /* DeactivatePodViewModel.swift in Sources */, C124028C29C7DA9700B32844 /* ExpirationReminderSetupView.swift in Sources */, + D845A1462AF8A4DA00EA0853 /* ActivityView.swift in Sources */, C124029029C7DA9700B32844 /* OmnipodReservoirView.swift in Sources */, C124027C29C7DA9700B32844 /* LowReservoirReminderEditView.swift in Sources */, C124028129C7DA9700B32844 /* ExpirationReminderPickerView.swift in Sources */, C124028329C7DA9700B32844 /* InsulinTypeConfirmation.swift in Sources */, C124029129C7DA9700B32844 /* DeliveryUncertaintyRecoveryView.swift in Sources */, + D845A1502AF8A4FB00EA0853 /* PumpManagerDetailsView.swift in Sources */, C124028229C7DA9700B32844 /* UncertaintyRecoveredView.swift in Sources */, C124027E29C7DA9700B32844 /* RileyLinkSetupView.swift in Sources */, C124027429C7DA9700B32844 /* PodLifeState.swift in Sources */, @@ -1116,11 +1144,14 @@ C124027329C7DA9700B32844 /* RileyLinkListDataSource.swift in Sources */, C124029329C7DA9700B32844 /* BasalStateView.swift in Sources */, C124027A29C7DA9700B32844 /* LeadingImage.swift in Sources */, + D845A14E2AF8A4FB00EA0853 /* ReadPodStatusView.swift in Sources */, C124028729C7DA9700B32844 /* OmnipodSettingsView.swift in Sources */, C124028929C7DA9700B32844 /* LowReservoirReminderSetupView.swift in Sources */, C124027029C7DA9700B32844 /* DeliveryUncertaintyRecoveryViewModel.swift in Sources */, C12EDA0E29C7DEFD00435701 /* NumberFormatter.swift in Sources */, + D845A1522AF8A51000EA0853 /* SilencePodSelectionView.swift in Sources */, C12EDA1229C7DF4B00435701 /* IdentifiableClass.swift in Sources */, + D845A1482AF8A4E400EA0853 /* FirstAppear.swift in Sources */, C124027529C7DA9700B32844 /* OmnipodSettingsViewModel.swift in Sources */, C124027629C7DA9700B32844 /* PodLifeHUDView.swift in Sources */, C124029729C7DA9700B32844 /* OmnipodUICoordinator.swift in Sources */, @@ -1131,6 +1162,7 @@ C124028A29C7DA9700B32844 /* PairPodView.swift in Sources */, C124029229C7DA9700B32844 /* DeactivatePodView.swift in Sources */, C124027929C7DA9700B32844 /* RoundedCard.swift in Sources */, + D845A14A2AF8A4EF00EA0853 /* PlayTestBeepsView.swift in Sources */, C124026F29C7DA9700B32844 /* PairPodViewModel.swift in Sources */, C124026E29C7DA9700B32844 /* FrameworkLocalText.swift in Sources */, C124028F29C7DA9700B32844 /* PodDetailsView.swift in Sources */, diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/AlertSlot.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/AlertSlot.swift index 52cd8dd716..b22e7066c4 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/AlertSlot.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/AlertSlot.swift @@ -8,11 +8,29 @@ import Foundation +fileprivate let defaultShutdownImminentTime = Pod.serviceDuration - Pod.endOfServiceImminentWindow +fileprivate let defaultExpirationReminderTime = Pod.nominalPodLife - Pod.defaultExpirationReminderOffset +fileprivate let defaultExpiredTime = Pod.nominalPodLife + +// PDM and pre-SwiftUI use every1MinuteFor3MinutesAndRepeatEvery15Minutes, but with SwiftUI use every15Minutes +fileprivate let suspendTimeExpiredBeepRepeat = BeepRepeat.every15Minutes + public enum AlertTrigger { case unitsRemaining(Double) case timeUntilAlert(TimeInterval) } +extension AlertTrigger: CustomDebugStringConvertible { + public var debugDescription: String { + switch self { + case .unitsRemaining(let units): + return "\(Int(units))U" + case .timeUntilAlert(let triggerTime): + return "triggerTime=\(triggerTime.timeIntervalStr)" + } + } +} + public enum BeepRepeat: UInt8 { case once = 0 case every1MinuteFor3MinutesAndRepeatEvery60Minutes = 1 @@ -29,29 +47,48 @@ public enum BeepRepeat: UInt8 { public struct AlertConfiguration { let slot: AlertSlot - let trigger: AlertTrigger let active: Bool let duration: TimeInterval + let trigger: AlertTrigger let beepRepeat: BeepRepeat let beepType: BeepType + let silent: Bool let autoOffModifier: Bool static let length = 6 - public init(alertType: AlertSlot, active: Bool = true, autoOffModifier: Bool = false, duration: TimeInterval, trigger: AlertTrigger, beepRepeat: BeepRepeat, beepType: BeepType) { + public init(alertType: AlertSlot, active: Bool = true, duration: TimeInterval = 0, trigger: AlertTrigger, beepRepeat: BeepRepeat, beepType: BeepType, silent: Bool = false, autoOffModifier: Bool = false) + { self.slot = alertType self.active = active - self.autoOffModifier = autoOffModifier self.duration = duration self.trigger = trigger self.beepRepeat = beepRepeat self.beepType = beepType + self.silent = silent + self.autoOffModifier = autoOffModifier } } extension AlertConfiguration: CustomDebugStringConvertible { public var debugDescription: String { - return "AlertConfiguration(slot:\(slot), active:\(active), autoOffModifier:\(autoOffModifier), duration:\(duration), trigger:\(trigger), beepRepeat:\(beepRepeat), beepType:\(beepType))" + var str = "slot:\(slot)" + if !active { + str += ", active:\(active)" + } + if duration != 0 { + str += ", duration:\(duration.timeIntervalStr)" + } + str += ", trigger:\(trigger), beepRepeat:\(beepRepeat)" + if beepType != .noBeepNonCancel { + str += ", beepType:\(beepType)" + } else { + str += ", silent:\(silent)" + } + if autoOffModifier { + str += ", autoOffModifier:\(autoOffModifier)" + } + return "\nAlertConfiguration(\(str))" } } @@ -60,54 +97,73 @@ extension AlertConfiguration: CustomDebugStringConvertible { public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { public typealias RawValue = [String: Any] - // 2 hours long, time for user to start pairing process - case waitingForPairingReminder + // slot0AutoOff: auto-off timer; requires user input every x minutes -- NOT IMPLEMENTED + case autoOff(active: Bool, offset: TimeInterval, countdownDuration: TimeInterval, silent: Bool = false) - // 1 hour long, time for user to finish priming, cannula insertion - case finishSetupReminder + // slot1NotUsed + case notUsed - // User configurable with PDM (1-24 hours before 72 hour expiration) "Change Pod Soon" - case expirationReminder(TimeInterval) + // slot2ShutdownImminent: 79 hour alarm (1 hour before shutdown) + // 2 sets of beeps every 15 minutes for 1 hour + case shutdownImminent(offset: TimeInterval, absAlertTime: TimeInterval, silent: Bool = false) - // 72 hour alarm - case expired(alertTime: TimeInterval, duration: TimeInterval) + // slot3ExpirationReminder: User configurable with PDM (1-24 hours before 72 hour expiration) + // 2 sets of beeps every minute for 3 minutes and repeat every 15 minutes + // The PDM doesn't use a duration for this alert (presumably because it is limited to 2^9-1 minutes or 8h31m) + case expirationReminder(offset: TimeInterval, absAlertTime: TimeInterval, duration: TimeInterval = 0, silent: Bool = false) - // 79 hour alarm (1 hour before shutdown) - case shutdownImminent(TimeInterval) + // slot4LowReservoir: reservoir below configured value alert + case lowReservoir(units: Double, silent: Bool = false) - // reservoir below configured value alert - case lowReservoir(Double) + // slot5SuspendedReminder: pod suspended reminder, before suspendTime; + // short beep every 15 minutes if > 30 min, else short beep every 5 minutes + case podSuspendedReminder(active: Bool, offset: TimeInterval, suspendTime: TimeInterval, timePassed: TimeInterval = 0, silent: Bool = false) - // auto-off timer; requires user input every x minutes - case autoOff(active: Bool, countdownDuration: TimeInterval) + // slot6SuspendTimeExpired: pod suspend time expired alarm, after suspendTime; + // 2 sets of beeps every minute for 3 minutes repeated every 15 minutes (PDM & pre-SwiftUI implementations) + // 2 sets of beeps every 15 minutes (for SwiftUI PumpManagerAlerts implementations) + case suspendTimeExpired(offset: TimeInterval, suspendTime: TimeInterval, silent: Bool = false) - // pod suspended reminder, before suspendTime; short beep every 15 minutes if > 30 min, else every 5 minutes - case podSuspendedReminder(active: Bool, suspendTime: TimeInterval) + // slot7Expired: 2 hours long, time for user to start pairing process + case waitingForPairingReminder + + // slot7Expired: 1 hour long, time for user to finish priming, cannula insertion + case finishSetupReminder - // pod suspend time expired alarm, after suspendTime; 2 sets of beeps every min for 3 minutes repeated every 15 minutes - case suspendTimeExpired(suspendTime: TimeInterval) + // slot7Expired: 72 hour alarm + case expired(offset: TimeInterval, absAlertTime: TimeInterval, duration: TimeInterval, silent: Bool = false) public var description: String { var alertName: String switch self { - case .waitingForPairingReminder: - return LocalizedString("Waiting for pairing reminder", comment: "Description waiting for pairing reminder") - case .finishSetupReminder: - return LocalizedString("Finish setup reminder", comment: "Description for finish setup reminder") - case .expirationReminder: - alertName = LocalizedString("Expiration alert", comment: "Description for expiration alert") - case .expired: - alertName = LocalizedString("Expiration advisory", comment: "Description for expiration advisory") - case .shutdownImminent: - alertName = LocalizedString("Shutdown imminent", comment: "Description for shutdown imminent") - case .lowReservoir(let units): - alertName = String(format: LocalizedString("Low reservoir advisory (%1$gU)", comment: "Format string for description for low reservoir advisory (1: reminder units)"), units) + // slot0AutoOff case .autoOff: - alertName = LocalizedString("Auto-off", comment: "Description for auto-off") + alertName = LocalizedString("Auto-off", comment: "Description for auto-off alert") + // slot1NotUsed + case .notUsed: + alertName = LocalizedString("Not used", comment: "Description for not used slot alert") + // slot2ShutdownImminent + case .shutdownImminent: + alertName = LocalizedString("Shutdown imminent", comment: "Description for shutdown imminent alert") + // slot3ExpirationReminder + case .expirationReminder: + alertName = LocalizedString("Expiration reminder", comment: "Description for expiration reminder alert") + // slot4LowReservoir + case .lowReservoir: + alertName = LocalizedString("Low reservoir", comment: "Format string for description for low reservoir alert") + // slot5SuspendedReminder case .podSuspendedReminder: - alertName = LocalizedString("Pod suspended reminder", comment: "Description for pod suspended reminder") + alertName = LocalizedString("Pod suspended reminder", comment: "Description for pod suspended reminder alert") + // slot6SuspendTimeExpired case .suspendTimeExpired: - alertName = LocalizedString("Suspend time expired", comment: "Description for suspend time expired") + alertName = LocalizedString("Suspend time expired", comment: "Description for suspend time expired alert") + // slot7Expired + case .waitingForPairingReminder: + alertName = LocalizedString("Waiting for pairing reminder", comment: "Description waiting for pairing reminder alert") + case .finishSetupReminder: + alertName = LocalizedString("Finish setup reminder", comment: "Description for finish setup reminder alert") + case .expired: + alertName = LocalizedString("Pod expired", comment: "Description for pod expired alert") } if self.configuration.active == false { alertName += LocalizedString(" (inactive)", comment: "Description for an inactive alert modifier") @@ -117,71 +173,126 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { public var configuration: AlertConfiguration { switch self { - case .waitingForPairingReminder: - return AlertConfiguration(alertType: .slot7, duration: .minutes(110), trigger: .timeUntilAlert(.minutes(10)), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .finishSetupReminder: - return AlertConfiguration(alertType: .slot7, duration: .minutes(55), trigger: .timeUntilAlert(.minutes(5)), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .expirationReminder(let alertTime): - let active = alertTime != 0 // disable if alertTime is 0 - return AlertConfiguration(alertType: .slot3, active: active, duration: 0, trigger: .timeUntilAlert(alertTime), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .expired(let alarmTime, let duration): - let active = alarmTime != 0 // disable if alarmTime is 0 - return AlertConfiguration(alertType: .slot7, active: active, duration: duration, trigger: .timeUntilAlert(alarmTime), beepRepeat: .every60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .shutdownImminent(let alarmTime): - let active = alarmTime != 0 // disable if alarmTime is 0 - return AlertConfiguration(alertType: .slot2, active: active, duration: 0, trigger: .timeUntilAlert(alarmTime), beepRepeat: .every15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .lowReservoir(let units): + // slot0AutoOff + case .autoOff(let active, _, let countdownDuration, let silent): + return AlertConfiguration(alertType: .slot0AutoOff, active: active, duration: .minutes(15), trigger: .timeUntilAlert(countdownDuration), beepRepeat: .every1MinuteFor15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent, autoOffModifier: true) + + // slot1NotUsed + case .notUsed: + return AlertConfiguration(alertType: .slot1NotUsed, duration: .minutes(55), trigger: .timeUntilAlert(.minutes(5)), beepRepeat: .every5Minutes, beepType: .noBeepNonCancel) + + // slot2ShutdownImminent + case .shutdownImminent(let offset, let absAlertTime, let silent): + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = 0 + } + return AlertConfiguration(alertType: .slot2ShutdownImminent, active: active, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot3ExpirationReminder + case .expirationReminder(let offset, let absAlertTime, let duration, let silent): + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = 0 + } + return AlertConfiguration(alertType: .slot3ExpirationReminder, active: active, duration: duration, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot4LowReservoir + case .lowReservoir(let units, let silent): let active = units != 0 // disable if units is 0 - return AlertConfiguration(alertType: .slot4, active: active, duration: 0, trigger: .unitsRemaining(units), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .autoOff(let active, let countdownDuration): - return AlertConfiguration(alertType: .slot0, active: active, autoOffModifier: true, duration: .minutes(15), trigger: .timeUntilAlert(countdownDuration), beepRepeat: .every1MinuteFor15Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) - case .podSuspendedReminder(let active, let suspendTime): - // A suspendTime of 0 is an untimed suspend + return AlertConfiguration(alertType: .slot4LowReservoir, active: active, trigger: .unitsRemaining(units), beepRepeat: .every1MinuteFor3MinutesAndRepeatEvery60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) + + // slot5SuspendedReminder + // A suspendTime of 0 is an untimed suspend + // timePassed will be > 0 for an existing pod suspended reminder changing its silent state + case .podSuspendedReminder(let active, _, let suspendTime, let timePassed, let silent): let reminderInterval, duration: TimeInterval - let trigger: AlertTrigger - let beepRepeat: BeepRepeat + var beepRepeat: BeepRepeat let beepType: BeepType - if active { - if suspendTime >= TimeInterval(minutes :30) { - // Use 15-minute pod suspended reminder beeps for longer scheduled suspend times as per PDM. - reminderInterval = TimeInterval(minutes: 15) - beepRepeat = .every15Minutes - } else { - // Use 5-minute pod suspended reminder beeps for shorter scheduled suspend times. - reminderInterval = TimeInterval(minutes: 5) - beepRepeat = .every5Minutes - } + let trigger: AlertTrigger + var isActive: Bool = active + + if suspendTime == 0 || suspendTime >= TimeInterval(minutes: 30) { + // Use 15-minute pod suspended reminder beeps for untimed or longer scheduled suspend times. + reminderInterval = TimeInterval(minutes: 15) + beepRepeat = .every15Minutes + } else { + // Use 5-minute pod suspended reminder beeps for shorter scheduled suspend times. + reminderInterval = TimeInterval(minutes: 5) + beepRepeat = .every5Minutes + } + + // Make alert inactive if there isn't enough remaining in suspend time for a reminder beep. + let suspendTimeRemaining = suspendTime - timePassed + if suspendTime != 0 && suspendTimeRemaining <= reminderInterval { + isActive = false + } + + if isActive { + // Compute the alert trigger time as the interval until the next upcoming reminder interval + let triggerTime: TimeInterval = .seconds(reminderInterval - Double((Int(timePassed) % Int(reminderInterval)))) + if suspendTime == 0 { duration = 0 // Untimed suspend, no duration - } else if suspendTime > reminderInterval { - duration = suspendTime - reminderInterval // End after suspendTime total time } else { - duration = .minutes(1) // Degenerate case, end ASAP + // duration is from triggerTime to suspend time remaining + duration = suspendTimeRemaining - triggerTime } - trigger = .timeUntilAlert(reminderInterval) // Start after reminderInterval has passed + trigger = .timeUntilAlert(triggerTime) // time to next reminder interval with the suspend time beepType = .beep } else { + beepRepeat = .once duration = 0 trigger = .timeUntilAlert(.minutes(0)) - beepRepeat = .once beepType = .noBeepCancel } - return AlertConfiguration(alertType: .slot5, active: active, duration: duration, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType) - case .suspendTimeExpired(let suspendTime): + return AlertConfiguration(alertType: .slot5SuspendedReminder, active: isActive, duration: duration, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType, silent: silent) + + // slot6SuspendTimeExpired + case .suspendTimeExpired(_, let suspendTime, let silent): let active = suspendTime != 0 // disable if suspendTime is 0 let trigger: AlertTrigger let beepRepeat: BeepRepeat let beepType: BeepType if active { trigger = .timeUntilAlert(suspendTime) - beepRepeat = .every1MinuteFor3MinutesAndRepeatEvery15Minutes + beepRepeat = suspendTimeExpiredBeepRepeat beepType = .bipBeepBipBeepBipBeepBipBeep } else { trigger = .timeUntilAlert(.minutes(0)) beepRepeat = .once beepType = .noBeepCancel } - return AlertConfiguration(alertType: .slot6, active: active, duration: 0, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType) + return AlertConfiguration(alertType: .slot6SuspendTimeExpired, active: active, trigger: trigger, beepRepeat: beepRepeat, beepType: beepType, silent: silent) + + // slot7Expired + case .waitingForPairingReminder: + // After pod is powered up, beep every 10 minutes for up to 2 hours before pairing before failing + let totalDuration: TimeInterval = .hours(2) + let startOffset: TimeInterval = .minutes(10) + return AlertConfiguration(alertType: .slot7Expired, duration: totalDuration - startOffset, trigger: .timeUntilAlert(startOffset), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) + case .finishSetupReminder: + // After pod is paired, beep every 5 minutes for up to 1 hour for pod setup to complete before failing + let totalDuration: TimeInterval = .hours(1) + let startOffset: TimeInterval = .minutes(5) + return AlertConfiguration(alertType: .slot7Expired, duration: totalDuration - startOffset, trigger: .timeUntilAlert(startOffset), beepRepeat: .every5Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep) + case .expired(let offset, let absAlertTime, let duration, let silent): + // Normally used to alert at Pod.nominalPodLife (72 hours) for Pod.expirationAdvisoryWindow (7 hours) + // 2 sets of beeps repeating every 60 minutes + let active = absAlertTime != 0 // disable if absAlertTime is 0 + let triggerTime: TimeInterval + if active { + triggerTime = absAlertTime - offset + } else { + triggerTime = .minutes(0) + } + return AlertConfiguration(alertType: .slot7Expired, active: active, duration: duration, trigger: .timeUntilAlert(triggerTime), beepRepeat: .every60Minutes, beepType: .bipBeepBipBeepBipBeepBipBeep, silent: silent) } } @@ -194,51 +305,92 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { } switch name { - case "waitingForPairingReminder": - self = .waitingForPairingReminder - case "finishSetupReminder": - self = .finishSetupReminder - case "expirationReminder": - guard let alertTime = rawValue["alertTime"] as? Double else { - return nil - } - self = .expirationReminder(TimeInterval(alertTime)) - case "expired": - guard let alarmTime = rawValue["alarmTime"] as? Double, - let duration = rawValue["duration"] as? Double else + case "autoOff": + guard let active = rawValue["active"] as? Bool, + let countdownDuration = rawValue["countdownDuration"] as? TimeInterval else { return nil } - self = .expired(alertTime: TimeInterval(alarmTime), duration: TimeInterval(duration)) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .autoOff(active: active, offset: offset, countdownDuration: countdownDuration, silent: silent) case "shutdownImminent": - guard let alarmTime = rawValue["alarmTime"] as? Double else { + guard let alarmTime = rawValue["alarmTime"] as? TimeInterval else { return nil } - self = .shutdownImminent(alarmTime) - case "lowReservoir": - guard let units = rawValue["units"] as? Double else { + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultShutdownImminentTime + offsetToUse = absAlertTime - alarmTime + } else { + absAlertTime = offset + alarmTime + offsetToUse = offset + } + let silent = rawValue["silent"] as? Bool ?? false + self = .shutdownImminent(offset: offsetToUse, absAlertTime: absAlertTime, silent: silent) + case "expirationReminder": + guard let alertTime = rawValue["alertTime"] as? TimeInterval else { return nil } - self = .lowReservoir(units) - case "autoOff": - guard let active = rawValue["active"] as? Bool, - let countdownDuration = rawValue["countdownDuration"] as? Double else - { + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultExpirationReminderTime + offsetToUse = absAlertTime - alertTime + } else { + absAlertTime = offset + alertTime + offsetToUse = offset + } + let duration = rawValue["duration"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .expirationReminder(offset: offsetToUse, absAlertTime: absAlertTime, duration: duration, silent: silent) + case "lowReservoir": + guard let units = rawValue["units"] as? Double else { return nil } - self = .autoOff(active: active, countdownDuration: TimeInterval(countdownDuration)) + let silent = rawValue["silent"] as? Bool ?? false + self = .lowReservoir(units: units, silent: silent) case "podSuspendedReminder": guard let active = rawValue["active"] as? Bool, - let suspendTime = rawValue["suspendTime"] as? Double else + let suspendTime = rawValue["suspendTime"] as? TimeInterval else { return nil } - self = .podSuspendedReminder(active: active, suspendTime: suspendTime) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .podSuspendedReminder(active: active, offset: offset, suspendTime: suspendTime, silent: silent) case "suspendTimeExpired": guard let suspendTime = rawValue["suspendTime"] as? Double else { return nil } - self = .suspendTimeExpired(suspendTime: suspendTime) + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let silent = rawValue["silent"] as? Bool ?? false + self = .suspendTimeExpired(offset: offset, suspendTime: suspendTime, silent: silent) + case "waitingForPairingReminder": + self = .waitingForPairingReminder + case "finishSetupReminder": + self = .finishSetupReminder + case "expired": + guard let alarmTime = rawValue["alarmTime"] as? TimeInterval, + let duration = rawValue["duration"] as? TimeInterval else + { + return nil + } + let offset = rawValue["offset"] as? TimeInterval ?? 0 + let offsetToUse, absAlertTime: TimeInterval + if offset == 0 { + // use default values as no offset value was found + absAlertTime = defaultExpiredTime + offsetToUse = absAlertTime - alarmTime + } else { + absAlertTime = offset + alarmTime + offsetToUse = offset + } + let silent = rawValue["silent"] as? Bool ?? false + self = .expired(offset: offsetToUse, absAlertTime: absAlertTime, duration: duration, silent: silent) default: return nil } @@ -248,50 +400,65 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { let name: String = { switch self { - case .waitingForPairingReminder: - return "waitingForPairingReminder" - case .finishSetupReminder: - return "finishSetupReminder" - case .expirationReminder: - return "expirationReminder" - case .expired: - return "expired" + case .autoOff: + return "autoOff" + case .notUsed: + return "notUsed" case .shutdownImminent: return "shutdownImminent" + case .expirationReminder: + return "expirationReminder" case .lowReservoir: return "lowReservoir" - case .autoOff: - return "autoOff" case .podSuspendedReminder: return "podSuspendedReminder" case .suspendTimeExpired: return "suspendTimeExpired" + case .waitingForPairingReminder: + return "waitingForPairingReminder" + case .finishSetupReminder: + return "finishSetupReminder" + case .expired: + return "expired" } }() - var rawValue: RawValue = [ "name": name, ] switch self { - case .expirationReminder(let alertTime): - rawValue["alertTime"] = alertTime - case .expired(let alarmTime, let duration): - rawValue["alarmTime"] = alarmTime - rawValue["duration"] = duration - case .shutdownImminent(let alarmTime): - rawValue["alarmTime"] = alarmTime - case .lowReservoir(let units): - rawValue["units"] = units - case .autoOff(let active, let countdownDuration): + case .autoOff(let active, let offset, let countdownDuration, let silent): rawValue["active"] = active + rawValue["offset"] = offset rawValue["countdownDuration"] = countdownDuration - case .podSuspendedReminder(let active, let suspendTime): + rawValue["silent"] = silent + case .shutdownImminent(let offset, let absAlertTime, let silent): + rawValue["offset"] = offset + rawValue["alarmTime"] = absAlertTime - offset + rawValue["silent"] = silent + case .expirationReminder(let offset, let absAlertTime, let duration, let silent): + rawValue["offset"] = offset + rawValue["alertTime"] = absAlertTime - offset + rawValue["duration"] = duration + rawValue["silent"] = silent + case .lowReservoir(let units, let silent): + rawValue["units"] = units + rawValue["silent"] = silent + case .podSuspendedReminder(let active, let offset, let suspendTime, _, let silent): rawValue["active"] = active + rawValue["offset"] = offset rawValue["suspendTime"] = suspendTime - case .suspendTimeExpired(let suspendTime): + rawValue["silent"] = silent + case .suspendTimeExpired(let offset, let suspendTime, let silent): + rawValue["offset"] = offset rawValue["suspendTime"] = suspendTime + rawValue["silent"] = silent + case .expired(let offset, let absAlertTime, let duration, let silent): + rawValue["offset"] = offset + rawValue["alarmTime"] = absAlertTime - offset + rawValue["duration"] = duration + rawValue["silent"] = silent default: break } @@ -301,14 +468,14 @@ public enum PodAlert: CustomStringConvertible, RawRepresentable, Equatable { } public enum AlertSlot: UInt8 { - case slot0 = 0x00 - case slot1 = 0x01 - case slot2 = 0x02 - case slot3 = 0x03 - case slot4 = 0x04 - case slot5 = 0x05 - case slot6 = 0x06 - case slot7 = 0x07 + case slot0AutoOff = 0x00 + case slot1NotUsed = 0x01 + case slot2ShutdownImminent = 0x02 + case slot3ExpirationReminder = 0x03 + case slot4LowReservoir = 0x04 + case slot5SuspendedReminder = 0x05 + case slot6SuspendTimeExpired = 0x06 + case slot7Expired = 0x07 public var bitMaskValue: UInt8 { return 1< Bool { - // slot5 is for podSuspendedReminder and slot6 is for suspendTimeExpired - if configuredAlerts.contains(where: { ($0.key == .slot5 || $0.key == .slot6) && $0.value.configuration.active }) { + if configuredAlerts.contains(where: { ($0.key == .slot5SuspendedReminder || $0.key == .slot6SuspendTimeExpired) && $0.value.configuration.active }) + { return true } return false } + +// Returns a descriptive string for all the alerts in alertSet +public func alertSetString(alertSet: AlertSet) -> String { + + if alertSet.isEmpty { + // Don't bother displaying any additional info for an inactive alert + return String(describing: alertSet) + } + + let alertDescription = alertSet.map { (slot) -> String in + switch slot { + case .slot0AutoOff: + return PodAlert.autoOff(active: true, offset: 0, countdownDuration: 0).description + case .slot1NotUsed: + return PodAlert.notUsed.description + case .slot2ShutdownImminent: + return PodAlert.shutdownImminent(offset: 0, absAlertTime: defaultShutdownImminentTime).description + case .slot3ExpirationReminder: + return PodAlert.expirationReminder(offset: 0, absAlertTime: defaultExpirationReminderTime).description + case .slot4LowReservoir: + return PodAlert.lowReservoir(units: Pod.maximumReservoirReading).description + case .slot5SuspendedReminder: + return PodAlert.podSuspendedReminder(active: true, offset: 0, suspendTime: .minutes(30)).description + case .slot6SuspendTimeExpired: + return PodAlert.suspendTimeExpired(offset: 0, suspendTime: .minutes(30)).description + case .slot7Expired: + return PodAlert.expired(offset: 0, absAlertTime: defaultExpiredTime, duration: Pod.expirationAdvisoryWindow).description + } + } + + return alertDescription.joined(separator: ", ") +} + +func configuredAlertsString(configuredAlerts: [AlertSlot : PodAlert]) -> String { + + if configuredAlerts.isEmpty { + return String(describing: configuredAlerts) + } + + let configuredAlertString = configuredAlerts.map { (configuredAlert) -> String in + + let podAlert = configuredAlert.value + let description = podAlert.description + guard podAlert.configuration.active else { + return description + } + + switch podAlert { + case .shutdownImminent(_, let absAlertTime, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + case .expirationReminder(_, let absAlertTime, _, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + case .lowReservoir(let unitTrigger, _): + return String(format: "%@ @ %dU", description, Int(unitTrigger)) + case .podSuspendedReminder(_, let offset, let suspendTime, _, _): + return String(format: "%@ ending @ %@ after %@", description, (offset + suspendTime).timeIntervalStr, suspendTime.timeIntervalStr) + case .suspendTimeExpired(let offset, let suspendTime, _): + return String(format: "%@ @ %@ after %@", description, (offset + suspendTime).timeIntervalStr, suspendTime.timeIntervalStr) + case .expired(_, let absAlertTime, _, _): + return String(format: "%@ @ %@", description, absAlertTime.timeIntervalStr) + default: + return "" + } + } + + return configuredAlertString.joined(separator: ", ") +} + +// Returns an array of appropriate PodAlerts with the specified silent value +// for all the configuredAlerts given all the current pod conditions. +func regeneratePodAlerts(silent: Bool, configuredAlerts: [AlertSlot: PodAlert], activeAlertSlots: AlertSet, currentPodTime: TimeInterval, currentReservoirLevel: Double) -> [PodAlert] { + var podAlerts: [PodAlert] = [] + + for alert in configuredAlerts { + // Just skip this alert if not previously active + guard alert.value.configuration.active else { + continue + } + + // Map alerts to corresponding appropriate new ones at the current pod time using the specified silent value. + switch alert.value { + + case .shutdownImminent(let offset, let alertTime, _): + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultShutdownImminentTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + } + // create new shutdownImminent podAlert using the current timeActive and the original absolute alert time + podAlerts.append(PodAlert.shutdownImminent(offset: currentPodTime, absAlertTime: absAlertTime, silent: silent)) + + case .expirationReminder(let offset, let alertTime, let alertDuration, _): + let duration: TimeInterval + + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultExpirationReminderTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + duration = 0 + } else { + duration = alertDuration + } + // create new expirationReminder podAlert using the current active time and the original absolute alert time and duration + podAlerts.append(PodAlert.expirationReminder(offset: currentPodTime, absAlertTime: absAlertTime, duration: duration, silent: silent)) + + case .lowReservoir(let unitTrigger, _): + let units: Double + if currentReservoirLevel > unitTrigger { + units = unitTrigger + } else { + // reservoir is no longer more than the unitTrigger, make inactive using a 0 value + units = 0 + } + podAlerts.append(PodAlert.lowReservoir(units: units, silent: silent)) + + case .podSuspendedReminder(let active, let offset, let suspendTime, _, _): + let timePassed: TimeInterval = min(currentPodTime - offset, .hours(2)) + // Pass along the computed time passed since alert was originally set so creation routine can + // do all the grunt work dealing with varying reminder intervals and time passing scenarios. + podAlerts.append(PodAlert.podSuspendedReminder(active: active, offset: offset, suspendTime: suspendTime, timePassed: timePassed, silent: silent)) + + case .suspendTimeExpired(let lastOffset, let lastSuspendTime, _): + let absAlertTime = lastOffset + lastSuspendTime + let suspendTime: TimeInterval + if currentPodTime >= absAlertTime { + // alert trigger is no longer in the future + if activeAlertSlots.contains(where: { $0 == .slot6SuspendTimeExpired } ) { + // The suspendTimeExpired alert has yet been acknowledged, + // set up a suspendTimeExpired alert for the next 15m interval. + // Compute a new suspendTime that is a multiple of 15 minutes + // from lastOffset which is at least one minute in the future. + let newOffsetSuspendTime = ceil((currentPodTime - lastOffset) / .minutes(15)) * .minutes(15) + let newAbsAlertTime = lastOffset + newOffsetSuspendTime + suspendTime = max(newAbsAlertTime - currentPodTime, .minutes(1)) + } else { + // The suspendTimeExpired alert was already been acknowledged, + // so now make this alert inactive by using a 0 suspendTime. + suspendTime = 0 + } + } else { + // recompute a new suspendTime based on the current pod time + suspendTime = absAlertTime - currentPodTime + print("setting new suspendTimeExpired suspendTime of \(suspendTime) with currentPodTime\(currentPodTime) and absAlertTime=\(absAlertTime)") + } + // create a new suspendTimeExpired PodAlert using the current active time and the computed suspendTime (if any) + podAlerts.append(PodAlert.suspendTimeExpired(offset: currentPodTime, suspendTime: suspendTime, silent: silent)) + + case .expired(let offset, let alertTime, let alertDuration, _): + let duration: TimeInterval + + // alertTime is absolute when offset is non-zero, otherwise use default value + var absAlertTime = offset != 0 ? alertTime : defaultExpiredTime + if currentPodTime >= absAlertTime { + // alert trigger is not in the future, make inactive using a 0 value + absAlertTime = 0 + duration = 0 + } else { + duration = alertDuration + } + // create new expired podAlert using the current active time and the original absolute alert time and duration + podAlerts.append(PodAlert.expired(offset: currentPodTime, absAlertTime: absAlertTime, duration: duration, silent: silent)) + + default: + break + } + } + return podAlerts +} diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift index 90d958dafe..582dbc4e94 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift @@ -163,8 +163,9 @@ public struct RateEntry { // Eros zero TB is the only case not using pulses return 0 } else { - // Use delayBetweenPulses to compute rate, works for non-Eros near zero rates - return (.hours(1) / delayBetweenPulses) / Pod.pulsesPerUnit + // Use delayBetweenPulses to compute rate which will also work for non-Eros near zero rates. + // Round the rate calculation to a two digit value to avoid slightly off values for some cases. + return round(((.hours(1) / delayBetweenPulses) / Pod.pulsesPerUnit) * 100) / 100.0 } } @@ -173,8 +174,9 @@ public struct RateEntry { // Eros zero TB case uses fixed 30 minute rate entries return TimeInterval(minutes: 30) } else { - // Use delayBetweenPulses to compute duration, works for non-Eros near zero rates - return delayBetweenPulses * totalPulses + // Use delayBetweenPulses to compute duration which will also work for non-Eros near zero rates. + // Round to nearest second to not be slightly off of the 30 minute rate entry boundary for some cases. + return round(delayBetweenPulses * totalPulses) } } @@ -230,6 +232,6 @@ public struct RateEntry { extension RateEntry: CustomDebugStringConvertible { public var debugDescription: String { - return "RateEntry(rate:\(rate) duration:\(duration.stringValue))" + return "RateEntry(rate:\(rate), duration:\(duration.timeIntervalStr))" } } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BeepPreference.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BeepPreference.swift index 2d04f3e098..ec8d937b44 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BeepPreference.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BeepPreference.swift @@ -29,9 +29,9 @@ public enum BeepPreference: Int, CaseIterable { case .silent: return LocalizedString("No confidence reminders are used.", comment: "Description for BeepPreference.silent") case .manualCommands: - return LocalizedString("Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used.", comment: "Description for BeepPreference.manualCommands") + return LocalizedString("Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used.", comment: "Description for BeepPreference.manualCommands") case .extended: - return LocalizedString("Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate.", comment: "Description for BeepPreference.extended") + return LocalizedString("Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate.", comment: "Description for BeepPreference.extended") } } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/FaultEventCode.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/FaultEventCode.swift index 559f8282a3..8ec484f806 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/FaultEventCode.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/FaultEventCode.swift @@ -25,6 +25,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case invalidBeepRepeatPattern = 0x09 case bf0notEqualToBF1 = 0x0A case tableCorruptionTempBasalSubcommand = 0x0B + case resetDueToCOP = 0x0D case resetDueToIllegalOpcode = 0x0E case resetDueToIllegalAddress = 0x0F @@ -75,6 +76,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case testInProgress = 0x3C case problemWithPumpAnchor = 0x3D case errorFlashWrite = 0x3E + case encoderCountTooHigh = 0x40 case encoderCountExcessiveVariance = 0x41 case encoderCountTooLow = 0x42 @@ -89,6 +91,7 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case trimICSTooCloseTo0x1FF = 0x4B case problemFindingBestTrimValue = 0x4C case badSetTPM1MultiCasesValue = 0x4D + case sawTrimError = 0x4E case unexpectedRFErrorFlagDuringReset = 0x4F case timerPulseWidthModulatorOverflow = 0x50 case tickcntError = 0x51 @@ -109,11 +112,13 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case occlusionCheckStartup1 = 0x60 case occlusionCheckStartup2 = 0x61 case occlusionCheckTimeouts1 = 0x62 + case occlusionCheckTimeouts2 = 0x66 case occlusionCheckTimeouts3 = 0x67 case occlusionCheckPulseIssue = 0x68 case occlusionCheckBolusProblem = 0x69 case occlusionCheckAboveThreshold = 0x6A + case basalUnderInfusion = 0x80 case basalOverInfusion = 0x81 case tempBasalUnderInfusion = 0x82 @@ -137,9 +142,9 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { case illegalInterLockChan = 0x95 case badStateInClearBolusIST2AndVars = 0x96 case badStateInMaybeInc33D = 0x97 - case valuesDoNotMatchOrAreGreaterThan0x97 = 0x98 + case valuesDoNotMatch = 0xFF } - + public var faultType: FaultEventType? { return FaultEventType(rawValue: rawValue) } @@ -147,268 +152,263 @@ public struct FaultEventCode: CustomStringConvertible, Equatable { public init(rawValue: UInt8) { self.rawValue = rawValue } - - public var description: String { - let faultDescription: String - - if let faultType = faultType { - faultDescription = { - switch faultType { - case .noFaults: - return "No fault" - case .failedFlashErase: - return "Flash erase failed" - case .failedFlashStore: - return "Flash store failed" - case .tableCorruptionBasalSubcommand: - return "Basal subcommand table corruption" - case .basalPulseTableCorruption: - return "Basal pulse table corruption" - case .corruptionByte720: - return "Corruption in byte_720" - case .dataCorruptionInTestRTCInterrupt: - return "Data corruption error in test_RTC_interrupt" - case .rtcInterruptHandlerInconsistentState: - return "RTC interrupt handler called with inconstent state" - case .valueGreaterThan8: - return "Value > 8" - case .invalidBeepRepeatPattern: - return "Invalid beep repeat pattern" - case .bf0notEqualToBF1: - return "Corruption in byte_BF0" - case .tableCorruptionTempBasalSubcommand: - return "Temp basal subcommand table corruption" - case .resetDueToCOP: - return "Reset due to COP" - case .resetDueToIllegalOpcode: - return "Reset due to illegal opcode" - case .resetDueToIllegalAddress: - return "Reset due to illegal address" - case .resetDueToSAWCOP: - return "Reset due to SAWCOP" - case .corruptionInByte_866: - return "Corruption in byte_866" - case .resetDueToLVD: - return "Reset due to LVD" - case .messageLengthTooLong: - return "Message length too long" - case .occluded: - return "Occluded" - case .corruptionInWord129: - return "Corruption in word_129 table/word_86A/dword_86E" - case .corruptionInByte868: - return "Corruption in byte_868" - case .corruptionInAValidatedTable: - return "Corruption in a validated table" - case .reservoirEmpty: - return "Reservoir empty or exceeded maximum pulse delivery" - case .badPowerSwitchArrayValue1: - return "Bad Power Switch Array Status and Control Register value 1 before starting pump" - case .badPowerSwitchArrayValue2: - return "Bad Power Switch Array Status and Control Register value 2 before starting pump" - case .badLoadCnthValue: - return "Bad LOADCNTH value when running pump" - case .exceededMaximumPodLife80Hrs: - return "Exceeded maximum Pod life of 80 hours" - case .badStateCommand1AScheduleParse: - return "Unexpected internal state in command_1A_schedule_parse_routine_wrapper" - case .unexpectedStateInRegisterUponReset: - return "Unexpected commissioned state in status and control register upon reset" - case .wrongSummaryForTable129: - return "Sum mismatch for word_129 table" - case .validateCountErrorWhenBolusing: - return "Validate encoder count error when bolusing" - case .badTimerVariableState: - return "Bad timer variable state" - case .unexpectedRTCModuleValueDuringReset: - return "Unexpected RTC Modulo Register value during reset" - case .problemCalibrateTimer: - return "Problem in calibrate_timer_case_3" - case .tickcntErrorRTC: - return "Tick count error RTC" - case .tickFailure: - return "Tick failure" - case .rtcInterruptHandlerUnexpectedCall: - return "RTC interrupt handler unexpectedly called" - case .missing2hourAlertToFillTank: - return "Failed to set up 2 hour alert for tank fill operation" - case .faultEventSetupPod: - return "Bad arg or state in update_insulin_variables, verify_and_start_pump or main_loop_control_pump" - case .autoOff0: - return "Alert #0 auto-off timeout" - case .autoOff1: - return "Alert #1 auto-off timeout" - case .autoOff2: - return "Alert #2 auto-off timeout" - case .autoOff3: - return "Alert #3 auto-off timeout" - case .autoOff4: - return "Alert #4 auto-off timeout" - case .autoOff5: - return "Alert #5 auto-off timeout" - case .autoOff6: - return "Alert #6 auto-off timeout" - case .autoOff7: - return "Alert #7 auto-off timeout" - case .insulinDeliveryCommandError: - return "Incorrect pod state for command or error during insulin command setup" - case .badValueStartupTest: - return "Bad value during startup testing" - case .connectedPodCommandTimeout: - return "Connected Pod command timeout" - case .resetFromUnknownCause: - return "Reset from unknown cause" - case .vetoNotSet: - return "Veto not set" - case .errorFlashInitialization: - return "Flash initialization error" - case .badPiezoValue: - return "Bad piezo value" - case .unexpectedValueByte358: - return "Unexpected byte_358 value" - case .problemWithLoad1and2: - return "Problem with LOAD1/LOAD2" - case .aGreaterThan7inMessage: - return "A > 7 in message processing" - case .failedTestSawReset: - return "SAW reset testing fail" - case .testInProgress: - return "402D is 'Z' - test in progress" - case .problemWithPumpAnchor: - return "Problem with pump anchor" - case .errorFlashWrite: - return "Flash initialization or write error" - case .encoderCountTooHigh: - return "Encoder count too high" - case .encoderCountExcessiveVariance: - return "Encoder count excessive variance" - case .encoderCountTooLow: - return "Encoder count too low" - case .encoderCountProblem: - return "Encoder count problem" - case .checkVoltageOpenWire1: - return "Check voltage open wire 1 problem" - case .checkVoltageOpenWire2: - return "Check voltage open wire 2 problem" - case .problemWithLoad1and2type46: - return "Problem with LOAD1/LOAD2" - case .problemWithLoad1and2type47: - return "Problem with LOAD1/LOAD2" - case .badTimerCalibration: - return "Bad timer calibration" - case .badTimerRatios: - return "Bad timer values: COP timer ratio bad" - case .badTimerValues: - return "Bad timer values" - case .trimICSTooCloseTo0x1FF: - return "ICS trim too close to 0x1FF" - case .problemFindingBestTrimValue: - return "find_best_trim_value problem" - case .badSetTPM1MultiCasesValue: - return "Bad set_TPM1_multi_cases value" - case .unexpectedRFErrorFlagDuringReset: - return "Unexpected TXSCR2 RF Tranmission Error Flag set during reset" - case .timerPulseWidthModulatorOverflow: - return "Timer pulse-width modulator overflow" - case .tickcntError: - return "Bad tick count state before starting pump" - case .badRfmXtalStart: - return "TXOK issue in process_input_buffer" - case .badRxSensitivity: - return "Bad Rx word_107 sensitivity value during input message processing" - case .packetFrameLengthTooLong: - return "Packet frame length too long" - case .unexpectedIRQHighinTimerTick: - return "Unexpected IRQ high in timer_tick" - case .unexpectedIRQLowinTimerTick: - return "Unexpected IRQ low in timer_tick" - case .badArgToGetEntry: - return "Corrupt constants table at byte_37A[] or flash byte_4036[]" - case .badArgToUpdate37ATable: - return "Bad argument to update_37A_table" - case .errorUpdating37ATable: - return "Error updating constants byte_37A table" - case .occlusionCheckValueTooHigh: - return "Occlusion check value too high for detection" - case .loadTableCorruption: - return "Load table corruption" - case .primeOpenCountTooLow: - return "Prime open count too low" - case .badValueByte109: - return "Bad byte_109 value" - case .disableFlashSecurityFailed: - return "Write flash byte to disable flash security failed" - case .checkVoltageFailure: - return "Two check voltage failures before starting pump" - case .occlusionCheckStartup1: - return "Occlusion check startup problem 1" - case .occlusionCheckStartup2: - return "Occlusion check startup problem 2" - case .occlusionCheckTimeouts1: - return "Occlusion check excess timeouts 1" - case .occlusionCheckTimeouts2: - return "Occlusion check excess timeouts 2" - case .occlusionCheckTimeouts3: - return "Occlusion check excess timeouts 3" - case .occlusionCheckPulseIssue: - return "Occlusion check pulse issue" - case .occlusionCheckBolusProblem: - return "Occlusion check bolus problem" - case .occlusionCheckAboveThreshold: - return "Occlusion check above threshold" - case .basalUnderInfusion: - return "Basal under infusion" - case .basalOverInfusion: - return "Basal over infusion" - case .tempBasalUnderInfusion: - return "Temp basal under infusion" - case .tempBasalOverInfusion: - return "Temp basal over infusion" - case .bolusUnderInfusion: - return "Bolus under infusion" - case .bolusOverInfusion: - return "Bolus over infusion" - case .basalOverInfusionPulse: - return "Basal over infusion pulse" - case .tempBasalOverInfusionPulse: - return "Temp basal over infusion pulse" - case .bolusOverInfusionPulse: - return "Bolus over infusion pulse" - case .immediateBolusOverInfusionPulse: - return "Immediate bolus under infusion pulse" - case .extendedBolusOverInfusionPulse: - return "Extended bolus over infusion pulse" - case .corruptionOfTables: - return "Corruption of $283/$2E3/$315 tables" - case .unrecognizedPulse: - return "Bad pulse value to verify_and_start_pump" - case .syncWithoutTempActive: - return "Pump sync req 5 with no temp basal active" - case .command1AParseUnexpectedFailed: - return "Command 1A parse routine unexpected failed" - case .illegalChanParam: - return "Bad parameter for $283/$2E3/$315 channel table specification" - case .basalPulseChanInactive: - return "Pump basal request with basal IST not set" - case .tempPulseChanInactive: - return "Pump temp basal request with temp basal IST not set" - case .bolusPulseChanInactive: - return "Pump bolus request and bolus IST not set" - case .intSemaphoreNotSet: - return "Bad table specifier field6 in 1A command" - case .illegalInterLockChan: - return "Illegal interlock channel" - case .badStateInClearBolusIST2AndVars: - return "Bad variable state in clear_Bolus_IST2_and_vars" - case .badStateInMaybeInc33D: - return "Bad variable state in maybe_inc_33D" - case .valuesDoNotMatchOrAreGreaterThan0x97: - return "Unknown fault code" - } - }() - } else { - faultDescription = "Unknown Fault" + + public var faultDescription: String { + switch faultType { + case .noFaults: + return "No fault" + case .failedFlashErase: + return "Flash erase failed" + case .failedFlashStore: + return "Flash store failed" + case .tableCorruptionBasalSubcommand: + return "Basal subcommand table corruption" + case .basalPulseTableCorruption: + return "Basal pulse table corruption" + case .corruptionByte720: + return "Corruption in byte_720" + case .dataCorruptionInTestRTCInterrupt: + return "Data corruption error in test_RTC_interrupt" + case .rtcInterruptHandlerInconsistentState: + return "RTC interrupt handler called with inconstent state" + case .valueGreaterThan8: + return "Value > 8" + case .invalidBeepRepeatPattern: + return "Invalid beep repeat pattern" + case .bf0notEqualToBF1: + return "Corruption in byte_BF0" + case .tableCorruptionTempBasalSubcommand: + return "Temp basal subcommand table corruption" + case .resetDueToCOP: + return "Reset due to COP" + case .resetDueToIllegalOpcode: + return "Reset due to illegal opcode" + case .resetDueToIllegalAddress: + return "Reset due to illegal address" + case .resetDueToSAWCOP: + return "Reset due to SAWCOP" + case .corruptionInByte_866: + return "Corruption in byte_866" + case .resetDueToLVD: + return "Reset due to LVD" + case .messageLengthTooLong: + return "Message length too long" + case .occluded: + return "Occluded" + case .corruptionInWord129: + return "Corruption in word_129 table/word_86A/dword_86E" + case .corruptionInByte868: + return "Corruption in byte_868" + case .corruptionInAValidatedTable: + return "Corruption in a validated table" + case .reservoirEmpty: + return "Reservoir empty or exceeded maximum pulse delivery" + case .badPowerSwitchArrayValue1: + return "Bad Power Switch Array Status and Control Register value 1 before starting pump" + case .badPowerSwitchArrayValue2: + return "Bad Power Switch Array Status and Control Register value 2 before starting pump" + case .badLoadCnthValue: + return "Bad LOADCNTH value when running pump" + case .exceededMaximumPodLife80Hrs: + return "Exceeded maximum Pod life of 80 hours" + case .badStateCommand1AScheduleParse: + return "Unexpected internal state in command_1A_schedule_parse_routine_wrapper" + case .unexpectedStateInRegisterUponReset: + return "Unexpected commissioned state in status and control register upon reset" + case .wrongSummaryForTable129: + return "Sum mismatch for word_129 table" + case .validateCountErrorWhenBolusing: + return "Validate encoder count error when bolusing" + case .badTimerVariableState: + return "Bad timer variable state" + case .unexpectedRTCModuleValueDuringReset: + return "Unexpected RTC Modulo Register value during reset" + case .problemCalibrateTimer: + return "Problem in calibrate_timer_case_3" + case .tickcntErrorRTC: + return "Tick count error RTC" + case .tickFailure: + return "Tick failure" + case .rtcInterruptHandlerUnexpectedCall: + return "RTC interrupt handler unexpectedly called" + case .missing2hourAlertToFillTank: + return "Failed to set up 2 hour alert for tank fill operation" + case .faultEventSetupPod: + return "Bad arg or state in update_insulin_variables, verify_and_start_pump or main_loop_control_pump" + case .autoOff0: + return "Alert #0 auto-off timeout" + case .autoOff1: + return "Alert #1 auto-off timeout" + case .autoOff2: + return "Alert #2 auto-off timeout" + case .autoOff3: + return "Alert #3 auto-off timeout" + case .autoOff4: + return "Alert #4 auto-off timeout" + case .autoOff5: + return "Alert #5 auto-off timeout" + case .autoOff6: + return "Alert #6 auto-off timeout" + case .autoOff7: + return "Alert #7 auto-off timeout" + case .insulinDeliveryCommandError: + return "Incorrect pod state for command or error during insulin command setup" + case .badValueStartupTest: + return "Bad value during startup testing" + case .connectedPodCommandTimeout: + return "Connected Pod command timeout" + case .resetFromUnknownCause: + return "Reset from unknown cause" + case .vetoNotSet: + return "Veto not set" + case .errorFlashInitialization: + return "Flash initialization error" + case .badPiezoValue: + return "Bad piezo value" + case .unexpectedValueByte358: + return "Unexpected byte_358 value" + case .problemWithLoad1and2: + return "Problem with LOAD1/LOAD2" + case .aGreaterThan7inMessage: + return "A > 7 in message processing" + case .failedTestSawReset: + return "SAW reset testing fail" + case .testInProgress: + return "test in progress" + case .problemWithPumpAnchor: + return "Problem with pump anchor" + case .errorFlashWrite: + return "Flash initialization or write error" + case .encoderCountTooHigh: + return "Encoder count too high" + case .encoderCountExcessiveVariance: + return "Encoder count excessive variance" + case .encoderCountTooLow: + return "Encoder count too low" + case .encoderCountProblem: + return "Encoder count problem" + case .checkVoltageOpenWire1: + return "Check voltage open wire 1 problem" + case .checkVoltageOpenWire2: + return "Check voltage open wire 2 problem" + case .problemWithLoad1and2type46: + return "Problem with LOAD1/LOAD2" + case .problemWithLoad1and2type47: + return "Problem with LOAD1/LOAD2" + case .badTimerCalibration: + return "Bad timer calibration" + case .badTimerRatios: + return "Bad timer values: COP timer ratio bad" + case .badTimerValues: + return "Bad timer values" + case .trimICSTooCloseTo0x1FF: + return "ICS trim too close to 0x1FF" + case .problemFindingBestTrimValue: + return "find_best_trim_value problem" + case .badSetTPM1MultiCasesValue: + return "Bad set_TPM1_multi_cases value" + case .unexpectedRFErrorFlagDuringReset: + return "Unexpected TXSCR2 RF Tranmission Error Flag set during reset" + case .timerPulseWidthModulatorOverflow: + return "Timer pulse-width modulator overflow" + case .tickcntError: + return "Bad tick count state before starting pump" + case .badRfmXtalStart: + return "TXOK issue in process_input_buffer" + case .badRxSensitivity: + return "Bad Rx word_107 sensitivity value during input message processing" + case .packetFrameLengthTooLong: + return "Packet frame length too long" + case .unexpectedIRQHighinTimerTick: + return "Unexpected IRQ high in timer_tick" + case .unexpectedIRQLowinTimerTick: + return "Unexpected IRQ low in timer_tick" + case .badArgToGetEntry: + return "Corrupt constants table at byte_37A[] or flash byte_4036[]" + case .badArgToUpdate37ATable: + return "Bad argument to update_37A_table" + case .errorUpdating37ATable: + return "Error updating constants byte_37A table" + case .occlusionCheckValueTooHigh: + return "Occlusion check value too high for detection" + case .loadTableCorruption: + return "Load table corruption" + case .primeOpenCountTooLow: + return "Prime open count too low" + case .badValueByte109: + return "Bad byte_109 value" + case .disableFlashSecurityFailed: + return "Write flash byte to disable flash security failed" + case .checkVoltageFailure: + return "Two check voltage failures before starting pump" + case .occlusionCheckStartup1: + return "Occlusion check startup problem 1" + case .occlusionCheckStartup2: + return "Occlusion check startup problem 2" + case .occlusionCheckTimeouts1: + return "Occlusion check excess timeouts 1" + case .occlusionCheckTimeouts2: + return "Occlusion check excess timeouts 2" + case .occlusionCheckTimeouts3: + return "Occlusion check excess timeouts 3" + case .occlusionCheckPulseIssue: + return "Occlusion check pulse issue" + case .occlusionCheckBolusProblem: + return "Occlusion check bolus problem" + case .occlusionCheckAboveThreshold: + return "Occlusion check above threshold" + case .basalUnderInfusion: + return "Basal under infusion" + case .basalOverInfusion: + return "Basal over infusion" + case .tempBasalUnderInfusion: + return "Temp basal under infusion" + case .tempBasalOverInfusion: + return "Temp basal over infusion" + case .bolusUnderInfusion: + return "Bolus under infusion" + case .bolusOverInfusion: + return "Bolus over infusion" + case .basalOverInfusionPulse: + return "Basal over infusion pulse" + case .tempBasalOverInfusionPulse: + return "Temp basal over infusion pulse" + case .bolusOverInfusionPulse: + return "Bolus over infusion pulse" + case .immediateBolusOverInfusionPulse: + return "Immediate bolus under infusion pulse" + case .extendedBolusOverInfusionPulse: + return "Extended bolus over infusion pulse" + case .corruptionOfTables: + return "Corruption of $283/$2E3/$315 tables" + case .unrecognizedPulse: + return "Bad pulse value to verify_and_start_pump" + case .syncWithoutTempActive: + return "Pump sync req 5 with no temp basal active" + case .command1AParseUnexpectedFailed: + return "Command 1A parse routine unexpected failed" + case .illegalChanParam: + return "Bad parameter for $283/$2E3/$315 channel table specification" + case .basalPulseChanInactive: + return "Pump basal request with basal IST not set" + case .tempPulseChanInactive: + return "Pump temp basal request with temp basal IST not set" + case .bolusPulseChanInactive: + return "Pump bolus request and bolus IST not set" + case .intSemaphoreNotSet: + return "Bad table specifier field6 in 1A command" + case .illegalInterLockChan: + return "Illegal interlock channel" + case .badStateInClearBolusIST2AndVars: + return "Bad variable state in clear_Bolus_IST2_and_vars" + case .badStateInMaybeInc33D: + return "Bad variable state in maybe_inc_33D" + default: + return "Unknown fault code" } + } + + public var description: String { return String(format: "Fault Event Code 0x%02x: %@", rawValue, faultDescription) } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift index 0b3af03f16..065d0dd7cd 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/CancelDeliveryCommand.swift @@ -9,30 +9,24 @@ import Foundation - public struct CancelDeliveryCommand : NonceResyncableMessageBlock { - + public let blockType: MessageBlockType = .cancelDelivery - - // ID1:1f00ee84 PTYPE:PDM SEQ:26 ID2:1f00ee84 B9:ac BLEN:7 MTYPE:1f05 BODY:e1f78752078196 CRC:03 - - // Cancel bolus - // 1f 05 be1b741a 64 - 1U - // 1f 05 a00a1a95 64 - 1U over 1hr - // 1f 05 ff52f6c8 64 - 1U immediate, 1U over 1hr - - // Cancel temp basal - // 1f 05 f76d34c4 62 - 30U/hr - // 1f 05 156b93e8 62 - ? - // 1f 05 62723698 62 - 0% - // 1f 05 2933db73 62 - 03ea - - // Suspend is a Cancel delivery, followed by a configure alerts command (0x19) - // 1f 05 50f02312 03 191050f02312580f000f06046800001e0302 - - // Deactivate pod: + // OFF 1 2 3 4 5 6 + // 1F 05 NNNNNNNN AX + + // Cancel bolus (with confirmation beep) + // 1f 05 be1b741a 64 + + // Cancel temp basal (with confirmation beep) + // 1f 05 f76d34c4 62 + + // Cancel all (before deactivate pod) // 1f 05 e1f78752 07 - + + // Cancel basal & temp basal for a suspend, followed by a configure alerts command (0x19) for alerts 5 & 6 + // 1f 05 50f02312 03 19 10 50f02312 580f 000f 0604 6800 001e 0302 + public struct DeliveryType: OptionSet, Equatable { public let rawValue: UInt8 @@ -47,7 +41,23 @@ public struct CancelDeliveryCommand : NonceResyncableMessageBlock { public init(rawValue: UInt8) { self.rawValue = rawValue } - + + var debugDescription: String { + switch self { + case .none: + return "None" + case .basal: + return "Basal" + case .tempBasal: + return "TempBasal" + case .all: + return "All" + case .allButBasal: + return "AllButBasal" + default: + return "\(self.rawValue)" + } + } } public let deliveryType: DeliveryType @@ -84,6 +94,6 @@ public struct CancelDeliveryCommand : NonceResyncableMessageBlock { extension CancelDeliveryCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "CancelDeliveryCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), deliveryType:\(deliveryType), beepType:\(beepType))" + return "CancelDeliveryCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), deliveryType:\(deliveryType.debugDescription), beepType:\(beepType))" } } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift index ab808a6d81..4cf646d420 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/ConfigureAlertsCommand.swift @@ -21,7 +21,9 @@ public struct ConfigureAlertsCommand : NonceResyncableMessageBlock { UInt8(4 + configurations.count * AlertConfiguration.length), ]) data.appendBigEndian(nonce) - for config in configurations { + // Sorting the alerts not required, but it can be helpful for log analysis + let sorted = configurations.sorted { $0.slot.rawValue < $1.slot.rawValue } + for config in sorted { data.append(contentsOf: config.data) } return data @@ -92,6 +94,7 @@ extension AlertConfiguration { } self.beepType = beepType + self.silent = (beepType == .noBeepNonCancel) } public var data: Data { @@ -104,12 +107,16 @@ extension AlertConfiguration { if autoOffModifier { firstByte += 1 << 1 } + + // The 9-bit duration is limited to 2^9-1 minutes max value + let durationMinutes = min(UInt(duration.minutes), 0x1ff) + // High bit of duration - firstByte += UInt8((Int(duration.minutes) >> 8) & 0x1) + firstByte += UInt8((durationMinutes >> 8) & 0x1) var data = Data([ firstByte, - UInt8(Int(duration.minutes) & 0xff) + UInt8(durationMinutes & 0xff) ]) switch trigger { @@ -122,7 +129,8 @@ extension AlertConfiguration { data.appendBigEndian(minutes) } data.append(beepRepeat.rawValue) - data.append(beepType.rawValue) + let beepTypeToSet: BeepType = silent ? .noBeepNonCancel : beepType + data.append(beepTypeToSet.rawValue) return data } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift index 184c621451..503bc83a22 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DeactivatePodCommand.swift @@ -9,14 +9,13 @@ import Foundation public struct DeactivatePodCommand : NonceResyncableMessageBlock { - - // ID1:1f00ee84 PTYPE:PDM SEQ:09 ID2:1f00ee84 B9:34 BLEN:6 MTYPE:1c04 BODY:0f7dc4058344 CRC:f1 + // OFF 1 2 3 4 5 + // 1C 04 NNNNNNNN public let blockType: MessageBlockType = .deactivatePod public var nonce: UInt32 - // e1f78752 07 8196 public var data: Data { var data = Data([ blockType.rawValue, diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift index 945e0fc6b4..687fbc5aee 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift @@ -98,7 +98,7 @@ public struct DetailedStatus : PodInfo, Equatable { // subsequent returns will be byte swapped data from previous command/response at the same buffer offset. self.possibleFaultCallingAddress = encodedData[20...21].toBigEndian(UInt16.self) // only potentially valid for Dash } - + self.data = Data(encodedData) } @@ -118,9 +118,8 @@ extension DetailedStatus: CustomDebugStringConvertible { "* bolusNotDelivered: \(bolusNotDelivered.twoDecimals) U", "* lastProgrammingMessageSeqNum: \(lastProgrammingMessageSeqNum)", "* totalInsulinDelivered: \(totalInsulinDelivered.twoDecimals) U", - "* faultEventCode: \(faultEventCode.description)", - "* reservoirLevel: \(reservoirLevel > Pod.maximumReservoirReading ? "50+" : reservoirLevel.twoDecimals) U", - "* timeActive: \(timeActive.stringValue)", + "* reservoirLevel: \(reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : reservoirLevel.twoDecimals) U", + "* timeActive: \(timeActive.timeIntervalStr)", "* unacknowledgedAlerts: \(unacknowledgedAlerts)", "", ].joined(separator: "\n") @@ -133,8 +132,9 @@ extension DetailedStatus: CustomDebugStringConvertible { } if faultEventCode.faultType != .noFaults { result += [ + "* faultEventCode: \(faultEventCode.description)", "* faultAccessingTables: \(faultAccessingTables)", - "* faultEventTimeSinceActivation: \(faultEventTimeSinceActivation?.stringValue ?? "NA")", + "* faultEventTimeSinceActivation: \(faultEventTimeSinceActivation?.timeIntervalStr ?? "NA")", "* errorEventInfo: \(errorEventInfo?.description ?? "NA")", "* previousPodProgressStatus: \(previousPodProgressStatus?.description ?? "NA")", "* possibleFaultCallingAddress: \(possibleFaultCallingAddress != nil ? String(format: "0x%04x", possibleFaultCallingAddress!) : "NA")", @@ -160,26 +160,26 @@ extension DetailedStatus: RawRepresentable { } extension TimeInterval { - var stringValue: String { - let totalSeconds = self - let minutes = Int(totalSeconds / 60) % 60 - let hours = Int(totalSeconds / 3600) - (Int(self / 3600)/24 * 24) - let days = Int((totalSeconds / 3600) / 24) - var pluralFormOfDays = "days" - if days == 1 { - pluralFormOfDays = "day" + var timeIntervalStr: String { + var str: String = "" + let hours = UInt(self / 3600) + let minutes = UInt(self / 60) % 60 + let seconds = UInt(self) % 60 + if hours != 0 { + str += String(format: "%uh", hours) } - let timeComponent = String(format: "%02d:%02d", hours, minutes) - if days > 0 { - return String(format: "%d \(pluralFormOfDays) plus %@", days, timeComponent) - } else { - return timeComponent + if minutes != 0 || hours != 0 { + str += String(format: "%um", minutes) + } + if seconds != 0 || str.isEmpty { + str += String(format: "%us", seconds) } + return str } } extension Double { - var twoDecimals: String { + public var twoDecimals: String { return String(format: "%.2f", self) } } @@ -191,11 +191,11 @@ extension Double { // dddd: Pod Progress at time of first logged fault event // public struct ErrorEventInfo: CustomStringConvertible, Equatable { - let rawValue: UInt8 - let insulinStateTableCorruption: Bool // 'a' bit - let occlusionType: Int // 'bb' 2-bit occlusion type - let immediateBolusInProgress: Bool // 'c' bit - let podProgressStatus: PodProgressStatus // 'dddd' bits + public let rawValue: UInt8 + public let insulinStateTableCorruption: Bool // 'a' bit + public let occlusionType: Int // 'bb' 2-bit occlusion type + public let immediateBolusInProgress: Bool // 'c' bit + public let podProgressStatus: PodProgressStatus // 'dddd' bits public var errorEventInfo: ErrorEventInfo? { return ErrorEventInfo(rawValue: rawValue) diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift index 97df19dce0..f573dd60ed 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLog.swift @@ -89,14 +89,14 @@ extension BinaryInteger { } } -func pulseLogString(pulseLogEntries: [UInt32], lastPulseNumber: Int) -> String { - var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg\n" +public func pulseLogString(pulseLogEntries: [UInt32], lastPulseNumber: Int) -> String { + var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg" var index = pulseLogEntries.count - 1 var pulseNumber = lastPulseNumber while index >= 0 { - str += String(format: "%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription + "\n" + str += String(format: "\n%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription index -= 1 pulseNumber -= 1 } - return str + "\n" + return str } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/StatusResponse.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/StatusResponse.swift index aa88744a1d..bf2474998b 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/StatusResponse.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/StatusResponse.swift @@ -94,7 +94,7 @@ public struct StatusResponse : MessageBlock { extension StatusResponse: CustomDebugStringConvertible { public var debugDescription: String { - return "StatusResponse(deliveryStatus:\(deliveryStatus), progressStatus:\(podProgressStatus), timeActive:\(timeActive.stringValue), reservoirLevel:\(String(describing: reservoirLevel)), delivered:\(insulinDelivered), bolusNotDelivered:\(bolusNotDelivered), lastProgrammingMessageSeqNum:\(lastProgrammingMessageSeqNum), alerts:\(alerts))" + return "StatusResponse(deliveryStatus:\(deliveryStatus.description), progressStatus:\(podProgressStatus), timeActive:\(timeActive.timeIntervalStr), reservoirLevel:\(reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : reservoirLevel.twoDecimals), insulinDelivered:\(insulinDelivered.twoDecimals), bolusNotDelivered:\(bolusNotDelivered.twoDecimals), lastProgrammingMessageSeqNum:\(lastProgrammingMessageSeqNum), alerts:\(alerts))" } } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift index 0e8c1c5dc8..f83330f45a 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/TempBasalExtraCommand.swift @@ -74,6 +74,6 @@ public struct TempBasalExtraCommand : MessageBlock { extension TempBasalExtraCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "TempBasalExtraCommand(completionBeep:\(completionBeep), programReminderInterval:\(programReminderInterval.stringValue) remainingPulses:\(remainingPulses), delayUntilFirstPulse:\(delayUntilFirstPulse.stringValue), rateEntries:\(rateEntries))" + return "TempBasalExtraCommand(completionBeep:\(completionBeep), programReminderInterval:\(programReminderInterval.timeIntervalStr), remainingPulses:\(remainingPulses), delayUntilFirstPulse:\(delayUntilFirstPulse.timeIntervalStr), rateEntries:\(rateEntries))" } } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift index 879114a30f..b16fe5d796 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift @@ -30,9 +30,6 @@ public struct Pod { // Units per second for priming/cannula insertion public static let primeDeliveryRate: Double = Pod.pulseSize / Pod.secondsPerPrimePulse - // User configured time before expiration advisory (PDM allows 1-24 hours) - public static let expirationAlertWindow = TimeInterval(hours: 2) - // Expiration advisory window: time after expiration alert, and end of service imminent alarm public static let expirationAdvisoryWindow = TimeInterval(hours: 7) diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/PumpManagerAlert.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/PumpManagerAlert.swift index 0a0f46df19..c17ec0e19e 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/PumpManagerAlert.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/PumpManagerAlert.swift @@ -1,5 +1,5 @@ // -// PodAlert.swift +// PumpManagerAlert.swift // OmniKit // // Created by Pete Schwamb on 7/9/20. @@ -11,7 +11,6 @@ import LoopKit import HealthKit public enum PumpManagerAlert: Hashable { - case multiCommand(triggeringSlot: AlertSlot?) case podExpireImminent(triggeringSlot: AlertSlot?) case userPodExpiration(triggeringSlot: AlertSlot?, scheduledExpirationReminderOffset: TimeInterval) case lowReservoir(triggeringSlot: AlertSlot?, lowReservoirReminderValue: Double) @@ -19,6 +18,7 @@ public enum PumpManagerAlert: Hashable { case suspendEnded(triggeringSlot: AlertSlot?) case podExpiring(triggeringSlot: AlertSlot?) case finishSetupReminder(triggeringSlot: AlertSlot?) + case unexpectedAlert(triggeringSlot: AlertSlot?) case timeOffsetChangeDetected var isRepeating: Bool { @@ -36,8 +36,6 @@ public enum PumpManagerAlert: Hashable { var contentTitle: String { switch self { - case .multiCommand: - return LocalizedString("Multiple Command Alert", comment: "Alert content title for multiCommand pod alert") case .userPodExpiration: return LocalizedString("Pod Expiration Reminder", comment: "Alert content title for userPodExpiration pod alert") case .podExpiring: @@ -52,6 +50,8 @@ public enum PumpManagerAlert: Hashable { return LocalizedString("Resume Insulin", comment: "Alert content title for suspendEnded pod alert") case .finishSetupReminder: return LocalizedString("Pod Pairing Incomplete", comment: "Alert content title for finishSetupReminder pod alert") + case .unexpectedAlert: + return LocalizedString("Unexpected Alert", comment: "Alert content title for unexpected pod alert") case .timeOffsetChangeDetected: return LocalizedString("Time Change Detected", comment: "Alert content title for timeOffsetChangeDetected pod alert") } @@ -59,8 +59,6 @@ public enum PumpManagerAlert: Hashable { var contentBody: String { switch self { - case .multiCommand: - return LocalizedString("Multiple Command Alert", comment: "Alert content body for multiCommand pod alert") case .userPodExpiration(_, let offset): let formatter = DateComponentsFormatter() formatter.allowedUnits = [.hour] @@ -81,6 +79,9 @@ public enum PumpManagerAlert: Hashable { return LocalizedString("The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes.", comment: "Alert content body for suspendEnded pod alert") case .finishSetupReminder: return LocalizedString("Please finish pairing your pod.", comment: "Alert content body for finishSetupReminder pod alert") + case .unexpectedAlert(let triggeringSlot): + let slotNumberString = triggeringSlot != nil ? String(describing: triggeringSlot!.rawValue) : "?" + return String(format: LocalizedString("Unexpected Pod Alert #%1@!", comment: "Alert content body for unexpected pod alert (1: slotNumberString)"), slotNumberString) case .timeOffsetChangeDetected: return LocalizedString("The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings.", comment: "Alert content body for timeOffsetChangeDetected pod alert") } @@ -88,8 +89,6 @@ public enum PumpManagerAlert: Hashable { var triggeringSlot: AlertSlot? { switch self { - case .multiCommand(let slot): - return slot case .userPodExpiration(let slot, _): return slot case .podExpiring(let slot): @@ -104,6 +103,8 @@ public enum PumpManagerAlert: Hashable { return slot case .finishSetupReminder(let slot): return slot + case .unexpectedAlert(let slot): + return slot case .timeOffsetChangeDetected: return nil } @@ -139,8 +140,6 @@ public enum PumpManagerAlert: Hashable { var alertIdentifier: String { switch self { - case .multiCommand: - return "multiCommand" case .userPodExpiration: return "userPodExpiration" case .podExpiring: @@ -153,10 +152,12 @@ public enum PumpManagerAlert: Hashable { return "suspendInProgress" case .suspendEnded: return "suspendEnded" - case .timeOffsetChangeDetected: - return "timeOffsetChangeDetected" case .finishSetupReminder: return "finishSetupReminder" + case .unexpectedAlert: + return "unexpectedAlert" + case .timeOffsetChangeDetected: + return "timeOffsetChangeDetected" } } @@ -183,8 +184,6 @@ extension PumpManagerAlert: RawRepresentable { } switch identifier { - case "multiCommand": - self = .multiCommand(triggeringSlot: slot) case "userPodExpiration": guard let offset = rawValue["offset"] as? TimeInterval, offset > 0 else { return nil @@ -203,6 +202,8 @@ extension PumpManagerAlert: RawRepresentable { self = .suspendInProgress(triggeringSlot: slot) case "suspendEnded": self = .suspendEnded(triggeringSlot: slot) + case "unexpectedAlert": + self = .unexpectedAlert(triggeringSlot: slot) case "timeOffsetChangeDetected": self = .timeOffsetChangeDetected default: @@ -229,14 +230,3 @@ extension PumpManagerAlert: RawRepresentable { return rawValue } } - -extension PodAlert { - var isIgnored: Bool { - switch self { - case .podSuspendedReminder, .finishSetupReminder: - return true - default: - return false - } - } -} diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/SilencePodPreference.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/SilencePodPreference.swift new file mode 100644 index 0000000000..118bbf5604 --- /dev/null +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/SilencePodPreference.swift @@ -0,0 +1,32 @@ +// +// SilencePodPreference.swift +// OmniKit +// +// Created by Joe Moran on 8/30/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import Foundation + +public enum SilencePodPreference: Int, CaseIterable { + case disabled + case enabled + + public var title: String { + switch self { + case .disabled: + return LocalizedString("Disabled", comment: "Title string for SilencePodPreference.disabled") + case .enabled: + return LocalizedString("Silenced", comment: "Title string for SilencePodPreference.enabled") + } + } + + public var description: String { + switch self { + case .disabled: + return LocalizedString("Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled.", comment: "Description for SilencePodPreference.disabled") + case .enabled: + return LocalizedString("All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts.", comment: "Description for SilencePodPreference.enabled") + } + } +} diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift index f3082f9751..b2a2befced 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift @@ -143,14 +143,6 @@ public class OmnipodPumpManager: RileyLinkPumpManager { return setStateWithResult(changes) } - @discardableResult - private func mutateState(_ changes: (_ state: inout OmnipodPumpManagerState) -> Void) -> OmnipodPumpManagerState { - return setStateWithResult({ (state) -> OmnipodPumpManagerState in - changes(&state) - return state - }) - } - private func setStateWithResult(_ changes: (_ state: inout OmnipodPumpManagerState) -> ReturnType) -> ReturnType { var oldValue: OmnipodPumpManagerState! var returnType: ReturnType! @@ -282,12 +274,14 @@ public class OmnipodPumpManager: RileyLinkPumpManager { override public var debugDescription: String { let lines = [ "## OmnipodPumpManager", + "", + super.debugDescription, "podComms: \(String(reflecting: podComms))", - "state: \(String(reflecting: state))", + "statusObservers.count: \(statusObservers.cleanupDeallocatedElements().count)", "status: \(String(describing: status))", + "", "podStateObservers.count: \(podStateObservers.cleanupDeallocatedElements().count)", - "statusObservers.count: \(statusObservers.cleanupDeallocatedElements().count)", - super.debugDescription, + "state: \(String(reflecting: state))", ] return lines.joined(separator: "\n") } @@ -548,10 +542,21 @@ extension OmnipodPumpManager { return false } + private var podTime: TimeInterval { + get { + guard let podState = state.podState else { + return 0 + } + let elapsed = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podActiveTime = podState.podTime + elapsed + return podActiveTime + } + } + // Returns a suitable beep command MessageBlock based the current beep preferences and // whether there is an unfinializedDose for a manual temp basal &/or a manual bolus. private func beepMessageBlock(beepType: BeepType) -> MessageBlock? { - guard self.beepPreference.shouldBeepForManualCommand else { + guard self.beepPreference.shouldBeepForManualCommand && !self.silencePod else { return nil } @@ -635,6 +640,13 @@ extension OmnipodPumpManager { } } + // Thread-safe + public var silencePod: Bool { + get { + return state.silencePod + } + } + // From last status response public var reservoirLevel: ReservoirLevel? { return state.reservoirLevel @@ -876,15 +888,13 @@ extension OmnipodPumpManager { } } - let expiration = self.podExpiresAt ?? Date().addingTimeInterval(Pod.nominalPodLife) - let timeUntilExpirationReminder = expiration.addingTimeInterval(-self.state.defaultExpirationReminderOffset).timeIntervalSince(self.dateGenerator()) - + let expirationReminderTime = Pod.nominalPodLife - self.state.defaultExpirationReminderOffset let alerts: [PodAlert] = [ - .expirationReminder(self.state.defaultExpirationReminderOffset > 0 ? timeUntilExpirationReminder : 0), - .lowReservoir(self.state.lowReservoirReminderValue) + .expirationReminder(offset: self.podTime, absAlertTime: self.state.defaultExpirationReminderOffset > 0 ? expirationReminderTime : 0), + .lowReservoir(units: self.state.lowReservoirReminderValue) ] - let finishWait = try messageSender.insertCannula(optionalAlerts: alerts) + let finishWait = try messageSender.insertCannula(optionalAlerts: alerts, silent: self.silencePod) completion(.success(finishWait)) } catch let error { completion(.failure(.communication(error))) @@ -948,6 +958,62 @@ extension OmnipodPumpManager { } } + public func getDetailedStatus(completion: ((_ result: PumpManagerResult) -> Void)? = nil) { + + // use hasSetupPod here instead of hasActivePod as DetailedStatus can be read with a faulted Pod + guard self.hasSetupPod else { + completion?(.failure(PumpManagerError.configuration(OmnipodPumpManagerError.noPodPaired))) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + podComms.runSession(withName: "Get detailed status", using: rileyLinkSelector) { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .bipBip) + let detailedStatus = try session.getDetailedStatus(beepBlock: beepBlock) + session.dosesForStorage({ (doses) -> Bool in + self.store(doses: doses, in: session) + }) + completion?(.success(detailedStatus)) + case .failure(let error): + throw error + } + } catch let error { + completion?(.failure(.communication(error as? LocalizedError))) + self.log.error("Failed to fetch detailed status: %{public}@", String(describing: error)) + } + } + } + + public func acknowledgePodAlerts(_ alertsToAcknowledge: AlertSet, completion: @escaping (_ alerts: AlertSet?) -> Void) { + guard self.hasActivePod else { + completion(nil) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + self.podComms.runSession(withName: "Acknowledge Alerts", using: rileyLinkSelector) { (result) in + let session: PodCommsSession + switch result { + case .success(let s): + session = s + case .failure: + completion(nil) + return + } + + do { + let beepBlock = self.beepMessageBlock(beepType: .bipBip) + let alerts = try session.acknowledgeAlerts(alerts: alertsToAcknowledge, beepBlock: beepBlock) + completion(alerts) + } catch { + completion(nil) + } + } + } + public func setTime(completion: @escaping (OmnipodPumpManagerError?) -> Void) { guard state.hasActivePod else { @@ -966,7 +1032,7 @@ extension OmnipodPumpManager { switch result { case .success(let session): do { - let beep = self.beepPreference.shouldBeepForManualCommand + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let _ = try session.setTime(timeZone: timeZone, basalSchedule: self.state.basalSchedule, date: Date(), acknowledgementBeep: beep) self.setState { (state) in state.timeZone = timeZone @@ -1023,7 +1089,7 @@ extension OmnipodPumpManager { case .success: break } - let beep = self.beepPreference.shouldBeepForManualCommand + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let _ = try session.setBasalSchedule(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: beep) self.setState { (state) in @@ -1086,12 +1152,12 @@ extension OmnipodPumpManager { self.podComms.runSession(withName: "Play Test Beeps", using: rileyLinkSelector) { (result) in switch result { case .success(let session): - // preserve Pod completion beep state for any unfinalized manual insulin delivery - let beep = self.beepPreference.shouldBeepForManualCommand + // preserve the pod's completion beep state which gets reset playing beeps + let enabled: Bool = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand let result = session.beepConfig( beepType: .bipBeepBipBeepBipBeepBipBeep, - tempBasalCompletionBeep: beep && self.hasUnfinalizedManualTempBasal, - bolusCompletionBeep: beep && self.hasUnfinalizedManualBolus + tempBasalCompletionBeep: enabled && self.hasUnfinalizedManualTempBasal, + bolusCompletionBeep: enabled && self.hasUnfinalizedManualBolus ) switch result { @@ -1145,17 +1211,21 @@ extension OmnipodPumpManager { } public func setConfirmationBeeps(newPreference: BeepPreference, completion: @escaping (OmnipodPumpManagerError?) -> Void) { - self.log.default("Set Confirmation Beeps to %s", String(describing: newPreference)) - guard self.hasActivePod else { + + // If there isn't an active pod or the pod is currently silenced, + // just need to update the internal state without any pod commands. + let name = String(format: "Set Beep Preference to %@", String(describing: newPreference)) + if !self.hasActivePod || self.silencePod { + self.log.default("%{public}@ for internal state only", name) self.setState { state in - state.confirmationBeeps = newPreference // set here to allow changes on a faulted Pod + state.confirmationBeeps = newPreference } completion(nil) return } let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice - self.podComms.runSession(withName: "Set Confirmation Beeps Preference", using: rileyLinkSelector) { (result) in + self.podComms.runSession(withName: name, using: rileyLinkSelector) { (result) in switch result { case .success(let session): // enable/disable Pod completion beep state for any unfinalized manual insulin delivery @@ -1181,6 +1251,76 @@ extension OmnipodPumpManager { } } } + + // Reconfigures all active alerts in pod to be silent or not as well as sets/clears the + // self.silencePod state variable which silences all confirmation beeping when enabled. + public func setSilencePod(silencePod: Bool, completion: @escaping (OmnipodPumpManagerError?) -> Void) { + + let name = String(format: "%@ Pod", silencePod ? "Silence" : "Unsilence") + // allow Silence Pod changes without an active Pod + guard self.hasActivePod else { + self.log.default("%{public}@", name) + self.setState { state in + state.silencePod = silencePod + } + completion(nil) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + self.podComms.runSession(withName: name, using: rileyLinkSelector) { (result) in + + let session: PodCommsSession + switch result { + case .success(let s): + session = s + case .failure(let error): + completion(.communication(error)) + return + } + + guard let configuredAlerts = self.state.podState?.configuredAlerts, + let activeAlertSlots = self.state.podState?.activeAlertSlots, + let reservoirLevel = self.state.podState?.lastInsulinMeasurements?.reservoirLevel?.rawValue else + { + self.log.error("Missing podState") // should never happen + completion(OmnipodPumpManagerError.noPodPaired) + return + } + + let beepBlock: MessageBlock? + if !self.beepPreference.shouldBeepForManualCommand { + // No enabled completion beeps to worry about for any in-progress manual delivery + beepBlock = nil + } else if silencePod { + // Disable completion beeps for any in-progress manual delivery w/o beeping + beepBlock = BeepConfigCommand(beepType: .noBeepNonCancel) + } else { + // Emit a confirmation beep and enable completion beeps for any in-progress manual delivery + beepBlock = BeepConfigCommand( + beepType: .bipBip, + tempBasalCompletionBeep: self.hasUnfinalizedManualTempBasal, + bolusCompletionBeep: self.hasUnfinalizedManualBolus + ) + } + + let podAlerts = regeneratePodAlerts(silent: silencePod, configuredAlerts: configuredAlerts, activeAlertSlots: activeAlertSlots, currentPodTime: self.podTime, currentReservoirLevel: reservoirLevel) + do { + // Since non-responsive pod comms are currently only resolved for insulin related commands, + // it's possible that a previous pod alert was successfully configured will lose its response + // and thus the alert won't get reset when reconfiguring pod alerts with a new silence pod state. + // So acknowledge all alerts now to be absolutely sure that no triggered alert will be forgotten. + try session.configureAlerts(podAlerts, acknowledgeAll: true, beepBlock: beepBlock) + self.setState { (state) in + state.silencePod = silencePod + } + completion(nil) + } catch { + self.log.error("Configure alerts %{public}@ failed: %{public}@", String(describing: podAlerts), String(describing: error)) + completion(.communication(error)) + } + } + } } // MARK: - PumpManager @@ -1273,7 +1413,7 @@ extension OmnipodPumpManager: PumpManager { public var defaultExpirationReminderOffset: TimeInterval { set { - mutateState { (state) in + setState { (state) in state.defaultExpirationReminderOffset = newValue } } @@ -1284,7 +1424,7 @@ extension OmnipodPumpManager: PumpManager { public var lowReservoirReminderValue: Double { set { - mutateState { (state) in + setState { (state) in state.lowReservoirReminderValue = newValue } } @@ -1295,7 +1435,7 @@ extension OmnipodPumpManager: PumpManager { public var podAttachmentConfirmed: Bool { set { - mutateState { (state) in + setState { (state) in state.podAttachmentConfirmed = newValue } } @@ -1306,7 +1446,7 @@ extension OmnipodPumpManager: PumpManager { public var initialConfigurationCompleted: Bool { set { - mutateState { (state) in + setState { (state) in state.initialConfigurationCompleted = newValue } } @@ -1391,7 +1531,7 @@ extension OmnipodPumpManager: PumpManager { // Use a beepBlock for the confirmation beep to avoid getting 3 beeps using cancel command beeps! let beepBlock = self.beepMessageBlock(beepType: .beeeeeep) - let result = session.suspendDelivery(suspendReminder: suspendReminder, beepBlock: beepBlock) + let result = session.suspendDelivery(suspendReminder: suspendReminder, silent: self.silencePod, beepBlock: beepBlock) switch result { case .certainFailure(let error): self.log.error("Failed to suspend: %{public}@", String(describing: error)) @@ -1437,8 +1577,8 @@ extension OmnipodPumpManager: PumpManager { do { let scheduleOffset = self.state.timeZone.scheduleOffset(forDate: Date()) - let beep = self.beepPreference.shouldBeepForManualCommand - let _ = try session.resumeBasal(schedule: self.state.basalSchedule, scheduleOffset: scheduleOffset, acknowledgementBeep: beep, completionBeep: beep) + let beep = self.silencePod ? false : self.beepPreference.shouldBeepForManualCommand + let _ = try session.resumeBasal(schedule: self.state.basalSchedule, scheduleOffset: scheduleOffset, acknowledgementBeep: beep) self.clearSuspendReminder() session.dosesForStorage() { (doses) -> Bool in return self.store(doses: doses, in: session) @@ -1514,8 +1654,14 @@ extension OmnipodPumpManager: PumpManager { // Round to nearest supported volume let enactUnits = roundToSupportedBolusVolume(units: units) - let acknowledgementBeep = self.beepPreference.shouldBeepForCommand(automatic: activationType.isAutomatic) - let completionBeep = beepPreference.shouldBeepForManualCommand && !activationType.isAutomatic + let acknowledgementBeep, completionBeep: Bool + if self.silencePod { + acknowledgementBeep = false + completionBeep = false + } else { + acknowledgementBeep = self.beepPreference.shouldBeepForCommand(automatic: activationType.isAutomatic) + completionBeep = beepPreference.shouldBeepForManualCommand && !activationType.isAutomatic + } let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice self.podComms.runSession(withName: "Bolus", using: rileyLinkSelector) { (result) in @@ -1601,7 +1747,7 @@ extension OmnipodPumpManager: PumpManager { } // when cancelling a bolus use the built-in type 6 beeeeeep to match PDM if confirmation beeps are enabled - let beepType: BeepType = self.beepPreference.shouldBeepForManualCommand ? .beeeeeep : .noBeepCancel + let beepType: BeepType = self.beepPreference.shouldBeepForManualCommand && !self.silencePod ? .beeeeeep : .noBeepCancel let result = session.cancelDelivery(deliveryType: .bolus, beepType: beepType) switch result { case .certainFailure(let error): @@ -1637,8 +1783,14 @@ extension OmnipodPumpManager: PumpManager { // Round to nearest supported rate let rate = roundToSupportedBasalRate(unitsPerHour: unitsPerHour) - let acknowledgementBeep = beepPreference.shouldBeepForCommand(automatic: automatic) - let completionBeep = beepPreference.shouldBeepForManualCommand && !automatic + let acknowledgementBeep, completionBeep: Bool + if self.silencePod { + acknowledgementBeep = false + completionBeep = false + } else { + acknowledgementBeep = beepPreference.shouldBeepForCommand(automatic: automatic) + completionBeep = beepPreference.shouldBeepForManualCommand && !automatic + } let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice self.podComms.runSession(withName: "Enact Temp Basal", using: rileyLinkSelector) { (result) in @@ -1668,9 +1820,12 @@ extension OmnipodPumpManager: PumpManager { return } + // Did the last message have comms issues or is the last delivery status not verified correctly? + let uncertainDeliveryStatus = self.state.podState?.lastCommsOK == false || self.state.podState?.deliveryStatusVerified == false + // Do the cancel temp basal command if currently running a temp basal OR - // if resuming scheduled basal delivery. - if self.state.podState?.unfinalizedTempBasal != nil || resumingScheduledBasal { + // if resuming scheduled basal delivery OR if the delivery status is uncertain. + if self.state.podState?.unfinalizedTempBasal != nil || resumingScheduledBasal || uncertainDeliveryStatus { let status: StatusResponse // if resuming scheduled basal delivery & an acknowledgement beep is needed, use the cancel TB beep @@ -1768,7 +1923,7 @@ extension OmnipodPumpManager: PumpManager { } public func syncDeliveryLimits(limits deliveryLimits: DeliveryLimits, completion: @escaping (Result) -> Void) { - mutateState { state in + setState { state in if let rate = deliveryLimits.maximumBasalRate?.doubleValue(for: .internationalUnitsPerHour) { state.maximumTempBasalRate = rate completion(.success(deliveryLimits)) @@ -1814,16 +1969,25 @@ extension OmnipodPumpManager: PumpManager { return } - var timeUntilReminder : TimeInterval = 0 + let podTime = self.podTime + var expirationReminderPodTime: TimeInterval = 0 // default to expiration reminder alert inactive + + // If the interval before expiration is not a positive value (e.g., it's in the past), + // then the pod alert will get the default alert time of 0 making this alert inactive. if let intervalBeforeExpiration = intervalBeforeExpiration, intervalBeforeExpiration > 0 { - timeUntilReminder = expiresAt.addingTimeInterval(-intervalBeforeExpiration).timeIntervalSince(self.dateGenerator()) + let timeUntilReminder = expiresAt.addingTimeInterval(-intervalBeforeExpiration).timeIntervalSince(self.dateGenerator()) + // Only bother to set an expiration reminder pod alert if it is still at least a couple of minutes in the future + if timeUntilReminder > .minutes(2) { + expirationReminderPodTime = podTime + timeUntilReminder + self.log.debug("Update Expiration timeUntilReminder=%@, podTime=%@, expirationReminderPodTime=%@", timeUntilReminder.timeIntervalStr, podTime.timeIntervalStr, expirationReminderPodTime.timeIntervalStr) + } } - let expirationReminder = PodAlert.expirationReminder(timeUntilReminder) + let expirationReminder = PodAlert.expirationReminder(offset: podTime, absAlertTime: expirationReminderPodTime, silent: self.silencePod) do { let beepBlock = self.beepMessageBlock(beepType: .beep) try session.configureAlerts([expirationReminder], beepBlock: beepBlock) - self.mutateState({ (state) in + self.setState({ (state) in state.scheduledExpirationReminderOffset = intervalBeforeExpiration }) completion(nil) @@ -1847,7 +2011,8 @@ extension OmnipodPumpManager: PumpManager { expiration.addingTimeInterval(.hours(Double(i))) } let now = dateGenerator() - return allDates.filter { $0.timeIntervalSince(now) > 0 } + // Have a couple minutes of slop to avoid confusion trying to set an expiration reminder too close to now + return allDates.filter { $0.timeIntervalSince(now) > .minutes(2) } } public var scheduledExpirationReminder: Date? { @@ -1860,9 +2025,26 @@ extension OmnipodPumpManager: PumpManager { return expiration.addingTimeInterval(-.hours(round(offset.hours))) } + // Updates the low reservior reminder value both for the current pod (when applicable) and for future pods public func updateLowReservoirReminder(_ value: Int, completion: @escaping (OmnipodPumpManagerError?) -> Void) { + + let supportedValue = min(max(0, Double(value)), Pod.maximumReservoirReading) + let setLowReservoirReminderValue = { + self.log.default("Set Low Reservoir Reminder to %d U", value) + self.lowReservoirReminderValue = supportedValue + completion(nil) + } + guard self.hasActivePod else { - completion(OmnipodPumpManagerError.noPodPaired) + // no active pod, just set the internal state for the next pod + setLowReservoirReminderValue() + return + } + + guard let currentReservoirLevel = self.reservoirLevel?.rawValue, currentReservoirLevel > supportedValue else { + // Since the new low reservoir alert level is not below the current reservoir value, + // just set the internal state for the next pod to prevent an immediate low reservoir alert. + setLowReservoirReminderValue() return } @@ -1878,13 +2060,11 @@ extension OmnipodPumpManager: PumpManager { return } - let lowReservoirReminder = PodAlert.lowReservoir(Double(value)) + let lowReservoirReminder = PodAlert.lowReservoir(units: supportedValue, silent: self.silencePod) do { let beepBlock = self.beepMessageBlock(beepType: .beep) try session.configureAlerts([lowReservoirReminder], beepBlock: beepBlock) - self.mutateState({ (state) in - state.lowReservoirReminderValue = Double(value) - }) + self.lowReservoirReminderValue = supportedValue completion(nil) } catch { completion(.communication(error)) @@ -1909,7 +2089,7 @@ extension OmnipodPumpManager: PumpManager { } } - self.mutateState { (state) in + self.setState { (state) in state.activeAlerts.insert(alert) } } @@ -1925,7 +2105,7 @@ extension OmnipodPumpManager: PumpManager { delegate?.retractAlert(identifier: repeatingIdentifier) } } - self.mutateState { (state) in + self.setState { (state) in state.activeAlerts.remove(alert) } } @@ -1946,6 +2126,8 @@ extension OmnipodPumpManager: PumpManager { } } else { log.error("Unconfigured alert slot triggered: %{public}@", String(describing: slot)) + let pumpManagerAlert = PumpManagerAlert.unexpectedAlert(triggeringSlot: slot) + issueAlert(alert: pumpManagerAlert) } } for alert in removed { @@ -1954,34 +2136,24 @@ extension OmnipodPumpManager: PumpManager { } private func getPumpManagerAlert(for podAlert: PodAlert, slot: AlertSlot) -> PumpManagerAlert? { - guard let podState = state.podState, let expiresAt = podState.expiresAt else { - preconditionFailure("trying to lookup alert info without podState") - } - - guard !podAlert.isIgnored else { - return nil - } switch podAlert { - case .podSuspendedReminder: - return PumpManagerAlert.suspendInProgress(triggeringSlot: slot) + case .shutdownImminent: + return PumpManagerAlert.podExpireImminent(triggeringSlot: slot) case .expirationReminder: - guard let offset = state.scheduledExpirationReminderOffset, offset > 0 else { - return nil + guard let podState = state.podState, let expiresAt = podState.expiresAt else { + preconditionFailure("trying to lookup expiresAt") } let timeToExpiry = TimeInterval(hours: expiresAt.timeIntervalSince(dateGenerator()).hours.rounded()) return PumpManagerAlert.userPodExpiration(triggeringSlot: slot, scheduledExpirationReminderOffset: timeToExpiry) - case .expired: - return PumpManagerAlert.podExpiring(triggeringSlot: slot) - case .shutdownImminent: - return PumpManagerAlert.podExpireImminent(triggeringSlot: slot) - case .lowReservoir(let units): + case .lowReservoir(let units, _): return PumpManagerAlert.lowReservoir(triggeringSlot: slot, lowReservoirReminderValue: units) - case .finishSetupReminder, .waitingForPairingReminder: - return PumpManagerAlert.finishSetupReminder(triggeringSlot: slot) case .suspendTimeExpired: return PumpManagerAlert.suspendEnded(triggeringSlot: slot) + case .expired: + return PumpManagerAlert.podExpiring(triggeringSlot: slot) default: + // No PumpManagerAlerts are used for any other pod alerts (including suspendInProgress). return nil } } @@ -1999,7 +2171,7 @@ extension OmnipodPumpManager: PumpManager { } catch { return } - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) state.alertsWithPendingAcknowledgment.remove(alert) } @@ -2123,7 +2295,7 @@ extension OmnipodPumpManager: PodCommsDelegate { } } else { // Resetting podState - mutateState { state in + setState { state in state.updatePodStateFromPodComms(podState) } } @@ -2142,6 +2314,13 @@ extension OmnipodPumpManager { if alert.alertIdentifier == alertIdentifier { // If this alert was triggered by the pod find the slot to clear it. if let slot = alert.triggeringSlot { + if case .some(.suspended) = self.state.podState?.suspendState, slot == .slot6SuspendTimeExpired { + // Don't clear this pod alert here with the pod still suspended so that the suspend time expired + // pod alert beeping will continue until the pod is resumed which will then deactivate this alert. + log.default("Skipping acknowledgement of suspend time expired alert with a suspended pod") + completion(nil) + return + } let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice self.podComms.runSession(withName: "Acknowledge Alert", using: rileyLinkSelector) { (result) in switch result { @@ -2150,18 +2329,18 @@ extension OmnipodPumpManager { let beepBlock = self.beepMessageBlock(beepType: .beep) let _ = try session.acknowledgeAlerts(alerts: AlertSet(slots: [slot]), beepBlock: beepBlock) } catch { - self.mutateState { state in + self.setState { state in state.alertsWithPendingAcknowledgment.insert(alert) } completion(error) return } - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) } completion(nil) case .failure(let error): - self.mutateState { state in + self.setState { state in state.alertsWithPendingAcknowledgment.insert(alert) } completion(error) @@ -2170,7 +2349,7 @@ extension OmnipodPumpManager { } } else { // Non-pod alert - self.mutateState { state in + self.setState { state in state.activeAlerts.remove(alert) if alert == .timeOffsetChangeDetected { state.acknowledgedTimeOffsetAlert = true @@ -2199,7 +2378,7 @@ extension FaultEventCode { case .exceededMaximumPodLife80Hrs: return LocalizedString("Pod Expired", comment: "The title for Pod Expired alarm notification") default: - return LocalizedString("Critical Pod Error", comment: "The title for AlarmCode.other notification") + return String(format: LocalizedString("Critical Pod Fault %1$03d", comment: "The title for AlarmCode.other notification: (1: fault code value)"), self.rawValue) } } diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManagerState.swift b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManagerState.swift index 3b2094a5bb..3b4913d3a7 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManagerState.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManagerState.swift @@ -35,6 +35,8 @@ public struct OmnipodPumpManagerState: RawRepresentable, Equatable { public var unstoredDoses: [UnfinalizedDose] + public var silencePod: Bool + public var confirmationBeeps: BeepPreference public var scheduledExpirationReminderOffset: TimeInterval? @@ -100,6 +102,7 @@ public struct OmnipodPumpManagerState: RawRepresentable, Equatable { self.basalSchedule = basalSchedule self.rileyLinkConnectionManagerState = rileyLinkConnectionManagerState self.unstoredDoses = [] + self.silencePod = false self.confirmationBeeps = .manualCommands self.insulinType = insulinType self.lowReservoirReminderValue = Pod.defaultLowReservoirReminder @@ -186,6 +189,8 @@ public struct OmnipodPumpManagerState: RawRepresentable, Equatable { self.unstoredDoses = [] } + self.silencePod = rawValue["silencePod"] as? Bool ?? false + if let oldAutomaticBolusBeeps = rawValue["automaticBolusBeeps"] as? Bool, oldAutomaticBolusBeeps { self.confirmationBeeps = .extended } else if let oldConfirmationBeeps = rawValue["confirmationBeeps"] as? Bool, oldConfirmationBeeps { @@ -253,6 +258,7 @@ public struct OmnipodPumpManagerState: RawRepresentable, Equatable { "timeZone": timeZone.secondsFromGMT(), "basalSchedule": basalSchedule.rawValue, "unstoredDoses": unstoredDoses.map { $0.rawValue }, + "silencePod": silencePod, "confirmationBeeps": confirmationBeeps.rawValue, "activeAlerts": activeAlerts.map { $0.rawValue }, "podAttachmentConfirmed": podAttachmentConfirmed, @@ -303,8 +309,8 @@ extension OmnipodPumpManagerState: CustomDebugStringConvertible { "* timeZone: \(timeZone)", "* basalSchedule: \(String(describing: basalSchedule))", "* maximumTempBasalRate: \(maximumTempBasalRate)", - "* scheduledExpirationReminderOffset: \(String(describing: scheduledExpirationReminderOffset))", - "* defaultExpirationReminderOffset: \(String(describing: defaultExpirationReminderOffset))", + "* scheduledExpirationReminderOffset: \(String(describing: scheduledExpirationReminderOffset?.timeIntervalStr))", + "* defaultExpirationReminderOffset: \(defaultExpirationReminderOffset.timeIntervalStr)", "* lowReservoirReminderValue: \(String(describing: lowReservoirReminderValue))", "* podAttachmentConfirmed: \(podAttachmentConfirmed)", "* activeAlerts: \(activeAlerts)", @@ -317,14 +323,21 @@ extension OmnipodPumpManagerState: CustomDebugStringConvertible { "* tempBasalEngageState: \(String(describing: tempBasalEngageState))", "* lastPumpDataReportDate: \(String(describing: lastPumpDataReportDate))", "* isPumpDataStale: \(String(describing: isPumpDataStale))", + "* silencePod: \(String(describing: silencePod))", "* confirmationBeeps: \(String(describing: confirmationBeeps))", "* pairingAttemptAddress: \(String(describing: pairingAttemptAddress))", "* insulinType: \(String(describing: insulinType))", + "* scheduledExpirationReminderOffset: \(String(describing: scheduledExpirationReminderOffset?.timeIntervalStr))", + "* defaultExpirationReminderOffset: \(defaultExpirationReminderOffset.timeIntervalStr)", "* rileyLinkBatteryAlertLevel: \(String(describing: rileyLinkBatteryAlertLevel))", "* lastRileyLinkBatteryAlertDate \(String(describing: lastRileyLinkBatteryAlertDate))", - String(reflecting: podState), - "* PreviousPodState: \(String(reflecting: previousPodState))", - String(reflecting: rileyLinkConnectionManagerState), + "", + "* RileyLinkConnectionManagerState: " + (rileyLinkConnectionManagerState == nil ? "nil" : String(describing: rileyLinkConnectionManagerState!)), + "", + "* PodState: " + (podState == nil ? "nil" : String(describing: podState!)), + "", + "* PreviousPodState: " + (previousPodState == nil ? "nil" : String(describing: previousPodState!)), + "", ].joined(separator: "\n") } } diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodComms.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodComms.swift index e74e6662b5..0389e3dc15 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodComms.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodComms.swift @@ -454,7 +454,6 @@ class PodComms: CustomDebugStringConvertible { var debugDescription: String { return [ "## PodComms", - "podState: \(String(reflecting: podState))", "configuredDevices: \(configuredDevices.value.map { $0.uuidString })", "delegate: \(String(describing: delegate != nil))", "" diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift index c509ea53d3..e00dbad502 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift @@ -279,6 +279,7 @@ public class PodCommsSession { let message = Message(address: podState.address, messageBlocks: blocksToSend, sequenceNum: messageNumber, expectFollowOnMessage: expectFollowOnMessage) + self.podState.lastCommsOK = false // mark last comms as not OK until we get the expected response let response = try transport.sendMessage(message) // Simulate fault @@ -287,6 +288,7 @@ public class PodCommsSession { if let responseMessageBlock = response.messageBlocks[0] as? T { log.info("POD Response: %{public}@", String(describing: responseMessageBlock)) + self.podState.lastCommsOK = true // message successfully sent and expected response received return responseMessageBlock } @@ -385,10 +387,16 @@ public class PodCommsSession { } @discardableResult - func configureAlerts(_ alerts: [PodAlert], beepBlock: MessageBlock? = nil) throws -> StatusResponse { + func configureAlerts(_ alerts: [PodAlert], acknowledgeAll: Bool = false, beepBlock: MessageBlock? = nil) throws -> StatusResponse { let configurations = alerts.map { $0.configuration } let configureAlerts = ConfigureAlertsCommand(nonce: podState.currentNonce, configurations: configurations) - let status: StatusResponse = try send([configureAlerts], beepBlock: beepBlock) + var blocksToSend: [MessageBlock] = [configureAlerts] + if acknowledgeAll { + // requested to acknowledge any possible pending pod alerts out of an abundnace of caution + let acknowledgeAll = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) + blocksToSend += [acknowledgeAll] + } + let status: StatusResponse = try send(blocksToSend, beepBlock: beepBlock) for alert in alerts { podState.registerConfiguredAlert(slot: alert.configuration.slot, alert: alert) } @@ -421,11 +429,11 @@ public class PodCommsSession { } } - public func insertCannula(optionalAlerts: [PodAlert] = []) throws -> TimeInterval { + public func insertCannula(optionalAlerts: [PodAlert] = [], silent: Bool) throws -> TimeInterval { let cannulaInsertionUnits = Pod.cannulaInsertionUnits + Pod.cannulaInsertionUnitsExtra let insertionWait: TimeInterval = .seconds(cannulaInsertionUnits / Pod.primeDeliveryRate) - guard let activatedAt = podState.activatedAt else { + guard podState.activatedAt != nil else { throw PodCommsError.noPodPaired } @@ -444,12 +452,12 @@ public class PodCommsSession { } podState.updateFromStatusResponse(status, at: currentDate) } else { - // Configure all the non-optional Pod Alarms - let expirationTime = activatedAt + Pod.nominalPodLife - let timeUntilExpirationAdvisory = expirationTime.timeIntervalSinceNow - let expirationAdvisoryAlarm = PodAlert.expired(alertTime: timeUntilExpirationAdvisory, duration: Pod.expirationAdvisoryWindow) - let endOfServiceTime = activatedAt + Pod.serviceDuration - let shutdownImminentAlarm = PodAlert.shutdownImminent((endOfServiceTime - Pod.endOfServiceImminentWindow).timeIntervalSinceNow) + let elapsed: TimeInterval = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podTime = podState.podTime + elapsed + + // Configure the mandatory Pod Alerts for shutdown imminent alert (79 hours) and pod expiration alert (72 hours) along with any optional alerts + let shutdownImminentAlarm = PodAlert.shutdownImminent(offset: podTime, absAlertTime: Pod.serviceDuration - Pod.endOfServiceImminentWindow, silent: silent) + let expirationAdvisoryAlarm = PodAlert.expired(offset: podTime, absAlertTime: Pod.nominalPodLife, duration: Pod.expirationAdvisoryWindow, silent: silent) try configureAlerts([expirationAdvisoryAlarm, shutdownImminentAlarm] + optionalAlerts) } @@ -500,7 +508,9 @@ public class PodCommsSession { let timeBetweenPulses = TimeInterval(seconds: Pod.secondsPerBolusPulse) let bolusScheduleCommand = SetInsulinScheduleCommand(nonce: podState.currentNonce, units: units, timeBetweenPulses: timeBetweenPulses, extendedUnits: extendedUnits, extendedDuration: extendedDuration) - if podState.unfinalizedBolus != nil { + // Do a getstatus to verify that there isn't an on-going bolus in progress if the last bolus command is still + // finalized, if the last delivery status wasn't successfully verified or the last comms attempt wasn't OK + if podState.unfinalizedBolus != nil || !podState.deliveryStatusVerified || !podState.lastCommsOK { var ongoingBolus = true if let statusResponse: StatusResponse = try? send([GetStatusCommand()]) { podState.updateFromStatusResponse(statusResponse, at: currentDate) @@ -602,7 +612,8 @@ public class PodCommsSession { // A suspendReminder of 0 is an untimed suspend which only uses podSuspendedReminder alert beeps. // A suspendReminder of 1-5 minutes will only use suspendTimeExpired alert beeps. // A suspendReminder of > 5 min will have periodic podSuspendedReminder beeps followed by suspendTimeExpired alerts. - public func suspendDelivery(suspendReminder: TimeInterval? = nil, beepBlock: MessageBlock? = nil) -> CancelDeliveryResult { + // The configured alerts will set up as silent pod alerts if silent is true. + public func suspendDelivery(suspendReminder: TimeInterval? = nil, silent: Bool, beepBlock: MessageBlock? = nil) -> CancelDeliveryResult { guard podState.unacknowledgedCommand == nil else { return .certainFailure(error: .unacknowledgedCommandPending) @@ -613,6 +624,9 @@ public class PodCommsSession { var podSuspendedReminderAlert: PodAlert? = nil var suspendTimeExpiredAlert: PodAlert? = nil let suspendTime: TimeInterval = suspendReminder != nil ? suspendReminder! : 0 + let elapsed: TimeInterval = -(podState.podTimeUpdated?.timeIntervalSinceNow ?? 0) + let podTime = podState.podTime + elapsed + log.debug("suspendDelivery: podState.podTime=%@, elapsed=%.2fs, computed timeActive %@", podState.podTime.timeIntervalStr, elapsed, podTime.timeIntervalStr) let cancelDeliveryCommand = CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel) var commandsToSend: [MessageBlock] = [cancelDeliveryCommand] @@ -620,14 +634,14 @@ public class PodCommsSession { // podSuspendedReminder provides a periodic pod suspended reminder beep until the specified suspend time. if suspendReminder != nil && (suspendTime == 0 || suspendTime > .minutes(5)) { // using reminder beeps for an untimed or long enough suspend time requiring pod suspended reminders - podSuspendedReminderAlert = PodAlert.podSuspendedReminder(active: true, suspendTime: suspendTime) + podSuspendedReminderAlert = PodAlert.podSuspendedReminder(active: true, offset: podTime, suspendTime: suspendTime, silent: silent) alertConfigurations += [podSuspendedReminderAlert!.configuration] } // suspendTimeExpired provides suspend time expired alert beeping after the expected suspend time has passed. if suspendTime > 0 { // a timed suspend using a suspend time expired alert - suspendTimeExpiredAlert = PodAlert.suspendTimeExpired(suspendTime: suspendTime) + suspendTimeExpiredAlert = PodAlert.suspendTimeExpired(offset: podTime, suspendTime: suspendTime, silent: silent) alertConfigurations += [suspendTimeExpiredAlert!.configuration] } @@ -667,8 +681,8 @@ public class PodCommsSession { private func cancelSuspendAlerts() throws -> StatusResponse { do { - let podSuspendedReminder = PodAlert.podSuspendedReminder(active: false, suspendTime: 0) - let suspendTimeExpired = PodAlert.suspendTimeExpired(suspendTime: 0) // A suspendTime of 0 deactivates this alert + let podSuspendedReminder = PodAlert.podSuspendedReminder(active: false, offset: 0, suspendTime: 0) + let suspendTimeExpired = PodAlert.suspendTimeExpired(offset: 0, suspendTime: 0) // A suspendTime of 0 deactivates this alert let status = try configureAlerts([podSuspendedReminder, suspendTimeExpired]) return status @@ -733,6 +747,11 @@ public class PodCommsSession { let basalExtraCommand = BasalScheduleExtraCommand.init(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: acknowledgementBeep, programReminderInterval: programReminderInterval) do { + if !(podState.lastCommsOK && podState.deliveryStatusVerified) { + // Can't trust the current delivery state -- do a cancel all + // to be sure that setting a basal program won't fault the pod. + let _: StatusResponse = try send([CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel)]) + } var status: StatusResponse = try send([basalScheduleCommand, basalExtraCommand]) let now = currentDate podState.suspendState = .resumed(now) @@ -918,11 +937,11 @@ public class PodCommsSession { } } - public func acknowledgeAlerts(alerts: AlertSet, beepBlock: MessageBlock? = nil) throws -> [AlertSlot: PodAlert] { + public func acknowledgeAlerts(alerts: AlertSet, beepBlock: MessageBlock? = nil) throws -> AlertSet { let cmd = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: alerts) let status: StatusResponse = try send([cmd], beepBlock: beepBlock) podState.updateFromStatusResponse(status, at: currentDate) - return podState.activeAlerts + return podState.activeAlertSlots } func dosesForStorage(_ storageHandler: ([UnfinalizedDose]) -> Bool) { diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodState.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodState.swift index fd051b6d74..48622a1fb7 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodState.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodState.swift @@ -55,16 +55,19 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl fileprivate var nonceState: NonceState public var activatedAt: Date? - public var expiresAt: Date? // set based on StatusResponse timeActive and can change with Pod clock drift and/or system time change + public var expiresAt: Date? // set based on timeActive and can change with Pod clock drift and/or system time change public var activeTime: TimeInterval? // Useful after pod deactivated or faulted. + public var podTime: TimeInterval // pod time from the last response, always whole minute values + public var podTimeUpdated: Date? // time that the podTime value was last updated + public var setupUnitsDelivered: Double? public let pmVersion: String public let piVersion: String public let lot: UInt32 public let tid: UInt32 - var activeAlertSlots: AlertSet + public var activeAlertSlots: AlertSet public var lastInsulinMeasurements: PodInsulinMeasurements? public var unacknowledgedCommand: PendingCommand? @@ -96,16 +99,6 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl public var configuredAlerts: [AlertSlot: PodAlert] public var insulinType: InsulinType - public var activeAlerts: [AlertSlot: PodAlert] { - var active = [AlertSlot: PodAlert]() - for slot in activeAlertSlots { - if let alert = configuredAlerts[slot] { - active[slot] = alert - } - } - return active - } - // Allow a grace period while the unacknowledged command is first being sent. public var needsCommsRecovery: Bool { if let unacknowledgedCommand = unacknowledgedCommand, !unacknowledgedCommand.isInFlight { @@ -114,6 +107,10 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl return false } + // the following two vars are not persistent across app restarts + public var deliveryStatusVerified: Bool + public var lastCommsOK: Bool + public init(address: UInt32, pmVersion: String, piVersion: String, lot: UInt32, tid: UInt32, packetNumber: Int = 0, messageNumber: Int = 0, insulinType: InsulinType) { self.address = address self.nonceState = NonceState(lot: lot, tid: tid) @@ -129,8 +126,11 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl self.messageTransportState = MessageTransportState(packetNumber: packetNumber, messageNumber: messageNumber) self.primeFinishTime = nil self.setupProgress = .addressAssigned - self.configuredAlerts = [.slot7: .waitingForPairingReminder] + self.configuredAlerts = [.slot7Expired: .waitingForPairingReminder] self.insulinType = insulinType + self.deliveryStatusVerified = false + self.lastCommsOK = false + self.podTime = 0 } public var unfinishedSetup: Bool { @@ -170,9 +170,21 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl let seed = UInt16(sum & 0xffff) ^ syncWord nonceState = NonceState(lot: lot, tid: tid, seed: seed) } - + + // Saves the current pod timeActive and will initialize the activatedAtComputed at + // pod startup and updates the expiresAt value to account for pod clock differences. private mutating func updatePodTimes(timeActive: TimeInterval) -> Date { let now = Date() + + guard timeActive >= self.podTime else { + // The pod active time went backwards and thus we have an apparent reset fault. + // Don't update any times or displayed expiresAt time will expectedly jump. + return now + } + + self.podTime = timeActive + self.podTimeUpdated = now + let activatedAtComputed = now - timeActive if activatedAt == nil { self.activatedAt = activatedAtComputed @@ -273,13 +285,25 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl private mutating func updateDeliveryStatus(deliveryStatus: DeliveryStatus, podProgressStatus: PodProgressStatus, bolusNotDelivered: Double, at date: Date) { + deliveryStatusVerified = true // See if the pod deliveryStatus indicates an active bolus or temp basal that the PodState isn't tracking (possible Loop restart) if deliveryStatus.bolusing && unfinalizedBolus == nil { // active bolus that Loop doesn't know about? if podProgressStatus.readyForDelivery { + deliveryStatusVerified = false // remember that we had inconsistent (bolus) delivery status // Create an unfinalizedBolus with the remaining bolus amount to capture what we can. unfinalizedBolus = UnfinalizedDose(bolusAmount: bolusNotDelivered, startTime: date, scheduledCertainty: .certain, insulinType: insulinType, automatic: false) } } + if deliveryStatus.tempBasalRunning && unfinalizedTempBasal == nil { // active temp basal that app isn't tracking + deliveryStatusVerified = false // remember that we had inconsistent (temp basal) delivery status + // unfinalizedTempBasal = UnfinalizedDose(tempBasalRate: 0, startTime: Date(), duration: .minutes(30), isHighTemp: false, scheduledCertainty: .certain, insulinType: insulinType) + } + if deliveryStatus != .suspended && isSuspended { // active basal that app isn't tracking + deliveryStatusVerified = false // remember that we had inconsistent (basal) delivery status + let resumeStartTime = Date() + suspendState = .resumed(resumeStartTime) + unfinalizedResume = UnfinalizedDose(resumeStartTime: resumeStartTime, scheduledCertainty: .certain, insulinType: insulinType) + } if var bolus = unfinalizedBolus, !deliveryStatus.bolusing { // Due to clock drift or comms delays, boluses can finish earlier than we expect @@ -413,6 +437,16 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl self.activeAlertSlots = .none } + if let podTime = rawValue["podTime"] as? TimeInterval, + let podTimeUpdated = rawValue["podTimeUpdated"] as? Date + { + self.podTime = podTime + self.podTimeUpdated = podTimeUpdated + } else { + self.podTime = 0 + self.podTimeUpdated = nil + } + if let setupProgressRaw = rawValue["setupProgress"] as? Int, let setupProgress = SetupProgress(rawValue: setupProgressRaw) { @@ -441,12 +475,12 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl } else { // Assume migration, and set up with alerts that are normally configured self.configuredAlerts = [ - .slot2: .shutdownImminent(0), - .slot3: .expirationReminder(0), - .slot4: .lowReservoir(0), - .slot5: .podSuspendedReminder(active: false, suspendTime: 0), - .slot6: .suspendTimeExpired(suspendTime: 0), - .slot7: .expired(alertTime: 0, duration: 0) + .slot2ShutdownImminent: .shutdownImminent(offset: 0, absAlertTime: 0), + .slot3ExpirationReminder: .expirationReminder(offset: 0, absAlertTime: 0), + .slot4LowReservoir: .lowReservoir(units: 0), + .slot5SuspendedReminder: .podSuspendedReminder(active: false, offset: 0, suspendTime: 0), + .slot6SuspendTimeExpired: .suspendTimeExpired(offset: 0, suspendTime: 0), + .slot7Expired: .expired(offset: 0, absAlertTime: 0, duration: 0) ] } @@ -455,8 +489,11 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl if let rawInsulinType = rawValue["insulinType"] as? InsulinType.RawValue, let insulinType = InsulinType(rawValue: rawInsulinType) { self.insulinType = insulinType } else { - insulinType = .novolog + self.insulinType = .novolog } + + self.deliveryStatusVerified = false + self.lastCommsOK = false } public var rawValue: RawValue { @@ -494,6 +531,8 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl rawValue["activeTime"] = activeTime rawValue["activatedAt"] = activatedAt rawValue["expiresAt"] = expiresAt + rawValue["podTime"] = podTime + rawValue["podTimeUpdated"] = podTimeUpdated rawValue["setupUnitsDelivered"] = setupUnitsDelivered @@ -514,6 +553,8 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl "* address: \(String(format: "%04X", address))", "* activatedAt: \(String(reflecting: activatedAt))", "* expiresAt: \(String(reflecting: expiresAt))", + "* podTime: \(podTime.timeIntervalStr)", + "* podTimeUpdated: \(String(reflecting: podTimeUpdated))", "* setupUnitsDelivered: \(String(reflecting: setupUnitsDelivered))", "* piVersion: \(piVersion)", "* pmVersion: \(pmVersion)", @@ -526,16 +567,14 @@ public struct PodState: RawRepresentable, Equatable, CustomDebugStringConvertibl "* unfinalizedSuspend: \(String(describing: unfinalizedSuspend))", "* unfinalizedResume: \(String(describing: unfinalizedResume))", "* finalizedDoses: \(String(describing: finalizedDoses))", - "* activeAlerts: \(String(describing: activeAlerts))", + "* activeAlertsSlots: \(alertSetString(alertSet: activeAlertSlots))", "* messageTransportState: \(String(describing: messageTransportState))", "* setupProgress: \(setupProgress)", "* primeFinishTime: \(String(describing: primeFinishTime))", - "* configuredAlerts: \(String(describing: configuredAlerts))", + "* configuredAlerts: \(configuredAlertsString(configuredAlerts: configuredAlerts))", "* insulinType: \(String(describing: insulinType))", - "* pdmRef: \(String(describing: fault?.pdmRef))", - "", - fault != nil ? String(reflecting: fault!) : "fault: nil", - "", + "* pdmRef: " + (fault?.pdmRef == nil ? "nil" : String(describing: fault!.pdmRef!)), + "* Fault: " + (fault == nil ? "nil" : String(describing: fault!)), ].joined(separator: "\n") } } diff --git a/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift b/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift index 04cce6bd83..6b81209aa8 100644 --- a/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift +++ b/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift @@ -133,7 +133,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(8100, decoded.timeActive) XCTAssertEqual(TimeInterval(minutes: 0x0087), decoded.timeActive) - XCTAssertEqual("02:15", decoded.timeActive.stringValue) + XCTAssertEqual("02:15", decoded.timeActive.timeIntervalStr) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(false, decoded.faultAccessingTables) XCTAssertNil(decoded.errorEventInfo) @@ -223,7 +223,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.basalOverInfusionPulse, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x09ff), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("1 day plus 18:39", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("1 day plus 18:39", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0a02), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -255,7 +255,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0e0c), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("2 days plus 11:56", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("2 days plus 11:56", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0e14), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -287,7 +287,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0268), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("10:16", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("10:16", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x026b), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/CannulaInserted.png b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/CannulaInserted.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cad5892fe437118f9af653ab8bc246f3619f08 GIT binary patch literal 36749 zcmc$`Wl$Yaw=Iej+#$HTySux4a0~A4?(PsAg1ZF^?(Xgo++6~%^PPLoJyq|%-)~p# z>fYVGR?AvFWsEU*q>_Rp0xS+J2nYy*w3L_%2nc8b@D=z125g}lpM?Y#pw23iA|N$W zcqhOQ8#66wb9s3X8eshk2m~k&$bSw2ehGl${`a~BC>03!zosBSKjD@j5dT>R0Z{;! z|31JufPMda36>A`zmEV-$Or%Lb%B3}{)R8*2Np06QrgZSAeiL;zM#@7WY-`dV6c{I zS}t1hay%yXwhTt5_Qqxm9<~nuT7mF+@Bpi}W-dlV9=0}i&O9FcB>y>r2U!2NnURF( zKZm$j^OI=FD-ns>JDCx&Gq5o*kqE#N5fSk@nVR#ch)Mjf=D;t0lJ71q4m^yE?(Xgk z?yL;t*8Mrh7HYO&%|D5Lkwdem_=>KS`{eN1rGIRaUmj7eV z|7iK|N_bSvob7E~|2+wHJ4+V<7Cy%R+vfk(ijVQ%)A}Dz@4trTKU;yZ5rE}m{O@rV zfKBZf{s{si1R^aatmXlFo&#yPpoJFT2n<*F-X*#_HJ)8~$HuPHuMW&M-i>AtYIG{K z1QPmCutEH&v(Jm)9G_cm9eVaHWIeaHx29WUnG+MZkso(Q)8EGm4260Ffq4Y1 z#o|9bb^KdD|D!=2K=W0JDIb~c5F1z+_SpSf?`Ttp&4+~o`USfGxA_0D`}%Vz6-XsW z@TCEv>-8PYT7xdHm)rhuBm)8em)nQ4bjG~yiumK%!r@3V@H+zGP6iQ<&YhRVVq;W{3+)>2@rZeh8KtgUJwNDH0?*4s?C*=2fIbEz=uI=`J zGwX**RMipgX#9ZTVM{uxuTJ(1aHDxE+S2m?-|cW*+}p7cjnFes(+F&gwM z`DgZr-?IJ2FUK4Mf5Gk}M*S6Y?%5*A=_GFFEuWX$gYk4m!OvT>@!U-gRmlr&^dOAp zt1HG<9uF!;MMg$OMSDd>gY8O#-#*N+kTi~rj(f-_jAF1ccl*OgVxnOx(UCNsH$>_AoeZ2+6qN7RT(HQEc(nWQY>>6LvLSRb_Yrj4}-|VllS}3%)=W<^V zeEnMHk6mv(Je5KmjJ$!o$6`K~K?2F52dk#?E}g+t@Nqe}$Z5Zof2{(OTx-DZ{dnH{ z_YEn5Es^tT+yC~y+^?71yh=+P7OO_9%_+4)omjulWUfv|SP%+5sDw~(O#Q`pN5OEX zzG!&kn;zr0U&sWM82l13=c^6GiHD=<>ob zbK3p*b%RP46OX3>Y?n!;kt{@i+SsU z7MVTuoH6jk<;pR%AF{l?QpDXb!gsVJH@NxmuS|uiXVI&ScS?>fGp;+r`?bUl68bCWm|$Vh%5F zvvqV%m%35H-41MT(%t6Ep<#!^$NMP;Z9G0N1qym#kV=URhvibI*JKvv?1^Eh!}&@g zsU%|emuAw?Q5y9MwYNunI1H8uv&P<7VV#Y7-?udR>}Gg&rq1uP73%3VddwqrpkJM` zMToVWI!L>z_;RrrCbIdDHrkxC&NRDz(Ce_-&VngoO?pMA6hx*o8t}P{4EFc$zdco8QVh`;97#2KRYQy6xwyYRSGakpJf4#p-7Z8Pto-k$%228O2rCLg8 zGCix*V!3K5n`XrQ(ZbYdxn9RWWHrM_r#F_*^Y!ktohx$=C6srAXrNQ>yi0Itvx#k)Fv^FPN&o9#c2|Y(YM{@g4f+@u1Q-9 z98&cUQ~7i};dVXiN`o011&T2Up8JgLVy!`Z4+{l?<%@!1E}wRr&)}a}+#Bg63B`1d z3qli#W&0VSipV6$P($(2b(%Br94Ab|^a_V;z?187y>$VV!hK*WKqKKim zJM0F%oGsNPyXaE2v_GBCcGz!AnW|O0Lt_M)@o&(OeiDLzm8j8gv%2XEO+p8+oNMyD z^8Y3`0 z-@DgoyYBYh9HEy{g4y7E){;5@(-MlhO1*Lk=#s@Wh6hs@aOw;5g)v3o;8e?$armvC zcjhNLdjpZ)PiN~5>eeq*!DK5WbUv^5j%Q2N83q2IHBqH8e7p`j`M~QUu`+9pkYCDL zI=#~5SY+CSA?Ww6Y%<*B=+uA>uaP4~tfe7-#mLX~Q}nO*)8pM!dYw|Y-`_yduwto9 zm5Tb|zGTXH&02lm51)uw>)s$pXe5Fx;B|bdI=n5B-Is`;g|`k&bGS{RR_?hJCf2(3 zoG3&m<8?pZ$w~YX>wGXG;I#0)5L_}-T>rO^=V}8v5@E%jP@Tz4weAy#?T>?g4&&j^ zE5Xl+Om10NutdNsK}KU8F(Qx7x=#3jpa+>zfTdopeSN+^ng7LXGE*vrmBnt&;c_ri z)@mtU<&Kpe4BWHutyz5tTMmVzE&p+~@BSsqtbUVFZzHN|qQhK)KnhBifT=GaQU2TfA0jYd4s) zyMOaO?zWh|d^lT1?S(R=RV(9iIv|WhB~L=ykwnBN;PzR`<|JkYi*y$Bzu5zWgd2et z0Vh`ek`@@Dl6BG#!ZMqoTy*1@jKgj{YrJxeLME4HRp_(3)ztyGdr4T666s_Lz^(ZJ zJsvb#?Gcd>=(oE_2ZV$m-mO2jy4?oOAWIp?5ejZ4xXIu`g6|rEG}|pB;*%4ao5sQ< zQ@CEPv76JiJ;R4Xx0#(qLPjt}xEJT;5k~Rt*#=^N*O}cLx60vI+F-D{q$(F(Wg+J&l0qSLS*mGA0;j$HfRJ@aZ3C&Aew&l$<9Q|- z9fWzOr};!iDo=CF#9lm}0E^StyV{l6KOfqCu*|d6>1nd7^z}{4E3dRxyu>Li7f)TSOpC3aYwyEEW-OrPXSY zMr6sbjNM_!u;r+VuK=aL+v}l1w{$8=rcx|&kM>8-Vcw`Zv6jS!NlAGKXlt^aulGaJ zxrq1E#eB0j(n*C%0+Uc*boWQr`%MvzuHycXJQVy_D#ENOKfAo#ZnRHXp=@4vhNFkG zQ7JM|#(uygn0lxlAkJOtbx6SDGB~v-n7>TV7G<;BGq~rIBK%;qBA>LxrmIZw91z>`aE^-oM^hzoV8Z0$o&4jU$#&lQP*H)$jqZprGMO3)g#Oz^!Jt*e0h|2N(7yO&5`Q zH#5iE?(Uh5-~AbJ(Ts<^)nng*kjLPtQHli~W7oQU%)=uKQgS->WITImr4J zUiV9ZFYN~F%9z5x0W-Nbk9pWZT*ZWQ z|F{Coh611Soyz4Z&%?PxAc_w{BLL4Fa0T+OSVHBF%o@$q4Pm=xA9G#Q zQfrFz_v7-Wl&sO3Bc%12E?^Ij&o|oQQX0jm0zsbmc-p9BE2?YV`*!M1IG@LLfMh&@ z5n8ulZ{hokS<3n!AkdJ$QJ#!I_!u*G6UakEqE{s_{k ze-Q9IWee3=-5Kf~kHO_6s6*QF#Vs1A)d(R6nDnVs+ScrK>0k5<*Z&EOzyx$3ZG;Xl z4hKc-AtA&HS!8$X=x(aSQ<*iYwTR1W+8>U!+vPIL8d%=6B!hT$vz!!KrP;pLupn2@mO zrm2;hwYPVwnZlz7Laa>oyCS-(C7)0+{AOnxz9H-$r+J+(~Ef9OgTI}%61 zCY7aPB6qabWYm8wC<(LE?sm1+VQ-KL z_G(a9=>Li0Gxt=~aW#D<*oI1}I_5!sH$VN^Y zaPhBnH6)xbH>355%m}opf<|mJolKjwYP3YELZ-8gdAB;^f?ulAkvA=Oc5u*Yu}anZ z5^QiKh_vPVxZaqsaW)yh@!c-=AE17u`1ED_Ks zrGsJ#nDKilr@|m|o3(9JLi-zvELLvwy}Z3!?Y4rXoZvSr747A)=>)^YCEszLpDzUB zuNdJs^P&g@-QH2#P*XXmRJ+qY`wuY+g2&hfhY>vc$3}~}hWb(OI{D@ui_xX688l-*BKbnp=h!MJJ zB{T@m_2;^JVn5ctUtu;Wkwc|#=V$)*a*M&`alO-OZ=mc7q-t9cp}O6c1tg)I_G<&n zh;L!F2HhG}YNM~t5~>q8HUXxY3iW;$?Ptria64h2+$sW~2Yq{Iji3GLvX6fEo!E~_ zf$Ro${CT0liL}>v>6B@H1&V3w(pc~T{`$T?heFrV%ABCh{U8bsjdL$p8WmH(r=_YetLQ zT3JA2tdO#%e1E-oxAnB>I=<17p<3$ zSK1nVt69B*emOc7D=KmLSHV*k`oDerRd;A|aC_f7P{`}_jn%?dT{R3;s)T^qJIg$N zbB9B&s?u&0$z9>JS#Qzn4~yNYBhsDeU2nC&T5CQVj6Tw`r;tieLi)PYq1GuDNsr69 z_wvQk?}=f>Yc&E59tB>_AtGsZ~`<73d|YNJFT-?zPI32Iy1hh08aX z(FQ(09yh0vJ~^j?AZ1l*)e3nKXZHu<9LVl)2jcKSn~h09U=&xxZFtDc(bQR@V}w zupny%t*)j{kI_yuZ`)PJDuH7Q=qV|KkPskL+>F-cal^Fg}!&r5-o;%)Uc% z)=KN{y}hZlYNlw(OY&K4ne6s8!kaNR#SU5$Bon#WpLb8M;BQC~7zr5cdS2d}>~P*_ z#uV~jDeZqknB5M#kD!tIZPX!DDVq>A8(T#?XvGA_BYIT=F}jsGc>jC?GFx1ntDuj^ zwEDzeBzlwor+^2Zi|+A4RsCa~$xtLNmh(H@5u?NC^mey!aM*E69|vor1T!8xTA&g)R7J}C$iE|prBA*zao zB~2JF*W<>9%r#7p(244GnDlgp!KgMWOC%JwTC4tcT2PW)F*gXu{b?RZSc#R0;D zjLTo`_`M9XroXS`R2#Hzsr1Y21N?)CxEh1Uk2~bi4z1!o{Y>XlPuxK`%PAuB$Leow z6&)SkAq&ura{$WYdbt7VhkOQ&euvNV?zY?K$!f8@jX&C?9gSHyIpqIQKcW%*CkD26 zZa^Z1o;SQfGvidPT7!P9W_}DVxIU<>;g$>q$sk|I&xZP%A*PPHxWe}h@$?y-)8zxB{Fgx@jM6p%?XHqm{mL5yU@8j`400ZikZWr}9 zHjo|h0(R9MnM1!8>o5ulhxz#U$l{>(?VUp52b=Ah3#^NyEB|aw&U}p?ulSAxI5cx7 z_HVRUTz1q8&X2d+U3>(~a%4KuI@4`ihXJGIF!o}F)C!4eoyV>WsUQNY&|9h`ie+Zo z*+OvyO07cwlQ}cP=DMWeBNS=dk9W_%Z%^L$$BA*XlQpL^b%6#CnnZQ^Td|aKgAEK8ZU1n9==oCh+v(y| z-(|}CTn?}MT8De>F6q}5)M|eK`w`m*j12b5c!D`>FAIdM+s4r3!$EL3(jZtCo2sW1 zRk-rk0G&+2NfHsrHf5sO3^g7Arod`ziMh&l-R%?a@_LBFW?ed(&Ksc&Gd^o8kw?~P zc0>&TAX21Y6_Y^t+Afj0zJ59M^6du8A}yGqnXe~eiR!CX*bs(Hc{%|4up5pM#L_?b ztqrw)OOLXG$=`mpA+@owk!jiZtj=Wkkx~I~d3B{}Y)BplPL;iEQDB_e5xCR~w-rf7 zypA}0B;{64%dH84fHZ^@C0bVU@2){%Pe#>q^bG^&tBsIQP+6?#FD2>px?3f(nrYHt zV#W|tIlSQ>1bzUK*J+&S}Y$dH~OBGYGVe;$F$KN4W#L{MM zck&<1saD#CAWzHlmzQ8EI&pCg0n(2`W##H3vPzXtAq|bEPNN?^HF@>8p}T=0^S2qy zCeR2tbOZg&CK8OgEemp@^fOweb|b;=4tf6ut4pPJsD~H}D~VBAE{V)>)hX)Ea3CI% z@oSPH{9RH&fr0-MqLrBuZ&=-os4lC;RE)RtiY&!4@`wvCg-NRR0ifbKi(|g^r(YS) z`1txdNz%_gqf8&?!>!pvA*tg^n#GDtTM4qK!7L=g1sMo4P7A7EG#rByrgHGmMAl0- zSKHmJon6HAtDG)w`l?OenQ`*C_qPBSiNz?V*r-wAVww00`3D}i%Lp>aeJcR4`Ms~4 zsrwvGdxwY-m1}f`busj7IFLg3>h?Bfuoh(L_|{=JgQ?vf0&waoUWV(VdL@fdo_g)ftmAf0CDxu=+BcpeJ8#(CEcc%l61#%x=CR30(R;Zz+G3jXvIl*t6P*`OP z^)!8$+QN_fZ((u~dQ_P3VNFdQxD#jBV__OPKBksEKw=IgL`c~WfIrU6~z2v90iE~}FJleio( zLaX_snXIM0AhxR zuD3W=2Q6lw{I7n~>0Fc9LUJ1-5-`Oqw#XT_T@D0iV*B4d(#c_DwNJNfY?p=^Mrs&< zUx~!zt?2|jKgXppsCX1s^M0xpw2Lf6YgAap+rA_mnFPCYWN)v1{Xktxhf_$8VJVOO z7GH+yy*8<2+%NAZyAZu%s6m+!AKtD`z7iQUSiqKmS~grZSRW~j=9Yc0r^@h|!8+i4Oi1;=h==9Lx$Xy++eMXjB zA|;*vPXsp*jl9VKCJRXn29E4_2hPNVo+h?bx5#$E(Q7mqBfVo@*#T-9q*z1Y|M``s35D~( zWJM!m>ypr z#zY(b#^4*=uX0U><0QCn(!RBca8~`T*^a35^*{hp5d!n`2L1VN zHhY0ozAw&!y(oLc%(ycAkWohQuz}8k+#$k<*3o^2mUoLA91}!JmG-bUO%$`mKB>!oQw_I zwc*S|i*!qA3XeM>3?3p8OBd)hVkM#-;zPONf(aSMD7yfG3_UMZMJgm`Y6ZvtGy8fx zo=~tQV#50TT*bR^2AxJNV}7wx^8{&wAu>cPg9x{cEl3%l_^?A6UN}B(U&hOm?NEK5 zRiw;{V6%)#-?2jI+|ITBbiYgV8tRw?96*K{#h?u<$y8gAlwtgo2>CTPPvOL<_iHE6 zalXsj9gSQDuPp%{mm_8v>N3}6&WlJoodLf?sIV6ZKJJ?qoTZ7iyb??l(*cwrvO+wF z%jA!o%IX0a4nuRegAWJpOSFtsE{}H*PQN;6!3!cMnC1-idI&ei%hJs3{GG_l?V;x# zc`cT+1Zyedi?>u){}(Z;#f8E!d^BB8Wo&eG^v4Qf_Ih~B;-*AFs5q;UV4-a4`_Ve| zgKI{qI6TMwiZHR+=%my#*MjcEo=6bXjXW;8X1O6F^@NW+4UQq7>m7ki%gfD?uy`5zZGtUfXnxj)QqbT~T0*X)7)lR^Ui``{;ZnpApLl%qL4 zYM6)~GBq8?hhSHz%o1WxK(Xiju`*WrUoA32mZ>4_!6*zPqcf7 za-9AF*{g*10LgABH~l;Ke><%sIS3lRpBX}hV5riscX6(8k(##-vxVZzDkdRdGH zzmLy5v#!;vb((9m8#RC%Y{uLIuwiUg^Y@$K2pBX9;2{a0Rk*;a^E(|lTy2HWKTai* zhN}^_K}rs{TQAoT=d#FYctFU$#tFa!CTOHfFOjF?&qqE8nQxc_p?kJ4tmAIL*l{Mx z-k|!8tjXA(rXm)tUfd2EL|Lv$8R!pem$fX{`XxQfOH_?{`BXEE>8?S)O7*r3d!nUfWZUg3{K$Q3NpC@Jo=CUT`ifJv7)g$YlZ?rXz1lOC4ACE&MtCz-+8g{g| zpPFhWlPfY{hQc+W59%JV^jE6=^AaYU4@rC(%%Wk?R^FWlqe-g>_ldAn-;l!2sg|oC zLc6;^4@S}Q1x92D1^vh(!Erw)APuyuv?3c0X}(v~TP>6|yI`r?hCT>pD}9KId{3sd`TLg492q9>MHSSFmQXtA6zw-^X5vlay@VN zC*)=7rwf+tZfDxv!ld$6kQBy4F^hFZ$>`K71YC83l5syW&KvB@LWx~2dV6~T7;F~w z<=I0s-5_cM5S2tD5DG1V<*HJlN3w|jJ^Qpn3$?9klpxmPnKkB2<^22CaUXRjNkbJq ziA;^h)^BBmvDm57aW}VEY0}g`$tXU?Vp=(OI9?P9d z8z&S;At=IIhZuQ8rrUBpOd+Q|zp+%Q*^2!eic1_?TPiSXp+Jty6_`}Wkc>VJx?o`r zsvEUEQek^xkysy<8ApS~qcKCxkcIB>MTLc2I5|#~BebrXn~?DSV#(A6&dHR99d;v3 z@?;D8+W{8o_5K7-l+AP`0my-wzRenwXR%qv6-rLeXg8Sd(&&a~7z>}U=`!dvA?t>} zKAf3YdjTRBiC7#<{Zz$FNfbk+IU_$5%nDO!(JxEcGZWxO>&NA@;k^8tDY7iR0q7u= zcEPXdz6`Ks08b_v$eA1-7R=HD*|&w-CThz^gm!I<5XOV|W??-oBi9iSkbMqQSV=;S z$>U^Br_!Vq426>X^%y;Nl}*ghR8Sf00U+-H#T{U2vUJ;APEe~PN_L=Ca5K>XfD}nN zOy}l2v}CGS6U{*;Q9K4r7hrS?Wc6bmJ)a&BB00{qT5FbH;J|)!IX2nTj;%2oJmV%U zee2(mHhaCN#Y?b9#H~VqwD|kl41^kr0Ko|4Dok(Ya{yakkcY~F_iEHb09onS0td); zqW0sy$B-h{BZnd2=5pA!M`QVJY;2@4=>7EnA=L@{jyzwf=}W9-B)TnCa{}8NHQor)r7p_JtB_2}KK6l_mO- z!wH`_rZQlwD7k2b8A|`O{a{2|szr*JqofrHBA6+IBa z!s@YD#RT<_kIRCD@JR_LJ(JbwO6+{#$p0=11-gm@mm^BR>Un_s8L zSKE5$zAu1=vvAtNSc85c7o|-N?bBS#46(PGRP6)GgWkd6=RK zpJW25HmU)l<3ul6IU2JwtNEX?6kh>N?|_kbqeRN85T1a~*WMIB4kMiiEe z9m^%MTod{$&WaOea`)3saID+04$!j@Y#%7G`2#>tdlkl1+f@FLX?0Cu3alXTaoFr|91=*&p* zJ>rU!Er`UXDx!c(zxR@@uwBdMLr%izwz|#n0c=s_PY&3-6v2C~zk zrzEgkuRole#RGwuP3AEi1udIiXVTOImJ(9Uh?|a@jQEs$uu3?LbE=O>ugxcOrwv}G zLan^XQWT6t*0~sQvLK|^|6133Zc0YBZXWDrxn2y~1Em&G)NL{}0iwlhTqBG98OAAU z%W5FPC_~t=SE=S3r!1QUG52`!UN=PN#c#4S4d%r(1DBq3CrdEMF>(a8FHo@1o>v4^7&dA16G2p z4P`*qd9%2XN|{7#!+L%QMiS41-0d%e!S8R48u)Zy*>F`UMEYxT)&Y`xu0{{~2dw?} zZ`bqVU1pP^HCeFM01)+D(BrD5b_n7kmAM;B_K0h>dY5=)aTY6w`#Ksl7&YmE!!O@00SkgDj9uu?(*tI3~< zpP;}v&tGH0blE{}^o1ovj;AnGm!r)>gsSZX83MdHg-(?og#;DFiHew^%k}eo$RT5c z#WW}x0D$3f*nDx*MZjf8$R=3b{)9S!DGl9TbC=0vSsach>!p|0id z-f_A!Wh5?g$4v(?q&v0^mr9@M(2F6Yw?TN>aH!yH1u(xiAKnp7StFW<{w`s zPoxxPTkY*R&~%$@(9(4Dy8Ud|mnN?@@Oj)M#)D=2`n&xt#xfF#ShIphI^WM7r}bIa< z({-y|Wlgk_DVnbV#9jbR645jY0XVP4EOWp^`M)!RY1f*R*66gHH}Sci9(?$EUyqzD zv{?hMg#Y_&QDfW{_m7C9R5!*3aF^ zr7pydUtiFSsDGC!e7XGtr`#mycT2|gOi!bmGnpb2Z4z*->7$l_;3;cF9s*gO0eLD) z(F?F2C~Z})XKp$gI^Xy`9J=FMDaW2$F4pdH=Y5ACt9$LYr?NQ(`OHcNcUu<%o-Q}L zePv55>2)>Mt0u0(@-iR?#R~@_<+GKE|LYpq4tjaK{!Hca^XjsawB&W?b&HOEdT*Vc zlzd|$1P|)(Q$uYRjZxYy>aWXCQpjQpM80}~LkDUaGBM`^2RB-5v#&P0lG$}1HL8F7 za#x}y6OJLv*Py_q&FscYmb|`wM9nqIfVDypfgn&$=B#bus#;W;E+;`f6^{GHa5Iyq zNhwXQ*BaIHh)}RF3?&CO2)2eB4-Q(x{wm5}T#?2+JFZhj?`+@*akjv|ydo8zM zV~=HKuxco&Ht@v09ih^!mLCE)hxZu&|v?$KLOBwKaCL(y86)N#(SRK(iUBXp^S90krvVD0a?|ELtOn!-9L-uiG+HMr zY}DqyCP*5HakkFYvgOSAOOmSq6JLCT>g#}niP{MLzTxdADa&1ingwg)0GALzCqX`V zay)CI)C82$=o}0NE>`FlEp74!esKQPuh?{f#iTpeYRyFk2g;rRNmsGys0tU%T1V2& z$-G5ip!-y=Yq+OrhfrxU2W-{V_U}MWf0RaiFrwgk!sTyGR+ufgB{=IOIG{;-`R%@-41aXLH zZk(<-@;E7g^HT_`Gw$&`;!Y2_UkS zeWB4(7Z)Fd0JA1?qyv<^iTfT_&_uI3BLd-dF#p-(L#M-T8&7#) z;9GFkj9P_?IC2#rVVw;_obN17nH&JYJO%W--cOf*0kOv_HXe)Vb%`vEwX|_m!=~d$ zCv;q(e(sUue6JO;?2-*&YLSGEtPtBwA>abOImpor3>OS67k#xv!glUpUOem zH=WFS0K^;1RobdYb#9t3AN}EXM_maH)4%c{JVFcrq?Sk1aZY_PfK+d-DarYF8S}2@ zzf5ORLQhQS04T`I*eOe7^!Lj}GUfoGRWXXz_>>MZEP@oPw)|3gebxPWzSa!hC-&_T z5HAqJG;m8{_5pQX8a40!M&S`~>d(f2DFz!!1eBP%98>4BoJ^g#5e<72*hou$djlxN zCUlm_vBXO}>v?=A4bnQJHl7JL7(pdyqlpHdKxmww|JJjsrO5l4AK0T_tzkR=Q=U!0 z?VwJi4qi;hV-gTA3wS@uh4i*LA016*TMWgVFfc${#^~`*u{kL2x{`T-`}cQPl|Bey zF`}qEtg&y0BdNtxc_Z!`?dUmN1K8~VOQm|H-G`Sen)uzYx&#v%c(@)SGg!87^XXT5 zq^NRo*$6l+zQL*XOrpOHn<(c{2&YKtO;(FmNrI1;n*iB+`*FRfFevv{3_tzYY)6}CV2lU_XR2%uU+*!x+LQy6Go<;KyP=uh}t^U z>>o`oRqX0wB*6!&VIzp90Jvv~6h7!j@Y^FCx_Yg4a1X|xB3WXsKl?Mcq#Iq{%hTI= zj%UmEhPTHacMDD~8%;*wq(DU_Fx*4NNfV*~1{ENz^~-@d5e3k8NM@Ko5mz0r)bAID z=>;is!T3E*ZT|hC6X<$+f~MY63(UVTgeSUKX#$&8CC|ECY{dpPB1j;e8VLI~7LHhP zPdXCJZoSL`{qwcp=AUG_!}TmEwJ1Hk)NpnZ`%&}Q`~CTbSQKiHtb7w^rdGzHefCPwF$m zj-y>~=5vxtWokAqi89AIPodUL`*zfqK`Yu0f3*cUoyqz(o<2QbNJ2|#KCJQ`biG>s zkrib=3i;erHKIS#hP+ zay+F4Krh}aHrkG3&gN@W>+r}o-McS)0u?4av#6P=Av~mI49E*eg1}_GuAkqivYZDh z-)24<;-_y^?YWw!T`{|8K`#ghJu#?0S0fBD>lg%&;GhuJn~ ztc{99Wa+e4w+o#rLKt^#K>vM=Rnw`1eaHqKQ(=}70n~Qbt+$i_@;5;9Gep&7F-`Ea z0Gi9BNXX-op}^Qy7KLD`#}{>JF=f0cEY&9({+Jw@RlD_U!uVSo6Tv9-n`mi zP7f56#9>mXQ$viCHEB1_qcjVH-%z4a&hAQDoll6llg+k8a5TEk|1lYkNBQ|vjamgF zg*ZiLv10LgJfrNTelpAtpQ|q30zDI@)+?^AcO(|Fhhc5I-PIXDp1wc*l+TU}p9E@V zvFLTAT$DIk{-NJ6jnV2_cq4g&MLGQL9{@Wp=wHzSDK20k;L6AMdL**gZ2g8f`_nAj zA(r4CsqoIqMQq6j_!o%(`Y(W7g&eGuF{xexVxqFLzu z_C>aBuEYVk;J4#Eg?5A4;PAz6KXlgQ%vyeMxJN3THjBxS+#YJ&^Y{7AuC8Y|xHJ|s zni0(VN~Ho3)8@HzyLhwIx_!T>0S@F#pxU{SLCqU54kA2ZZl4m@>5uqidv@_~Y|wuQ z1rs2qBl&~~2rL+0J(zLA8UPF(m5}3aFsJRzbyO{*trhQ*c7sjk$B={`P+_fn+~Bpp z#qUJ`;6zxfW|bN`4h`67H+s;z^rV z4wQ6wB>Lo61g{*FtCWb?957-lv6zijt?GT4xe@FXC}}1h{R9vVfI^T6(eCs}tTPBN zdA*w!ygL}B{eMV02Zp}ew~c4pHkNJMb}cX4SZkTfu4QZ4wcO$|w`?u97XR1%Jn!I# zFV5@0=X?v-N0e+nD_@@$4yZ#w8^1?Xvh`gpuKjguwG9Y{QHVH8d^Sbrw%%zaL28)w zdt*Y$D9I#p*|750fdW&(bOSCx?Kd^XaY{996XlcSF=J%SfBG>HuCs`zd-!P^}RvQJ|%vJXzyRi+0$U* z%+Z0mmwJg%pFi5LSxQO5|Hiof2>vaZEhy}~)?}y`&aa>rk#~^A7|mcKA3`37wWRg> z!3$rl4GQ7Q-;6;#c+e^Qh58+6us`pOrL*KLXcCRz!ye%@r#afq(D902eR5c+;0P)# z@$fc5%|Vop3Ip~hoY}8X`h3EF`jWNvW)L(1IcoXt`_Qu5b)ct3NWi(*9Vz!qoxZ-~ z=8(_v_h@6a7DBq!mEDr96g(PeN$H)hwPe)jJ1>cM3YzwM_n7x2_FaCCCtL4uz&Eaa zHI4jTPG@2=`bE9;%~YM9ioUnm9$Q1E8;NegtTH6z&w9HXv=*DKgt$0FkuG=~U^XK3 zj`g#ZpT#=FTla9*kxPie=1QVS!)nzU^4xmPFl#~rm;2ysm1{D7<>~37=VZaHnT*Dp zgVRv8O{-iiK>ZlLy9e>mD<0}G7$lX5$Xts&p3ta-rAAN)>z|t1vD86P-7kG5Z*V3k za)fA;wqZ2>JkWz4!mioYZoXvOoO9+O(}lT2uGatWclUixZE{}Z7(-B%ylOu~|c`q#7eSJe?DY0M2>QzdW=dtkUPicN zPk@3r(!k;6UqTp6qA*zIxe9)>^Pz7`pbhe0rseb7YhT~5K9sNT>Sy#7x{wT!|COo& zopATKbUX`z+<#|iHYg{MnLH^FKpA8OBJWN%LVY=J_hqkTnnx^wVAmm>WhooC@o>=# zjw>eJzpt+gnn&+dRc)rL^j{{kI7!_^%+Y?l?*90j!{<`9pr^+w)h%z!JVk{|A(ENr zj&UyjY(Jh*L@15%4HaofBDnhliFVcJRr-e!>24+aj}nWY)mi%vf(&*u76SMDw=zB} z!$+rBm-ppC_*a9oT|)y!#1;#c51C09k{)azyXob92LhiW;r+=>A@twSKbow%%|{D% zT;dE?(CC0o@)++0n=JRt(fDyX56+vrDhr(9Br|Y{_1+mrm`UB>G270J#&|D&h;kr3 zF&DGEuPK}I{D8~nlr#h-`*9y0+Iu%*=KCoL{J)TQxrAIrJEMsl)Ubvf0p!gb~Y{tOgi05hK*IROo@lvly`!ki_bu0pXr*BM`1)mOsigJykL^2Z! zpg~Lu{xs`j?VyY(t#|@mg=uD!yo9#i7 z(Ks23V3@GCOnL%A)c@TbW2jF6=A6VfIk0zTTl28XxktIzk!UY2YBQ)(34ey#8yDQsK$W6*+TJT zc3XOKBm#9B;r!zmpy)rn@mCeoRMJ!LsrQ;%69AwyV!4i)e)su67nC=4Ga(osRTm8SvZ zZMZ5ImspHoTA)tEe#AF`LJ$?`nfxK-uq!FHhfR;$mq47`rj|oud!EkkRVLt5t5X-k0UK{L|@TQS~egf_gY2%V;nRD+f5$eSjyBMtZu`f;xhe zG{ft=BrU5bA<>U695c>ZMkrp;Wdw`#By9H#UQnR=Q+FrqtGkpfB>@T>`H=NK_x*7tJr&k3WdDAYsZ^m#@QS06xKk2Dj!6+NYBUUji~^o> zz}}^~_XQX{Fbx)B?wY;b*IKQr<(YX;62xL~nCuVQmIwGXBe+nYhyL|_keI8PKVI)L z13Ik_lnxP7JP1yqk_m^QTDaN&Wb;Rns3m~Om&nmzDg#6W59hBPpTaXHcdV37`319u z(g|PcjC+=f?6ev*j<&Xf7~(8^?cfBR*6;SK^@hl)ufw@HI4QQdyL)~jQ^Pqr0DBdf zsYIDt6eF_5{&#N1W{IF#{zt^MuPVLBuz(SW*_5q9pYTcEH-<@lU1?~*kCR4IV)k9n z=1HMb#@Q$9eG_#Ya{WaqnKh=3LID9f0=q!m%Z8?a#$wR+{e(SN1VZNEbk?FhV>77| z9i$vUX+3o3_4Liy?`D7g>-w4%@QHXM21(ym8Z2SdDo>9Hju((Hu5?8{18=w`awf)V zV${vFBZk3ydi$GhhnWCMfg(K%>w8>L+kE+~VUkiV{XYS@`l|lG*_B%z64Uj#6`UQeZnIs!hA&Y5@CQ$G=dlLV` zY^V}#Pt$9+o_rrhzdcTu#l<|uI&BOh*ht`Y5xP!niUrZjHE|@Fj}CdApWqgLi@{~` z7P>QMAXLweC1{8{S;k&vLHyC~uxWBnQd-T+B+U>aGgAsgU=qPSNh}c&f)B+d(uk2D zh=I#yBHU;}bJcLNSPZX$9kulhUi+7+yGe`x_}-YshRG*?bTYw(d-iu+_7)IoJ)o2i z2P=X>qtJPKf9^o;;v&|2`Vg%(R$l6VM+BmqlvG6vBbu-wNrEko`@6e?K>?<1e^xXK z%%V&)O3TB zN`yQ6Tk2TjGAAOjXAeYCe~azk`u*>S305|&r$BTvhVvBE!zSB3uaf7i#xb6MS~oFa zD-Z-_bVvmqcKsC%d{$dRCj#gcD8ik4mNQ8m3Fb@aI-|C{6fL8Ps%jefcavX5jn$dP z0d6Il*?#y;BX|%ArTb;sG-WJxz<(v74q%_|PFkY4#wwSBlan1CNE{zyxPND(wr^sv zk?3yqfTaI7zp+Lu(KIU(#p^}Ei+!sJ7ISF5U`(#3rIN@3kyV)1v)>Y|B+yTcQHv{(fG-h zvtdMjf19(jy#4Pdv%vkuV?XEnv)ivM&g|SobVJn1u;uZa>ZA1D%+#;8a>d;7wUpQK z-5b=dw=K#d@_!CI7N5flV7jWn9}WU8S69W6MM%?H*S5{Jvs4PnCA!1E2z~xK=XN0w zi(D)IS?f(uCfCi?c-!(;uHWeW%=hWhlcE3pbY4%DPW89XE!)PQULF^5bxtyvK5SAy zmRfUZLzl!c8Z_eIr5&BI6itwbd7p`$zL~VT%S;)za33b?{LAlsBNMZ(fv6M@etvV_ zAn8!6s!6nDFdN0XJ-Wi4oF^9zfcZh{tq-M8T-tg3St{mD>P)vWC8>B4PSE8;l6UQ| zC{l$#uVuAH*Zb4tc=AR|D@^@V4xnPVJ0lxhbGGUM*i^{~9e5HXmXh7TxQ96mcP$a1 zBMepWtf4cZRrqLgjb>QdxF4lG@mdgEsmxAWmDXK3 z5BU?502i5v<}5=kyfRS=#$R9_Qv7+$;d|Q@mGrb-YqkStNT;USfWJRUi_k?rUqMy0 zU;I2>N@vki4PkFYx|gd@+~9M3SYBNv6eVne`0#LlE@U{C1|#w_jp^*pG%WB6#cqSf z*S(d9(gf7>X>y9ToJZ{@k2X)4N;F=+nb(@V@xU$0couNf+ZTTdu z-1hUo9COvah}yA8-gdd|5*b$6&Po~Ji1VP_R^@<488Td4sM2uEH5^$Pc+}Tjj{Zfp_No`+; zz=b%S$xEtryv$WqphZFj=(|P{0qpYhZToNOO!W@ z`ew`bv2FwL7ZS3>qx<#l6yFW;HTQ-5I$66$f0il+VT$lB!;Q$pe(~|~F0okr>kl;uNPvH9 z_=Hn99DkMkA;8bqZ!OmMZvQ4j_54@9*k=>wrp+M87kIS9^coy)j!Q64zE4tkhR*fB zJK;%)Inb%)q~n*6@cFYIp3p&ESz#N>qWbcPYQOv~biPp+pZKeLmyplV*7i2#!Hzd} z+!EXk5r6n63}$^>#~LuWp_EGv;D9PH9*g0a1h2$ZLKRsn^3HI26WyGKZxT+OGGUaS z-JDvq5)EFhQMES^r>rNlYFG6S_P5#s+>Mgv4Eh8DcclLXxKrbM?YV!dq*8wlmF#)E zmLU&^(k3%|sQvg?9Rv1zz*YV^DV4XyzvCl)d=a}3EHQN;wAh1Q9jXWws@3J4@|uh< z z@;ytxtbX*1+`Cmx;hN*B%+4A>x>cR&5i)et110z|MU{{mP{%b=z^#U7pHg}!7=cdO zX|wFCVNm{Uw}@70uMf`_ioqwuYiH<+kgKfe33w^L^@(fDEf;R;ath!)S`U2|S zA1{0ly?sopRd0|e9?3?%&DieM9%44><`08J7J1b|tJQuZpU}+r5v2^^9UYHx-oC-l zV~$UJYew2jqjaf$)d};#ZB9IrNUXqT%i}84RU&~iYc7NZgGTgwYei&sii?d7$wcyK`dp|HrLp*Rh7Co^|2Wn1 zMexi1S&;DJ&Awj%@o<38EQ@oTFlmEw_Bx)~?jOWRIUN{|X|Y`#QLM{f3z1Z3Nn??b zS17Ldru}k>UPTi)fY)w+1&u^N@{C8WgPY`kO<^G-owz+ztOi?X%WBor918E#Oen`35ba`>QOR_bG{ zm~<4AsQh+@6tL-4zsNHA-x65wDC(|bVkzugKJsk5uX~U~T#iB~->7CN<}ERUhGWb> z8O^6xbCxzg$8#67!LLwyLL-PmEC8W&PNya1?#g|b-Opx8`27RARtJ-W-@efYVNxxY zt8I>_RlmZUbcvV~SL)uKgozM~xg|Fv5HF2YON~;#3HY}AL#^U9zwtynqSLQLcF(7| z)Ybz`K9>imsmD{Nd~B3zlHo)fEPZ-#^t!m8#`DEoHUhpzENeR7eVCKMO079ZT(|;s zPIqWcWHLfb=6guc{tCUJr=Ws}C;2DW>6xBzR@@Splly1o`%7IkHa@F~=68$m`jqRK zEu7;WclEuF5=a-Xn*$bkO8Q^;LCcveuFJbsb;xoxD-H7{N~H7k30ydFlY_400qHv< zv9abfk%lg`NIT3W$|5jmeu+{qpXCiEiSP0EF_GL?sJL}EdvB^4!0eBS|; ziF{=mx7-}Ivz{87*@E<&S*BvrMlQ8d`XuLUc4WBj=PA%idb;~VJ-Y*rd>9j^pYa9W zry=))UehVa-20A-BUxyas~Yc3W@Nh_KHeRxI7U&^s~(vyPvyM+YIW*Y)QTcT#G*Ny zD@6_zzFruYLU<(+wE)EwD9TE$(i1*g^~OB~4&|Lb*63UidCMEDJZiY%h0H37r7)Ll zk;#H;^w!sDv)i@Ag;k)kjm!pGex`;@eloq@dAf8k^t88oe3UK85qY_C&QiA(a+ki| z9yW6-Kd^sAJVr{SY1X^^Fb1u%n4xyV`7&h#;2P><1}xQY4|V|wv_<@g zjd^mp?)hne4W5cUAR(r&-sA7T*owkrD4r_AJ08Iz<+m%XJNTlZF?6rAs>|I-#Z|Jn z>WW{*{XT{1k@&HNj~W@p)u-AzRUR4)_mpD~Mb=k4S1(&pq((2rkLY9?i(#xM4aIBd z2~@9zPxqC)n*v+z_{=8SJ+i27jBlIrbovkblyHrUP-Rh{gEVaIm1z7^i8s)@+MhWr zh6ZSr#`R_>(Ien%^EcxJnye`qZi+s?T*u+3w&~kgZVW3Ea_x;Kaee&x6{KodKy^57 zP_Ndo!~HR}l5ws`)E=m!pYCfA))~FN$y7Fz!Kr7W9j!--msub=WAIMWk~nV1IaJEX z(De^2T7%wQcf{olut{8&|M2-Ci5~1eCYTTY%)Q}v-{If9LXhkFEOylQ{nO#kuUB_H zjPG#BU-UDJhNFkEBlsNu{Pr`e*`nU4=4NLMM24>GGirl&*|hGGQ;+-I;h|HZ-Vj(U zJFJA0;3^x-&A)%Z>o{XJR)Yg+zcCQbo3l=(6txyg0jHY#jE`q)k+sL2*=wsYqD*-1 zu$UxOzok^J{O=UV^%Te*)<-ji!?C}xv-nQPs1Ft@G)sYgRQw}hc^-4|0>F{)FIGQl z0D{Gp+m6<+1|v>Gc3lb+d<7m zivzpWYLk@%@N#2yYaJ7V$c#!PULKVKn`Tzc2P3^sXQhZ0_kXtn8RKXglNz0bpF(9K zV(T)A8ued*qVWgKD43A&FI@h&wvr4XQ1>B`sKn-rQ42}&w)zRdFONwH-yJ)y1%vxr zd~eE7iC_O^pjxYM>(@EIz{Oo3OjIvs^4|jO4lid0mrfOVy#wRh#Kpr@(6WI*V4!T=R z%y&2}g987F#@`(mA#fTeCwJ+@ZueVjCXASQ1VlF$(^eGx09ohX&BvFR)HSu+f}c(n z)Q1LV%;pKXK4dnTiO!<6q}P2lB!)g+uFbh$#v$Y4(1^wwPMTl6Xuj`WBHk>6ahM_k z)U4$Of-hg9dLo-b?(pbRlD7HnG3~$m-)ZcQ*ab`bz5%lkZXI1RXXfQ^-u9KLVGn`p z{`fvTdezFuibW6)KuNs=>;!bnpMJc&UW$Yhz)wuP+GC%w}9@ zInbAzQ%5jm`(h{BN#ges^Nqxj?H(U9+?_8KKh10po@=0_ri=G`!yxk=fQ%8R6_~$% zd?6$@AXMhTcL{Aggasg>PF92OHOi}RKL%yXFPHbm97!eJ;Lr#)rym^eeAxtq>Oy>z zhKaJng`$ETI*vTtejjOo$|%$OikaWx$c zQ`(`x2ch@q1>XL4OU=iwQjrPd8GHS}HF@Fi)CbQ0yMd>>3ztTy3D8Pioaui2p& zn{6&9C1VMTf2g3KhoG}KKN`A zXUF9yydQ7v5C=T%=3hCiJzwBZOS0doM+ul*m~>?^?LGC{FOCCh&yCI@At{%&FeDORfm(kz!KvjPZCXNjmexe!)18Cftp7bZKYOuYEn3#*_Tnmmai@h6mq?BDQUI@dDbxAJRll8;$$Bk?3ts>nET!;GHWdJ1aCuUqnlt z!DRYPVi1lX)_h0}6@5g8Jl`0|2r3z@Y8%3`ab?^~0}%Pa;Wvlqg#7Q=+11|<6qI;m z{ESU!VX0tx>(KRi5^SOBALzni@-8Ghup$->pqZVxy%-7=;@OWG{uNb9Q$F{n{ZpZi zc$eQUU2=TF!;PA1xpLk!z{2ZQXk&i-yT_1B+(p8Z8zaXLqjJNf+Tfrkv(e)bIa3z( zYqjZ+J>bK4j26<w?1S;#9EgXrm^lb^>Wol$ z4w8v<5jo&a4ti_Y-&zJ;Jm#%;J>8#p-HvLEA%}E(FzMCV&(#n@#l8Ny_gyrkqT~$& zX?xlgQTZ`ogL?ws;a?a8AEexGL`s%5(kuJf5;wO1i|!|(+>xb7fAVsmIl z`N>{agA73ygJ%UphT^IfzT%@$uunFhUAN=@xQEU3H!pASlp9;Q!WJI|#Jl3nKtdLu zDqFYasm6f~$%jgSVv@G~43Va5<}q19EAD;d-Tm*u0(^L`%PKcvUt@Sr=HIK=6y0Q>M_NxOVjRoW|jdy`qncVfY|Fnu71EjuFM zy(izeH`ee47J7u02B}Rh-lS>G573)g;f=$TS@2>TuAXI(joR!&sc4bdOqr(!VE$vV zfq^ag0fv8o~VGw{uJYz!~EraYK6SStuPpgzcV987*qqt^QwN6d@Ir1{~` zKsfW;Vfd5S^4A2sntRcgSFW{rpVo*8j4 znZ+gfUHNpI)u4*ToVU$+b)csyOGl8%N0X%J(@n3N6w;^Y*<%24y{w_JVBiq`VjQ*9 zS=7gnY4F{1wczz7o?Pg4dsog*#&xLaaQdl7kIhduHe;*VtUsBmu<7Qc_ss;|wPZU- zz{5M9gb|jVk`QDNK*k@wr2%$(i3lmAG`{6lM^nU}r~Zl|FyQWVK_N+405hA{dA*AB zEZ}wfN9)9_vsh#`R-d#S%VMMaEvLc209=dYrVaCFx1Aw3PRrO?gwR!xa|Bf7LFdtk zT-7Rx=wBO^wdEPhBU3q!Bwk?&zkz0%&SEk-Pt`9KT!GGF)Ycex(|XX&$*`;2VzpZa z453SgIhg27w-&^Y%eWAG$(QN6=U(g4n>E6TPFMNi zO^E{Q&tzGd*4GE5YEYl0sul4%;RZoFcTZ1lVQ2I%+PIS?srD6*%b@dh+k#AZbQ1j@ z3)-DpPc;T{Z_H{VftLP>v3FQC0#T%CSCN}74)i4_pr)K{*5v)idYNoJ7Kf$E;O#V( zMZ6xtmIoO5#c~NjJd-tLYCjT1lEV5o1095{C)+`XX4ULTAzK^A*JZJvr8ik7xhB>7dcfuYX|hRi`QPu=ypI>g z#>VXC78u~X8+@B?$jA~|YW}r^y>Q!UF4IyQ4#M$b8?t=o7J>@1GC{Nck5l9ZhX|m2Dv+msX$oD${ zkcmHE1rCLKJ>t=IqPV{Ze&r7oHlO3j*){C4V>~Fqx2WK)&Nmyf;2r+`@0_nxASW~H z?w&fwT&#`Px%93}lS<*RZnTm*5_@#5{qtKO?R7 zkVZPfOF!gMofe0~I>LM~g4v)^8-Yy>U`LZ_V;SHi#M;b`W_Z(eB&YP!IrT-Pu`y$- zl;A^U?DtPjwvSg^jg53sxD((qR4vZDt*s9#0az(t@MR(irgR^6d%+jIvPT)|hqFj$ zO8D5yZRYRiPGshVJ51_`n@MbvHjpoq)IfGve!YFT!cJ~M4v_GYi+*><*E*;2II(#5 zn*wh4t3gw=>jnX_gM&@EXHn62sM&&1TaAxAXNR~f2X@8k1m`}Rq|_q3^z@P8n3NJ& zYQuYD__W4KI{8;sRV&`-rlX?Oy=<7 zPkfTICd8kLCmT&QtH)~k?{2QNseDy+{d=wBFQnU>5h$MsQCuRt2xpxmnXz0~ak=2| zbW!_-sM}jlcF^;C*4B2fo)*iWEtG<1tHZDJ58fq+F!b|QJQH=(2)UeFH5*DsI{LLd zQ9a)cyJ;uS8)EWyr}f)I8y0sO92PnCjn`XY=nw&}U;&D^`$Ui@Xmp=|szt9!cdFY< zXI1t0=21A6xOIFI66Ft?cC%)4hqWcpcW!PC@=PD5Mw5ycN#awg6;jIVOK^YSb$9u? zy=1Jq?iYA8RAx2p`4pC1qTyh91rfiiC&FzlW^6s(i{5Q>-X!A;$fT3L_CK`XA*{4U zVGCGXq&4r(GO#?s!lkYEl>(DGrDP2A6WAVP2}WSC&%tSFEhilzQj!%X-2%=x57F4# zf77SPoU=Uo@9z^S)uSY(+o|GdS{?N2tT(!&8DS*rXrkd&b`CGdmwG=dm8aACZDd@$ zHx%RQlcuJoHV@0tvoSI<;vwk>_@`$UXb&gvL)qbb-ZVRwQp1ivk+~Pbp3cvt8$j9Z z8%N#tx`so6sECxzU#oW^I(Mq+4`@6%!`g? zjyOc7mdPFn(lHhRA-)LFU)&5`)*Th0lxR$Bx14?4y!NT@JuaO0_Z!SIa?@nm@1T{1 z`uncgUFxldhySLu6*jtV$jfp1n8?HEaR)O1{EC<-(811)4}t)#8Vmqu(SW)12w+ z+<2p~M=5qyEG#VOr{lv4uZ3}*LrkB)B&j%}=%%`S(^qg&DCMU#gjP!>LIZRo%UcN^ z=rH4g5rdR$fg2CJrZVM!wyTZ%YniXXa*qSMlzxfM3(ub{MkOsvo@Q`5|LNSy_i4 z(lGV?S!eM06Y{WgO(;4Z2Is%kSrp;=aFb8^V@!9K>m6c2{7}S1kMk#g{$-`FIV_j!24`PiMl?OReefNIwvYp+!vD%n-CLnt?6Ak z!NXHvaByZ|tM|zlbRL^jpUT6aC8*dSbnBt@ZyN%`1kSByJC)_)DLo;37Bq}8X6)%a zV=_(zqo+rezO8Yc+ZI3e_0AZ;E32lqHincA#dkOEb5eaOQ5!tk8GP45+lAP*xw&!! z03jb~^wXAXe`T9zKNHnvluRlWxGBLOed>}+AnPwI%Jxb8h-L&d-C5n{jV2e)JqqF<#*D~c&T5CjGO zclr@?3&99Rbjq1w4QkF0;LP%0j9Qy%1vXN_Iyu$zx9@MJ94^Z_as_@YTr$32=a)Nfx)P6ZCmxa+Lo>t)&2G&FWyUiqF3zN{AV3INpnqoO1dqeK!ayP* ztO|?fAB0)T&>{bzlvt&)`K>_V@=x@afn{VQZfa^$r7RfH{(j1xZ(tikQ@}SJN2IFL zcDFY!w;h;2L=2OcKVq9^ZI92oT{cBIr&Cj;-FyPOq&O%!F?YWuUrRWK3Zo(*(R~!G zgdbMz(17~y^E3oO8Du}my-WZ5cv{D1a4j;SLqIAkX}E3hPM_^#L_J2040W#j)D(nC zVpi_@SXWavhyNd{0R@;4H^C4`*7y7u7vx)8GswtSk>u%AUGONrDNTKepr1A1>g1)y z*T$PG==XB1L=_w^1Of?lHwsvfH%+}L4(42sjutG|1`VJ=5On**eTO}jbDylaQ z%h{HtKE|+Lr!)rwVJ-}8-uYl-^ZoCJEyNWCB@quJNkN5wd#eb>NU;&b@qj{IJ>F__ zu5{ZK#m~!uwH1Pi>FoUJ5mw$eEc)*H6i&W4{Omxj` zPgypZr@a~kLlCC^==a?pDV;tSl!tXs3QQfC2KL|cmtlGrVj&yR7$Rm;Oz zE^_ET@3niL?qS8t1;zg`aG=?~$Rj@@A4Jp9G(Jl^V-GmLJU?!CeC6B+eEt)^OaGIj zO5z=fl$4O@{#oh=|3rh3JSNTwA^hl?9-6MGrsm=178f5co!-%LoSZZ_KHh0JU-p}gFMz;RD0UmUj>MvrR4VKP5jH~Ojs(8U$|Tr z{$lYP4xuq~Za>Xh`$=GYZ0t(?_F4FP5rfonrLw;vvXdSiDgiliq?A zKgCjKv{JuPQ@`_@!i_^9CXOYB@9i+jqKajM5q+qUdRQ#c$`cPcEm5^vhd3pswogF~ zC2_!vyP%rsO+$2Op~A$NDR}{1)}+9QvT4Yikns59{aN5?ZU1Gjm$JwTwTh^$i$HdXnK?-j+7{6d<&TIhwunSKIBog z^8$A5xXe)xoO_5tOSXIb51Y22K%l`5H+V~;*bg|3l#@Y~m zlY)XB?q7kZnIRn=nS@oJ5eXL7I8!|Cx8Yd)A}2)4p~D{p!ct7zgOj+p6|BQ$IcwoN zBQ!cyx*P~e;ZUpFxcWDJed1wBRZ^s5v2OpZ@c?l)cnXX6{dA$7>vqdb|r;#1pgeecEDANd;%;^rEBT#HE_o^Iv%6%sJ;J% zELA7bV?oVFcaJ8BKY+X*2l8Qb!|v~U{Ar!dzTQIM$BtuGoGT!cng*R{4s|u^CB7eJ zoekAGqMZ9_zlbwZaB@RITC70Kg)tn{TNNtdl^g^)wXn3L>g5tg#4|tlt-)44m`Y^I z-VIlo!9nG9Hz3!gnX#XCCbVz;yOYt-BWjg_f*az){jT@w4yWcfKZQDt!go_0Ne|%_or2YjKnyX~Wy#4v*GyeFU9 zyL^~Ed110jOBaD>-hgx^g)1nVqI#t`CQC{BcBCQd%xtHY<%GRVNQ&737QUHtNGsC+ z)V{3@Dxj!UZcMOrI<+y!`6tKSL#w^4F7Cg z3X0qFOF&B~aBsnK0$lTJbR?AX&HPfbQsZmA`JJG6sMuIgJv=Fv8%?#W)YGC<%j345 z)W7&?0+&hwHlaul?u3SZmBSRn|2#|mH8;0Gmd`0BkMF{PF=9u3P{-vgqgUJ4?fjuT z@jZd5WawU}X9(lW^9Hg%iF-^Ij{p)50)z$+BpjghH?}rRjg6t9X?l-2aQ5;aEY<#! z?2-uW)ymuK`iL($20@F)q!rifV3)cU9~-@&Mo0T)lCTC7kz*{I_~E}F)?hd24^-?A zFW`8_;(d|}f9&!Jd^(vBP*C{pf*$y5KvE7yU8BZ)cqRphJ}=kT8n7j!etO*=u>lkx z-86Goa&j_|u1=1QqDaH4Cw%4o8T?>H*@RWtnA_n{aSFE>^fWskA1pKxiD5-Y!?h^l zaU_r5`UaR<@!#Za=1bz%w#h8CSZE*`}=nWrN6V!6n)Vj-!l^*)69l37>%iot0f(UD^F+X>taHk zxvx&Vm>eHBv=2mriiK5lvf-NZwJ0p2F1Fxv?*4d@cZ+jya1h*2^MJxth;pm>xbNLS zGNWXM*rX**JP-We4*s0$Yj@o`!@#4h*Nsn)MK}%hI?S-0s1*8PP5`_mPK!*l%w}h2 zM@B~0-q}|S{(-&MmyZt}>;&t-f0s<>IhSjF#z{^c7hkU1R2Ngu??I^f`t?0y*H$Ga z8+_L_7!%IdeEN(o&i0OWcdMrv`0;{~+cV(4rmD)|P?{qfJaWtMeFtOGktEtjyMWSNa?@>J3$flU8ol$K-u~4-&b@;9j=6u@;^SC$s8P zP2UEnt>8<+Pmd^tj30Ifkd#zazX$w_sjfy&MxO4u>SoXX{Ad>tAiRGiZD-M^WXUM} z7z*Dj6IKu|Cy*Nba_Eezv2?a0H33>RZ3 z=fTv77HWum6<<3!1Y?-}=Ojy>EA)BbGQsjA^7)YWsqBAE%H|2h2eDTA>mo}6pp8%G=s%c|Z#(D{U3+X&nthhT7?CQjI#3VK+rnU{Se;2Rdc}NKVRlW4KhTpce`W z4YNp#rjU>jvK;(6|pJfP2hg4SV=kB&9~EZK#hUj+c0-iStM+jXFx zQtE*1nH6x{&bYlppJ+eO{v4aaot9aFKF)#EY;h_Va+dn4;+#nZ|And^Mi%3|+wuom z9*0{GIZjKHl0&0KN6Sbv2R=s(Z6Ck7F@O1N$IpB*cqr_&ur@y0^~(0+y}htYDB{`n zD2pPZWceKCz+pU&eFUOj#-v`?Gcm&|a_C_J>67_UP zDWILNR%aCMMXzQ=OkCs| z_L}@}!ZPS9RPwl?Z;O3hp*7~RBqAJDgB?W&NZ=wbD8WlmEL0}E_{FBRq)B|+U#bw#z)Ii zEyVk+8nF4Bgj;>hrO$h=!7_<>VE6ACW;MrhwUJ(wg16J+co2PZxj!Pmx;vDT*;1}h zFC_PRNg4EX7X#LnGI*?KGPwe?}aIu=9Ui^ef4vg& zdP-ih+mf_^GTq$NWa$=UcEDk|!G)zNNpTD=3~c&%`e_(u!v+gnP9;TqXVrMMjBh

Qap2Wd|5RJA^zgTamKol4F7%2PhM< z5bB67lT%Z}%Y&>mdcfFyZ)~&;g@3q*cnd-WU$uuu;w;J|P)T&$+&JXoX}})BjA6*R zZKgs#p08*R$ufFwFJ%lP?I`k;Z^nk$5=>4KS? zT{9#-S5jtz9Yup1`Pq!3&odH_7C*f};PYORRU&jLb3IHv28^6y7KmU{BmehhxRF1? z%hA)b=by{NQpOGIOv_=U0m|s;!~}K(rcs;QF5O)uP8Yrk%=U0(0S1xyC?)addQ??QV5h?~MA26^rNRbF6vRJP@?7P(8{}<@NaZcyK5t`9iZ**;>do z#DqDBtMasGS(JU8&+pdQ+uJ(_(Y<9X^l{t#{r3~{*a*cz?tlKQ0))(q@lLl;PM2!nePG; z%*|TMLN<>>QtABfXY%xT{w6fkdLm}dB9HBJNqR`Q~HwmM?FVp#NS?S4& zixEDX{3wa~U~uERdTDpRQG*-4GX(v@SGnxbpe@{QZYoUbEd_K?J(@h6EBd z-y0-^k?>Ad04XWS3W51nmYm!assmLu`6LXX((9CWXxJ$%OMV0}o$gP|9TDAema&L1 zDyrl8GkUDz5dK4&whxmrs`^0p!&F>-= zTvT6Tdnh{2NH13esk+78vv{1}H&|p{MkiX+)38U){AS1x7_i@Mvf0DYaTIRb^S8DX zKzWu{5FN=f$O6;)=Yv}X9DU^lHL+Y(Sn8y~xskbHrGw8mQ@4cqsD6i}cD>p6i>Ww! zsflTsu~ai8^K}WPrk3=&+EU5gr=@#Ab_mQ#ckOYm)1dKk1opmYj_F95o3HNP(DBwA za5aCUtKizvD4hevpl1-(R(m}vp0(Uy!G#)1**OvQJ-P%>CFe~|X6bq)4&a8Dbn}a^ z@q@s#kqerq&qY12aJRnSv z)&HNO^iTx$j|2&HJvqc8HPL^mJi(H6se2ZXpB_cQ%H8uW@5;KFjJ$MJ-JKN`4hmuM zj|d!N(kb|YwZ9oW`qW9-b%JS4!~(H}-}gzUB*%wd;yl@L+pZwUm21W_gfN@ww1`W7^WmcoUE1<9WB(PgVx;6;(YxV z=f}?v@8@|x@8|V;KF{m*yf2kfWVdW}g>2uLhcDCM*2I_97GZ_s4TR4VEU%irxFb?P zbF92Wtg*0IaUU9$jIBPVhwa1+3|E?icMb0-RKvlK;x4kIKEko_kq;Eb3>NJ-8OL0E=({zoKLWW8x zX$o>z&oG*IM?Z zQCF8KQ1_k(Tzm`$gTE@a5{r(-uSNa1mjBG1u7!#p8t~G{ZcjfU@4BP5xvm!Bo|y6s zscFDs#fQvvn}aiF(YAYVr}4?g`nz`1Hh|%aYfM$081hL#BOONta2#dO_jDahOdgP_ z!M2LmPFJM zXS0q>O>>gMox80VxGDbrxas%fn^rOJT7eFDdH?H2TwENku4F$`C`&|!?h7l?GzSk! zgNInX1Li5j8-lYg zZCrklk)M6srASv-(E5`7&jkysAT!HKw=c9zld2^r+Ut>uaSAsI>$+P10#Ig|v@!I( z4ZsFpU*A`}>S~7zcZ-zQUp0FpC?#xZ3I^TNMfZ(_%%>RkOqdWYA z4z@sCJ`EKQe>ofpSVJ%Si`*pQ?g;)kaE1ZT#s(I=SFH(LV&PjtFWl?oHJnaQ{>(Xo z2{!Dyy|yUSIi*JZcVx3W;eoNq09|KsL69054{TF<#rR9!dgkylAJPw#Xi^<`q7SGW z9M#djhn!J~fMEV!H^czqEKRBljOZyKhRkJaWGHK0j+kgJd~`)JT8X2UCEC0m)8T6w zEEd>$%xmSz`I2bAg}e0B}^t-DXrQi)2%Mm`PRO(A-Q zmLZcQJcle4xD-fxF^ArbmcY-Rx+PiO6)XmWCcHopJCjOdRgaABVt8(KMLScvL^lyx zF67m%2_HPDxAi1!CBkZgt=rQ-BaAaa9fUdbIWiiGJ3~1jqvWw?eVP&-?J;oi?;e*i z^kuk@TiFH+fJRahC&^(e*dG62e_O=s`apO7Zl{@ioryOkA=*zv?`xV$JF07IbVRRb zPId(d{zpT=Vqduy`;5MKlh-Sk z4tKh+a~Em>1u>ZSEF^+Z_c3y^-s$?eTii}^TI%znrReC36Cb83WmDF;+}r&iOULz- zXA<>C$N`ZH8&z+l*N9UsxdaaDmAy5$lTkwB_K}p;lVzHF&87B=s|1n`$}sdWEMGab zF+EL&l#?J9)}FFd@l1(h0fxRDdibW)L6C~JdDKf?|2p1Q=%7Ur9865{$$a5wZ}r8r z`PQZD?~Ne^u*FI?Lto)nZLPCGyPHcG)a03?o{4c2Qb+R!%Tt@`6W|PHX?m%l4f0M~ z1>N6CFD$RZ9DJe*$iwhwLiGv9?-Mf!g^WV_0Yt0(sSeZRNCI@^246Rs9j_$uX!Nd^ zU-)SDHbdg}N5>yFd|Cbdc15+dwHaY<0p3*09Yoe1-BqrZLB%#)Cb|wEW+r?Y2zMIKve!R1TaE4WV>!t zE(2tCQ-%buiMmc`qhhw-CkwVKHu(ORy(W}uYBYd}Sy9ihp9!TGX{)=_xUlPj`53@> l{q54&FS4op|6RzY4$mM=F1&qDE3l+Y>bMKmxd9WD`X9pd+-d*- literal 0 HcmV?d00001 diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/Contents.json b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/Contents.json new file mode 100644 index 0000000000..26bf5fbad9 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/Cannula Inserted.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "CannulaInserted.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/Contents.json b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/Contents.json new file mode 100644 index 0000000000..c200469464 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "pod_reservoir_mask.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/pod_reservoir_mask.svg b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/pod_reservoir_mask.svg new file mode 100644 index 0000000000..abe1a576c7 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_mask_swiftui.imageset/pod_reservoir_mask.svg @@ -0,0 +1,55 @@ + +image/svg+xml diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/Contents.json b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/Contents.json new file mode 100644 index 0000000000..25baae2d30 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "pod_reservoir.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/pod_reservoir.svg b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/pod_reservoir.svg new file mode 100644 index 0000000000..276ed5c4bb --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/OmniKitUI.xcassets/pod_reservoir_swiftui.imageset/pod_reservoir.svg @@ -0,0 +1,59 @@ + +image/svg+xml diff --git a/Dependencies/OmniKit/OmniKitUI/ViewControllers/OmnipodUICoordinator.swift b/Dependencies/OmniKit/OmniKitUI/ViewControllers/OmnipodUICoordinator.swift index 7eb48d49a0..1101e3d933 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewControllers/OmnipodUICoordinator.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewControllers/OmnipodUICoordinator.swift @@ -162,7 +162,7 @@ class OmnipodUICoordinator: UINavigationController, PumpManagerOnboarding, Compl hostedView.navigationItem.title = LocalizedString("Insulin Type", comment: "Title for insulin type selection screen") return hostedView case .deactivate: - let viewModel = DeactivatePodViewModel(podDeactivator: pumpManager, podAttachedToBody: pumpManager.podAttachmentConfirmed) + let viewModel = DeactivatePodViewModel(podDeactivator: pumpManager, podAttachedToBody: pumpManager.podAttachmentConfirmed, fault: pumpManager.state.podState?.fault) viewModel.didFinish = { [weak self] in self?.stepFinished() diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift index 2e137fd87f..8f42c46261 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift @@ -20,16 +20,6 @@ extension OmnipodPumpManager: PodDeactivater {} class DeactivatePodViewModel: ObservableObject, Identifiable { - public var podAttachedToBody: Bool - - var instructionText: String { - if podAttachedToBody { - return LocalizedString("Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod.", comment: "Instructions for deactivate pod when pod is on body") - } else { - return LocalizedString("Please deactivate the pod. When deactivation is complete, you may pair a new pod.", comment: "Instructions for deactivate pod when pod not on body") - } - } - enum DeactivatePodViewModelState { case active case deactivating @@ -125,9 +115,38 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { var podDeactivator: PodDeactivater - init(podDeactivator: PodDeactivater, podAttachedToBody: Bool) { + var podAttachedToBody: Bool + + var instructionText: String + + init(podDeactivator: PodDeactivater, podAttachedToBody: Bool, fault: DetailedStatus?) { + + var text: String = "" + if let faultEventCode = fault?.faultEventCode { + let notificationString = faultEventCode.notificationTitle + switch faultEventCode.faultType { + case .exceededMaximumPodLife80Hrs, .reservoirEmpty, .occluded: + // Just prepend a simple sentence with the notification string for these faults. + // Other occluded related 0x6? faults will be treated as a general pod error as per the PDM. + text = String(format: "%@. ", notificationString) + default: + // Display the fault code in decimal and hex, the fault description and the pdmRef string for other errors. + text = String(format: "⚠️ %1$@ (0x%2$02X)\n%3$@\n", notificationString, faultEventCode.rawValue, faultEventCode.faultDescription) + if let pdmRef = fault?.pdmRef { + text += LocalizedString("Ref: ", comment: "PDM Ref string line") + pdmRef + "\n\n" + } + } + } + + if podAttachedToBody { + text += LocalizedString("Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod.", comment: "Instructions for deactivate pod when pod is on body") + } else { + text += LocalizedString("Please deactivate the pod. When deactivation is complete, you may pair a new pod.", comment: "Instructions for deactivate pod when pod not on body") + } + self.podDeactivator = podDeactivator self.podAttachedToBody = podAttachedToBody + self.instructionText = text } public func continueButtonTapped() { diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift index 07ce3a6b84..0a91c9cbaf 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift @@ -35,6 +35,8 @@ class OmnipodSettingsViewModel: ObservableObject { @Published var beepPreference: BeepPreference + @Published var silencePodPreference: SilencePodPreference + @Published var rileylinkConnected: Bool var activatedAtString: String { @@ -131,7 +133,7 @@ class OmnipodSettingsViewModel: ObservableObject { var recoveryText: String? { if case .fault = podCommState { - return LocalizedString("Insulin delivery stopped. Change Pod now.", comment: "The action string on pod status page when pod faulted") + return LocalizedString("⚠️ Insulin delivery stopped. Change Pod now.", comment: "The action string on pod status page when pod faulted") } else if podOk && isPodDataStale { return LocalizedString("Make sure your phone and pod are close to each other. If communication issues persist, move to a new area.", comment: "The action string on pod status page when pod data is stale") } else if let serviceTimeRemaining = pumpManager.podServiceTimeRemaining, serviceTimeRemaining <= Pod.serviceDuration - Pod.nominalPodLife { @@ -230,6 +232,7 @@ class OmnipodSettingsViewModel: ObservableObject { lowReservoirAlertValue = Int(self.pumpManager.state.lowReservoirReminderValue) podCommState = self.pumpManager.podCommState beepPreference = self.pumpManager.beepPreference + silencePodPreference = self.pumpManager.silencePod ? .enabled : .disabled insulinType = self.pumpManager.insulinType podDetails = self.pumpManager.podDetails previousPodDetails = self.pumpManager.previousPodDetails @@ -278,7 +281,7 @@ class OmnipodSettingsViewModel: ObservableObject { } func stopUsingOmnipodTapped() { - self.pumpManager.notifyDelegateOfDeactivation { + pumpManager.notifyDelegateOfDeactivation { DispatchQueue.main.async { self.didFinish?() } @@ -337,10 +340,30 @@ class OmnipodSettingsViewModel: ObservableObject { } } + func readPodStatus(_ completion: @escaping (_ result: PumpManagerResult) -> Void) { + pumpManager.getDetailedStatus() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readPulseLog(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readPulseLog() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + func playTestBeeps(_ completion: @escaping (Error?) -> Void) { pumpManager.playTestBeeps(completion: completion) } + func pumpManagerDetails(_ completion: @escaping (_ result: String) -> Void) { + completion(pumpManager.debugDescription) + } + func setConfirmationBeeps(_ preference: BeepPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) { pumpManager.setConfirmationBeeps(newPreference: preference) { error in DispatchQueue.main.async { @@ -352,6 +375,17 @@ class OmnipodSettingsViewModel: ObservableObject { } } + func setSilencePod(_ silencePodPreference: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) { + pumpManager.setSilencePod(silencePod: silencePodPreference == .enabled) { error in + DispatchQueue.main.async { + if error == nil { + self.silencePodPreference = silencePodPreference + } + completion(error) + } + } + } + func didChangeInsulinType(_ newType: InsulinType?) { self.pumpManager.insulinType = newType } @@ -367,6 +401,10 @@ class OmnipodSettingsViewModel: ObservableObject { } } + var noPod: Bool { + return podCommState == .noPod + } + var podError: String? { switch podCommState { case .fault(let status): @@ -378,7 +416,7 @@ class OmnipodSettingsViewModel: ObservableObject { case .occluded, .occlusionCheckStartup1, .occlusionCheckStartup2, .occlusionCheckTimeouts1, .occlusionCheckTimeouts2, .occlusionCheckTimeouts3, .occlusionCheckPulseIssue, .occlusionCheckBolusProblem, .occlusionCheckAboveThreshold, .occlusionCheckValueTooHigh: return LocalizedString("Pod Occlusion", comment: "Error message for reservoir view when pod occlusion checks failed") default: - return LocalizedString("Pod Error", comment: "Error message for reservoir view during general pod fault") + return String(format: LocalizedString("Pod Fault %1$03d", comment: "Error message for reservoir view during general pod fault: (1: fault code value)"), status.faultEventCode.rawValue) } case .active: if isPodDataStale { diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/PodLifeState.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/PodLifeState.swift index fc625c233b..76494d1464 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/PodLifeState.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/PodLifeState.swift @@ -85,7 +85,7 @@ enum PodLifeState { case .podDeactivating: return LocalizedString("Finish deactivation", comment: "Settings page link description when next lifecycle action is to finish deactivation") default: - return LocalizedString("Replace Pod", comment: "Settings page link description when next lifecycle action is to replace pod") + return LocalizedString("Deactivate Pod", comment: "Settings page link description when next lifecycle action is to deactivate pod") } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ActivityView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ActivityView.swift new file mode 100644 index 0000000000..221d31c14e --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/ActivityView.swift @@ -0,0 +1,36 @@ +// +// ActivityView.swift +// OmniKit +// +// Created by Joe Moran on 9/17/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI + +struct ActivityView: UIViewControllerRepresentable { + @Binding var isPresented: Bool + let activityItems: [Any] + + func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIActivityViewController { + let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + controller.completionWithItemsHandler = { (_, _, _, _) in + self.isPresented = false + } + return controller + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext) { + } +} + +fileprivate struct ActivityViewController: UIViewControllerRepresentable { + var activityItems: [Any] + var applicationActivities: [UIActivity]? = nil + + func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIActivityViewController { + return UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities) + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext) {} +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/AttachPodView.swift b/Dependencies/OmniKit/OmniKitUI/Views/AttachPodView.swift index 1c1327bee6..b637215b50 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/AttachPodView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/AttachPodView.swift @@ -33,7 +33,7 @@ struct AttachPodView: View { HStack { InstructionList(instructions: [ LocalizedString("Prepare site.", comment: "Label text for step one of attach pod instructions"), - LocalizedString("Remove the pod's needle cap and check cannula. Then remove paper backing.", comment: "Label text for step two of attach pod instructions"), + LocalizedString("Remove the Pod's clear needle cap and check cannula. Then remove paper backing.", comment: "Label text for step two of attach pod instructions"), LocalizedString("Check Pod, apply to site, then confirm pod attachment.", comment: "Label text for step three of attach pod instructions") ]) } @@ -55,7 +55,7 @@ struct AttachPodView: View { } .animation(.default) .alert(item: $activeModal, content: self.alert(for:)) - .navigationBarTitle("Attach Pod", displayMode: .automatic) + .navigationBarTitle(LocalizedString("Attach Pod", comment: "navigation bar title attach pod"), displayMode: .automatic) .navigationBarItems(trailing: cancelButton) .navigationBarBackButtonHidden(true) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/BeepPreferenceSelectionView.swift b/Dependencies/OmniKit/OmniKitUI/Views/BeepPreferenceSelectionView.swift index 7d757eebe7..e9a2e659c0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/BeepPreferenceSelectionView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/BeepPreferenceSelectionView.swift @@ -39,7 +39,7 @@ struct BeepPreferenceSelectionView: View { VStack { List { Section { - Text(LocalizedString("Confidence reminders are beeps from the pod which can be used to acknowledge selected commands.", comment: "Help text for BeepPreferenceSelectionView")).fixedSize(horizontal: false, vertical: true) + Text(LocalizedString("Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced.", comment: "Help text for BeepPreferenceSelectionView")).fixedSize(horizontal: false, vertical: true) .padding(.vertical, 10) } @@ -88,7 +88,7 @@ struct BeepPreferenceSelectionView: View { } .insetGroupedListStyle() - .navigationTitle("Confidence Reminders") + .navigationTitle(LocalizedString("Confidence Reminders", comment: "navigation title for confidence reminders")) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) } @@ -110,15 +110,15 @@ struct BeepPreferenceSelectionView: View { private var cancelButton: some View { Button(action: { self.presentationMode.wrappedValue.dismiss() } ) { - Text(LocalizedString("Cancel", comment: "Button title for cancelling low reservoir reminder edit")) + Text(LocalizedString("Cancel", comment: "Button title for cancelling confidence reminders edit")) } } var saveButtonText: String { if saving { - return LocalizedString("Saving...", comment: "button title for saving low reservoir reminder while saving") + return LocalizedString("Saving...", comment: "button title for saving confidence reminder while saving") } else { - return LocalizedString("Save", comment: "button title for saving low reservoir reminder") + return LocalizedString("Save", comment: "button title for saving confidence reminder") } } @@ -135,7 +135,7 @@ struct BeepPreferenceSelectionView: View { } -struct ContentView_Previews: PreviewProvider { +struct BeepPreferenceSelectionView_Previews: PreviewProvider { static var previews: some View { NavigationView { BeepPreferenceSelectionView(initialValue: .extended) { selectedValue, completion in diff --git a/Dependencies/OmniKit/OmniKitUI/Views/CheckInsertedCannulaView.swift b/Dependencies/OmniKit/OmniKitUI/Views/CheckInsertedCannulaView.swift index 126ac4b4d5..6a2a138875 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/CheckInsertedCannulaView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/CheckInsertedCannulaView.swift @@ -55,7 +55,7 @@ struct CheckInsertedCannulaView: View { } .animation(.default) .alert(isPresented: $cancelModalIsPresented) { cancelPairingModal } - .navigationBarTitle("Check Cannula", displayMode: .automatic) + .navigationBarTitle(LocalizedString("Check Cannula", comment: "navigation bar title for check cannula"), displayMode: .automatic) .navigationBarItems(trailing: cancelButton) .navigationBarBackButtonHidden(true) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift b/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift index ad8226655a..3d24d0c739 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift @@ -78,7 +78,7 @@ struct DeactivatePodView: View { .padding() } .alert(isPresented: $removePodModalIsPresented) { removePodModal } - .navigationBarTitle("Deactivate Pod", displayMode: .automatic) + .navigationBarTitle(LocalizedString("Deactivate Pod", comment: "navigation bar title for deactivate pod"), displayMode: .automatic) .navigationBarItems(trailing: Button("Cancel") { viewModel.didCancel?() diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ExpirationReminderSetupView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ExpirationReminderSetupView.swift index a764e1432d..6c508140b0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/ExpirationReminderSetupView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/ExpirationReminderSetupView.swift @@ -38,7 +38,7 @@ struct ExpirationReminderSetupView: View { } .padding() } - .navigationBarTitle(LocalizedString("Expiration Reminder", comment: "Title for ExpirationReminderSetupView"), displayMode: .automatic) + .navigationBarTitle(LocalizedString("Expiration Reminder", comment: "navigation bar title for expiration reminder"), displayMode: .automatic) .navigationBarHidden(false) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { diff --git a/Dependencies/OmniKit/OmniKitUI/Views/FirstAppear.swift b/Dependencies/OmniKit/OmniKitUI/Views/FirstAppear.swift new file mode 100644 index 0000000000..664bde6018 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/FirstAppear.swift @@ -0,0 +1,30 @@ +// +// FirstAppear.swift +// Omnipod +// +// Created by Joe Moran on 9/24/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI + +extension View { + func onFirstAppear(_ action: @escaping () -> ()) -> some View { + modifier(FirstAppear(action: action)) + } +} + +private struct FirstAppear: ViewModifier { + let action: () -> () + + // State used to insure action is invoked here only once + @State private var hasAppeared = false + + func body(content: Content) -> some View { + content.onAppear { + guard !hasAppeared else { return } + hasAppeared = true + action() + } + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift b/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift index a57c5e7cad..06520b4be2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift @@ -83,7 +83,7 @@ struct InsertCannulaView: View { } .animation(.default) .alert(isPresented: $cancelModalIsPresented) { cancelPairingModal } - .navigationBarTitle("Insert Cannula", displayMode: .automatic) + .navigationBarTitle(LocalizedString("Insert Cannula", comment: "navigation bar title for insert cannula"), displayMode: .automatic) .navigationBarBackButtonHidden(true) .navigationBarItems(trailing: cancelButton) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/InsulinTypeConfirmation.swift b/Dependencies/OmniKit/OmniKitUI/Views/InsulinTypeConfirmation.swift index 27af622548..814f1fdba0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/InsulinTypeConfirmation.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/InsulinTypeConfirmation.swift @@ -63,6 +63,6 @@ struct InsulinTypeConfirmation: View { struct InsulinTypeConfirmation_Previews: PreviewProvider { static var previews: some View { - InsulinTypeConfirmation(initialValue: .humalog, supportedInsulinTypes: InsulinType.allCases, didConfirm: { (newType) in }, didCancel: {}) + InsulinTypeConfirmation(initialValue: .humalog, supportedInsulinTypes: InsulinType.allCases, didConfirm: { (newType) in }, didCancel: { }) } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/LowReservoirReminderSetupView.swift b/Dependencies/OmniKit/OmniKitUI/Views/LowReservoirReminderSetupView.swift index dcb526570a..cb3bd34887 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/LowReservoirReminderSetupView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/LowReservoirReminderSetupView.swift @@ -50,7 +50,7 @@ struct LowReservoirReminderSetupView: View { } .padding() } - .navigationBarTitle(LocalizedString("Low Reservoir", comment: "Navigation bar title for LowReservoirReminderSetupView"), displayMode: .automatic) + .navigationBarTitle(LocalizedString("Low Reservoir", comment: "navigation bar title for low reservoir"), displayMode: .automatic) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(LocalizedString("Cancel", comment: "Cancel button title"), action: { diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ManualTempBasalEntryView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ManualTempBasalEntryView.swift index d5ea043760..84c69cff6d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/ManualTempBasalEntryView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/ManualTempBasalEntryView.swift @@ -95,7 +95,7 @@ struct ManualTempBasalEntryView: View { .frame(maxHeight: 162.0) .alert(isPresented: $showingMissingConfigAlert, content: { missingConfigAlert }) Section { - Text(LocalizedString("Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled.", comment: "Description text on manual temp basal action sheet")) + Text(LocalizedString("Your insulin delivery will not be automatically adjusted until the temporary basal rate finishes or is canceled.", comment: "Description text on manual temp basal action sheet")) .font(.footnote) .foregroundColor(.secondary) .fixedSize(horizontal: false, vertical: true) @@ -147,7 +147,7 @@ struct ManualTempBasalEntryView: View { var missingConfigAlert: SwiftUI.Alert { return SwiftUI.Alert( title: Text(LocalizedString("Missing Config", comment: "Alert title for missing temp basal configuration")), - message: Text(LocalizedString("This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate.", comment: "Alert format string for missing temp basal configuration.")) + message: Text(LocalizedString("This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Pump Settings in the settings CONFIGURATION section to set a new Max Basal.", comment: "Alert format string for missing temp basal configuration.")) ) } @@ -158,7 +158,4 @@ struct ManualTempBasalEntryView: View { } .accessibility(identifier: "button_cancel") } - } - - diff --git a/Dependencies/OmniKit/OmniKitUI/Views/NotificationSettingsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/NotificationSettingsView.swift index 34becf6c2a..9e3101aad2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/NotificationSettingsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/NotificationSettingsView.swift @@ -34,29 +34,29 @@ struct NotificationSettingsView: View { var body: some View { RoundedCardScrollView { RoundedCard( - title: LocalizedString("Omnipod Reminders", comment: "Title for omnipod reminders section"), - footer: LocalizedString("The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod.", comment: "Footer text for omnipod reminders section") + title: LocalizedString("Pod Reminders", comment: "Title for pod reminders section"), + footer: LocalizedString("The app configures a reminder on the Pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure by default when pairing a new Pod.", comment: "Footer text for pod reminders section") ) { ExpirationReminderPickerView(expirationReminderDefault: $expirationReminderDefault) } if let allowedDates = allowedScheduledReminderDates { RoundedCard( - footer: LocalizedString("This is a reminder that you scheduled when you paired your current Pod.", comment: "Footer text for scheduled reminder area")) + footer: LocalizedString("The expiration reminder time for the current Pod.", comment: "Footer text for scheduled reminder area")) { - Text(LocalizedString("Scheduled Reminder", comment: "Scheduled reminder card title on NotificationSettingsView")) + Text(LocalizedString("Scheduled Reminder", comment: "Title of scheduled reminder card on NotificationSettingsView")) Divider() scheduledReminderRow(scheduledDate: scheduledReminderDate, allowedDates: allowedDates) } } - RoundedCard(footer: LocalizedString("The App notifies you when the amount of insulin in the Pod reaches this level.", comment: "Footer text for low reservoir value row")) { + RoundedCard(footer: LocalizedString("The app notifies you when the amount of insulin in the Pod reaches this level.", comment: "Footer text for low reservoir value row")) { lowReservoirValueRow } RoundedCard( title: LocalizedString("Critical Alerts", comment: "Title for critical alerts description"), - footer: LocalizedString("The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode.", comment: "Description text for critical alerts") + footer: LocalizedString("The above reminders will not sound in the app if your device is in Silent or Do Not Disturb mode. There are other critical Pod alerts that will sound in the app even if your device is set to Silent or Do Not Disturb mode.\n\nThe Pod will also use audible beeps for all Pod reminders and alerts except when the Pod is Silenced.", comment: "Description text for critical alerts") ) } .navigationBarTitle(LocalizedString("Notification Settings", comment: "navigation title for notification settings")) @@ -66,7 +66,8 @@ struct NotificationSettingsView: View { private func scheduledReminderRow(scheduledDate: Date?, allowedDates: [Date]) -> some View { Group { - if let scheduledDate = scheduledDate, scheduledDate <= Date() { + // Make the expiration reminder time read-only if there aren't any more available times. + if allowedDates.isEmpty { scheduledReminderRowContents(disclosure: false) } else { NavigationLink( @@ -125,13 +126,15 @@ struct NotificationSettingsView_Previews: PreviewProvider { static var previews: some View { return Group { NavigationView { - NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: Date(), allowedScheduledReminderDates: [Date()], lowReservoirReminderValue: 20) + let now = Date() + NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: now + TimeInterval(hours: 1), allowedScheduledReminderDates: [now, now - TimeInterval(hours: 2), now - TimeInterval(hours: 3)], lowReservoirReminderValue: 20) .previewDevice(PreviewDevice(rawValue:"iPod touch (7th generation)")) .previewDisplayName("iPod touch (7th generation)") } NavigationView { - NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: Date(), allowedScheduledReminderDates: [Date()], lowReservoirReminderValue: 20) + let now = Date() + NotificationSettingsView(dateFormatter: DateFormatter(), expirationReminderDefault: .constant(2), scheduledReminderDate: now + TimeInterval(hours: 1), allowedScheduledReminderDates: [now, now - TimeInterval(hours: 2), now - TimeInterval(hours: 3)], lowReservoirReminderValue: 20) .colorScheme(.dark) .previewDevice(PreviewDevice(rawValue: "iPhone XS Max")) .previewDisplayName("iPhone XS Max - Dark") diff --git a/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift index d1106705d4..bc105972b4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift @@ -14,28 +14,27 @@ import OmniKit import RileyLinkBLEKit struct OmnipodSettingsView: View { - + @ObservedObject var viewModel: OmnipodSettingsViewModel @ObservedObject var rileyLinkListDataSource: RileyLinkListDataSource var handleRileyLinkSelection: (RileyLinkDevice) -> Void - + @State private var showingDeleteConfirmation = false - - @State private var showSuspendOptions = false; - @State private var showManualTempBasalOptions = false; + @State private var showSuspendOptions = false + + @State private var showManualTempBasalOptions = false - @State private var showSyncTimeOptions = false; + @State private var showSyncTimeOptions = false - @State private var sendingTestBeepsCommand = false; + @State private var sendingTestBeepsCommand = false @State private var cancelingTempBasal = false var supportedInsulinTypes: [InsulinType] - @Environment(\.guidanceColors) var guidanceColors @Environment(\.insulinTintColor) var insulinTintColor @@ -286,7 +285,7 @@ struct OmnipodSettingsView: View { headerImage lifecycleProgress - + HStack(alignment: .top) { deliveryStatus Spacer() @@ -309,7 +308,7 @@ struct OmnipodSettingsView: View { }.padding(.vertical, 8) } } - + Section(header: SectionHeader(label: LocalizedString("Activity", comment: "Section header for activity section"))) { suspendResumeRow() .disabled(!self.viewModel.podOk) @@ -350,7 +349,7 @@ struct OmnipodSettingsView: View { manualTempBasalRow } } - .disabled(cancelingTempBasal) + .disabled(cancelingTempBasal || !self.viewModel.podOk) Section(header: HStack { FrameworkLocalText("Devices", comment: "Header for devices section of RileyLinkSetupView") @@ -390,7 +389,7 @@ struct OmnipodSettingsView: View { Text(self.viewModel.activatedAtString) .foregroundColor(Color.secondary) } - + HStack { if let expiresAt = viewModel.expiresAt, expiresAt < Date() { FrameworkLocalText("Pod Expired", comment: "Label for pod expiration row, past tense") @@ -401,21 +400,34 @@ struct OmnipodSettingsView: View { Text(self.viewModel.expiresAtString) .foregroundColor(Color.secondary) } - + if let podDetails = self.viewModel.podDetails { - NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Device Details", comment: "title for device details page"))) { - FrameworkLocalText("Device Details", comment: "Text for device details disclosure row").foregroundColor(Color.primary) + NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Pod Details", comment: "title for pod details page"))) { + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row").foregroundColor(Color.primary) } } else { HStack { - FrameworkLocalText("Device Details", comment: "Text for device details disclosure row") + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row") + Spacer() + Text("—") + .foregroundColor(Color.secondary) + } + } + + if let previousPodDetails = viewModel.previousPodDetails { + NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row").foregroundColor(Color.primary) + } + } else { + HStack { + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row") Spacer() Text("—") .foregroundColor(Color.secondary) } } } - + Section() { Button(action: { self.viewModel.navigateTo?(self.viewModel.lifeState.nextPodLifecycleAction) @@ -424,7 +436,7 @@ struct OmnipodSettingsView: View { .foregroundColor(self.viewModel.lifeState.nextPodLifecycleActionColor) } } - + Section(header: SectionHeader(label: LocalizedString("Configuration", comment: "Section header for configuration section"))) { NavigationLink(destination: @@ -447,9 +459,17 @@ struct OmnipodSettingsView: View { .foregroundColor(.secondary) } } + NavigationLink(destination: SilencePodSelectionView(initialValue: viewModel.silencePodPreference, onSave: viewModel.setSilencePod)) { + HStack { + FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link").foregroundColor(Color.primary) + Spacer() + Text(viewModel.silencePodPreference.title) + .foregroundColor(.secondary) + } + } NavigationLink(destination: InsulinTypeSetting(initialValue: viewModel.insulinType, supportedInsulinTypes: supportedInsulinTypes, allowUnsetInsulinType: false, didChange: viewModel.didChangeInsulinType)) { HStack { - FrameworkLocalText("Insulin Type", comment: "Text for confidence reminders navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Insulin Type", comment: "Text for insulin type navigation link").foregroundColor(Color.primary) if let currentTitle = viewModel.insulinType?.brandName { Spacer() Text(currentTitle) @@ -458,7 +478,7 @@ struct OmnipodSettingsView: View { } } } - + Section() { HStack { FrameworkLocalText("Pump Time", comment: "The title of the command to change pump time zone") @@ -489,14 +509,23 @@ struct OmnipodSettingsView: View { } } - if let previousPodDetails = viewModel.previousPodDetails { - Section() { - NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { - FrameworkLocalText("Previous Pod Information", comment: "Text for previous pod information row").foregroundColor(Color.primary) - } + Section(header: SectionHeader(label: LocalizedString("Diagnostics", comment: "Section header for diagnostic section"))) { + NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { + FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link").foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + NavigationLink(destination: ReadPulseLogView(toRun: viewModel.readPulseLog)) { + FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link").foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { + FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link").foregroundColor(Color.primary) + } + .disabled(!self.viewModel.podOk) + NavigationLink(destination: PumpManagerDetailsView(toRun: viewModel.pumpManagerDetails)) { + FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link").foregroundColor(Color.primary) } } - if self.viewModel.lifeState.allowsPumpManagerRemoval { Section() { diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PairPodView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PairPodView.swift index c174ec23cd..9abb1e45d8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/PairPodView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/PairPodView.swift @@ -22,7 +22,7 @@ struct PairPodView: View { HStack { InstructionList(instructions: [ - LocalizedString("Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps.", comment: "Label text for step 1 of pair pod instructions"), + LocalizedString("Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps.", comment: "Label text for step 1 of pair pod instructions"), LocalizedString("Keep the RileyLink about 6 inches from the pod during pairing.", comment: "Label text for step 2 of pair pod instructions") ]) .disabled(viewModel.state.instructionsDisabled) @@ -80,7 +80,7 @@ struct PairPodView: View { } .animation(.default) .alert(isPresented: $cancelModalIsPresented) { cancelPairingModal } - .navigationBarTitle(LocalizedString("Pair Pod", comment: "Navigation bar title for PairPodView"), displayMode: .automatic) + .navigationBarTitle(LocalizedString("Pair Pod", comment: "Pair Pod navigationBarTitle"), displayMode: .automatic) .navigationBarBackButtonHidden(self.viewModel.backButtonHidden) .navigationBarItems(trailing: self.viewModel.state.navBarVisible ? cancelButton : nil) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift new file mode 100644 index 0000000000..bf8dac01dd --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift @@ -0,0 +1,100 @@ +// +// PlayTestBeepsView.swift +// OmniKit +// +// Created by Joe Moran on 9/1/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + + +struct PlayTestBeepsView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var successMessage = LocalizedString("Play test beeps command sent successfully.\n\nIf you did not hear any beeps from your Pod, the piezo speaker in your Pod may be broken or disabled.", comment: "Success message for play test beeps") + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView = false + + init(toRun: @escaping (_ completion: @escaping (_ result: Error?) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + Text(self.displayString).fixedSize(horizontal: false, vertical: true) + } + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (error) in + if let error = error { + self.displayString = "" + self.error = error + self.alertIsPresented = true + } else { + self.displayString = successMessage + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + } else { + return LocalizedString("Play Test Beeps", comment: "button title to play test beeps") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct PlayTestBeepsView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + PlayTestBeepsView() { completion in + completion(nil) + } + } + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PodDetailsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PodDetailsView.swift index 2eeb9503ec..5a5ed77aa3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/PodDetailsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/PodDetailsView.swift @@ -89,7 +89,7 @@ struct PodDetailsView: View { var body: some View { List { row(LocalizedString("Lot Number", comment: "description label for lot number pod details row"), value: String(describing: podDetails.lotNumber)) - row(LocalizedString("Sequence Number", comment: "description label for sequence number pod details row"), value: String(describing: podDetails.sequenceNumber)) + row(LocalizedString("Sequence Number", comment: "description label for sequence number pod details row"), value: String(format: "%07d", podDetails.sequenceNumber)) row(LocalizedString("PI Version", comment: "description label for pi version pod details row"), value: podDetails.piVersion) row(LocalizedString("PM Version", comment: "description label for ble firmware version pod details row"), value: podDetails.pmVersion) row(LocalizedString("Total Delivery", comment: "description label for total delivery pod details row"), value: totalDeliveryText) @@ -108,10 +108,7 @@ struct PodDetailsView: View { Text(LocalizedString("Pod Fault Details", comment: "description label for pod fault details")) .fontWeight(.semibold) }.padding(.vertical, 4) - Text(String(describing: fault)) - .fixedSize(horizontal: false, vertical: true) - .foregroundColor(.secondary) - Text("Ref: " + pdmRef) + Text(String(format: LocalizedString("Internal Pod fault code %1$03d\n%2$@\nRef: %3$@\n", comment: "The format string for the pod fault info: (1: fault code) (2: fault description) (3: pdm ref string)"), fault.rawValue, fault.faultDescription, pdmRef)) .fixedSize(horizontal: false, vertical: true) .foregroundColor(.secondary) } @@ -124,6 +121,6 @@ struct PodDetailsView: View { struct PodDetailsView_Previews: PreviewProvider { static var previews: some View { - PodDetailsView(podDetails: PodDetails(lotNumber: 0x1234, sequenceNumber: 0x1234, piVersion: "1.1.1", pmVersion: "2.2.2", totalDelivery: 10, lastStatus: Date(), fault: FaultEventCode(rawValue: 0x67), activatedAt: Date().addingTimeInterval(.days(1))), title: "Device Details") + PodDetailsView(podDetails: PodDetails(lotNumber: 123456789, sequenceNumber: 1234567, piVersion: "2.1.0", pmVersion: "2.1.0", totalDelivery: 99, lastStatus: Date(), fault: FaultEventCode(rawValue: 064), activatedAt: Date().addingTimeInterval(.days(2)), pdmRef: "19-02448-09951-064"), title: "Device Details") } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PodSetupView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PodSetupView.swift index fbf622033c..88c03085e2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/PodSetupView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/PodSetupView.swift @@ -107,7 +107,7 @@ struct PodSetupView: View { } -struct RileyLinkSetupView_Previews: PreviewProvider { +struct PodSetupView_Previews: PreviewProvider { static var previews: some View { PodSetupView(nextAction: {}, allowDebugFeatures: true, skipOnboarding: {}) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift new file mode 100644 index 0000000000..805bbd876c --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift @@ -0,0 +1,100 @@ +// +// PumpManagerDetailsView.swift +// OmniKit +// +// Created by Joe Moran on 9/26/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit + + +struct PumpManagerDetailsView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + + @State private var displayString: String = "" + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: String) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + let myFont = Font + .system(size: 12) + .monospaced() + Text(self.displayString) + .font(myFont) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details")) + .navigationBarTitleDisplayMode(.inline) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + self.displayString = result + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + } else { + return LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") + } + } +} + +struct PumpManagerDetailsView_Previews: PreviewProvider { + static var previews: some View { + let examplePumpManagerDetails: String = "## OmnipodPumpManager\n\n## RileyLinkPumpManager\nlastTimerTick: 2023-10-07 22:35:39 +0000\n\n## RileyLinkDeviceManager\n\ncentral: \n\nautoConnectIDs: [\"F0178BCA-967D-504A-8C3A-99E84964B459\"]\n\ntimerTickEnabled: true\n\nidleListeningState: disabled\n\n## RileyLinkDevice\n* name: JPM OrangePro\n* lastIdle: 0001-01-01 00:00:00 +0000\n* isIdleListeningPending: false\n* isTimerTickEnabled: true\n* isTimerTickNotifying: true\n* radioFirmware: Optional(subg_rfspy 2.2)\n* bleFirmware: Optional(ble_rfspy 2.0)\n* peripheralManager: \n* sessionQueue.operationCount: 2\n\npodComms: ## PodComms\nconfiguredDevices: [\"F0178BCA-967D-504A-8C3A-99E84964B459\"]\ndelegate: true\n\nstatusObservers.count: 2\nstatus: ## PumpManagerStatus\n* timeZone: GMT-0700 (fixed)\n* device: <, name:Omnipod, manufacturer:Insulet, model:Eros, firmware:2.10.0, software:1.0, localIdentifier:1F05DD9A>\n* pumpBatteryChargeRemaining: nil\n* basalDeliveryState: Optional(LoopKit.PumpManagerStatus.BasalDeliveryState.active(2023-10-07 22:33:48 +0000))\n* bolusState: noBolus\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* deliveryIsUncertain: false\n\npodStateObservers.count: 1\nstate: ## OmnipodPumpManagerState\n* isOnboarded: true\n* timeZone: GMT-0700 (fixed)\n* basalSchedule: BasalSchedule(entries: [OmniKit.BasalScheduleEntry(rate: 0.9, startTime: 0.0)])\n* maximumTempBasalRate: 2.0\n* scheduledExpirationReminderOffset: Optional(\"24h0m\")\n* defaultExpirationReminderOffset: 24h0m\n* lowReservoirReminderValue: 50.0\n* podAttachmentConfirmed: true\n* activeAlerts: []\n* alertsWithPendingAcknowledgment: []\n* acknowledgedTimeOffsetAlert: false\n* initialConfigurationCompleted: true\n* unstoredDoses: []\n* suspendEngageState: stable\n* bolusEngageState: stable\n* tempBasalEngageState: stable\n* lastPumpDataReportDate: Optional(2023-10-07 22:35:24 +0000)\n* isPumpDataStale: false\n* silencePod: false\n* confirmationBeeps: manualCommands\n* pairingAttemptAddress: nil\n* insulinType: Optional(LoopKit.InsulinType.humalog)\n* scheduledExpirationReminderOffset: Optional(\"24h0m\")\n* defaultExpirationReminderOffset: 24h0m\n* rileyLinkBatteryAlertLevel: nil\n* lastRileyLinkBatteryAlertDate 0001-01-01 00:00:00 +0000\n* RileyLinkConnectionManagerState: RileyLinkConnectionState(autoConnectIDs: Set([\"F0178BCA-967D-504A-8C3A-99E84964B459\"]))\n* PodState: ### PodState\n* address: 1F05DD9A\n* activatedAt: Optional(2023-10-07 22:31:21 +0000)\n* expiresAt: Optional(2023-10-10 22:30:51 +0000)\n* timeActive: 4m\n* timeActiveUpdated: Optional(2023-10-07 22:35:38 +0000)\n* setupUnitsDelivered: Optional(2.65)\n* piVersion: 2.10.0\n* pmVersion: 2.10.0\n* lot: 72353\n* tid: 3280440\n* suspendState: resumed(2023-10-07 22:33:48 +0000)\n* unacknowledgedCommand: nil\n* unfinalizedBolus: nil\n* unfinalizedTempBasal: nil\n* unfinalizedSuspend: nil\n* unfinalizedResume: Optional(Resume: 10/7/23, 3:33:48 PM Certain)\n* finalizedDoses: []\n* activeAlertsSlots: No alerts\n* messageTransportState: MessageTransportState(packetNumber: 2, messageNumber: 8)\n* setupProgress: completed\n* primeFinishTime: Optional(2023-10-07 22:33:16 +0000)\n* configuredAlerts: [OmniKit.AlertSlot.slot4LowReservoir: Low reservoir, OmniKit.AlertSlot.slot3ExpirationReminder: Expiration reminder, OmniKit.AlertSlot.slot2ShutdownImminent: Shutdown imminent, OmniKit.AlertSlot.slot7Expired: Pod expired]\n* insulinType: humalog\n* PdmRef: nil\n* Fault: nil\n\n* PreviousPodState: nil\n" + NavigationView { + PumpManagerDetailsView() { completion in + completion(examplePumpManagerDetails) + } + } + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift new file mode 100644 index 0000000000..cd4226e7cc --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift @@ -0,0 +1,168 @@ +// +// ReadPodStatusView.swift +// OmniKit +// +// Created by Joe Moran on 8/15/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import OmniKit + +private func podStatusString(status: DetailedStatus) -> String { + var result, str: String + + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .full + formatter.allowedUnits = [.hour, .minute] + formatter.unitsStyle = .short + if let timeStr = formatter.string(from: status.timeActive) { + str = timeStr + } else { + str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) + } + result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) + + result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) + + result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) + + result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) + + result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) + + result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) + + result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) + + result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) + + if status.radioRSSI != 0 { + result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) + result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) + } + + if status.faultEventCode.faultType != .noFaults { + // report the additional fault related information in a separate section + result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) + result += String(format: "\n%1$@", status.faultEventCode.faultDescription) + if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, + let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) + { + result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) + } + if let errorEventInfo = status.errorEventInfo { + result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) + result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) + result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) + result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) + result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) + } + if let pdmRef = status.pdmRef { + result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) + } + } + + return result +} + +struct ReadPodStatusView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var error: LocalizedError? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + Text(self.displayString).fixedSize(horizontal: false, vertical: true) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Read Pod Status", comment: "navigation title for read pod status")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + switch result { + case .success(let detailedStatus): + self.displayString = podStatusString(status: detailedStatus) + case .failure(let error): + self.error = error + self.alertIsPresented = true + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + } else { + return LocalizedString("Read Pod Status", comment: "button title to read pod status") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct ReadPodStatusView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + let detailedStatus = try! DetailedStatus(encodedData: Data([0x02, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xc3, 0x6a, 0x02, 0x07, 0x03, 0xff, 0x02, 0x09, 0x20, 0x00, 0x28, 0x99, 0x08, 0x00, 0x82])) + ReadPodStatusView() { completion in + completion(.success(detailedStatus)) + } + } + } + } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift new file mode 100644 index 0000000000..acaa00d568 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift @@ -0,0 +1,128 @@ +// +// ReadPulseLogView.swift +// OmniKit +// +// Created by Joe Moran on 9/1/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import OmniKit + +struct ReadPulseLogView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var displayString: String = "" + @State private var error: Error? = nil + @State private var executing: Bool = false + @State private var showActivityView: Bool = false + + init(toRun: @escaping (_ completion: @escaping (_ result: Result) -> Void) -> Void) { + self.toRun = toRun + } + + var body: some View { + VStack { + List { + Section { + let myFont = Font + .system(size: 12) + .monospaced() + Text(self.displayString) + .font(myFont) + } + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button(action: { + self.showActivityView = true + }) { + Image(systemName: "square.and.arrow.up") + } + } + }.sheet(isPresented: $showActivityView) { + ActivityView(isPresented: $showActivityView, activityItems: [self.displayString]) + } + VStack { + Button(action: { + asyncAction() + }) { + Text(buttonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(executing) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Read Pulse Log", comment: "navigation title for read pulse log")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + .onFirstAppear { + asyncAction() + } + } + + private func asyncAction () { + DispatchQueue.global(qos: .utility).async { + executing = true + self.displayString = "" + toRun?() { (result) in + switch result { + case .success(let pulseLogString): + self.displayString = pulseLogString + case .failure(let error): + self.displayString = "" + self.error = error + self.alertIsPresented = true + } + executing = false + } + } + } + + private var buttonText: String { + if executing { + return LocalizedString("Reading Pulse Log...", comment: "button title when executing read pulse log") + } else { + return LocalizedString("Read Pulse Log", comment: "button title to read pulse log") + } + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct ReadPulsePodLogView_Previews: PreviewProvider { + static var previews: some View { + ReadPulseLogView() { completion in + let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, + 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, + 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, + 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, + 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, + 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, + 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, + 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, + 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, + 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, + 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, + 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, + 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, + 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) + let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) + completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + } + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/SetupCompleteView.swift b/Dependencies/OmniKit/OmniKitUI/Views/SetupCompleteView.swift index 23980b86e3..6ad9e7f22b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/SetupCompleteView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/SetupCompleteView.swift @@ -44,7 +44,7 @@ struct SetupCompleteView: View { .fixedSize(horizontal: false, vertical: true) Divider() VStack(alignment: .leading) { - Text(LocalizedString("Scheduled Reminder", comment: "Title of SetupCompleteView")) + Text(LocalizedString("Scheduled Reminder", comment: "Scheduled reminder card title on SetupCompleteView")) Divider() NavigationLink( destination: ScheduledExpirationReminderEditView( @@ -84,7 +84,7 @@ struct SetupCompleteView: View { .zIndex(1) } .animation(.default) - .navigationBarTitle("Setup Complete", displayMode: .automatic) + .navigationBarTitle(LocalizedString("Setup Complete", comment: "Title of SetupCompleteView"), displayMode: .automatic) } private func scheduledReminderDateString(_ scheduledDate: Date?) -> String { diff --git a/Dependencies/OmniKit/OmniKitUI/Views/SilencePodSelectionView.swift b/Dependencies/OmniKit/OmniKitUI/Views/SilencePodSelectionView.swift new file mode 100644 index 0000000000..107316eb28 --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/SilencePodSelectionView.swift @@ -0,0 +1,144 @@ +// +// SilencePodSelectionView.swift +// OmniKit +// +// Created by Joe Moran 8/30/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI +import OmniKit + +struct SilencePodSelectionView: View { + + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.presentationMode) var presentationMode: Binding + + private var initialValue: SilencePodPreference + @State private var preference: SilencePodPreference + private var onSave: ((_ selectedValue: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) -> Void)? + + @State private var alertIsPresented: Bool = false + @State private var error: LocalizedError? + @State private var saving: Bool = false + + + init(initialValue: SilencePodPreference, onSave: @escaping (_ selectedValue: SilencePodPreference, _ completion: @escaping (_ error: LocalizedError?) -> Void) -> Void) { + self.initialValue = initialValue + self._preference = State(initialValue: initialValue) + self.onSave = onSave + } + + var body: some View { + contentWithCancel + } + + var content: some View { + VStack { + List { + Section { + Text(LocalizedString("Silence Pod mode suppresses all Pod alert and confirmation reminder beeping.", comment: "Help text for Silence Pod view")).fixedSize(horizontal: false, vertical: true) + .padding(.vertical, 10) + } + Section { + ForEach(SilencePodPreference.allCases, id: \.self) { preference in + HStack { + CheckmarkListItem( + title: Text(preference.title), + description: Text(preference.description), + isSelected: Binding( + get: { self.preference == preference }, + set: { isSelected in + if isSelected { + self.preference = preference + } + } + ) + ) + } + .padding(.vertical, 10) + } + } + .buttonStyle(PlainButtonStyle()) // Disable row highlighting on selection + } + VStack { + Button(action: { + saving = true + onSave?(preference) { (error) in + saving = false + if let error = error { + self.error = error + self.alertIsPresented = true + } else { + self.presentationMode.wrappedValue.dismiss() + } + } + }) { + Text(saveButtonText) + .actionButtonStyle(.primary) + } + .padding() + .disabled(saving || !valueChanged) + } + .padding(self.horizontalSizeClass == .regular ? .bottom : []) + .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) + } + .insetGroupedListStyle() + .navigationTitle(LocalizedString("Silence Pod", comment: "navigation title for Silnce Pod")) + .navigationBarTitleDisplayMode(.inline) + .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) + } + + private var contentWithCancel: some View { + if saving { + return AnyView(content + .navigationBarBackButtonHidden(true) + ) + } else if valueChanged { + return AnyView(content + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: cancelButton) + ) + } else { + return AnyView(content) + } + } + + private var cancelButton: some View { + Button(action: { self.presentationMode.wrappedValue.dismiss() } ) { + Text(LocalizedString("Cancel", comment: "Button title for cancelling silence pod edit")) + } + } + + var saveButtonText: String { + if saving { + return LocalizedString("Saving...", comment: "button title for saving silence pod preference while saving") + } else { + return LocalizedString("Save", comment: "button title for saving silence pod preference") + } + } + + private var valueChanged: Bool { + return preference != initialValue + } + + private func alert(error: Error?) -> SwiftUI.Alert { + return SwiftUI.Alert( + title: Text(LocalizedString("Failed to update silence pod preference.", comment: "Alert title for error when updating silence pod preference")), + message: Text(error?.localizedDescription ?? "No Error") + ) + } +} + +struct SilencePodSelectionView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + SilencePodSelectionView(initialValue: .disabled) { selectedValue, completion in + print("Selected: \(selectedValue)") + completion(nil) + } + } + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/UncertaintyRecoveredView.swift b/Dependencies/OmniKit/OmniKitUI/Views/UncertaintyRecoveredView.swift index cefb4072e6..7a9e984d13 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/UncertaintyRecoveredView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/UncertaintyRecoveredView.swift @@ -16,9 +16,8 @@ struct UncertaintyRecoveredView: View { var body: some View { GuidePage(content: { - Text(LocalizedString("Loop has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use Loop normally now.", comment: "Text body for page showing insulin uncertainty has been recovered.")) - .fixedSize(horizontal: false, vertical: true) - .padding([.top, .bottom]) + Text(String(format: LocalizedString("%1$@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %2$@ normally now.", comment: "Text body for page showing insulin uncertainty has been recovered (1: appName) (2: appName)"), self.appName, self.appName)) + .padding([.top, .bottom]) }) { VStack { Button(action: { From 9c7edb44b1aa677e305e1b3700bded5292cce2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 12 Nov 2023 11:35:34 +0100 Subject: [PATCH 218/405] New Crowdin updates (#320) --- .../Sources/Localizations/Main/ar.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/da.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/de.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/es.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/fi.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/fr.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/he.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/it.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/nb.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/nl.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/pl.lproj/Localizable.strings | 6 ++++++ .../Localizations/Main/pt-BR.lproj/Localizable.strings | 6 ++++++ .../Localizations/Main/pt-PT.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/ru.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/sk.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/sv.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/tr.lproj/Localizable.strings | 6 ++++++ .../Sources/Localizations/Main/uk.lproj/Localizable.strings | 6 ++++++ .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 6 ++++++ 19 files changed, 114 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 1597de3f5e..ed957b9984 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 7eeafc2684..a7ef9d3760 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Gem som forudindstilling"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index bc54c5adc8..26f88b1707 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Speichern als Voreinstellung"; +/* */ +"Predictions" = "Prognosen"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index edf64dcdaa..5d1492546b 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index e258f97b27..afacad2023 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 6769eff5cd..859befc046 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 1597de3f5e..ed957b9984 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index ae83898f2b..21a211238a 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Salva come Predefinito"; +/* */ +"Predictions" = "Previsione"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 671d84abb7..b25ad82017 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Lagre som forvalg"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 6c830ddbdd..487bd897e6 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Bewaar als voorinstelling"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index cc5c6b8a54..eb354fc94b 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1393,6 +1393,12 @@ Połączono z Nightscout!"; /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 23942ac3b9..bc1a71117d 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 236041691e..4c75c211f5 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 9a9b394926..edd35652cc 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Сохранить как шаблон"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 845e05d5d5..89988ca48a 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 45beae40de..e84a030176 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Spara som förval"; +/* */ +"Predictions" = "Prognoser"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Visa fett och protein"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 561b0a7dbb..be805bdbe9 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index ab5bad639f..241b2d83fd 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Зберегти як Шаблон"; +/* */ +"Predictions" = "Прогнози"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Показати білок і жир"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 44c41a7046..eb2089d735 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1391,6 +1391,12 @@ Enact a temp Basal or a temp target */ /* */ "Save as Preset" = "Save as Preset"; +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ From 2b494c9491bf6eba31b553a31c08063c58c5e611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 12 Nov 2023 11:51:24 +0100 Subject: [PATCH 219/405] Update version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 53495d2b4d..f9d093433c 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.8 +APP_VERSION = 2.2.9 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From ba8cc985d80d8ab3d5e3484067834535f8ad2cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 12 Nov 2023 12:09:38 +0100 Subject: [PATCH 220/405] Merge fix (#327) --- .../Localizations/en.lproj/Localizable.strings | 16 ++++++++++++++++ .../Localizations/sv.lproj/Localizable.strings | 9 +++++++++ .../OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 8 ++++---- .../xcshareddata/swiftpm/Package.resolved | 2 +- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index bd8013e51b..d56ca9dac4 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -790,3 +790,19 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; + +/* navigation title for Silnce Pod" */ +"Silence Pod" = "Silence Pod"; + diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 415e41d1da..438c471d43 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -785,3 +785,12 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ sedan"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Tystad"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på både för varningar och för bekräftelser."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Varningar kommer inte längre använda ljud och alla bekräftelseljud kommer också att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att några poddvarningar."; diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index 4bb73b4b48..65dc794234 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -68,6 +68,7 @@ 10389A3F26FF7841002115E9 /* CRC16.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A2026FF7841002115E9 /* CRC16.swift */; }; 10389A4126FF7841002115E9 /* MessageTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A2226FF7841002115E9 /* MessageTransport.swift */; }; 191DB66D2A06F17800212AC9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 191DB6522A06F17800212AC9 /* Localizable.strings */; }; + 196A6F232AFFFD1700E3C089 /* SilencePodPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196A6F222AFFFD1200E3C089 /* SilencePodPreference.swift */; }; 84752E9326ED0FFE009FD801 /* OmniBLE.h in Headers */ = {isa = PBXBuildFile; fileRef = 84752E8526ED0FFE009FD801 /* OmniBLE.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84752ED626ED13F5009FD801 /* Id.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84752EBF26ED13F5009FD801 /* Id.swift */; }; 84752ED726ED13F5009FD801 /* X25519KeyGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84752EC126ED13F5009FD801 /* X25519KeyGenerator.swift */; }; @@ -168,7 +169,6 @@ D802CD0A27DD98C10072E3A1 /* TempBasalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD0527DD98C10072E3A1 /* TempBasalTests.swift */; }; D802CD1027DD99AB0072E3A1 /* CRC16Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD0F27DD99AB0072E3A1 /* CRC16Tests.swift */; }; D802CD1227DD9AE10072E3A1 /* BasalScheduleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D802CD1127DD9AE10072E3A1 /* BasalScheduleTests.swift */; }; - D845A1332AF89DB500EA0853 /* SilencePodPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */; }; D845A1372AF89F5500EA0853 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1362AF89F5500EA0853 /* ActivityView.swift */; }; D845A1392AF89F6300EA0853 /* FirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1382AF89F6300EA0853 /* FirstAppear.swift */; }; D845A13B2AF89F7100EA0853 /* PlayTestBeepsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */; }; @@ -302,6 +302,7 @@ 191DB66A2A06F17800212AC9 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; 191DB66B2A06F17800212AC9 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; 191DB66C2A06F17800212AC9 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; + 196A6F222AFFFD1200E3C089 /* SilencePodPreference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodPreference.swift; sourceTree = ""; }; 4B23AA6328D909E2009B453B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 4B23AA6428D909E7009B453B /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 4B23AA6528D909E9009B453B /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; @@ -428,7 +429,6 @@ D802CD0527DD98C10072E3A1 /* TempBasalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempBasalTests.swift; sourceTree = ""; }; D802CD0F27DD99AB0072E3A1 /* CRC16Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CRC16Tests.swift; sourceTree = ""; }; D802CD1127DD9AE10072E3A1 /* BasalScheduleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasalScheduleTests.swift; sourceTree = ""; }; - D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SilencePodPreference.swift; path = "/Users/Joe_1/Documents/iaps/iaps-11-05-19-dev/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/SilencePodPreference.swift"; sourceTree = ""; }; D845A1362AF89F5500EA0853 /* ActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; D845A1382AF89F6300EA0853 /* FirstAppear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstAppear.swift; sourceTree = ""; }; D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayTestBeepsView.swift; sourceTree = ""; }; @@ -493,7 +493,7 @@ 1016325627185EE4007A3BC2 /* PodProgressStatus.swift */, C1F67ED927979E400017487F /* PumpManagerAlert.swift */, C1F67EE127985F580017487F /* ReservoirLevel.swift */, - D845A1322AF89DB500EA0853 /* SilencePodPreference.swift */, + 196A6F222AFFFD1200E3C089 /* SilencePodPreference.swift */, 1016325827185EE4007A3BC2 /* UnfinalizedDose.swift */, ); path = OmnipodCommon; @@ -1147,8 +1147,8 @@ 1016325C27185EE5007A3BC2 /* BasalDeliveryTable.swift in Sources */, 84752EE326ED13F5009FD801 /* BLEPacket.swift in Sources */, D845A1402AF89F8400EA0853 /* ReadPulseLogView.swift in Sources */, - D845A1332AF89DB500EA0853 /* SilencePodPreference.swift in Sources */, 102111472709462300784F13 /* PodState.swift in Sources */, + 196A6F232AFFFD1700E3C089 /* SilencePodPreference.swift in Sources */, 1021114B2709462300784F13 /* BasalSchedule+LoopKit.swift in Sources */, 84752EE626ED13F5009FD801 /* LTKExchanger.swift in Sources */, 10389A2A26FF7841002115E9 /* MessageBlock.swift in Sources */, diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2cfe78ebfa..142d983415 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", From addab02efc5a97940f86b1b5b356b6c6f4ca6650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 12 Nov 2023 15:12:59 +0100 Subject: [PATCH 221/405] Move all "Close" buttons to the the trailing side --- .../Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 2 +- .../Modules/AddTempTarget/View/AddTempTargetRootView.swift | 2 +- .../Sources/Modules/DataTable/View/DataTableRootView.swift | 6 +++--- .../ManualTempBasal/View/ManualTempBasalRootView.swift | 2 +- .../View/OverrideProfilesRootView.swift | 2 +- .../Sources/Modules/Settings/View/SettingsRootView.swift | 2 +- FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift | 2 +- FreeAPS/Sources/Modules/Stat/View/StatRootView.swift | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index c0b9a028b3..4e36be7d4e 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -134,7 +134,7 @@ extension AddCarbs { } .navigationTitle("Add Meal") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } private var presetPopover: some View { diff --git a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift index 7aa646936e..6ccf9256ae 100644 --- a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift +++ b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift @@ -141,7 +141,7 @@ extension AddTempTarget { } .navigationTitle("Enact Temp Target") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } private func presetView(for preset: TempTarget) -> some View { diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index ee777a802a..327046d376 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -62,7 +62,7 @@ extension DataTable { .onAppear(perform: configureView) .navigationTitle("History") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) .sheet(isPresented: $showManualGlucose) { addGlucoseView } @@ -179,7 +179,7 @@ extension DataTable { .onAppear(perform: configureView) .navigationTitle("Add Glucose") .navigationBarTitleDisplayMode(.automatic) - .navigationBarItems(leading: Button("Close", action: { showManualGlucose = false })) + .navigationBarItems(trailing: Button("Close", action: { showManualGlucose = false })) } } @@ -326,7 +326,7 @@ extension DataTable { .onAppear(perform: configureView) .navigationTitle("External Insulin") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: { showExternalInsulin = false + .navigationBarItems(trailing: Button("Close", action: { showExternalInsulin = false state.externalInsulinAmount = 0 })) } } diff --git a/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift b/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift index 4b230ec9ce..93080a7f19 100644 --- a/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift +++ b/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift @@ -45,7 +45,7 @@ extension ManualTempBasal { .onAppear(perform: configureView) .navigationTitle("Manual Temp Basal") .navigationBarTitleDisplayMode(.automatic) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index a43883b0e3..76d51be136 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -271,7 +271,7 @@ extension OverrideProfilesConfig { .onAppear { state.savedSettings() } .navigationBarTitle("Profiles") .navigationBarTitleDisplayMode(.automatic) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } @ViewBuilder private func profilesView(for preset: OverridePresets) -> some View { diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 6cce471d00..9130f97629 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -133,7 +133,7 @@ extension Settings { } .onAppear(perform: configureView) .navigationTitle("Settings") - .navigationBarItems(leading: Button("Close", action: state.hideSettingsModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideSettingsModal)) .navigationBarTitleDisplayMode(.inline) .onDisappear(perform: { state.uploadProfileAndSettings(false) }) } diff --git a/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift b/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift index a476719d5d..fefb226d30 100644 --- a/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift +++ b/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift @@ -117,7 +117,7 @@ extension Snooze { } .navigationBarTitle("Snooze Alerts") .navigationBarTitleDisplayMode(.automatic) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) .onAppear { configureView() snoozeDescription = getSnoozeDescription() diff --git a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift index 021c553572..bf116c6f46 100644 --- a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift @@ -149,7 +149,7 @@ extension Stat { .onAppear(perform: configureView) .navigationBarTitle("Statistics") .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: Button("Close", action: state.hideModal)) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } } } From 70ceb0dd72b244537439d8a989d9ae620dc7929d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 12 Nov 2023 17:29:58 +0100 Subject: [PATCH 222/405] Add SF-symbol for Back --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 8 ++++++-- .../Modules/Bolus/View/DefaultBolusCalcRootView.swift | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 7427593dc6..8ab1b4ff9a 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -170,8 +170,12 @@ extension Bolus { leading: Button { carbsView() } - label: { Text(fetch ? "Back" : "Meal") }, - + label: { + HStack { + Image(systemName: "chevron.backward") + Text("Meal") + } + }, trailing: Button { state.hideModal() } label: { Text("Close") } ) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 3ad2b7b235..1f173ad412 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -155,8 +155,12 @@ extension Bolus { leading: Button { carbsView() } - label: { Text(fetch ? "Back" : "Meal") }, - + label: { + HStack { + Image(systemName: "chevron.backward") + Text("Meal") + } + }, trailing: Button { state.hideModal() } label: { Text("Close") } ) From 774fb1646fe6d9fb6d192af1159e4f3750c8d736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 12 Nov 2023 22:13:11 +0100 Subject: [PATCH 223/405] More pod strings --- .../en.lproj/Localizable.strings | 14 ++++++++++ .../Resources/en.lproj/Localizable.strings | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index d56ca9dac4..8d94a9d337 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -806,3 +806,17 @@ /* navigation title for Silnce Pod" */ "Silence Pod" = "Silence Pod"; +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; + +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 5a1a04e9bb..02a585a422 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -765,4 +765,32 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; + +/* navigation title for Silnce Pod" */ +"Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; + +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; From b162ebb98d8ef075779f0824fa1b5e089beade67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 12 Nov 2023 22:42:57 +0100 Subject: [PATCH 224/405] Localization work --- .../OmniBLE/Localizations/ar.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/bn.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/ca.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/da.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/de.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/es.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/fi.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/fr.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/he.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/it.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/ja.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/lt.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/nb.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/nl.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/pl.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/pt-BR.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/pt-PT.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/ro.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/ru.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/sk.lproj/Localizable.strings | 6 +++--- .../OmniBLE/Localizations/sv.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/tr.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/uk.lproj/Localizable.strings | 4 ++-- .../OmniBLE/Localizations/vi.lproj/Localizable.strings | 6 +++--- .../Localizations/zh-Hans.lproj/Localizable.strings | 6 +++--- .../OmniBLE/PumpManagerUI/Views/AttachPodView.swift | 2 +- Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings | 8 +++++--- Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings | 6 +++--- .../OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings | 6 +++--- Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings | 6 +++--- .../OmniKit/Resources/ar.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/da.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/de.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/en.lproj/Localizable.strings | 5 +++-- .../OmniKit/Resources/es.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/fi.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/fr.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/he.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/it.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/nb.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/nl.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/pl.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/pt-BR.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/ro.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/ru.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/sk.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/sv.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/tr.lproj/Localizable.strings | 4 ++-- .../OmniKit/Resources/zh-Hans.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/ar.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/cs.lproj/Localizable.strings | 2 +- .../OmniKitUI/Resources/da.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/de.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/en.lproj/Localizable.strings | 7 +++++-- .../OmniKitUI/Resources/es.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/fi.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/fr.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/he.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/it.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/nb.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/nl.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/pl.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/pt-BR.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/ro.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/ru.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/sk.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/sv.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/tr.lproj/Localizable.strings | 4 ++-- .../OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings | 4 ++-- .../Localizations/Main/ar.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/ca.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/da.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/de.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/en.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/es.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/fi.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/fr.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/he.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/it.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/nb.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/nl.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/pl.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/pt-BR.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/pt-PT.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/ru.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/sk.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/sv.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/tr.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/uk.lproj/Localizable.strings | 6 +++--- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 6 +++--- 103 files changed, 261 insertions(+), 255 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index 2f76433a27..be5dac0ba4 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings index 5305555e86..77af0f085c 100644 --- a/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings index 5305555e86..77af0f085c 100644 --- a/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index ba32842173..fa33e79ba7 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Der anvendes ingen tillidspåmindelser."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når iAPS automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når iAPS automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når iAPS automatisk justerer tilførslen og de kommandoer, du sætter igang."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når iAPS automatisk justerer tilførslen og de kommandoer, du sætter igang."; /* Label text for temporary basal rate summary */ "Rate" = "Værdi"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 85eb6c3b15..b23340a91a 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; /* Label text for temporary basal rate summary */ "Rate" = "BR"; diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 8d94a9d337..0f898afaee 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -435,7 +435,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -606,10 +606,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 887b5e5ece..7ab0a8f0ae 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Ratio"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index febdf4e6fb..9b7ecf0199 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index d127cd2965..c79f81251d 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; /* Label text for temporary basal rate summary */ "Rate" = "Taux"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index 2f76433a27..be5dac0ba4 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index bbb48733d1..ff3ace7b8b 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* Label text for temporary basal rate summary */ "Rate" = "Valore"; diff --git a/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings index d63473b325..6cdb095bde 100644 --- a/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings @@ -435,7 +435,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -606,10 +606,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings index 5305555e86..77af0f085c 100644 --- a/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index a23bd629fd..89d51c7527 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; /* Label text for temporary basal rate summary */ "Rate" = "Ratio"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 65c9f796be..f02cb995cb 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die u hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die u hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die u initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die u initieert."; /* Label text for temporary basal rate summary */ "Rate" = "Waarde"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index 60976f83ed..f4a1399cc0 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index a5a676276a..1a24550313 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Taxa"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index c0c73d2a78..37b1278d8d 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Taxa"; diff --git a/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings index d63473b325..6cdb095bde 100644 --- a/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings @@ -435,7 +435,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -606,10 +606,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 9829fbfae3..7acd4b0de3 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for temporary basal rate summary */ "Rate" = "Скорость"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 61b21cee17..535f8637d9 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 438c471d43..a6cda647bd 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Inga ljud på."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; /* Label text for temporary basal rate summary */ "Rate" = "Värde"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 86849df9a5..607dac7e22 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Onay sesi kullanılmaz."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; /* Label text for temporary basal rate summary */ "Rate" = "Oran"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index e4c70e1ec5..35d60fe3ad 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли петля автоматично регулює доставку, а також для команд, які ви ініціюєте."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли петля автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* Label text for temporary basal rate summary */ "Rate" = "Швидкість"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index d63473b325..6cdb095bde 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -435,7 +435,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -606,10 +606,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Rate"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 446ebb6a11..2fe9c6f687 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "输注率"; diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift index 93e8d74025..4d551aa4f0 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/AttachPodView.swift @@ -33,7 +33,7 @@ struct AttachPodView: View { HStack { InstructionList(instructions: [ LocalizedString("Prepare site.", comment: "Label text for step one of attach pod instructions"), - LocalizedString("Remove the Pod's blue needle cap and check cannula. Then remove paper backing.", comment: "Label text for step two of attach pod instructions"), + LocalizedString("Remove the Pod's blue needle cap and check cannula. Then remove paper backing.", comment: "Label text for step 1 of pair pod instructions "), LocalizedString("Check Pod, apply to site, then confirm pod attachment.", comment: "Label text for step three of attach pod instructions") ]) } diff --git a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings index c5ec1ac935..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Section header for configuration section */ "Configuration" = "Konfiguration"; diff --git a/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings index 66f91d0dd0..b728dd9286 100644 --- a/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings @@ -65,7 +65,7 @@ "Comms Recovered" = "Komunikace obnovena"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Ujištující upozornění jsou pípnutí podu, které lze použít k potvrzení zadaných příkazů."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Ujištující upozornění jsou pípnutí podu, které lze použít k potvrzení zadaných příkazů."; /* Section header for configuration section */ "Configuration" = "Konfigurace"; diff --git a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings index c2fb961f98..e04b4b4ec2 100644 --- a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Påmindelse om succesfulde aktiviteter"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Påmindelse om succesfulde aktiviteter er bip fra Pod'en, som kan bruges til at bekræfte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påmindelse om succesfulde aktiviteter er bip fra Pod'en, som kan bruges til at bekræfte valgte kommandoer."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når Loop automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når Loop automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når Loop automatisk justerer tilførslen og de kommandoer, du sætter igang."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når Loop automatisk justerer tilførslen og de kommandoer, du sætter igang."; /* Section header for configuration section */ "Configuration" = "Konfiguration"; diff --git a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings index c5ec1ac935..5d77765663 100644 --- a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Section header for configuration section */ "Configuration" = "Konfiguration"; @@ -1128,3 +1128,5 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ihr Pod gibt möglicherweise immer noch Insulin ab.\nEntfernen Sie ihn vom Körper und tippen dann auf „Weiter“."; +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings index e93e12ed71..0567fb182f 100644 --- a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Recordatorios de confianza"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Los recordatorios de confianza son pitidos que emite el Pod que pueden utilizarse para tener certeza de que se han seleccionado comandos."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Los recordatorios de confianza son pitidos que emite el Pod que pueden utilizarse para tener certeza de que se han seleccionado comandos."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Los recordatorios de confianza sonarán para los comandos que seleccione, como bolo, cancelar bolo, suspender, reanudar, guardar recordatorios de notificación, etc. Cuando Loop ajusta automáticamente la administración de insulina, no se utilizan recordatorios de confianza."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Los recordatorios de confianza sonarán para los comandos que seleccione, como bolo, cancelar bolo, suspender, reanudar, guardar recordatorios de notificación, etc. Cuando Loop ajusta automáticamente la administración de insulina, no se utilizan recordatorios de confianza."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Recordatorios de confianza sonarán cuando Loop automáticamente ajuste la administración de insulina, así como para los comandos que selecciones."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Recordatorios de confianza sonarán cuando Loop automáticamente ajuste la administración de insulina, así como para los comandos que selecciones."; /* Section header for configuration section */ "Configuration" = "Configuración"; diff --git a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings index 55790abdbc..195019eb84 100644 --- a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Rappels de confiance"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentiront pour les commandes que vous initiez, comme administrer ou annuler un bolus, suspendre, reprendre, enregistrer les rappels de notification, etc. Lorsque Loop ajuste automatiquement l'administration, aucun rappel de confiance n’est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentiront pour les commandes que vous initiez, comme administrer ou annuler un bolus, suspendre, reprendre, enregistrer les rappels de notification, etc. Lorsque Loop ajuste automatiquement l'administration, aucun rappel de confiance n’est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentiront lorsque Loop ajustera automatiquement l'administration ainsi que pour les commandes que vous lancez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentiront lorsque Loop ajustera automatiquement l'administration ainsi que pour les commandes que vous lancez."; /* Section header for configuration section */ "Configuration" = "Configuration"; diff --git a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings index f6c26054b8..46fadec09f 100644 --- a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Promemoria di fiducia"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, ecc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, ecc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* Section header for configuration section */ "Configuration" = "Configurazione"; diff --git a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings index ac12ec90db..258d3dc9dd 100644 --- a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Bekreftelser"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Tillitspåminnelser er pip fra pod som kan brukes til å bekrefte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Tillitspåminnelser er pip fra pod som kan brukes til å bekrefte valgte kommandoer."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Tillitspåminnelser høres for kommandoer du starter, for eksempel bolus, avbryt bolus, suspendere, gjenoppta, lagre varslingspåminnelser osv. Når Loop automatisk justerer leveringen, brukes mistillitspåminnelser."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Tillitspåminnelser høres for kommandoer du starter, for eksempel bolus, avbryt bolus, suspendere, gjenoppta, lagre varslingspåminnelser osv. Når Loop automatisk justerer leveringen, brukes mistillitspåminnelser."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Tillitspåminnelser vil høres når Loop automatisk justerer leveringen så vel som for kommandoer du starter."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Tillitspåminnelser vil høres når Loop automatisk justerer leveringen så vel som for kommandoer du starter."; /* Section header for configuration section */ "Configuration" = "Konfigurasjon"; diff --git a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings index fac8f7a749..31df48538a 100644 --- a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Bevestigingsherinneringen"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Bevestigingsherinneringen zijn piepjes van de pod die kunnen worden gebruikt ter bevestiging van de geselecteerde opdrachten."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bevestigingsherinneringen zijn piepjes van de pod die kunnen worden gebruikt ter bevestiging van de geselecteerde opdrachten."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bevestigingsherinneringen zijn hoorbaar voor opdrachten die je start, zoals bolussen, bolus annuleren, onderbreken, hervatten, meldingsherinneringen opslaan, enz. Wanneer Loop de toediening automatisch aanpast, zijn er geen bevestigingsherinneringen hoorbaar."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bevestigingsherinneringen zijn hoorbaar voor opdrachten die je start, zoals bolussen, bolus annuleren, onderbreken, hervatten, meldingsherinneringen opslaan, enz. Wanneer Loop de toediening automatisch aanpast, zijn er geen bevestigingsherinneringen hoorbaar."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bevestigingsherinneringen zijn hoorbaar wanneer Loop de toediening automatisch aanpast, evenals voor opdrachten die je geeft."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bevestigingsherinneringen zijn hoorbaar wanneer Loop de toediening automatisch aanpast, evenals voor opdrachten die je geeft."; /* Section header for configuration section */ "Configuration" = "Configuratie"; diff --git a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings index 9b69b4f5e4..7c3a7beea3 100644 --- a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Przypomnienia (sygnały dźwiękowe) z POD'a"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Przypomnienia potwierdzające to sygnały dźwiękowe, z których można korzystać w celu potwierdzania wybranych poleceń."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Przypomnienia potwierdzające to sygnały dźwiękowe, z których można korzystać w celu potwierdzania wybranych poleceń."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Przypomnienia (sygnały dźwiękowe) będą emitowane w przypadku poleceń, które zainicjujesz, takich jak bolus, anulowanie bolusa, wstrzymanie, wznowienie, zapisanie przypomnień o powiadomieniach itp. Kiedy Loop automatycznie dostosowuje podawanie, nie są używane żadne sygnały dźwiękowe."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Przypomnienia (sygnały dźwiękowe) będą emitowane w przypadku poleceń, które zainicjujesz, takich jak bolus, anulowanie bolusa, wstrzymanie, wznowienie, zapisanie przypomnień o powiadomieniach itp. Kiedy Loop automatycznie dostosowuje podawanie, nie są używane żadne sygnały dźwiękowe."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Przypomnienia potwierdzające są emitowane, gdy Loop automatycznie dostosowuje podawanie insuliny, a także w przypadku poleceń inicjowanych przez użytkownika."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Przypomnienia potwierdzające są emitowane, gdy Loop automatycznie dostosowuje podawanie insuliny, a także w przypadku poleceń inicjowanych przez użytkownika."; /* Section header for configuration section */ "Configuration" = "Konfiguracja"; diff --git a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings index c5ec1ac935..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Section header for configuration section */ "Configuration" = "Konfiguration"; diff --git a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings index 16564198b3..cb10880234 100644 --- a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Mementouri de confimare"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Memento-urile de confirmare sunt semnale sonore de la Pod care pot fi folosite pentru confirmarea comenzilor selectate."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Memento-urile de confirmare sunt semnale sonore de la Pod care pot fi folosite pentru confirmarea comenzilor selectate."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Mementourile de confirmare vor suna pentru comenzile pe care le inițiați, precum bolus, anualarea bolusului, suspendare, reluare, salvarea mementourilor de confirmare etc. Când Loop ajustează automat administrarea, nu sunt folosite mementouri de confirmare."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Mementourile de confirmare vor suna pentru comenzile pe care le inițiați, precum bolus, anualarea bolusului, suspendare, reluare, salvarea mementourilor de confirmare etc. Când Loop ajustează automat administrarea, nu sunt folosite mementouri de confirmare."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Mementourile de confirmare vor suna atunci când Loop ajustează automat administrare, precum și pentru comenzile pe care le inițiați."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Mementourile de confirmare vor suna atunci când Loop ajustează automat administrare, precum și pentru comenzile pe care le inițiați."; /* Section header for configuration section */ "Configuration" = "Configurare"; diff --git a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings index 8875740bcf..8766306e8a 100644 --- a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Напоминания об уверенности"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Напоминания об уверенности - это звуковые сигналы, подаваемые подом, которые можно использовать для подтверждения выбранных команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Напоминания об уверенности - это звуковые сигналы, подаваемые подом, которые можно использовать для подтверждения выбранных команд."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Напоминания будут звучать для инициированных вами команд, таких как болюс, отмена болюса, приостановка, возобновление, напоминания о сохранении уведомлений и т.д. Когда Loop автоматически регулирует подачу инсулина, напоминания не будут использоваться."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Напоминания будут звучать для инициированных вами команд, таких как болюс, отмена болюса, приостановка, возобновление, напоминания о сохранении уведомлений и т.д. Когда Loop автоматически регулирует подачу инсулина, напоминания не будут использоваться."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Напоминания будут звучать, когда Loop автоматически регулирует подачу инсулина, а также для команд, которые вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Напоминания будут звучать, когда Loop автоматически регулирует подачу инсулина, а также для команд, которые вы инициируете."; /* Section header for configuration section */ "Configuration" = "Конфигурация"; diff --git a/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings index dd28a6c248..09e8ac7b2f 100644 --- a/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings @@ -130,13 +130,13 @@ "Communication issue: Unacknowledged command pending." = "Problém s komunikáciou: Čaká sa na potvrdenie príkazu."; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Potvrdzovacie pripomienky sú pípnutia z podu, ktoré možno použiť pre potvrdenie vybraných príkazov."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Potvrdzovacie pripomienky sú pípnutia z podu, ktoré možno použiť pre potvrdenie vybraných príkazov."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Pripomienky spoľahlivosti zaznejú pri príkazoch, ktoré spustíte, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie upozornení atď. Keď Loop automaticky upraví podanie, nepoužijú sa žiadne pripomenutia spoľahlivosti."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Pripomienky spoľahlivosti zaznejú pri príkazoch, ktoré spustíte, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie upozornení atď. Keď Loop automaticky upraví podanie, nepoužijú sa žiadne pripomenutia spoľahlivosti."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Keď Loop automaticky upraví podávanie, ako aj prevedie príkazy, ktoré iniciujete, zaznejú pripomenutia spoľahlivosti."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Keď Loop automaticky upraví podávanie, ako aj prevedie príkazy, ktoré iniciujete, zaznejú pripomenutia spoľahlivosti."; /* Section header for configuration section */ "Configuration" = "Konfigurácia"; diff --git a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings index 76200f959a..1ab6aa045c 100644 --- a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Emniyet Hatırlatıcıları"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Emniyet hatırlatıcıları, poddan gelen ve seçilen komutları onaylamak için kullanılabilen bip sesleridir."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Emniyet hatırlatıcıları, poddan gelen ve seçilen komutları onaylamak için kullanılabilen bip sesleridir."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Emniyet hatırlatıcıları, bolus, bolus iptali, askıya alma, devam ettirme, bildirim hatırlatıcılarını kaydetme gibi başlattığınız komutlar için çalacaktır. Loop iletimi otomatik olarak ayarladığında emniyet hatırlatıcıları kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Emniyet hatırlatıcıları, bolus, bolus iptali, askıya alma, devam ettirme, bildirim hatırlatıcılarını kaydetme gibi başlattığınız komutlar için çalacaktır. Loop iletimi otomatik olarak ayarladığında emniyet hatırlatıcıları kullanılmaz."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Emniyet hatırlatıcıları, Başlattığınız komutların yanı sıra Loop iletimi otomatik olarak ayarladığında çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Emniyet hatırlatıcıları, Başlattığınız komutların yanı sıra Loop iletimi otomatik olarak ayarladığında çalacaktır."; /* Section header for configuration section */ "Configuration" = "Konfigürasyon"; diff --git a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings index c5ec1ac935..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings @@ -191,13 +191,13 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* No comment provided by engineer. */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Section header for configuration section */ "Configuration" = "Konfiguration"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ar.lproj/Localizable.strings index e7871f9b3c..496f0367fb 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ar.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings index 6909cbbfce..14e8ddb98d 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Uerkendt kommando afventer."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når Loop automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når Loop automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når Loop automatisk justerer tilførslen og de kommandoer, du sætter igang."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når Loop automatisk justerer tilførslen og de kommandoer, du sætter igang."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritisk Pod-fejl"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings index 2776e4fc9a..8c7de48334 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Unbestätigter Befehl steht noch aus."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritischer Pod-Fehler"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/en.lproj/Localizable.strings index e7871f9b3c..0e1b974d1c 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/en.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; @@ -426,3 +426,4 @@ /* Description waiting for pairing reminder */ "Waiting for pairing reminder" = "Waiting for pairing reminder"; + diff --git a/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings index 9ea994a781..96c8667908 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problema de comunicación: Pendiente de confirmar comando."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Los recordatorios de confianza sonarán para los comandos que seleccione, como bolo, cancelar bolo, suspender, reanudar, guardar recordatorios de notificación, etc. Cuando Loop ajusta automáticamente la administración de insulina, no se utilizan recordatorios de confianza."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Los recordatorios de confianza sonarán para los comandos que seleccione, como bolo, cancelar bolo, suspender, reanudar, guardar recordatorios de notificación, etc. Cuando Loop ajusta automáticamente la administración de insulina, no se utilizan recordatorios de confianza."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Recordatorios de confianza sonarán cuando Loop automáticamente ajuste la administración de insulina, así como para los comandos que selecciones."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Recordatorios de confianza sonarán cuando Loop automáticamente ajuste la administración de insulina, así como para los comandos que selecciones."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Error crítico del Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/fi.lproj/Localizable.strings index c4f828d163..81c1d07af0 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/fi.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings index 55a4a2965d..9656e873ff 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problème de communication : Commande en attente sans accusé de réception."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentiront pour les commandes que vous initiez, comme administrer ou annuler un bolus, suspendre, reprendre, enregistrer les rappels de notification, etc. Lorsque Loop ajuste automatiquement l'administration, aucun rappel de confiance n’est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentiront pour les commandes que vous initiez, comme administrer ou annuler un bolus, suspendre, reprendre, enregistrer les rappels de notification, etc. Lorsque Loop ajuste automatiquement l'administration, aucun rappel de confiance n’est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentiront lorsque Loop ajustera automatiquement l'administration ainsi que pour les commandes que vous lancez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentiront lorsque Loop ajustera automatiquement l'administration ainsi que pour les commandes que vous lancez."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Erreur critique du Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/he.lproj/Localizable.strings index ab206177fb..cad7281581 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/he.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings index 3b4abda616..379fc593b0 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problema di comunicazione: comando di conferma in attesa."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, ecc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, ecc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Errore critico Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings index 18e2714c1e..2aedb9b665 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikasjonsproblem: Ukjent kommando venter."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Tillitspåminnelser høres for kommandoer du starter, for eksempel bolus, avbryt bolus, suspendere, gjenoppta, lagre varslingspåminnelser osv. Når Loop automatisk justerer leveringen, brukes mistillitspåminnelser."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Tillitspåminnelser høres for kommandoer du starter, for eksempel bolus, avbryt bolus, suspendere, gjenoppta, lagre varslingspåminnelser osv. Når Loop automatisk justerer leveringen, brukes mistillitspåminnelser."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Tillitspåminnelser vil høres når Loop automatisk justerer leveringen så vel som for kommandoer du starter."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Tillitspåminnelser vil høres når Loop automatisk justerer leveringen så vel som for kommandoer du starter."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Pod-feil"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings index 22e15218a1..f97fe8000a 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communicatieprobleem: niet-bevestigde opdracht in behandeling"; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritieke Pod fout"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings index 0c501838ec..278a77ef93 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problem z komunikacją: Niepotwierdzone polecenie w toku."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Przypomnienia (sygnały dźwiękowe) będą emitowane w przypadku poleceń, które zainicjujesz, takich jak bolus, anulowanie bolusa, wstrzymanie, wznowienie, zapisanie przypomnień o powiadomieniach itp. Kiedy Loop automatycznie dostosowuje podawanie, nie są używane żadne sygnały dźwiękowe."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Przypomnienia (sygnały dźwiękowe) będą emitowane w przypadku poleceń, które zainicjujesz, takich jak bolus, anulowanie bolusa, wstrzymanie, wznowienie, zapisanie przypomnień o powiadomieniach itp. Kiedy Loop automatycznie dostosowuje podawanie, nie są używane żadne sygnały dźwiękowe."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Przypomnienia potwierdzające są emitowane, gdy Loop automatycznie dostosowuje podawanie insuliny, a także w przypadku poleceń inicjowanych przez użytkownika."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Przypomnienia potwierdzające są emitowane, gdy Loop automatycznie dostosowuje podawanie insuliny, a także w przypadku poleceń inicjowanych przez użytkownika."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Krytyczny błąd POD'a"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/pt-BR.lproj/Localizable.strings index d0c96cb01d..6e7f038591 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/pt-BR.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ro.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ro.lproj/Localizable.strings index 99c8c7c98a..017cd6bb15 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ro.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ro.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problemă de comunicare: comandă nerecunoscută în așteptare."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Mementourile de confirmare vor suna pentru comenzile pe care le inițiați, precum bolus, anualarea bolusului, suspendare, reluare, salvarea mementourilor de confirmare etc. Când Loop ajustează automat administrarea, nu sunt folosite mementouri de confirmare."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Mementourile de confirmare vor suna pentru comenzile pe care le inițiați, precum bolus, anualarea bolusului, suspendare, reluare, salvarea mementourilor de confirmare etc. Când Loop ajustează automat administrarea, nu sunt folosite mementouri de confirmare."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Mementourile de confirmare vor suna atunci când Loop ajustează automat administrare, precum și pentru comenzile pe care le inițiați."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Mementourile de confirmare vor suna atunci când Loop ajustează automat administrare, precum și pentru comenzile pe care le inițiați."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Eroare critică Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings index b45f1a2099..ab36346f6b 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема со связью: ожидается неподтвержденная команда."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Напоминания будут звучать для инициированных вами команд, таких как болюс, отмена болюса, приостановка, возобновление, напоминания о сохранении уведомлений и т.д. Когда Loop автоматически регулирует подачу инсулина, напоминания не будут использоваться."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Напоминания будут звучать для инициированных вами команд, таких как болюс, отмена болюса, приостановка, возобновление, напоминания о сохранении уведомлений и т.д. Когда Loop автоматически регулирует подачу инсулина, напоминания не будут использоваться."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Напоминания будут звучать, когда Loop автоматически регулирует подачу инсулина, а также для команд, которые вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Напоминания будут звучать, когда Loop автоматически регулирует подачу инсулина, а также для команд, которые вы инициируете."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критическая ошибка пода"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings index 04a8aba4ff..e7599483f1 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problém s komunikáciou: Čaká sa na potvrdenie príkazu."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Pripomienky spoľahlivosti zaznejú pri príkazoch, ktoré spustíte, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie upozornení atď. Keď Loop automaticky upraví podanie, nepoužijú sa žiadne pripomenutia spoľahlivosti."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Pripomienky spoľahlivosti zaznejú pri príkazoch, ktoré spustíte, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie upozornení atď. Keď Loop automaticky upraví podanie, nepoužijú sa žiadne pripomenutia spoľahlivosti."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Keď Loop automaticky upraví podávanie, ako aj prevedie príkazy, ktoré iniciujete, zaznejú pripomenutia spoľahlivosti."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Keď Loop automaticky upraví podávanie, ako aj prevedie príkazy, ktoré iniciujete, zaznejú pripomenutia spoľahlivosti."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings index 43f051db03..4989d732b1 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Obekräftat kommando väntar."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritiskt poddfel"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings index 49b381f078..25f45ad597 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "İletişim sorunu: Onaylanmamış komut beklemede."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Emniyet hatırlatıcıları, bolus, bolus iptali, askıya alma, devam ettirme, bildirim hatırlatıcılarını kaydetme gibi başlattığınız komutlar için çalacaktır. Loop iletimi otomatik olarak ayarladığında emniyet hatırlatıcıları kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Emniyet hatırlatıcıları, bolus, bolus iptali, askıya alma, devam ettirme, bildirim hatırlatıcılarını kaydetme gibi başlattığınız komutlar için çalacaktır. Loop iletimi otomatik olarak ayarladığında emniyet hatırlatıcıları kullanılmaz."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Emniyet hatırlatıcıları, Başlattığınız komutların yanı sıra Loop iletimi otomatik olarak ayarladığında çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Emniyet hatırlatıcıları, Başlattığınız komutların yanı sıra Loop iletimi otomatik olarak ayarladığında çalacaktır."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritik Pod Hatası"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings index 339e59c33e..91d00da528 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index 0519d1af2d..35989663bf 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "المعطيات"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings index 5c0604249a..c11489e842 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings @@ -53,7 +53,7 @@ "Comms Recovered" = "Komunikace obnovena"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Ujištující upozornění jsou pípnutí podu, které lze použít k potvrzení zadaných příkazů."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Ujištující upozornění jsou pípnutí podu, které lze použít k potvrzení zadaných příkazů."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurace"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index 7b326799c6..a299a14d09 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Påmindelse om succesfulde aktiviteter"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Påmindelse om succesfulde aktiviteter er bip fra Pod'en, som kan bruges til at bekræfte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påmindelse om succesfulde aktiviteter er bip fra Pod'en, som kan bruges til at bekræfte valgte kommandoer."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Fjern pumpe"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index f1358a657d..4299d6289b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pumpe löschen"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Entferne die Nadelkappe des Pods und überprüfe die Kanüle. Dann entferne die Papierträger."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Entferne die Nadelkappe des Pods und überprüfe die Kanüle. Dann entferne die Papierträger."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 02a585a422..6bbe410f4e 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -794,3 +794,6 @@ /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index b9808cb7fa..20a4fc5a06 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Recordatorios de confianza"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Los recordatorios de confianza son pitidos que emite el Pod que pueden utilizarse para tener certeza de que se han seleccionado comandos."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Los recordatorios de confianza son pitidos que emite el Pod que pueden utilizarse para tener certeza de que se han seleccionado comandos."; /* The title of the configuration section in settings */ "Configuration" = "Configuración"; @@ -547,7 +547,7 @@ "Remove Pump" = "Retire la bomba"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Retire la tapa de la aguja del Pod y compruebe la cánula. A continuación, retire el envoltorio de papel de la parte de atrás."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Retire la tapa de la aguja del Pod y compruebe la cánula. A continuación, retire el envoltorio de papel de la parte de atrás."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index 8fb85ec072..0e6c69402c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Määritykset"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index f2af2a449a..d41ff39947 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Rappels de confiance"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; /* The title of the configuration section in settings */ "Configuration" = "Configuration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Retirer la pompe"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Retirez le capuchon d'aiguille du pod et vérifiez la canule. Retirez ensuite le film en papier de l'autocollant."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Retirez le capuchon d'aiguille du pod et vérifiez la canule. Retirez ensuite le film en papier de l'autocollant."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index 9c1c15e512..ea29f66339 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index c2aefd178f..69c03f993a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Promemoria di fiducia"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; /* The title of the configuration section in settings */ "Configuration" = "Configurazione"; @@ -547,7 +547,7 @@ "Remove Pump" = "Rimuovere microinfusore"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio dell'ago del Pod e controllare la cannula. Quindi rimuovere le due coperture di carta."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio dell'ago del Pod e controllare la cannula. Quindi rimuovere le due coperture di carta."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index 87e4b09712..b1d015e75f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekreftelser"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Tillitspåminnelser er pip fra pod som kan brukes til å bekrefte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Tillitspåminnelser er pip fra pod som kan brukes til å bekrefte valgte kommandoer."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurasjon"; @@ -547,7 +547,7 @@ "Remove Pump" = "Fjern pumpen"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Fjern kanylehetten til pod og sjekk kanylen. Fjern deretter plasterbeskyttelsen."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Fjern kanylehetten til pod og sjekk kanylen. Fjern deretter plasterbeskyttelsen."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 6138e64402..60357bd1a6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; /* The title of the configuration section in settings */ "Configuration" = "Configuratie"; @@ -547,7 +547,7 @@ "Remove Pump" = "Verwijder Pomp"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 5cbdbadad8..4f95960ae6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Przypomnienia (sygnały dźwiękowe) z POD'a"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Przypomnienia potwierdzające to sygnały dźwiękowe, z których można korzystać w celu potwierdzania wybranych poleceń."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Przypomnienia potwierdzające to sygnały dźwiękowe, z których można korzystać w celu potwierdzania wybranych poleceń."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguracja"; @@ -547,7 +547,7 @@ "Remove Pump" = "Usuń pompę"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Usuń osłonę igły i sprawdź kaniulę. Następnie usuń papierowe zabezpieczenie kleju."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Usuń osłonę igły i sprawdź kaniulę. Następnie usuń papierowe zabezpieczenie kleju."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index d16292ed24..68a61b2c44 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuração"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings index 070106fb39..181c0100aa 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Mementouri de confimare"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Memento-urile de confirmare sunt semnale sonore de la Pod care pot fi folosite pentru confirmarea comenzilor selectate."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Memento-urile de confirmare sunt semnale sonore de la Pod care pot fi folosite pentru confirmarea comenzilor selectate."; /* The title of the configuration section in settings */ "Configuration" = "Configurare"; @@ -550,7 +550,7 @@ "Remove Pump" = "Ștergeți pompa"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Scoateți capacul acului de pe Pod și verificați canula. Apoi înlăturați eticheta de hârtie de pe spate."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Scoateți capacul acului de pe Pod și verificați canula. Apoi înlăturați eticheta de hârtie de pe spate."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 42ceebd4c4..ff4e8eac0d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Напоминания об уверенности"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Напоминания об уверенности - это звуковые сигналы, подаваемые подом, которые можно использовать для подтверждения выбранных команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Напоминания об уверенности - это звуковые сигналы, подаваемые подом, которые можно использовать для подтверждения выбранных команд."; /* The title of the configuration section in settings */ "Configuration" = "Конфигурация"; @@ -547,7 +547,7 @@ "Remove Pump" = "Удалите помпу"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Отломите защитную крышку канюли и проверьте состояние самой канюли. Далее снимите защитные стикеры с пластыря."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Отломите защитную крышку канюли и проверьте состояние самой канюли. Далее снимите защитные стикеры с пластыря."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 85316d2f46..045b780a5f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Potvrdzovacie pripomienky sú pípnutia z podu, ktoré možno použiť pre potvrdenie vybraných príkazov."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Potvrdzovacie pripomienky sú pípnutia z podu, ktoré možno použiť pre potvrdenie vybraných príkazov."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurácia"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Odstráňte kryt z ihly a skontrolujte kanylu. Potom odstráňte papierovú podložku."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Odstráňte kryt z ihly a skontrolujte kanylu. Potom odstráňte papierovú podložku."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index df7077505f..f492a5a986 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekräftelseljud"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Ta bort podd"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Ta bort kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Ta bort kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 473b27f198..04d13dc9fe 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Emniyet Hatırlatıcıları"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Emniyet hatırlatıcıları, poddan gelen ve seçilen komutları onaylamak için kullanılabilen bip sesleridir."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Emniyet hatırlatıcıları, poddan gelen ve seçilen komutları onaylamak için kullanılabilen bip sesleridir."; /* The title of the configuration section in settings */ "Configuration" = "Konfigürasyon"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pompayı Çıkar"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Pod'un iğne kapağını çıkarın ve kanülü kontrol edin. Ardından yapışkan kağıt desteğini çıkarın."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Pod'un iğne kapağını çıkarın ve kanülü kontrol edin. Ardından yapışkan kağıt desteğini çıkarın."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 999e5a8e54..1483f170a3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "配置"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 1597de3f5e..5559909284 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings index 715cccca8c..26a52518a4 100644 --- a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings @@ -1291,7 +1291,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1321,10 +1321,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 7eeafc2684..8fa8acf7c0 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Gemmer..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index bc54c5adc8..94e9df74cc 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Pumpe Bestätigungstöne"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Bestätigungshinweise sind Pieptöne des Pods, die zur Quittierung ausgewählter Befehle aktiviert werden können."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bestätigungshinweise sind Pieptöne des Pods, die zur Quittierung ausgewählter Befehle aktiviert werden können."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Speichern..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard Ablauf-Erinnerung"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 46f2d6f106..aed8151a98 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1481,7 +1481,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1511,10 +1511,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index edf64dcdaa..14de70f089 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Guardando..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index e258f97b27..46078a76ab 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 6769eff5cd..2f204b7036 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Les rappels de confiance sont des bips du pod qui peuvent être utilisés pour reconnaître les commandes sélectionnées."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips du pod qui peuvent être utilisés pour reconnaître les commandes sélectionnées."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sauvegarde..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Rappel d'expiration activé"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 1597de3f5e..5559909284 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index ae83898f2b..0226f2b5a3 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Promemoria Di Sicurezza"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sto salvando..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Promemoria scadenza predefinito"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 671d84abb7..c862fdc8fd 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekreftelseslyder"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Bekreftelseslyder er pipelyder fra pod som kan brukes som kvittering for utførte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekreftelseslyder er pipelyder fra pod som kan brukes som kvittering for utførte kommandoer."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Lagrer..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Utløpspåminnelse"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 6c830ddbdd..4bc9045c65 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Dit zijn meldingen die met piepjes uit de pod komen en kunnen worden gebruikt om geselecteerde opdrachten te erkennen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de pod komen en kunnen worden gebruikt om geselecteerde opdrachten te erkennen."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Opslaan..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Herinnering vervaldatum ingeschakeld"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index cc5c6b8a54..7ccb42ef6d 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1476,7 +1476,7 @@ Połączono z Nightscout!"; /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Zapisywanie..."; @@ -1506,10 +1506,10 @@ Połączono z Nightscout!"; "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 23942ac3b9..21e8e2a7c2 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Salvando..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 236041691e..7035c50888 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Salvando..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 9a9b394926..7378fab1fb 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Напоминания о верификации"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Сохранение..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Напоминание об истечении срока"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 845e05d5d5..a4ca8ca10b 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Saving..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 45beae40de..eba4d92412 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekräftelseljud"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sparar..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Inga ljud på."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekräftelseljud kommer att pipa för för ala pumpkommandon du ger, som bolus, avbryt bolus, pausa pump, återuppta insulintillförsel, spara påminnelser etc. När iAPS automatiskt justerar insulintillförsel kommer inga pip att ljuda."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekräftelsepip kommer att ljuda även vid automatiska pumpkommandon såväl som vid manuella."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard påminnelsetid"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 561b0a7dbb..ed9e67614c 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Onay sesi"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Onay sesleri, seçili komutları onaylamak için kullanılabilen pod'tan gelen bip sesleridir."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Onay sesleri, seçili komutları onaylamak için kullanılabilen pod'tan gelen bip sesleridir."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Kaydediliyor..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Onay sesi kullanılmaz."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Varsayılan Süre Sonu Hatırlatıcı"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index ab5bad639f..60b258f9e5 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Нагадування про Впевненість"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Нагадування про довіру — це звукові сигнали Pod, які можна використовувати для підтвердження вибраних команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Нагадування про довіру — це звукові сигнали Pod, які можна використовувати для підтвердження вибраних команд."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Збереження..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Довірені звукові сигнали спрацюють навіть тоді, коли петля автоматично змінить подачу інсуліну, а також команд, які Ви ініціюєте."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Довірені звукові сигнали спрацюють навіть тоді, коли петля автоматично змінить подачу інсуліну, а також команд, які Ви ініціюєте."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Нагадування про закінчення терміну"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 44c41a7046..44c291608b 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1474,7 +1474,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "正在保存..."; @@ -1504,10 +1504,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "No confidence reminders are used."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; From 0d0acadb28d92265731cd7053fa0e26fdcf9e8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 12 Nov 2023 23:18:27 +0100 Subject: [PATCH 225/405] strings --- Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings | 2 +- .../OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift | 2 +- Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index fa33e79ba7..cae624903d 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Skift Pod nu. Insulintilførsel stopper 8 timer efter, at Pod'en er udløbet, eller når der ikke er mere insulin tilbage."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lyt efter 2 bip."; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index b23340a91a..415e9ff5f1 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Ersetze jetzt den Pod! Die Insulinabgabe wird in 8 Stunden unterbrochen, spätestens wenn die Gültigkeit abgelaufen ist oder kein Insulin mehr vorhanden ist."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index c79f81251d..bdbad9659f 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Changez de Pod maintenant. La fourniture d'insuline s'arrêtera 8 heures après l'expiration du Pod ou quand il n'y aura plus d'insuline."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Écoutez deux bips."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index ff3ace7b8b..0522d07f60 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Cambia il Pod ora. La somministrazione di insulina si fermerà 8 ore dopo la scadenza del Pod o quando non rimane più insulina."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 89d51c7527..b3e206f386 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Bytt pod nå. Insulintilførsel stopper 8 timer etter at den er utgått eller når det ikke er mer insulin igjen."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny pod med U-100 insulin (la blått beskyttelsesdeksel være på)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny pod med U-100 insulin (la blått beskyttelsesdeksel være på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index f02cb995cb..5883531726 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 7acd4b0de3..d830064c8c 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замените Под. Подача инсулина будет остановлена спустя 8 часов после истечения срока действия Пода, либо когда резервуар будет пуст."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index a6cda647bd..d0199ef03c 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Byt podd nu. Insulintillförsel kommer att upphöra 8 timmar efter att podd går ut eller tills att inget insulin återstår."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny podd med insulin (låt det blå kanlyskyddet sitta kvar)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny podd med insulin (låt det blå kanlyskyddet sitta kvar)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Det ska höras 2 pip."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 607dac7e22..23d62e226f 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Pod'u şimdi değiştirin. İnsülin iletimi, Pod'un süresi dolduktan 8 saat sonra veya daha fazla insülin kalmadığında duracaktır."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Yeni bir Pod'u 100 Ü İnsülin ile doldurun (mavi iğne kapağı Pod üzerinde kalsın)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Yeni bir Pod'u 100 Ü İnsülin ile doldurun (mavi iğne kapağı Pod üzerinde kalsın)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "2 bip sesini dinleyin."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 35d60fe3ad..541fa4c900 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замініть Pod. Подача інсуліну буде зупинена через 8 годин після закінчення терміну дії Pod'a або коли резервуар буде порожній."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заповніть новий Pod інсуліном U-100 (залиште синю захисну кришку Pod'а)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заповніть новий Pod інсуліном U-100 (залиште синю захисну кришку Pod'а)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift index 1c704cbb00..eb506bda08 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift @@ -22,7 +22,7 @@ struct PairPodView: View { HStack { InstructionList(instructions: [ - LocalizedString("Fill a new pod with U-100 Insulin (leave blue Pod needle cap on).", comment: "Label text for step 1 of pair pod instructions"), + LocalizedString("Remove the Pod's blue needle cap and check cannula. Then remove paper backing.", comment: "Label text for step 1 of pair pod instructions"), LocalizedString("Listen for 2 beeps.", comment: "Label text for step 2 of pair pod instructions") ]) .disabled(viewModel.state.instructionsDisabled) diff --git a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings index 5bf12da7f3..47f5bfbcce 100644 --- a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings index e04b4b4ec2..351b1f5c5e 100644 --- a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fejlhændelse indtraf"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld en ny pod med E-100 insulin (lad den blå hætte på podnålen sidde på)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyld en ny pod med E-100 insulin (lad den blå hætte på podnålen sidde på)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Afslut deaktivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings index 5d77765663..e935a95f84 100644 --- a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings index 0567fb182f..8b1229e82f 100644 --- a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Se ha producido un fallo"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Llene un nuevo Pod con insulina U-100 (deje puesta la tapa azul de la aguja del Pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Llene un nuevo Pod con insulina U-100 (deje puesta la tapa azul de la aguja del Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finalizar la desactivación"; diff --git a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings index 195019eb84..a057111b95 100644 --- a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Une erreur s'est produite"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplir un nouveau Pod avec de l'insuline U-100 (laisser le capuchon bleu de l'aiguille du Pod en place)"; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remplir un nouveau Pod avec de l'insuline U-100 (laisser le capuchon bleu de l'aiguille du Pod en place)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Terminer la désactivation"; diff --git a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings index 46fadec09f..da01e556e3 100644 --- a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Si è verificato un errore"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempire un nuovo Pod con insulina U-100 (lasciare il cappuccio blu del Pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Riempire un nuovo Pod con insulina U-100 (lasciare il cappuccio blu del Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Completa la disattivazione"; diff --git a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings index 258d3dc9dd..bc82442d72 100644 --- a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Feilhendelse oppstod"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny pod med U-100 insulin (la den blå nålehetten være på)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny pod med U-100 insulin (la den blå nålehetten være på)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Fullfør deaktivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings index 31df48538a..dba4b64b6b 100644 --- a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fout is opgetreden"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe pod met U-100 insuline (laat de blauwe Podnaalddop zitten)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Vul een nieuwe pod met U-100 insuline (laat de blauwe Podnaalddop zitten)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Voltooi deactivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings index 7c3a7beea3..88d8676afc 100644 --- a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Wystąpiła usterka"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Napełnij nowego POD'a insuliną U-100 (minimum 80j). Pozostaw niebieską osłonkę igły."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Napełnij nowego POD'a insuliną U-100 (minimum 80j). Pozostaw niebieską osłonkę igły."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Zakończ dezaktywację"; diff --git a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings index 5bf12da7f3..47f5bfbcce 100644 --- a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings index cb10880234..f4f4cceffb 100644 --- a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "A avut loc un eveniment de eroare"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Umpleți un Pod nou cu insulină U-100 (nu înlăturați capacul albastru al acului de pe Pod)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Umpleți un Pod nou cu insulină U-100 (nu înlăturați capacul albastru al acului de pe Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finalizați dezactivarea"; diff --git a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings index 8766306e8a..6b69fc9386 100644 --- a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Произошло событие неисправности"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заправьте новый под инсулином (не менее 100 единиц, голубая крышка канюли должна быть на месте). Дождитесь 2 звуковых сигналов."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заправьте новый под инсулином (не менее 100 единиц, голубая крышка канюли должна быть на месте). Дождитесь 2 звуковых сигналов."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершение деактивации"; diff --git a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings index 1ab6aa045c..8118561696 100644 --- a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Hata meydana geldi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Yeni bir podu U-100 İnsülin ile doldurun (podun mavi iğne kapağını çıkarmayın)."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Yeni bir podu U-100 İnsülin ile doldurun (podun mavi iğne kapağını çıkarmayın)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Devre Dışı Bırakmayı Bitir"; diff --git a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings index 5bf12da7f3..47f5bfbcce 100644 --- a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; From e2c06cdc3847464dd68e9d199c7754468cf1e3c7 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Sun, 12 Nov 2023 23:24:42 +0100 Subject: [PATCH 226/405] Revert "strings" This reverts commit 0d0acadb28d92265731cd7053fa0e26fdcf9e8c9. --- Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings | 2 +- .../OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift | 2 +- Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings | 2 +- Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index cae624903d..fa33e79ba7 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Skift Pod nu. Insulintilførsel stopper 8 timer efter, at Pod'en er udløbet, eller når der ikke er mere insulin tilbage."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lyt efter 2 bip."; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 415e9ff5f1..b23340a91a 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Ersetze jetzt den Pod! Die Insulinabgabe wird in 8 Stunden unterbrochen, spätestens wenn die Gültigkeit abgelaufen ist oder kein Insulin mehr vorhanden ist."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index bdbad9659f..c79f81251d 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Changez de Pod maintenant. La fourniture d'insuline s'arrêtera 8 heures après l'expiration du Pod ou quand il n'y aura plus d'insuline."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Écoutez deux bips."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 0522d07f60..ff3ace7b8b 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Cambia il Pod ora. La somministrazione di insulina si fermerà 8 ore dopo la scadenza del Pod o quando non rimane più insulina."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index b3e206f386..89d51c7527 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Bytt pod nå. Insulintilførsel stopper 8 timer etter at den er utgått eller når det ikke er mer insulin igjen."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny pod med U-100 insulin (la blått beskyttelsesdeksel være på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny pod med U-100 insulin (la blått beskyttelsesdeksel være på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 5883531726..f02cb995cb 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index d830064c8c..7acd4b0de3 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замените Под. Подача инсулина будет остановлена спустя 8 часов после истечения срока действия Пода, либо когда резервуар будет пуст."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index d0199ef03c..a6cda647bd 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Byt podd nu. Insulintillförsel kommer att upphöra 8 timmar efter att podd går ut eller tills att inget insulin återstår."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny podd med insulin (låt det blå kanlyskyddet sitta kvar)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny podd med insulin (låt det blå kanlyskyddet sitta kvar)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Det ska höras 2 pip."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 23d62e226f..607dac7e22 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Pod'u şimdi değiştirin. İnsülin iletimi, Pod'un süresi dolduktan 8 saat sonra veya daha fazla insülin kalmadığında duracaktır."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Yeni bir Pod'u 100 Ü İnsülin ile doldurun (mavi iğne kapağı Pod üzerinde kalsın)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Yeni bir Pod'u 100 Ü İnsülin ile doldurun (mavi iğne kapağı Pod üzerinde kalsın)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "2 bip sesini dinleyin."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 541fa4c900..35d60fe3ad 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замініть Pod. Подача інсуліну буде зупинена через 8 годин після закінчення терміну дії Pod'a або коли резервуар буде порожній."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заповніть новий Pod інсуліном U-100 (залиште синю захисну кришку Pod'а)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заповніть новий Pod інсуліном U-100 (залиште синю захисну кришку Pod'а)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift index eb506bda08..1c704cbb00 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PairPodView.swift @@ -22,7 +22,7 @@ struct PairPodView: View { HStack { InstructionList(instructions: [ - LocalizedString("Remove the Pod's blue needle cap and check cannula. Then remove paper backing.", comment: "Label text for step 1 of pair pod instructions"), + LocalizedString("Fill a new pod with U-100 Insulin (leave blue Pod needle cap on).", comment: "Label text for step 1 of pair pod instructions"), LocalizedString("Listen for 2 beeps.", comment: "Label text for step 2 of pair pod instructions") ]) .disabled(viewModel.state.instructionsDisabled) diff --git a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings index 47f5bfbcce..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings index 351b1f5c5e..e04b4b4ec2 100644 --- a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fejlhændelse indtraf"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyld en ny pod med E-100 insulin (lad den blå hætte på podnålen sidde på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld en ny pod med E-100 insulin (lad den blå hætte på podnålen sidde på)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Afslut deaktivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings index e935a95f84..5d77765663 100644 --- a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings index 8b1229e82f..0567fb182f 100644 --- a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Se ha producido un fallo"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Llene un nuevo Pod con insulina U-100 (deje puesta la tapa azul de la aguja del Pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Llene un nuevo Pod con insulina U-100 (deje puesta la tapa azul de la aguja del Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finalizar la desactivación"; diff --git a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings index a057111b95..195019eb84 100644 --- a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Une erreur s'est produite"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remplir un nouveau Pod avec de l'insuline U-100 (laisser le capuchon bleu de l'aiguille du Pod en place)"; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplir un nouveau Pod avec de l'insuline U-100 (laisser le capuchon bleu de l'aiguille du Pod en place)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Terminer la désactivation"; diff --git a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings index da01e556e3..46fadec09f 100644 --- a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Si è verificato un errore"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Riempire un nuovo Pod con insulina U-100 (lasciare il cappuccio blu del Pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempire un nuovo Pod con insulina U-100 (lasciare il cappuccio blu del Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Completa la disattivazione"; diff --git a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings index bc82442d72..258d3dc9dd 100644 --- a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Feilhendelse oppstod"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fyll en ny pod med U-100 insulin (la den blå nålehetten være på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny pod med U-100 insulin (la den blå nålehetten være på)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Fullfør deaktivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings index dba4b64b6b..31df48538a 100644 --- a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fout is opgetreden"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Vul een nieuwe pod met U-100 insuline (laat de blauwe Podnaalddop zitten)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe pod met U-100 insuline (laat de blauwe Podnaalddop zitten)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Voltooi deactivering"; diff --git a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings index 88d8676afc..7c3a7beea3 100644 --- a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Wystąpiła usterka"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Napełnij nowego POD'a insuliną U-100 (minimum 80j). Pozostaw niebieską osłonkę igły."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Napełnij nowego POD'a insuliną U-100 (minimum 80j). Pozostaw niebieską osłonkę igły."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Zakończ dezaktywację"; diff --git a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings index 47f5bfbcce..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings index f4f4cceffb..cb10880234 100644 --- a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "A avut loc un eveniment de eroare"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Umpleți un Pod nou cu insulină U-100 (nu înlăturați capacul albastru al acului de pe Pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Umpleți un Pod nou cu insulină U-100 (nu înlăturați capacul albastru al acului de pe Pod)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finalizați dezactivarea"; diff --git a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings index 6b69fc9386..8766306e8a 100644 --- a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Произошло событие неисправности"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Заправьте новый под инсулином (не менее 100 единиц, голубая крышка канюли должна быть на месте). Дождитесь 2 звуковых сигналов."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заправьте новый под инсулином (не менее 100 единиц, голубая крышка канюли должна быть на месте). Дождитесь 2 звуковых сигналов."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершение деактивации"; diff --git a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings index 8118561696..1ab6aa045c 100644 --- a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Hata meydana geldi"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Yeni bir podu U-100 İnsülin ile doldurun (podun mavi iğne kapağını çıkarmayın)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Yeni bir podu U-100 İnsülin ile doldurun (podun mavi iğne kapağını çıkarmayın)."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Devre Dışı Bırakmayı Bitir"; diff --git a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings index 47f5bfbcce..5bf12da7f3 100644 --- a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings @@ -344,7 +344,7 @@ "Fault event occurred" = "Fehlerereignis aufgetreten"; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; From 253af3c6f677850c5b26d23fe4cc6b6a86617f75 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Sun, 12 Nov 2023 23:27:15 +0100 Subject: [PATCH 227/405] revert --- Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 0f898afaee..a94c110cfd 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -435,7 +435,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; From bd3d933f3e184f5bd099f79cc50a5f85d7aaae54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:49:11 +0100 Subject: [PATCH 228/405] New Crowdin updates (#329) --- .../ar.lproj/Localizable.strings | 31 +++++++- .../da.lproj/Localizable.strings | 43 ++++++++-- .../de.lproj/Localizable.strings | 35 ++++++++- .../es.lproj/Localizable.strings | 31 +++++++- .../fi.lproj/Localizable.strings | 31 +++++++- .../fr.lproj/Localizable.strings | 35 ++++++++- .../he.lproj/Localizable.strings | 31 +++++++- .../it.lproj/Localizable.strings | 35 ++++++++- .../nb.lproj/Localizable.strings | 35 ++++++++- .../nl.lproj/Localizable.strings | 35 ++++++++- .../pl.lproj/Localizable.strings | 31 +++++++- .../pt-BR.lproj/Localizable.strings | 31 +++++++- .../pt-PT.lproj/Localizable.strings | 31 +++++++- .../ru.lproj/Localizable.strings | 35 ++++++++- .../sk.lproj/Localizable.strings | 31 +++++++- .../sv.lproj/Localizable.strings | 24 +++++- .../tr.lproj/Localizable.strings | 35 ++++++++- .../uk.lproj/Localizable.strings | 37 ++++++++- .../zh-Hans.lproj/Localizable.strings | 31 +++++++- .../Resources/da.lproj/Localizable.strings | 4 +- .../Resources/de.lproj/Localizable.strings | 4 +- .../Resources/es.lproj/Localizable.strings | 4 +- .../Resources/fr.lproj/Localizable.strings | 4 +- .../Resources/it.lproj/Localizable.strings | 4 +- .../Resources/nb.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 4 +- .../Resources/pl.lproj/Localizable.strings | 4 +- .../Resources/pt-PT.lproj/Localizable.strings | 4 +- .../Resources/ru.lproj/Localizable.strings | 4 +- .../Resources/sk.lproj/Localizable.strings | 4 +- .../Resources/tr.lproj/Localizable.strings | 4 +- .../Resources/uk.lproj/Localizable.strings | 4 +- .../Resources/ar.lproj/Localizable.strings | 32 ++++++++ .../Resources/da.lproj/Localizable.strings | 36 ++++++++- .../Resources/de.lproj/Localizable.strings | 36 ++++++++- .../Resources/es.lproj/Localizable.strings | 36 ++++++++- .../Resources/fi.lproj/Localizable.strings | 32 ++++++++ .../Resources/fr.lproj/Localizable.strings | 36 ++++++++- .../Resources/he.lproj/Localizable.strings | 32 ++++++++ .../Resources/it.lproj/Localizable.strings | 36 ++++++++- .../Resources/nb.lproj/Localizable.strings | 36 ++++++++- .../Resources/nl.lproj/Localizable.strings | 36 ++++++++- .../Resources/pl.lproj/Localizable.strings | 36 ++++++++- .../Resources/pt-BR.lproj/Localizable.strings | 32 ++++++++ .../Resources/pt-PT.lproj/Localizable.strings | 36 ++++++++- .../Resources/ru.lproj/Localizable.strings | 36 ++++++++- .../Resources/sk.lproj/Localizable.strings | 36 ++++++++- .../Resources/sv.lproj/Localizable.strings | 36 ++++++++- .../Resources/tr.lproj/Localizable.strings | 36 ++++++++- .../Resources/uk.lproj/Localizable.strings | 36 ++++++++- .../zh-Hans.lproj/Localizable.strings | 32 ++++++++ .../Main/da.lproj/Localizable.strings | 78 +++++++++---------- .../Main/de.lproj/Localizable.strings | 6 +- .../Main/fr.lproj/Localizable.strings | 6 +- .../Main/it.lproj/Localizable.strings | 6 +- .../Main/nb.lproj/Localizable.strings | 6 +- .../Main/nl.lproj/Localizable.strings | 6 +- .../Main/ru.lproj/Localizable.strings | 10 +-- .../Main/sv.lproj/Localizable.strings | 2 +- .../Main/tr.lproj/Localizable.strings | 6 +- .../Main/uk.lproj/Localizable.strings | 6 +- 61 files changed, 1313 insertions(+), 163 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index be5dac0ba4..cd58c69526 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index fa33e79ba7..1c5168fcc2 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Skift Pod nu. Insulintilførsel stopper 8 timer efter, at Pod'en er udløbet, eller når der ikke er mere insulin tilbage."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyld et nyt bælg med U-100 Insulin (efterlad den blå nålehætte på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lyt efter 2 bip."; @@ -562,7 +562,7 @@ "This is a reminder that you scheduled when you paired your current Pod." = "Dette er en påmindelse om, at du planlagde, hvornår du parrede din nuværende Pod."; /* */ -"Scheduled Reminder" = "Planlagt Påmindelse"; +"Scheduled Reminder" = "Scheduled Reminder"; /* Footer text for low reservoir value row */ "The App notifies you when the amount of insulin in the Pod reaches this level." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau."; @@ -579,7 +579,7 @@ "Time" = "Tid"; /* Value text for no expiration reminder */ -"No Reminder" = "Ingen Påmindelse"; +"No Reminder" = "No Reminder"; /* Label for low reservoir reminder row */ "Low Reservoir Reminder" = "Påmindelse om lavt reservoir"; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Der anvendes ingen tillidspåmindelser."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når iAPS automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når iAPS automatisk justerer tilførslen og de kommandoer, du sætter igang."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Værdi"; @@ -637,7 +637,7 @@ "Missing Config" = "Manglende Konfiguration"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Denne PumpManager er ikke blevet konfigureret med maximal basal rate fordi det var tilføjet før manuel temp basal var en feature. Gå til Terapi Indstillinger -> Leveringsgrænser og set en ny maximal basal rate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard for udløbspåmindelse"; @@ -709,7 +709,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Lavt Reservoir"; +"Low Reservoir" = "Low Reservoir"; /* */ "Save" = "Gem"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ siden"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index b23340a91a..c0d414771a 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Ersetze jetzt den Pod! Die Insulinabgabe wird in 8 Stunden unterbrochen, spätestens wenn die Gültigkeit abgelaufen ist oder kein Insulin mehr vorhanden ist."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "BR"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ vor"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 7ab0a8f0ae..f53ca4b7ab 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "Hace %@"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 9b7ecf0199..09296590ae 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index c79f81251d..287286a04d 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Changez de Pod maintenant. La fourniture d'insuline s'arrêtera 8 heures après l'expiration du Pod ou quand il n'y aura plus d'insuline."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Écoutez deux bips."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Taux"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "Il y a %@"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index be5dac0ba4..cd58c69526 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index ff3ace7b8b..1531a8cefd 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Cambia il Pod ora. La somministrazione di insulina si fermerà 8 ore dopo la scadenza del Pod o quando non rimane più insulina."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Valore"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ fa"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 89d51c7527..1d478f7c0c 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Bytt pod nå. Insulintilførsel stopper 8 timer etter at den er utgått eller når det ikke er mer insulin igjen."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny pod med U-100 insulin (la blått beskyttelsesdeksel være på)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Ratio"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ siden"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index f02cb995cb..aeafaf9cb9 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die u hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die u initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Waarde"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ geleden"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index f4a1399cc0..748cc1f600 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ temu"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 1a24550313..0fc54fe7c6 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ atrás"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index 37b1278d8d..f66f0c8f29 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 7acd4b0de3..96f4bc69bf 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замените Под. Подача инсулина будет остановлена спустя 8 часов после истечения срока действия Пода, либо когда резервуар будет пуст."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Скорость"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ назад"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 535f8637d9..9fe453e41c 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "pred %@"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index a6cda647bd..cdbeeea7fa 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -790,7 +790,27 @@ "Silenced" = "Tystad"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på både för varningar och för bekräftelser."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på för både varningar och för bekräftelser."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Varningar kommer inte längre använda ljud och alla bekräftelseljud kommer också att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att några poddvarningar."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Tysta podden"; + +/* title for pod details page */ +"Pod Details" = "Poddetaljer"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Detaljer om tidigare podd"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Information om pumphanteraren"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Hämtar pumphanterarens detaljer..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Uppdatera pumphanterarens detaljer"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 607dac7e22..624aea657e 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Pod'u şimdi değiştirin. İnsülin iletimi, Pod'un süresi dolduktan 8 saat sonra veya daha fazla insülin kalmadığında duracaktır."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Yeni bir Pod'u 100 Ü İnsülin ile doldurun (mavi iğne kapağı Pod üzerinde kalsın)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "2 bip sesini dinleyin."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Onay sesi kullanılmaz."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Oran"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ önce"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 35d60fe3ad..676611a414 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замініть Pod. Подача інсуліну буде зупинена через 8 годин після закінчення терміну дії Pod'a або коли резервуар буде порожній."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заповніть новий Pod інсуліном U-100 (залиште синю захисну кришку Pod'а)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; @@ -573,7 +573,7 @@ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Нагадування вище не звучатимуть, якщо ваш пристрій перебуває в беззвучному режимі або режимі «Не турбувати».\n\nІснують інші важливі сповіщення та будильники Podʼу, які лунатимуть, навіть якщо на пристрої встановлено режим «Без звуку» або «Не турбувати»."; /* navigation title for notification settings */ -"Notification Settings" = "Параметри Сповіщень"; +"Notification Settings" = "Параметри сповіщень"; /* Label for scheduled reminder value row */ "Time" = "Час"; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли петля автоматично регулює доставку, а також для команд, які ви ініціюєте."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ "Rate" = "Швидкість"; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ тому"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 2fe9c6f687..e05a32eec0 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -785,3 +785,32 @@ /* DASH Pod time ago since last status */ "%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings index 14e8ddb98d..eb3e845869 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/da.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Uerkendt kommando afventer."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påmindelser om succesfulde handlinger vil lyde for de kommandoer du sætter igang, annulleret, suspenderet, genoptaget bolus, gemme notifikationspåmindelser etc. Når Loop automatisk justerer tilførslen, bliver påmindelser om succesfulde handlinger ikke benyttet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påmindelser om succesfulde handlinger vil lyde, når Loop automatisk justerer tilførslen og de kommandoer, du sætter igang."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritisk Pod-fejl"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings index 8c7de48334..aadf6cf134 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Unbestätigter Befehl steht noch aus."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritischer Pod-Fehler"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings index 96c8667908..cad5cbcb59 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/es.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problema de comunicación: Pendiente de confirmar comando."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Los recordatorios de confianza sonarán para los comandos que seleccione, como bolo, cancelar bolo, suspender, reanudar, guardar recordatorios de notificación, etc. Cuando Loop ajusta automáticamente la administración de insulina, no se utilizan recordatorios de confianza."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Recordatorios de confianza sonarán cuando Loop automáticamente ajuste la administración de insulina, así como para los comandos que selecciones."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Error crítico del Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings index 9656e873ff..a01deeeaa8 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problème de communication : Commande en attente sans accusé de réception."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentiront pour les commandes que vous initiez, comme administrer ou annuler un bolus, suspendre, reprendre, enregistrer les rappels de notification, etc. Lorsque Loop ajuste automatiquement l'administration, aucun rappel de confiance n’est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentiront lorsque Loop ajustera automatiquement l'administration ainsi que pour les commandes que vous lancez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Erreur critique du Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings index 379fc593b0..85ddffc181 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problema di comunicazione: comando di conferma in attesa."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, ecc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Errore critico Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings index 2aedb9b665..eeb705f2a4 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikasjonsproblem: Ukjent kommando venter."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Tillitspåminnelser høres for kommandoer du starter, for eksempel bolus, avbryt bolus, suspendere, gjenoppta, lagre varslingspåminnelser osv. Når Loop automatisk justerer leveringen, brukes mistillitspåminnelser."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Tillitspåminnelser vil høres når Loop automatisk justerer leveringen så vel som for kommandoer du starter."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Pod-feil"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings index f97fe8000a..4090dca4ee 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communicatieprobleem: niet-bevestigde opdracht in behandeling"; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritieke Pod fout"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings index 278a77ef93..b4708a58d6 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/pl.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problem z komunikacją: Niepotwierdzone polecenie w toku."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Przypomnienia (sygnały dźwiękowe) będą emitowane w przypadku poleceń, które zainicjujesz, takich jak bolus, anulowanie bolusa, wstrzymanie, wznowienie, zapisanie przypomnień o powiadomieniach itp. Kiedy Loop automatycznie dostosowuje podawanie, nie są używane żadne sygnały dźwiękowe."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Przypomnienia potwierdzające są emitowane, gdy Loop automatycznie dostosowuje podawanie insuliny, a także w przypadku poleceń inicjowanych przez użytkownika."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Krytyczny błąd POD'a"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/pt-PT.lproj/Localizable.strings index 08c409943d..c84ab13214 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/pt-PT.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings index ab36346f6b..669cf193ae 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема со связью: ожидается неподтвержденная команда."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Напоминания будут звучать для инициированных вами команд, таких как болюс, отмена болюса, приостановка, возобновление, напоминания о сохранении уведомлений и т.д. Когда Loop автоматически регулирует подачу инсулина, напоминания не будут использоваться."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Напоминания будут звучать, когда Loop автоматически регулирует подачу инсулина, а также для команд, которые вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критическая ошибка пода"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings index e7599483f1..c0f2d23d95 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problém s komunikáciou: Čaká sa na potvrdenie príkazu."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Pripomienky spoľahlivosti zaznejú pri príkazoch, ktoré spustíte, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie upozornení atď. Keď Loop automaticky upraví podanie, nepoužijú sa žiadne pripomenutia spoľahlivosti."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Keď Loop automaticky upraví podávanie, ako aj prevedie príkazy, ktoré iniciujete, zaznejú pripomenutia spoľahlivosti."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Critical Pod Error"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings index 25f45ad597..9ac00194dc 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/tr.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "İletişim sorunu: Onaylanmamış komut beklemede."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Emniyet hatırlatıcıları, bolus, bolus iptali, askıya alma, devam ettirme, bildirim hatırlatıcılarını kaydetme gibi başlattığınız komutlar için çalacaktır. Loop iletimi otomatik olarak ayarladığında emniyet hatırlatıcıları kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Emniyet hatırlatıcıları, Başlattığınız komutların yanı sıra Loop iletimi otomatik olarak ayarladığında çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritik Pod Hatası"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings index 8750f0fac5..e8db1305c3 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема комунікації: не визнана команда в очікуванні."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When Loop automatically adjusts delivery, no confidence reminders are used." = "Сигнали підтвердження лунатимуть для команд, які ви ініціюєте, таких як болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли петля автоматично регулює подачу, сигнали підтвердження не використовуються."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when Loop automatically adjusts delivery as well as for commands you initiate." = "Сигнали підтвердження лунатимуть, коли петля автоматично регулює подачу, а також для команд, які ви ініціюєте."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критична Помилка"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index 35989663bf..b57dddcf7d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index a299a14d09..5e56dc5a0f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Påmindelse om succesfulde aktiviteter"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påmindelse om succesfulde aktiviteter er bip fra Pod'en, som kan bruges til at bekræfte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Fjern pumpe"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Din Pod leverer muligvis stadig insulin.\nFjern den fra din krop og tryk derefter på \"Fortsæt\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 4299d6289b..dee8f70a5f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pumpe löschen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Entferne die Nadelkappe des Pods und überprüfe die Kanüle. Dann entferne die Papierträger."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ihr Pod gibt möglicherweise immer noch Insulin ab.\nEntfernen Sie ihn vom Körper und tippen dann auf „Weiter“."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index 20a4fc5a06..100487ad32 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Recordatorios de confianza"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Los recordatorios de confianza son pitidos que emite el Pod que pueden utilizarse para tener certeza de que se han seleccionado comandos."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuración"; @@ -547,7 +547,7 @@ "Remove Pump" = "Retire la bomba"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Retire la tapa de la aguja del Pod y compruebe la cánula. A continuación, retire el envoltorio de papel de la parte de atrás."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Es posible que su Pod siga suministrando insulina.\nRetírelo de su cuerpo y pulse \"Continuar\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index 0e6c69402c..7e7b298282 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index d41ff39947..043ab1a0a9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Rappels de confiance"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Retirer la pompe"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Retirez le capuchon d'aiguille du pod et vérifiez la canule. Retirez ensuite le film en papier de l'autocollant."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Votre Pod peut encore délivrer de l'insuline.\nRetirez-le de votre corps, puis appuyez sur \"Continuer\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index ea29f66339..00c2952e3c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 69c03f993a..225154cdb6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Promemoria di fiducia"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configurazione"; @@ -547,7 +547,7 @@ "Remove Pump" = "Rimuovere microinfusore"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio dell'ago del Pod e controllare la cannula. Quindi rimuovere le due coperture di carta."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Il tuo Pod potrebbe ancora erogare insulina.\n Rimuovilo dal tuo corpo, e poi tocca \"Continua\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index b1d015e75f..f8892bd396 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekreftelser"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Tillitspåminnelser er pip fra pod som kan brukes til å bekrefte valgte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurasjon"; @@ -547,7 +547,7 @@ "Remove Pump" = "Fjern pumpen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Fjern kanylehetten til pod og sjekk kanylen. Fjern deretter plasterbeskyttelsen."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod kan fortsatt levere insulin.\nFjern den fra kroppen din, og trykk deretter på \"Fortsett\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 60357bd1a6..c1a8f8a23a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Configuratie"; @@ -547,7 +547,7 @@ "Remove Pump" = "Verwijder Pomp"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Je Pod kan nog steeds insuline toedienen.\nVerwijder de Pod van je lichaam en tik vervolgens op \"Ga Verder\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 4f95960ae6..14e3df006a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Przypomnienia (sygnały dźwiękowe) z POD'a"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Przypomnienia potwierdzające to sygnały dźwiękowe, z których można korzystać w celu potwierdzania wybranych poleceń."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguracja"; @@ -547,7 +547,7 @@ "Remove Pump" = "Usuń pompę"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Usuń osłonę igły i sprawdź kaniulę. Następnie usuń papierowe zabezpieczenie kleju."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Twój POD może nadal dostarczać insulinę.\nUsuń go z ciała, a następnie wybierz \"Kontynuuj\"."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index 68a61b2c44..14e833cc79 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 2722dfc64b..374ffa7cc4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Confidence reminders are beeps from the pod which can be used to acknowledge selected commands."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Ajustes"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Remove the pod's needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index ff4e8eac0d..ced4289e57 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Напоминания об уверенности"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Напоминания об уверенности - это звуковые сигналы, подаваемые подом, которые можно использовать для подтверждения выбранных команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Конфигурация"; @@ -547,7 +547,7 @@ "Remove Pump" = "Удалите помпу"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Отломите защитную крышку канюли и проверьте состояние самой канюли. Далее снимите защитные стикеры с пластыря."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш под может по-прежнему доставлять инсулин.\n Удалите его с тела, затем нажмите «Продолжить»."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 045b780a5f..9184b21ebb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Confidence Reminders"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Potvrdzovacie pripomienky sú pípnutia z podu, ktoré možno použiť pre potvrdenie vybraných príkazov."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurácia"; @@ -547,7 +547,7 @@ "Remove Pump" = "Remove Pump"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Odstráňte kryt z ihly a skontrolujte kanylu. Potom odstráňte papierovú podložku."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index f492a5a986..7904b7f9ea 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekräftelseljud"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden (när den inte är tystad) som kan användas som bekräftelser på utförda kommandon."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Ta bort podd"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Ta bort kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Ta bort poddens kanylskydd och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Din podd kan eventuellt fortfarande ge Insulin.\nTa bort den från din kropp och tryck sedan på ”Fortsätt.”"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Tystad"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på för både varningar och för bekräftelser."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Tysta podded"; + +/* title for pod details page */ +"Pod Details" = "Poddetaljer"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Detaljer om tidigare podd"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Information om pumphanteraren"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Hämtar pumphanterarens detaljer..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Uppdatera pumphanterarens detaljer"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Misslyckades att uppdatera inställning för tystad podd."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 04d13dc9fe..42ce07a4bf 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Emniyet Hatırlatıcıları"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Emniyet hatırlatıcıları, poddan gelen ve seçilen komutları onaylamak için kullanılabilen bip sesleridir."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Konfigürasyon"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pompayı Çıkar"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Pod'un iğne kapağını çıkarın ve kanülü kontrol edin. Ardından yapışkan kağıt desteğini çıkarın."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod'unuz hala İnsülin veriyor olabilir.\nVücudunuzdan çıkarın ve ardından \"Devam\"a dokunun."; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 9edca2215b..22f9e7a8ff 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Нагадування про Впевненість"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the pod which can be used to acknowledge selected commands." = "Сигнали підтвердження — це звукові сигнали Podʼа, які можна використовувати для підтвердження вибраних команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ "Configuration" = "Налаштування"; @@ -547,7 +547,7 @@ "Remove Pump" = "Зніміть Pod"; /* Label text for step two of attach pod instructions */ -"Remove the pod's needle cap and check cannula. Then remove paper backing." = "Зніміть захисну кришку канюлі та перевірте канюлю. Потім зніміть захисні стікери."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш Pod може все ще подавати інсулін.\nЗніміть його зі свого тіла, а потім натисніть «Продовжити»"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 1483f170a3..ee0a8d8068 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -764,3 +764,35 @@ /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index fcbcb0542e..1fb082e885 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -56,37 +56,37 @@ "Error at" = "Fejl ved"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Måltidsoversigt"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Rediger Måltid"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Tilføj Måltid"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolusoversigt"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Beregninger"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Fedt Måltid"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Fuld Bolus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fraktion"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Fedt Måltidsfaktor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Resultat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Din indtastade mængde blev begrænset af din maksimale Bolusindstilling på %d%@"; /* Bolus View Continue Button */ "Continue" = "Fortsæt"; @@ -122,7 +122,7 @@ "Carbs required" = "Krævede kulhydrater"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Gemte Måltider"; /* */ "Are you sure?" = "Er du sikker?"; @@ -609,7 +609,7 @@ Enact a temp Basal or a temp target */ "Automatic" = "Automatisk"; /* External insulin treatments */ -"External" = "External"; +"External" = "Ekstern"; /* */ "Other" = "Andet"; @@ -630,7 +630,7 @@ Enact a temp Basal or a temp target */ "Libre 2 Direct" = "Libre 2 Direct"; /* */ -"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; +"Select the third party transmitter you want to connect to" = "Vælg den tredjeparts sensor du vil forbinde til"; /* State was restored */ "State was restored" = "Tilstand blev gendannet"; @@ -645,13 +645,13 @@ Enact a temp Basal or a temp target */ "Add calibration" = "Tilføj kalibrering"; /* When adding capillary glucose meater reading */ -"Meter glucose" = "Meter glucose"; +"Meter glucose" = "Måler glucose"; /* */ "Info" = "Info"; /*v*/ -"Slope" = "Slope"; +"Slope" = "Hældning"; /* */ "Intercept" = "Intercept"; @@ -681,7 +681,7 @@ Enact a temp Basal or a temp target */ "PatchInfo" = "PatchInfo"; /* */ -"Calibrationinfo" = "Calibrationinfo"; +"Calibrationinfo" = "Kalibreringsinfo"; /* */ "Unknown" = "Ukendt"; @@ -693,25 +693,25 @@ Enact a temp Basal or a temp target */ "Pair Sensor & connect" = "Par Sensor & Forbind"; /* */ -"Phone NFC required!" = "Phone NFC required!"; +"Phone NFC required!" = "Telefon NFC påkrævet!"; /* */ "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Din telefon eller app er ikke aktiveret til NFC-kommunikation, som er nødvendig for at parre til libre2 sensorer"; /* Bluetooth Power Off */ -"Bluetooth Power Off" = "Bluetooth Power Off"; +"Bluetooth Power Off" = "Bluetooth Slået Fra"; /* Please turn on Bluetooth */ "Please turn on Bluetooth" = "Slå Bluetooth til"; /* No Libre Transmitter Selected */ -"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; +"No Libre Transmitter Selected" = "Ingen Libre Sensor Valgt"; /* Delete Transmitter and start anew. */ "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; /* Invalid libre checksum */ -"Invalid libre checksum" = "Invalid libre checksum"; +"Invalid libre checksum" = "Ugyldig libre checksum"; /* Libre sensor was incorrectly read, CRCs were not valid */ "Libre sensor was incorrectly read, CRCs were not valid" = "Libre sensor was incorrectly read, CRCs were not valid"; @@ -720,19 +720,19 @@ Enact a temp Basal or a temp target */ "Glucose" = "Glukose"; /* LOWALERT! */ -"LOWALERT!" = "LOWALERT!"; +"LOWALERT!" = "LAVALARM!"; /* HIGHALERT! */ -"HIGHALERT!" = "HIGHALERT!"; +"HIGHALERT!" = "HØJALARM!"; /* (Snoozed)*/ -"(Snoozed)" = "(Snoozed)"; +"(Snoozed)" = "(Udsat)"; /* Glucose: %@ */ -"Glucose: %@" = "Glucose: %@"; +"Glucose: %@" = "Glukose: %@"; /* Transmitter: %@%% */ -"Transmitter: %@%%" = "Transmitter: %@%%"; +"Transmitter: %@%%" = "Sensor: %@%%"; /* No Sensor Detected */ "No Sensor Detected" = "Ingen Sensor Fundet"; @@ -780,7 +780,7 @@ Enact a temp Basal or a temp target */ "Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; /* Sensor Ending Soon */ -"Sensor Ending Soon" = "Sensor Ending Soon"; +"Sensor Ending Soon" = "Sensor Udløber Snart"; /* Current Sensor is Ending soon! Sensor Life left in %@ */ "Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; @@ -789,10 +789,10 @@ Enact a temp Basal or a temp target */ "Libre Bluetooth" = "Libre Bluetooth"; /* */ -"Snooze Alerts" = "Snooze Alerts"; +"Snooze Alerts" = "Udsæt Alarmer"; /* */ -"Last measurement" = "Last measurement"; +"Last measurement" = "Sidste måling"; /* */ "Sensor Footer checksum" = "Sensor Footer checksum"; @@ -807,22 +807,22 @@ Enact a temp Basal or a temp target */ "Sensor Info" = "Sensor Info"; /* */ -"Sensor Age" = "Sensor Age"; +"Sensor Age" = "Sensor Alder"; /* */ -"Sensor Age Left" = "Sensor Age Left"; +"Sensor Age Left" = "Sensor Tid Tilbage"; /* */ -"Sensor Endtime" = "Sensor Endtime"; +"Sensor Endtime" = "Sensor Sluttid"; /* */ -"Sensor State" = "Sensor State"; +"Sensor State" = "Sensortilstand"; /* */ -"Sensor Serial" = "Sensor Serial"; +"Sensor Serial" = "Sensor Serienummer"; /* */ -"Transmitter Info" = "Transmitter Info"; +"Transmitter Info" = "Senderinfo"; /* */ "Hardware" = "Hardware"; @@ -1065,16 +1065,16 @@ Enact a temp Basal or a temp target */ "Temp Target" = "Temp Target"; /* */ -"Resume" = "Resume"; +"Resume" = "Genoptag"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Suspender"; /* */ -"Animated Background" = "Animated Background"; +"Animated Background" = "Animeret Baggrund"; /* Sensor day(s) */ -" day(s)" = " day(s)"; +" day(s)" = " dag(e)"; /* Option to show HR in Watch app*/ "Display HR on Watch" = "Display HR on Watch"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 3c92d219da..9d4bcfd7df 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Pumpe Bestätigungstöne"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bestätigungshinweise sind Pieptöne des Pods, die zur Quittierung ausgewählter Befehle aktiviert werden können."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Speichern..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Erinnerungssignale ertönen gemäß deiner Einstellungen, wie Bolusabgabe, Bolus abbrechen, Unterbrechung, Wiederaufnahme, Speicherung von Benachrichtigungen usw. Wenn Loop automatisch Insulin abgibt, ertönen keine Erinnerungssignale."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Erinnerungssignale ertönen, wenn Loop die Abgabe automatisch anpasst sowie bei Befehlen, die von dir ausgelöst werden."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard Ablauf-Erinnerung"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 3fc8ba5af9..590719b758 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Confidence Reminders"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips du pod qui peuvent être utilisés pour reconnaître les commandes sélectionnées."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sauvegarde..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance sonneront pour les commandes que vous initiez, comme les bolus, l'annulation de bolus, la suspension, la reprise, les rappels de notification d'enregistrement, etc. Lorsque la boucle ajuste automatiquement la dose, aucun rappel de confiance n'est utilisé."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Les rappels de confiance sonneront lorsque la boucle ajuste automatiquement la dose délivrée ainsi que les commandes que vous initiez."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Rappel d'expiration activé"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 4925e34751..41c750be38 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Promemoria Di Sicurezza"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sto salvando..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando Loop invece regola in automatico l'erogazione allora non userà alcun promemoria di fiducia."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando Loop regola automaticamente l'erogazione e per i comandi avviati dall'utente."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Promemoria scadenza predefinito"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index d5d096d75f..f5c9aea34a 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekreftelseslyder"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekreftelseslyder er pipelyder fra pod som kan brukes som kvittering for utførte kommandoer."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Lagrer..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bekreftelseslyder vil høres ved manuelle kommandoer som bolus, avbryt bolus, pause leveranse, gjenoppta leveranse, lagre varsler, etc. Det er ikke bekreftelseslyder når appen endrer insulintiførsel automatisk."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bekreftelseslyder vil høres ved endret insulintiførsel, både fra automatiske justeringer og manuelle kommandoer."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Utløpspåminnelse"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 8f7378df94..bd470d6eeb 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de pod komen en kunnen worden gebruikt om geselecteerde opdrachten te erkennen."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Opslaan..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Herinnering vervaldatum ingeschakeld"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 0261535fd8..ea74c1d3cf 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -1392,10 +1392,10 @@ Enact a temp Basal or a temp target */ "Save as Preset" = "Сохранить как шаблон"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Прогноз"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Отображать белки и жиры"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Напоминания о верификации"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Сохранение..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т.д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Напоминание об истечении срока"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 0de0f52b06..7609a4826d 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekräftelseljud"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden som kan användas som bekräftelser på utförda kommandon"; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bekräftelseljud är pip från podden (när den inte är tystad) som kan användas som bekräftelser på utförda kommandon"; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sparar..."; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 085bfdaed3..8398c9b6b4 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Onay sesi"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Onay sesleri, seçili komutları onaylamak için kullanılabilen pod'tan gelen bip sesleridir."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Kaydediliyor..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Onay sesi kullanılmaz."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bolus, bolusu iptal et, askıya al, devam ettir, bildirim hatırlatıcılarını kaydet vb. gibi başlattığınız komutlar için Onay sesleri çalacaktır. Döngü, iletimi otomatik olarak ayarladığında, hiçbir onay sesi kullanılmaz."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Loop, başlattığınız komutların yanı sıra teslimatı otomatik olarak ayarladığında, onay sesi çalacaktır."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Varsayılan Süre Sonu Hatırlatıcı"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 5104e50fb8..59625f2423 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Нагадування про Впевненість"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Нагадування про довіру — це звукові сигнали Pod, які можна використовувати для підтвердження вибраних команд."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Збереження..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Довірені звукові сигнали спрацюють для операцій, які Ви ініціюєте - Болюс, Скасування Болюса, Припинення подачі, Відновлення подачі, Збереження нагадувань тощо. Коли петля автоматично змінює подачу інсуліну – звукові сигнали не використовуються."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Довірені звукові сигнали спрацюють навіть тоді, коли петля автоматично змінить подачу інсуліну, а також команд, які Ви ініціюєте."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Нагадування про закінчення терміну"; From 3b335db70be322c3685a21db159b019e6c87eab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 13 Nov 2023 00:03:13 +0100 Subject: [PATCH 229/405] fix strings --- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 2 +- .../OmniBLE/Localizations/sv.lproj/Localizable.strings | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index a94c110cfd..3522d69c64 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -803,7 +803,7 @@ /* Help text for Silence Pod view */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -/* navigation title for Silnce Pod" */ +/* navigation title for Silnce Pod */ "Silence Pod" = "Silence Pod"; /* title for pod details page */ diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index cdbeeea7fa..3802f8a283 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -795,11 +795,12 @@ /* Description for SilencePodPreference.enabled */ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; -/* Help text for Silence Pod view */ + /* navigation title for Silnce Pod" */ +"Silence Pod" = "Silence Pod"; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Tysta podden"; +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping" = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; /* title for pod details page */ "Pod Details" = "Poddetaljer"; From 130c35c6cee600cfa6409a835d64f58c993621b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 13 Nov 2023 00:18:27 +0100 Subject: [PATCH 230/405] fix strings --- .../en.lproj/Localizable.strings | 2 +- .../sv.lproj/Localizable.strings | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 3522d69c64..cb337a9027 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -801,7 +801,7 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; /* navigation title for Silnce Pod */ "Silence Pod" = "Silence Pod"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 3802f8a283..b7ad512163 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -792,15 +792,17 @@ /* Description for SilencePodPreference.disabled */ "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på för både varningar och för bekräftelser."; +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Tystad"; + /* Description for SilencePodPreference.enabled */ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; - -/* navigation title for Silnce Pod" */ -"Silence Pod" = "Silence Pod"; - /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping" = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." + +/* navigation title for Silnce Pod */ +"Silence Pod" = "Tysta podden"; /* title for pod details page */ "Pod Details" = "Poddetaljer"; @@ -809,9 +811,10 @@ "Previous Pod Details" = "Detaljer om tidigare podd"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Information om pumphanteraren"; +"Pump Manager Details" = "Detaljer från pumphanteraren"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Hämtar pumphanterarens detaljer..."; +"Retrieving Pump Manager Details..." = "Hämtar detaljer från pumphanteraren..."; + /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Uppdatera pumphanterarens detaljer"; +"Refresh Pump Manager Details" = "Uppdatera detaljer från pumphanteraren"; From dadcbe5bbcb963317257e836735bb916778143f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 13 Nov 2023 01:19:09 +0100 Subject: [PATCH 231/405] New Crowdin updates (#332) --- .../Localizations/ar.lproj/Localizable.strings | 6 +++--- .../Localizations/da.lproj/Localizable.strings | 6 +++--- .../Localizations/de.lproj/Localizable.strings | 6 +++--- .../Localizations/es.lproj/Localizable.strings | 6 +++--- .../Localizations/fi.lproj/Localizable.strings | 6 +++--- .../Localizations/fr.lproj/Localizable.strings | 6 +++--- .../Localizations/he.lproj/Localizable.strings | 6 +++--- .../Localizations/it.lproj/Localizable.strings | 6 +++--- .../Localizations/nb.lproj/Localizable.strings | 8 ++++---- .../Localizations/nl.lproj/Localizable.strings | 6 +++--- .../Localizations/pl.lproj/Localizable.strings | 6 +++--- .../pt-BR.lproj/Localizable.strings | 6 +++--- .../pt-PT.lproj/Localizable.strings | 6 +++--- .../Localizations/ru.lproj/Localizable.strings | 6 +++--- .../Localizations/sk.lproj/Localizable.strings | 6 +++--- .../Localizations/sv.lproj/Localizable.strings | 12 ++++-------- .../Localizations/tr.lproj/Localizable.strings | 6 +++--- .../Localizations/uk.lproj/Localizable.strings | 6 +++--- .../zh-Hans.lproj/Localizable.strings | 6 +++--- .../Resources/sv.lproj/Localizable.strings | 2 +- .../Main/nb.lproj/Localizable.strings | 16 ++++++++-------- 21 files changed, 68 insertions(+), 72 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index cd58c69526..45e1b115e6 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 1c5168fcc2..ee218b3a0e 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index c0d414771a..019ccb559e 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index f53ca4b7ab..2cb2937e30 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 09296590ae..ee5177d1ce 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 287286a04d..f56676504d 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index cd58c69526..45e1b115e6 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 1531a8cefd..70b4aa4e9b 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 1d478f7c0c..523bc43df3 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Bytt pod nå. Insulintilførsel stopper 8 timer etter at den er utgått eller når det ikke er mer insulin igjen."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny Pod med U-100 insulin (la den blå hetten være på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index aeafaf9cb9..233c859106 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index 748cc1f600..8ee7cfdd56 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 0fc54fe7c6..d3184aff0a 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index f66f0c8f29..2fab8a7abd 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 96f4bc69bf..6e66fa330d 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 9fe453e41c..19ce535865 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index b7ad512163..962faddb0b 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -792,14 +792,11 @@ /* Description for SilencePodPreference.disabled */ "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normalt läge när ljud är på för både varningar och för bekräftelser."; -/* Title string for SilencePodPreference.enabled */ -"Silenced" = "Tystad"; - /* Description for SilencePodPreference.enabled */ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Under tyst poddläge stängs alla poddens ljud av."; /* navigation title for Silnce Pod */ "Silence Pod" = "Tysta podden"; @@ -811,10 +808,9 @@ "Previous Pod Details" = "Detaljer om tidigare podd"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Detaljer från pumphanteraren"; +"Pump Manager Details" = "Information om pumphanteraren"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Hämtar detaljer från pumphanteraren..."; - +"Retrieving Pump Manager Details..." = "Hämtar pumphanterarens detaljer..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Uppdatera detaljer från pumphanteraren"; +"Refresh Pump Manager Details" = "Uppdatera pumphanterarens detaljer"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 624aea657e..5abf593e1b 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 676611a414..2aa7c34aea 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index e05a32eec0..20167ea8d5 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 7904b7f9ea..ebe1ffb6a5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -778,7 +778,7 @@ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Tysta podded"; +Silence Pod" = "Tysta podden"; /* title for pod details page */ "Pod Details" = "Poddetaljer"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index f5c9aea34a..26360f63ad 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Karbo nødvendig"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Lagre måltid"; /* */ "Are you sure?" = "Er du sikker?"; @@ -1392,10 +1392,10 @@ Enact a temp Basal or a temp target */ "Save as Preset" = "Lagre som forvalg"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Prediksjoner"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Vis protein og fett"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1409,10 +1409,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Beregnet blodsukker"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Vennligst vent"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Blodsukker, "; /* */ "Target Glucose" = "Blodsukkermål"; @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekreftelseslyder"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påminnelser er pipelyder fra Pod'en som kan brukes som bekreftelse for bestemte kommandoer når Pod'en ikke er satt i stille-modus."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Lagrer..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påminnelser vil høres for kommandoer du starter, slik som bolus, stopp bolus, pause, gjenoppta, osv. Når appen automatisk justerer insulintilførsel, lages det ingen lyd."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påminnelser vil høres når appen automatisk justerer insulintilførsel og for kommandoer du starter."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Utløpspåminnelse"; From 49bea21d4d24cfb03ca77c7ee5505ec586775a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 13 Nov 2023 09:12:36 +0100 Subject: [PATCH 232/405] New Crowdin updates (#333) --- .../uk.lproj/Localizable.strings | 24 +++++++++---------- .../Resources/uk.lproj/Localizable.strings | 4 ++-- .../Resources/uk.lproj/Localizable.strings | 22 ++++++++--------- .../Main/uk.lproj/Localizable.strings | 6 ++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 2aa7c34aea..0ff6364dae 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замініть Pod. Подача інсуліну буде зупинена через 8 годин після закінчення терміну дії Pod'a або коли резервуар буде порожній."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Наповніть новий Pod інсуліном U-100 (залиште синю кришку капсули на голці)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* Label text for temporary basal rate summary */ "Rate" = "Швидкість"; @@ -787,30 +787,30 @@ "%@ ago" = "%@ тому"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Сповіщення вимкнено"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Звичайний режим роботи, коли звукові сигнали Pod використовуються для всіх сповіщень Pod і коли ввімкнено нагадування про конфіденційність."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Усі сповіщення Pod не використовують звукові сигнали, а звукові сигнали нагадування про підтвердження пригнічуються. Pod подає звукові сигнали лише у разі фатальних помилок Pod і під час відтворення тестових звукових сигналів.\n\n⚠️Попередження. Щоразу, коли Pod вимкнено, він має залишатися в зоні дії Bluetooth цього пристрою, щоб отримувати сповіщення про сповіщення Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Режим Silence Pod пригнічує всі звукові сигнали сповіщень і нагадувань про підтвердження."; /* navigation title for Silnce Pod */ "Silence Pod" = "Silence Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Деталі Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Попередні подробиці Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Деталі менеджера помпи"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Отримання деталей менеджера помп..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings index e8db1305c3..48c06a44c2 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема комунікації: не визнана команда в очікуванні."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критична Помилка"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 22f9e7a8ff..998befc826 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Нагадування про Впевненість"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Сигнали підтвердження — це звукові сигнали Podʼа, які можна використовувати для підтвердження вибраних команд."; /* The title of the configuration section in settings */ "Configuration" = "Налаштування"; @@ -547,7 +547,7 @@ "Remove Pump" = "Зніміть Pod"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,13 +766,13 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш Pod може все ще подавати інсулін.\nЗніміть його зі свого тіла, а потім натисніть «Продовжити»"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Сповіщення вимкнено"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Звичайний режим роботи, коли звукові сигнали Pod використовуються для всіх сповіщень Pod і коли ввімкнено нагадування про конфіденційність."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Усі сповіщення Pod не використовують звукові сигнали, а звукові сигнали нагадування про підтвердження пригнічуються. Pod подає звукові сигнали лише у разі фатальних помилок Pod і під час відтворення тестових звукових сигналів.\n\n⚠️Попередження. Щоразу, коли Pod вимкнено, він має залишатися в зоні дії Bluetooth цього пристрою, щоб отримувати сповіщення про сповіщення Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ @@ -781,18 +781,18 @@ Silence Pod" = "Silence Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Деталі Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Попередні подробиці Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Деталі менеджера помпи"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Отримання деталей менеджера помп..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Не вдалося оновити налаштування сигналів підтвердження."; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 59625f2423..c69e0ab2df 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Нагадування про Впевненість"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Сигнали підтвердження — це звукові сигнали Podʼа, які можна використовувати для підтвердження вибраних команд."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Збереження..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Нагадування про закінчення терміну"; From 7f4d47c8633eb784863246a923287afc693f6da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 13 Nov 2023 09:17:39 +0100 Subject: [PATCH 233/405] Crowdin (#334) --- .../ar.lproj/Localizable.strings | 6 ++-- .../da.lproj/Localizable.strings | 6 ++-- .../de.lproj/Localizable.strings | 6 ++-- .../en.lproj/Localizable.strings | 2 +- .../es.lproj/Localizable.strings | 6 ++-- .../fi.lproj/Localizable.strings | 6 ++-- .../fr.lproj/Localizable.strings | 6 ++-- .../he.lproj/Localizable.strings | 6 ++-- .../it.lproj/Localizable.strings | 6 ++-- .../nb.lproj/Localizable.strings | 8 +++--- .../nl.lproj/Localizable.strings | 6 ++-- .../pl.lproj/Localizable.strings | 6 ++-- .../pt-BR.lproj/Localizable.strings | 6 ++-- .../pt-PT.lproj/Localizable.strings | 6 ++-- .../ru.lproj/Localizable.strings | 6 ++-- .../sk.lproj/Localizable.strings | 6 ++-- .../sv.lproj/Localizable.strings | 9 +++--- .../tr.lproj/Localizable.strings | 6 ++-- .../uk.lproj/Localizable.strings | 28 +++++++++---------- .../zh-Hans.lproj/Localizable.strings | 6 ++-- .../Resources/uk.lproj/Localizable.strings | 4 +-- .../Resources/sv.lproj/Localizable.strings | 2 +- .../Resources/uk.lproj/Localizable.strings | 22 +++++++-------- .../Main/nb.lproj/Localizable.strings | 16 +++++------ .../Main/uk.lproj/Localizable.strings | 6 ++-- 25 files changed, 96 insertions(+), 97 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index cd58c69526..45e1b115e6 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 1c5168fcc2..ee218b3a0e 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index c0d414771a..019ccb559e 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 3522d69c64..cb337a9027 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -801,7 +801,7 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; /* navigation title for Silnce Pod */ "Silence Pod" = "Silence Pod"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index f53ca4b7ab..2cb2937e30 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 09296590ae..ee5177d1ce 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 287286a04d..f56676504d 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index cd58c69526..45e1b115e6 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 1531a8cefd..70b4aa4e9b 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 1d478f7c0c..523bc43df3 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Bytt pod nå. Insulintilførsel stopper 8 timer etter at den er utgått eller når det ikke er mer insulin igjen."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny Pod med U-100 insulin (la den blå hetten være på)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index aeafaf9cb9..233c859106 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index 748cc1f600..8ee7cfdd56 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 0fc54fe7c6..d3184aff0a 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index f66f0c8f29..2fab8a7abd 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 96f4bc69bf..6e66fa330d 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 9fe453e41c..19ce535865 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 3802f8a283..962faddb0b 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -795,12 +795,11 @@ /* Description for SilencePodPreference.enabled */ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "\"Varningar kommer inte längre använda ljud och även alla bekräftelseljud kommer att vara avstängda. Podden kommer bara att pipa om du väljer att spela upp testljud.\n\n⚠️Varning - när podden är tystad måste du vara inom räckhåll för dina enheter för att få några poddvarningar.\""; - -/* navigation title for Silnce Pod" */ -"Silence Pod" = "Silence Pod"; - /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping" = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Under tyst poddläge stängs alla poddens ljud av."; + +/* navigation title for Silnce Pod */ +"Silence Pod" = "Tysta podden"; /* title for pod details page */ "Pod Details" = "Poddetaljer"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 624aea657e..5abf593e1b 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 676611a414..0ff6364dae 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замініть Pod. Подача інсуліну буде зупинена через 8 годин після закінчення терміну дії Pod'a або коли резервуар буде порожній."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Наповніть новий Pod інсуліном U-100 (залиште синю кришку капсули на голці)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* Label text for temporary basal rate summary */ "Rate" = "Швидкість"; @@ -787,30 +787,30 @@ "%@ ago" = "%@ тому"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Сповіщення вимкнено"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Звичайний режим роботи, коли звукові сигнали Pod використовуються для всіх сповіщень Pod і коли ввімкнено нагадування про конфіденційність."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Усі сповіщення Pod не використовують звукові сигнали, а звукові сигнали нагадування про підтвердження пригнічуються. Pod подає звукові сигнали лише у разі фатальних помилок Pod і під час відтворення тестових звукових сигналів.\n\n⚠️Попередження. Щоразу, коли Pod вимкнено, він має залишатися в зоні дії Bluetooth цього пристрою, щоб отримувати сповіщення про сповіщення Pod."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Режим Silence Pod пригнічує всі звукові сигнали сповіщень і нагадувань про підтвердження."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Деталі Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Попередні подробиці Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Деталі менеджера помпи"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Отримання деталей менеджера помп..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index e05a32eec0..20167ea8d5 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -796,10 +796,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -/* navigation title for Silnce Pod" */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings index e8db1305c3..48c06a44c2 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема комунікації: не визнана команда в очікуванні."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критична Помилка"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 7904b7f9ea..ebe1ffb6a5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -778,7 +778,7 @@ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Tysta podded"; +Silence Pod" = "Tysta podden"; /* title for pod details page */ "Pod Details" = "Poddetaljer"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 22f9e7a8ff..998befc826 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Нагадування про Впевненість"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Сигнали підтвердження — це звукові сигнали Podʼа, які можна використовувати для підтвердження вибраних команд."; /* The title of the configuration section in settings */ "Configuration" = "Налаштування"; @@ -547,7 +547,7 @@ "Remove Pump" = "Зніміть Pod"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,13 +766,13 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш Pod може все ще подавати інсулін.\nЗніміть його зі свого тіла, а потім натисніть «Продовжити»"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Сповіщення вимкнено"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Звичайний режим роботи, коли звукові сигнали Pod використовуються для всіх сповіщень Pod і коли ввімкнено нагадування про конфіденційність."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Усі сповіщення Pod не використовують звукові сигнали, а звукові сигнали нагадування про підтвердження пригнічуються. Pod подає звукові сигнали лише у разі фатальних помилок Pod і під час відтворення тестових звукових сигналів.\n\n⚠️Попередження. Щоразу, коли Pod вимкнено, він має залишатися в зоні дії Bluetooth цього пристрою, щоб отримувати сповіщення про сповіщення Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ @@ -781,18 +781,18 @@ Silence Pod" = "Silence Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Деталі Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Попередні подробиці Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Деталі менеджера помпи"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Отримання деталей менеджера помп..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Не вдалося оновити налаштування сигналів підтвердження."; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index f5c9aea34a..26360f63ad 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -122,7 +122,7 @@ "Carbs required" = "Karbo nødvendig"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Lagre måltid"; /* */ "Are you sure?" = "Er du sikker?"; @@ -1392,10 +1392,10 @@ Enact a temp Basal or a temp target */ "Save as Preset" = "Lagre som forvalg"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Prediksjoner"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Vis protein og fett"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1409,10 +1409,10 @@ Enact a temp Basal or a temp target */ "Eventual Glucose" = "Beregnet blodsukker"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Vennligst vent"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Blodsukker, "; /* */ "Target Glucose" = "Blodsukkermål"; @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bekreftelseslyder"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påminnelser er pipelyder fra Pod'en som kan brukes som bekreftelse for bestemte kommandoer når Pod'en ikke er satt i stille-modus."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Lagrer..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Påminnelser vil høres for kommandoer du starter, slik som bolus, stopp bolus, pause, gjenoppta, osv. Når appen automatisk justerer insulintilførsel, lages det ingen lyd."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Påminnelser vil høres når appen automatisk justerer insulintilførsel og for kommandoer du starter."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Utløpspåminnelse"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 59625f2423..c69e0ab2df 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Нагадування про Впевненість"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Сигнали підтвердження — це звукові сигнали Podʼа, які можна використовувати для підтвердження вибраних команд."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Збереження..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Нагадування про довіру не використовуються."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Нагадування про достовірність лунатимуть для команд, які ви ініціюєте, як-от болюс, скасування болюсу, призупинення, відновлення, збереження сповіщень тощо. Коли Loop автоматично регулює доставку, нагадування про довіру не використовуються."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Нагадування про довіру лунатимуть, коли Loop автоматично регулює доставку, а також для команд, які ви ініціюєте."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Нагадування про закінчення терміну"; From a3832aff4e88747fd84e1a60e085de38e29a3d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 13 Nov 2023 15:15:18 +0100 Subject: [PATCH 234/405] New Silence pod string --- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 3 +++ .../OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index cb337a9027..acc13e9e1b 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -820,3 +820,6 @@ /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 6bbe410f4e..7cfcf60fb3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -797,3 +797,6 @@ /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; From f3580db7449ab904fad84e2f77f3361a09d40da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 13 Nov 2023 15:19:55 +0100 Subject: [PATCH 235/405] More strings --- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 3 +++ .../OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index acc13e9e1b..2612ff2e95 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -823,3 +823,6 @@ /* Section header for diagnostic section */ "Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 7cfcf60fb3..72cedeb38c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -800,3 +800,6 @@ /* Section header for diagnostic section */ "Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; From 2158d52e9b5d0e4558b200bd4fa016834fdee679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 13 Nov 2023 18:01:43 +0100 Subject: [PATCH 236/405] Setting for displaying/not displaying predictions --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 +++++ .../Sources/Modules/Bolus/BolusStateModel.swift | 2 ++ .../View/AlternativeBolusCalcRootView.swift | 16 +++++++++------- .../Bolus/View/DefaultBolusCalcRootView.swift | 16 +++++++++------- .../BolusCalculatorStateModel.swift | 3 +++ .../View/BolusCalculatorConfigRootView.swift | 5 +++++ 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 476c64408a..9c35e4fb33 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -49,6 +49,7 @@ struct FreeAPSSettings: JSON, Equatable { var useCalc: Bool = false var fattyMeals: Bool = false var fattyMealFactor: Decimal = 0.7 + var displayPredictions: Bool = true } extension FreeAPSSettings: Decodable { @@ -254,6 +255,10 @@ extension FreeAPSSettings: Decodable { settings.onlyAutotuneBasals = onlyAutotuneBasals } + if let displayPredictions = try? container.decode(Bool.self, forKey: .displayPredictions) { + settings.displayPredictions = displayPredictions + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index ecbc2a28bd..cf0f13de7d 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -57,6 +57,7 @@ extension Bolus { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var useFattyMealCorrectionFactor: Bool = false + @Published var displayPredictions: Bool = true @Published var meal: [CarbsEntry]? @Published var carbs: Decimal = 0 @@ -76,6 +77,7 @@ extension Bolus { useCalc = settings.settings.useCalc fattyMeals = settings.settings.fattyMeals fattyMealFactor = settings.settings.fattyMealFactor + displayPredictions = settings.settings.displayPredictions if waitForSuggestionInitial { apsManager.determineBasal() diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 8ab1b4ff9a..d8000124e7 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -57,13 +57,15 @@ extension Bolus { var body: some View { Form { - Section { - if state.waitForSuggestion { - Text("Please wait") - } else { - predictionChart - } - } header: { Text("Predictions") } + if state.displayPredictions { + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } + } Section {} if fetch { diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 1f173ad412..3ca8e36310 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -37,13 +37,15 @@ extension Bolus { var body: some View { Form { - Section { - if state.waitForSuggestion { - Text("Please wait") - } else { - predictionChart - } - } header: { Text("Predictions") } + if state.displayPredictions { + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } + } if fetch { Section { diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift index 2be23b790a..836a398fdf 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift @@ -7,6 +7,8 @@ extension BolusCalculatorConfig { @Published var fattyMeals: Bool = false @Published var fattyMealFactor: Decimal = 0 @Published var insulinReqPercentage: Decimal = 70 + @Published var displayPredictions: Bool = true + override func subscribe() { subscribeSetting(\.overrideFactor, on: $overrideFactor, initial: { let value = max(min($0, 1.2), 0.1) @@ -16,6 +18,7 @@ extension BolusCalculatorConfig { }) subscribeSetting(\.useCalc, on: $useCalc) { useCalc = $0 } subscribeSetting(\.fattyMeals, on: $fattyMeals) { fattyMeals = $0 } + subscribeSetting(\.displayPredictions, on: $displayPredictions) { displayPredictions = $0 } subscribeSetting(\.fattyMealFactor, on: $fattyMealFactor, initial: { let value = max(min($0, 1.2), 0.1) fattyMealFactor = value diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift index 11d0a3efea..bbb379a520 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift @@ -43,6 +43,11 @@ extension BolusCalculatorConfig { } } header: { Text("Calculator settings") } + Section { + Toggle("Display Predictions", isOn: $state.displayPredictions) + + } header: { Text("Smaller iPhone Screens") } + if state.useCalc { Section { HStack { From 54e3b1aae8219f1cd2f6c9af4ec2c2b894de1d9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 13 Nov 2023 18:06:49 +0100 Subject: [PATCH 237/405] Crowdin updates (#335) --- .../ar.lproj/Localizable.strings | 6 ++++ .../da.lproj/Localizable.strings | 6 ++++ .../de.lproj/Localizable.strings | 6 ++++ .../es.lproj/Localizable.strings | 6 ++++ .../fi.lproj/Localizable.strings | 6 ++++ .../fr.lproj/Localizable.strings | 6 ++++ .../he.lproj/Localizable.strings | 6 ++++ .../it.lproj/Localizable.strings | 6 ++++ .../nb.lproj/Localizable.strings | 6 ++++ .../nl.lproj/Localizable.strings | 32 +++++++++++-------- .../pl.lproj/Localizable.strings | 6 ++++ .../pt-BR.lproj/Localizable.strings | 6 ++++ .../pt-PT.lproj/Localizable.strings | 6 ++++ .../ru.lproj/Localizable.strings | 6 ++++ .../sk.lproj/Localizable.strings | 6 ++++ .../sv.lproj/Localizable.strings | 6 ++++ .../tr.lproj/Localizable.strings | 6 ++++ .../uk.lproj/Localizable.strings | 6 ++++ .../zh-Hans.lproj/Localizable.strings | 6 ++++ .../Resources/nl.lproj/Localizable.strings | 4 +-- .../Resources/ar.lproj/Localizable.strings | 6 ++++ .../Resources/da.lproj/Localizable.strings | 6 ++++ .../Resources/de.lproj/Localizable.strings | 6 ++++ .../Resources/es.lproj/Localizable.strings | 6 ++++ .../Resources/fi.lproj/Localizable.strings | 6 ++++ .../Resources/fr.lproj/Localizable.strings | 6 ++++ .../Resources/he.lproj/Localizable.strings | 6 ++++ .../Resources/it.lproj/Localizable.strings | 6 ++++ .../Resources/nb.lproj/Localizable.strings | 6 ++++ .../Resources/nl.lproj/Localizable.strings | 30 ++++++++++------- .../Resources/pl.lproj/Localizable.strings | 6 ++++ .../Resources/pt-BR.lproj/Localizable.strings | 6 ++++ .../Resources/pt-PT.lproj/Localizable.strings | 6 ++++ .../Resources/ru.lproj/Localizable.strings | 6 ++++ .../Resources/sk.lproj/Localizable.strings | 6 ++++ .../Resources/sv.lproj/Localizable.strings | 6 ++++ .../Resources/tr.lproj/Localizable.strings | 6 ++++ .../Resources/uk.lproj/Localizable.strings | 6 ++++ .../zh-Hans.lproj/Localizable.strings | 6 ++++ .../Main/nl.lproj/Localizable.strings | 10 +++--- 40 files changed, 260 insertions(+), 32 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index 45e1b115e6..f3e25b45ef 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index ee218b3a0e..6102a76d53 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 019ccb559e..691a2a4eb5 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 2cb2937e30..97b0403250 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index ee5177d1ce..681a1e0169 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index f56676504d..63c4206702 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index 45e1b115e6..f3e25b45ef 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 70b4aa4e9b..0349d46d18 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 523bc43df3..4b9f32d606 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 233c859106..0662a3a310 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; /* Label text for temporary basal rate summary */ "Rate" = "Waarde"; @@ -787,30 +787,36 @@ "%@ ago" = "%@ geleden"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Gedempt"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale bewerkingsmodus waarbij hoorbare puepjes worden gebruikt voor alle Pod waarschuwingen en wanneer meldingen zijn ingeschakeld."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod alarmen gebruiken geen piepjes en herinneringen worden gedempt. De Pod zal alleen piepen bij fatale Pod fouten en bij testpiepen.\n\n⚠️Waarschuwing - Wanneer de Pod is gedempt, moet het binnen het Bluetooth-bereik van dit apparaat worden gehouden om meldingen voor Pod te ontvangen."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Pod modus dempt alle Pod alarmen en herinnering meldingen."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Gedempt"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorige Pod details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pomp manager details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pomp manager gegevens ophalen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pomp manager details verversen"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostische gegevens"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = ""; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index 8ee7cfdd56..bebc91b195 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index d3184aff0a..15d56f1c91 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index 2fab8a7abd..8019116b43 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 6e66fa330d..0361e4f665 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 19ce535865..b01332c817 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 962faddb0b..fd17da881e 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Hämtar pumphanterarens detaljer..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Uppdatera pumphanterarens detaljer"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostik"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Läd poddstatus"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 5abf593e1b..8a589c5980 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 0ff6364dae..5947cf27ab 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Отримання деталей менеджера помп..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 20167ea8d5..32f9c63cca 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -814,3 +814,9 @@ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings index 4090dca4ee..f97fe8000a 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Communicatieprobleem: niet-bevestigde opdracht in behandeling"; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritieke Pod fout"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index b57dddcf7d..a3b7b3a417 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index 5e56dc5a0f..be078fbfe6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index dee8f70a5f..526bb72127 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index 100487ad32..f1255d125d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index 7e7b298282..e41304948a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index 043ab1a0a9..86a6813a3f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index 00c2952e3c..e5a65aceb3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 225154cdb6..32385cf6a5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index f8892bd396..eca1fc4e17 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index c1a8f8a23a..bed1732065 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; /* The title of the configuration section in settings */ "Configuration" = "Configuratie"; @@ -547,7 +547,7 @@ "Remove Pump" = "Verwijder Pomp"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,33 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Je Pod kan nog steeds insuline toedienen.\nVerwijder de Pod van je lichaam en tik vervolgens op \"Ga Verder\"."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Gedempt"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale bewerkingsmodus waarbij hoorbare puepjes worden gebruikt voor alle Pod waarschuwingen en wanneer meldingen zijn ingeschakeld."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod alarmen gebruiken geen piepjes en herinneringen worden gedempt. De Pod zal alleen piepen bij fatale Pod fouten en bij testpiepen.\n\n⚠️Waarschuwing - Wanneer de Pod is gedempt, moet het binnen het Bluetooth-bereik van dit apparaat worden gehouden om meldingen voor Pod te ontvangen."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Gedempt"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorige Pod details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pomp manager details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pomp manager gegevens ophalen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pomp manager details verversen"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Kon de voorkeur voor meldingen niet bijwerken."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostische gegevens"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = ""; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 14e3df006a..08d9e94b7d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index 14e833cc79..72b1e743f3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 374ffa7cc4..2718eea445 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index ced4289e57..361282afc1 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 9184b21ebb..c6efa56456 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index ebe1ffb6a5..9d2a4613a2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Tysta podden"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Misslyckades att uppdatera inställning för tystad podd."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostik"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Läd poddstatus"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 42ce07a4bf..6f6f95c14a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 998befc826..67216a18ff 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Не вдалося оновити налаштування сигналів підтвердження."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index ee0a8d8068..180ddff2ed 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -796,3 +796,9 @@ Silence Pod" = "Silence Pod"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index bd470d6eeb..c587332bc0 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1392,10 +1392,10 @@ Enact a temp Basal or a temp target */ "Save as Preset" = "Bewaar als voorinstelling"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Voorspellingen"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Toon vet en eiwit"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Opslaan..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Herinnering vervaldatum ingeschakeld"; From f0ed313366c8f64f465641f401f1f5c476ba940e Mon Sep 17 00:00:00 2001 From: Pierre L Date: Mon, 13 Nov 2023 20:55:14 +0100 Subject: [PATCH 238/405] allows to add carbs in future #336 resolutions --- .../Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 4e36be7d4e..a77b815c7f 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -74,7 +74,6 @@ extension AddCarbs { // Time HStack { - let now = Date.now Text("Time") Spacer() if !pushed { @@ -87,14 +86,11 @@ extension AddCarbs { DatePicker( "Time", selection: $state.date, - in: ...now, displayedComponents: [.hourAndMinute] ).controlSize(.mini) .labelsHidden() Button { - if state.date.addingTimeInterval(5.minutes.timeInterval) < now { - state.date = state.date.addingTimeInterval(10.minutes.timeInterval) - } + state.date = state.date.addingTimeInterval(10.minutes.timeInterval) } label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) } From 7476aac93d4f04bb22f90242593711f14660a14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 14 Nov 2023 01:13:57 +0100 Subject: [PATCH 239/405] Fix Type bug. Uncomment the gray code if you want to display minutes ago for glucose on Watch app (kind of unnecesary as it normally should be same value as last loop minutes ago...) --- .../Services/WatchManager/WatchManager.swift | 1 - FreeAPSWatch WatchKit Extension/DataFlow.swift | 1 - .../Views/MainView.swift | 13 ++++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index e4d3b6d53d..b8d91fdf01 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -62,7 +62,6 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.delta = glucoseValues.delta self.state.trendRaw = readings.first?.direction ?? "↔︎" self.state.glucoseDate = readings.first?.date ?? .distantPast - self.state.glucoseDateInterval = self.state.glucoseDate.map { UInt64($0.timeIntervalSince1970) } self.state.lastLoopDate = self.enactedSuggestion?.recieved == true ? self.enactedSuggestion?.deliverAt : self .apsManager.lastLoopDate self.state.lastLoopDateInterval = self.state.lastLoopDate.map { diff --git a/FreeAPSWatch WatchKit Extension/DataFlow.swift b/FreeAPSWatch WatchKit Extension/DataFlow.swift index d6f7848c13..cd781b7e36 100644 --- a/FreeAPSWatch WatchKit Extension/DataFlow.swift +++ b/FreeAPSWatch WatchKit Extension/DataFlow.swift @@ -6,7 +6,6 @@ struct WatchState: Codable { var trendRaw: String? var delta: String? var glucoseDate: Date? - var glucoseDateInterval: UInt64? var lastLoopDate: Date? var lastLoopDateInterval: UInt64? var bolusIncrement: Decimal? diff --git a/FreeAPSWatch WatchKit Extension/Views/MainView.swift b/FreeAPSWatch WatchKit Extension/Views/MainView.swift index ab2268523c..456bbb8f1a 100644 --- a/FreeAPSWatch WatchKit Extension/Views/MainView.swift +++ b/FreeAPSWatch WatchKit Extension/Views/MainView.swift @@ -80,7 +80,18 @@ struct MainView: View { .scaledToFill() .minimumScaleFactor(0.5) } - Text(state.delta).font(.caption2).foregroundColor(.gray) + /* IF YOU WANT TO DISPLAY MINUTES AGO, UNCOMMENT the gray code below + let minutesAgo: TimeInterval = -1 * (state.glucoseDate ?? .distantPast).timeIntervalSinceNow / 60 + let minuteString = minutesAgo.formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + */ + HStack { + /* if minutesAgo > 0 { + Text(minuteString) + Text("min") + } */ + Text(state.delta) + } + .font(.caption2).foregroundColor(.gray) } Spacer() From 7c19bd9c26009beedb4ff3cf5c3d122d168c5166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 14 Nov 2023 10:36:15 +0100 Subject: [PATCH 240/405] Display Eventual BG --- .../View/AlternativeBolusCalcRootView.swift | 20 +++++++++---------- .../Bolus/View/DefaultBolusCalcRootView.swift | 19 +++++++++--------- .../Modules/Bolus/View/Predictions.swift | 5 ++++- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index d8000124e7..382f24a3c3 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -57,15 +57,15 @@ extension Bolus { var body: some View { Form { - if state.displayPredictions { - Section { - if state.waitForSuggestion { - Text("Please wait") - } else { - predictionChart - } - } header: { Text("Predictions") } - } + + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } + Section {} if fetch { @@ -203,7 +203,7 @@ extension Bolus { var predictionChart: some View { ZStack { PredictionView( - predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target, displayPredictions: $state.displayPredictions ) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 3ca8e36310..b040accdf4 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -37,15 +37,13 @@ extension Bolus { var body: some View { Form { - if state.displayPredictions { - Section { - if state.waitForSuggestion { - Text("Please wait") - } else { - predictionChart - } - } header: { Text("Predictions") } - } + Section { + if state.waitForSuggestion { + Text("Please wait") + } else { + predictionChart + } + } header: { Text("Predictions") } if fetch { Section { @@ -178,7 +176,8 @@ extension Bolus { var predictionChart: some View { ZStack { PredictionView( - predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target, + displayPredictions: $state.displayPredictions ) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift index 27e9ca6a08..c07a26be0b 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/Predictions.swift @@ -8,6 +8,7 @@ struct PredictionView: View { @Binding var units: GlucoseUnits @Binding var eventualBG: Int @Binding var target: Decimal + @Binding var displayPredictions: Bool private enum Config { static let height: CGFloat = 160 @@ -16,7 +17,9 @@ struct PredictionView: View { var body: some View { VStack { - chart() + if displayPredictions { + chart() + } HStack { let conversion = units == .mmolL ? 0.0555 : 1 Text("Eventual Glucose") From 61ea03f1c24545796ad328f8c52edc735ce853c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 14 Nov 2023 17:01:44 +0100 Subject: [PATCH 241/405] Crowdin updates (#338) German --- .../de.lproj/Localizable.strings | 30 +++++++++---------- .../Resources/de.lproj/Localizable.strings | 4 +-- .../Resources/de.lproj/Localizable.strings | 28 ++++++++--------- .../Main/de.lproj/Localizable.strings | 8 ++--- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 691a2a4eb5..9862b94e96 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Ersetze jetzt den Pod! Die Insulinabgabe wird in 8 Stunden unterbrochen, spätestens wenn die Gültigkeit abgelaufen ist oder kein Insulin mehr vorhanden ist."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Label text for temporary basal rate summary */ "Rate" = "BR"; @@ -787,36 +787,36 @@ "%@ ago" = "%@ vor"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Stille"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normaler Operationsmodus, in dem hörbare Pod Signale für alle Pod Alarme verwendet werden und wenn Vertrauenserinnerungen aktiviert sind."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod Alarme verwenden keine Signale und Bestätigungssignale werden unterdrückt. Der Pod springt nur bei tödlichen Pod-Fehlern und beim Abspielen von Testsignalen.\n\nWarnung: Warnung - Wann immer der Pod zum Schweigen gebracht wird, muss er innerhalb des Bluetooth-Bereichs dieses Geräts gehalten werden, um Benachrichtigungen für Pod-Benachrichtigungen zu erhalten."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Stille Pod Modus unterdrückt alle Pod Warnungen und Bestätigungs-Erinnerung."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Stille Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-Details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorherige Pod-Details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pump-Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pumpenmanager Details abrufen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pumpmanager Details aktualisieren"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose-Infos"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Pod-Status ablesen"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings index aadf6cf134..8c7de48334 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Unbestätigter Befehl steht noch aus."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritischer Pod-Fehler"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 526bb72127..702fbf6a0d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pumpe löschen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Entfernen Sie die Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ihr Pod gibt möglicherweise immer noch Insulin ab.\nEntfernen Sie ihn vom Körper und tippen dann auf „Weiter“."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Stille"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normaler Operationsmodus, in dem hörbare Pod Signale für alle Pod Alarme verwendet werden und wenn Vertrauenserinnerungen aktiviert sind."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod Alarme verwenden keine Signale und Bestätigungssignale werden unterdrückt. Der Pod springt nur bei tödlichen Pod-Fehlern und beim Abspielen von Testsignalen.\n\nWarnung: Warnung - Wann immer der Pod zum Schweigen gebracht wird, muss er innerhalb des Bluetooth-Bereichs dieses Geräts gehalten werden, um Benachrichtigungen für Pod-Benachrichtigungen zu erhalten."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Stille Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-Details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorherige Pod-Details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pump-Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pumpenmanager Details abrufen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pumpenmanager Details aktualisieren"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Fehler beim Aktualisieren der Stille Pod Einstellung."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose-Infos"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Pod-Status ablesen"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 9d4bcfd7df..1bc0b21270 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1395,7 +1395,7 @@ Enact a temp Basal or a temp target */ "Predictions" = "Prognosen"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Zeige Eiweiß & Fett"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Pumpe Bestätigungstöne"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Speichern..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard Ablauf-Erinnerung"; From c014beec8ae94b70513cbeca8ed55fc58c0de90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 15 Nov 2023 14:21:20 +0100 Subject: [PATCH 242/405] New Crowdin updates (#339) * Russian --- .../ru.lproj/Localizable.strings | 30 +++++++++---------- .../Resources/ru.lproj/Localizable.strings | 4 +-- .../Resources/ru.lproj/Localizable.strings | 28 ++++++++--------- .../Main/ru.lproj/Localizable.strings | 6 ++-- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 0361e4f665..afd3e16fe2 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замените Под. Подача инсулина будет остановлена спустя 8 часов после истечения срока действия Пода, либо когда резервуар будет пуст."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for temporary basal rate summary */ "Rate" = "Скорость"; @@ -787,36 +787,36 @@ "%@ ago" = "%@ назад"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Беззвучно"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Обычный режим работы, при котором звуковые сигналы используются для всех оповещений Пода и при включенных доверенных напоминаниях."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Все уведомления Пода не издают звуковых сигналов и напоминания о подтверждении подавлены. Под будет издавать звуковые сигналы только при критических сбоях Пода и когда проигрываются тестовые звуки.\n\n⚠️Предупреждение — Когда Под заглушен, он должен находиться в пределах Bluetooth-диапазона этого устройства, для получения сигналов уведомлений."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Беззвучный режим Пода отключает все звуковые сигналы и напоминания о подтверждении Пода."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Беззвучный Под"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Сведения о Поде"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Сведения о предыдущем Поде"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Сведения о помпе"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Получение сведений о помпе..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Обновить сведения о помпе"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Диагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Получить статус Пода"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings index 669cf193ae..5188e016fb 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема со связью: ожидается неподтвержденная команда."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критическая ошибка пода"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 361282afc1..ddc9d602c2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Напоминания об уверенности"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды, когда Под не заглушен."; /* The title of the configuration section in settings */ "Configuration" = "Конфигурация"; @@ -547,7 +547,7 @@ "Remove Pump" = "Удалите помпу"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Отломите защитную крышку канюли и проверьте состояние самой канюли. Далее снимите защитные стикеры с пластыря."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш под может по-прежнему доставлять инсулин.\n Удалите его с тела, затем нажмите «Продолжить»."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Беззвучно"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Обычный режим работы, при котором звуковые сигналы используются для всех оповещений Пода и при включенных доверенных напоминаниях."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Все уведомления Пода не издают звуковых сигналов и напоминания о подтверждении подавлены. Под будет издавать звуковые сигналы только при критических сбоях Пода и когда проигрываются тестовые звуки.\n\n⚠️Предупреждение — Когда Под заглушен, он должен находиться в пределах Bluetooth-диапазона этого устройства, для получения сигналов уведомлений."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Беззвучный Под"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Сведения о Поде"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Сведения о предыдущем Поде"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Сведения о помпе"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Получение сведений о помпе..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Обновить сведения о помпе"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Не удалось обновить настройку беззвучного режима Пода."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Диагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Получить статус Пода"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ea74c1d3cf..07f6d3ddf0 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -1480,7 +1480,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Напоминания о верификации"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды, когда Под не заглушен."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Сохранение..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Напоминание об истечении срока"; From ea8bd04d1401d921120145f30fb93d5853ca6091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 16 Nov 2023 01:01:56 +0100 Subject: [PATCH 243/405] Crowdin (Dutch) (#342) --- .../Sources/Localizations/Main/nl.lproj/Localizable.strings | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index c587332bc0..6af29174f7 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -95,7 +95,7 @@ "Home" = "Hoofdmenu"; /* Looping in progress */ -"looping" = "Loopen"; +"looping" = "Updaten"; /* min ago since last loop */ "min ago" = "Min. terug"; @@ -471,7 +471,7 @@ Enact a temp Basal or a temp target */ "m" = "m"; /* */ -"Closed loop" = "Gesloten loop"; +"Closed loop" = "Actieve loop"; /* */ "Configuration" = "Instellingen"; @@ -1880,7 +1880,7 @@ Enact a temp Basal or a temp target */ "Max IOB" = "Max IOB"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "De Max IOB is de maximale hoeveelheid insuline aan boord van alle bronnen - zowel basaal (of SMB correcties) en bolus insuline die door iAPS gegeven mag worden om alles hoger dan de streefwaarde te behandelen. Anders dan de andere twee veiligheid instelingen (max_daily_safety_multiplier and current_basal_safety_multiplier) wordt bij deze instelling een vaste aantal eenheden insuline opgegeven. Voorlopig worden handmatige bolussen NIET beperkt door deze instelling. \n\n Om je basaal waarden te testen gedurende de nacht kun je deze instelling op 0 zetten tijdens een gesloten Loop. Dit zorgt er voor dat stop voor laag geactiveerd worden wanneer je je instelling aan het testen bent. \n\n(Tip van https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "De Max IOB is de maximale hoeveelheid insuline aan boord van alle bronnen - zowel basaal (of SMB correcties) en bolus insuline die door iAPS gegeven mag worden om alles hoger dan de streefwaarde te behandelen. Anders dan de andere twee veiligheid instelingen (max_daily_safety_multiplier and current_basal_safety_multiplier) wordt bij deze instelling een vaste aantal eenheden insuline opgegeven. Voorlopig worden handmatige bolussen NIET beperkt door deze instelling. \n\n Om je basaal waarden te testen gedurende de nacht kun je deze instelling op 0 zetten tijdens een actieve Loop. Dit zorgt er voor dat stop voor laag geactiveerd worden wanneer je je instelling aan het testen bent. \n\n(Tip van https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ "Max Daily Safety Multiplier" = "Maximale dagelijkse veiligheidsvermenigvuldiger"; From 234c8edb41c3b193ef8c9d401628d18b913e978c Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Thu, 16 Nov 2023 01:05:45 +0100 Subject: [PATCH 244/405] Revert "allows to add carbs in future" This reverts commit f0ed313366c8f64f465641f401f1f5c476ba940e. Reverted due to incompatibility with new bolus-meal which will need some refactoring first. --- .../Sources/Modules/AddCarbs/View/AddCarbsRootView.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index a77b815c7f..4e36be7d4e 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -74,6 +74,7 @@ extension AddCarbs { // Time HStack { + let now = Date.now Text("Time") Spacer() if !pushed { @@ -86,11 +87,14 @@ extension AddCarbs { DatePicker( "Time", selection: $state.date, + in: ...now, displayedComponents: [.hourAndMinute] ).controlSize(.mini) .labelsHidden() Button { - state.date = state.date.addingTimeInterval(10.minutes.timeInterval) + if state.date.addingTimeInterval(5.minutes.timeInterval) < now { + state.date = state.date.addingTimeInterval(10.minutes.timeInterval) + } } label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) } From f82a29996a4bff8a94fed4e72bb20b9b021079ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 18 Nov 2023 04:28:42 +0100 Subject: [PATCH 245/405] Crowdin updates (#350) Ukrainian --- .../OmniBLE/Localizations/uk.lproj/Localizable.strings | 4 ++-- .../OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 5947cf27ab..d68827c20d 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -816,7 +816,7 @@ "Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Діагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Отримати статус Pod'у"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 67216a18ff..63ec6f256e 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -798,7 +798,7 @@ Silence Pod" = "Silence Pod"; "Failed to update silence pod preference." = "Не вдалося оновити налаштування сигналів підтвердження."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Діагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Отримати статус Pod'у"; From 2e16d7d724433c1360fa1eb5af1b5822a6c7816d Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:13:11 +0100 Subject: [PATCH 246/405] Add Timezone Offset Indicator (#323) --- .../Core_Data.xcdatamodel/contents | 2 + FreeAPS/Sources/APS/DeviceDataManager.swift | 7 ++ .../Sources/APS/Storage/CarbsStorage.swift | 55 ++++++--- FreeAPS/Sources/Models/CarbsEntry.swift | 4 +- .../Sources/Models/NightscoutTreatment.swift | 6 +- .../Modules/AddCarbs/AddCarbsStateModel.swift | 10 +- .../Modules/Bolus/BolusStateModel.swift | 37 +++--- .../View/AlternativeBolusCalcRootView.swift | 14 +-- .../Bolus/View/DefaultBolusCalcRootView.swift | 9 +- .../Modules/DataTable/DataTableProvider.swift | 7 +- .../DataTable/DataTableStateModel.swift | 5 +- .../Sources/Modules/Home/HomeProvider.swift | 4 + .../Sources/Modules/Home/HomeStateModel.swift | 13 +- .../Modules/Home/View/Header/LoopView.swift | 1 + .../Modules/Home/View/Header/PumpView.swift | 11 ++ .../Modules/Home/View/HomeRootView.swift | 3 +- .../Services/HealthKit/HealthKitManager.swift | 65 +++++----- .../Services/Network/NightscoutAPI.swift | 13 +- .../Services/Network/NightscoutManager.swift | 112 ++++++++++++++---- .../Services/WatchManager/WatchManager.swift | 2 +- .../Carbs/CarbPresetIntentRequest.swift | 2 +- 21 files changed, 262 insertions(+), 120 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 372848b776..88e0749cdc 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -68,7 +68,9 @@ + + diff --git a/FreeAPS/Sources/APS/DeviceDataManager.swift b/FreeAPS/Sources/APS/DeviceDataManager.swift index 8d2abb088a..308f97c54f 100644 --- a/FreeAPS/Sources/APS/DeviceDataManager.swift +++ b/FreeAPS/Sources/APS/DeviceDataManager.swift @@ -349,6 +349,9 @@ extension BaseDeviceDataManager: PumpManagerDelegate { broadcaster.notify(PumpBatteryObserver.self, on: processQueue) { $0.pumpBatteryDidChange(battery) } + broadcaster.notify(PumpTimeZoneObserver.self, on: processQueue) { + $0.pumpTimeZoneDidChange(status.timeZone) + } if let omnipod = pumpManager as? OmnipodPumpManager { let reservoirVal = omnipod.state.podState?.lastInsulinMeasurements?.reservoirLevel ?? 0xDEAD_BEEF @@ -652,3 +655,7 @@ protocol PumpReservoirObserver { protocol PumpBatteryObserver { func pumpBatteryDidChange(_ battery: Battery) } + +protocol PumpTimeZoneObserver { + func pumpTimeZoneDidChange(_ timezone: TimeZone) +} diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 1297a51b56..d2fa3c7e11 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -12,7 +12,7 @@ protocol CarbsStorage { func syncDate() -> Date func recent() -> [CarbsEntry] func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] - func deleteCarbs(at uniqueID: String) + func deleteCarbs(at uniqueID: String, fpuID: String, complex: Bool) } final class BaseCarbsStorage: CarbsStorage, Injectable { @@ -71,7 +71,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // New date for each carb equivalent var useDate = entries.last?.createdAt ?? Date() // Group and Identify all FPUs together - let fpuID = (entries.last?.collectionID ?? "") + ".fpu" + let fpuID = entries.last?.fpuID ?? "" // Create an array of all future carb equivalents. var futureCarbArray = [CarbsEntry]() while carbEquivalents > 0, numberOfEquivalents > 0 { @@ -81,7 +81,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) } let eachCarbEntry = CarbsEntry( - collectionID: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, + id: UUID().uuidString, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, enteredBy: CarbsEntry.manual, isFPU: true, fpuID: fpuID ) @@ -100,10 +100,22 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } } // ------------------------- END OF TPU ---------------------------------------- // Store the actual (normal) carbs - if entries.last?.carbs ?? 0 > 0 { + if let entry = entries.last, entry.carbs > 0 { // uniqEvents = [] + let onlyCarbs = CarbsEntry( + id: entry.id ?? "", + createdAt: entry.createdAt, + carbs: entry.carbs, + fat: nil, + protein: nil, + note: entry.note ?? "", + enteredBy: entry.enteredBy ?? "", + isFPU: false, + fpuID: "" + ) + self.storage.transaction { storage in - storage.append(entries, to: file, uniqBy: \.createdAt) + storage.append(onlyCarbs, to: file, uniqBy: \.createdAt) uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } .sorted { $0.createdAt > $1.createdAt } ?? [] @@ -143,17 +155,31 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? [] } - func deleteCarbs(at uniqueID: String) { + func deleteCarbs(at uniqueID: String, fpuID: String, complex: Bool) { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - if allValues.firstIndex(where: { $0.collectionID == uniqueID }) == nil { - debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description) - } else { - allValues.removeAll(where: { $0.collectionID == uniqueID }) - storage.save(allValues, as: OpenAPS.Monitor.carbHistory) - broadcaster.notify(CarbsObserver.self, on: processQueue) { - $0.carbsDidUpdate(allValues) + if fpuID != "" { + if allValues.firstIndex(where: { $0.fpuID == fpuID }) == nil { + debug(.default, "Didn't find any carb equivalents to delete. ID to search for: " + fpuID.description) + } else { + allValues.removeAll(where: { $0.fpuID == fpuID }) + storage.save(allValues, as: OpenAPS.Monitor.carbHistory) + broadcaster.notify(CarbsObserver.self, on: processQueue) { + $0.carbsDidUpdate(allValues) + } + } + } + + if fpuID == "" || complex { + if allValues.firstIndex(where: { $0.id == uniqueID }) == nil { + debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description) + } else { + allValues.removeAll(where: { $0.id == uniqueID }) + storage.save(allValues, as: OpenAPS.Monitor.carbHistory) + broadcaster.notify(CarbsObserver.self, on: processQueue) { + $0.carbsDidUpdate(allValues) + } } } } @@ -181,7 +207,8 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { foodType: $0.note, targetTop: nil, targetBottom: nil, - collectionID: $0.collectionID + id: $0.id, + fpuID: $0.fpuID ) } return Array(Set(treatments).subtracting(Set(uploaded))) diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index 9faff357f9..3c8f35cc76 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -1,7 +1,7 @@ import Foundation struct CarbsEntry: JSON, Equatable, Hashable { - let collectionID: String? + let id: String? let createdAt: Date let carbs: Decimal let fat: Decimal? @@ -25,7 +25,7 @@ struct CarbsEntry: JSON, Equatable, Hashable { extension CarbsEntry { private enum CodingKeys: String, CodingKey { - case collectionID = "_id" + case id = "_id" case createdAt = "created_at" case carbs case fat diff --git a/FreeAPS/Sources/Models/NightscoutTreatment.swift b/FreeAPS/Sources/Models/NightscoutTreatment.swift index e05f3cc2bd..e7c78bcf9d 100644 --- a/FreeAPS/Sources/Models/NightscoutTreatment.swift +++ b/FreeAPS/Sources/Models/NightscoutTreatment.swift @@ -21,7 +21,8 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable { var glucoseType: String? var glucose: String? var units: String? - var collectionID: String? + var id: String? + var fpuID: String? static let local = "iAPS" @@ -58,6 +59,7 @@ extension NigtscoutTreatment { case glucoseType case glucose case units - case collectionID + case id + case fpuID } } diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index c10114e6f8..80fc242a63 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -40,14 +40,14 @@ extension AddCarbs { id_ = UUID().uuidString let carbsToStore = [CarbsEntry( - collectionID: id_, - createdAt: date, + id: id_, + createdAt: Date.now, carbs: carbs, fat: fat, protein: protein, note: note, enteredBy: CarbsEntry.manual, - isFPU: false, fpuID: nil + isFPU: false, fpuID: UUID().uuidString )] carbsStorage.storeCarbs(carbsToStore) @@ -192,13 +192,15 @@ extension AddCarbs { let save = Meals(context: coredataContext) if let entry = stored.first { save.createdAt = Date.now - save.id = entry.collectionID ?? "" + save.id = entry.id ?? "" + save.fpuID = entry.fpuID ?? "" save.carbs = Double(entry.carbs) save.fat = Double(entry.fat ?? 0) save.protein = Double(entry.protein ?? 0) save.note = entry.note try? coredataContext.save() } + print("meals 1: ID: " + (save.id ?? "").description + " FPU ID: " + (save.fpuID ?? "").description) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index cf0f13de7d..752a8ec106 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -223,25 +223,34 @@ extension Bolus { } } - func backToCarbsView(complexEntry: Bool, _ id: String, override: Bool) { - delete(deleteTwice: complexEntry, id: id) + func backToCarbsView(complexEntry: Bool, _ meal: FetchedResults, override: Bool) { + delete(deleteTwice: complexEntry, meal: meal) showModal(for: .addCarbs(editMode: complexEntry, override: override)) } - func delete(deleteTwice: Bool, id: String) { + func delete(deleteTwice: Bool, meal: FetchedResults) { + guard let meals = meal.first else { + return + } + + let mealArray = DataTable.Treatment( + units: units, + type: .carbs, + date: meals.createdAt ?? Date(), + id: meals.id ?? "", + isFPU: deleteTwice ? true : false, + fpuID: deleteTwice ? (meals.fpuID ?? "") : "" + ) + + print( + "meals 2: ID: " + (mealArray.id ?? "").description + " FPU ID: " + (mealArray.fpuID ?? "") + .description + ) + if deleteTwice { - // DispatchQueue.safeMainSync { - nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id - ) - nsManager.deleteCarbs( - at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id - ) - // } + nsManager.deleteCarbs(mealArray, complexMeal: true) } else { - nsManager.deleteCarbs( - at: id, isFPU: nil, fpuID: nil, syncID: id - ) + nsManager.deleteCarbs(mealArray, complexMeal: false) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 382f24a3c3..6c3e983600 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -57,7 +57,6 @@ extension Bolus { var body: some View { Form { - Section { if state.waitForSuggestion { Text("Please wait") @@ -65,7 +64,6 @@ extension Bolus { predictionChart } } header: { Text("Predictions") } - Section {} if fetch { @@ -190,9 +188,9 @@ extension Bolus { } .onDisappear { if fetch, hasFatOrProtein, !keepForNextWiew, state.useCalc { - state.delete(deleteTwice: true, id: meal.first?.id ?? "") + state.delete(deleteTwice: true, meal: meal) } else if fetch, !keepForNextWiew, state.useCalc { - state.delete(deleteTwice: false, id: meal.first?.id ?? "") + state.delete(deleteTwice: false, meal: meal) } } .popup(isPresented: showInfo) { @@ -203,7 +201,8 @@ extension Bolus { var predictionChart: some View { ZStack { PredictionView( - predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target, displayPredictions: $state.displayPredictions + predictions: $state.predictions, units: $state.units, eventualBG: $state.evBG, target: $state.target, + displayPredictions: $state.displayPredictions ) } } @@ -284,12 +283,11 @@ extension Bolus { } func carbsView() { - let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_, override: false) + state.backToCarbsView(complexEntry: true, meal, override: false) } else { - state.backToCarbsView(complexEntry: false, id_, override: true) + state.backToCarbsView(complexEntry: false, meal, override: true) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index b040accdf4..8329f93ec3 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -143,9 +143,9 @@ extension Bolus { .onDisappear { if fetch, hasFatOrProtein, !keepForNextWiew, !state.useCalc { - state.delete(deleteTwice: true, id: meal.first?.id ?? "") + state.delete(deleteTwice: true, meal: meal) } else if fetch, !keepForNextWiew, !state.useCalc { - state.delete(deleteTwice: false, id: meal.first?.id ?? "") + state.delete(deleteTwice: false, meal: meal) } } @@ -191,12 +191,11 @@ extension Bolus { } func carbsView() { - let id_ = meal.first?.id ?? "" if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, id_, override: false) + state.backToCarbsView(complexEntry: fetch, meal, override: false) } else { - state.backToCarbsView(complexEntry: false, id_, override: true) + state.backToCarbsView(complexEntry: false, meal, override: true) } } diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift index 4540bd957b..8fc90b8f1f 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift @@ -32,12 +32,7 @@ extension DataTable { } func deleteCarbs(_ treatement: Treatment) { - nightscoutManager.deleteCarbs( - at: treatement.id, - isFPU: treatement.isFPU, - fpuID: treatement.fpuID, - syncID: treatement.id - ) + nightscoutManager.deleteCarbs(treatement, complexMeal: false) } func deleteInsulin(_ treatement: Treatment) { diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index bf5b1045ca..22a03d5cce 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -40,13 +40,14 @@ extension DataTable { let carbs = self.provider.carbs() .filter { !($0.isFPU ?? false) } .map { - if let id = $0.collectionID { + if let id = $0.id { return Treatment( units: units, type: .carbs, date: $0.createdAt, amount: $0.carbs, id: id, + fpuID: $0.fpuID, note: $0.note ) } else { @@ -62,7 +63,7 @@ extension DataTable { type: .fpus, date: $0.createdAt, amount: $0.carbs, - id: $0.collectionID, + id: $0.id, isFPU: $0.isFPU, fpuID: $0.fpuID, note: $0.note diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index c9cc1c0a07..fb846a2fd0 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -19,6 +19,10 @@ extension Home { storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) } + func pumpTimeZone() -> TimeZone? { + apsManager.pumpManager?.status.timeZone + } + func heartbeatNow() { apsManager.heartbeat(date: Date()) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 50d737ead9..d96bd43411 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -60,6 +60,7 @@ extension Home { @Published var displayXgridLines: Bool = false @Published var displayYgridLines: Bool = false @Published var thresholdLines: Bool = false + @Published var timeZone: TimeZone? let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -75,6 +76,7 @@ extension Home { setupBattery() setupReservoir() setupAnnouncements() + setupCurrentPumpTimezone() suggestion = provider.suggestion uploadStats = settingsManager.settings.uploadStats @@ -360,6 +362,10 @@ extension Home { tempTarget = provider.tempTarget() } + private func setupCurrentPumpTimezone() { + timeZone = provider.pumpTimeZone() + } + func openCGM() { guard var url = nightscoutManager.cgmURL else { return } @@ -397,7 +403,8 @@ extension Home.StateModel: CarbsObserver, EnactedSuggestionObserver, PumpBatteryObserver, - PumpReservoirObserver + PumpReservoirObserver, + PumpTimeZoneObserver { func glucoseDidUpdate(_: [BloodGlucose]) { setupGlucose() @@ -463,6 +470,10 @@ extension Home.StateModel: func pumpReservoirDidChange(_: Decimal) { setupReservoir() } + + func pumpTimeZoneDidChange(_: TimeZone) { + setupCurrentPumpTimezone() + } } extension Home.StateModel: CompletionDelegate { diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index e5d1e3b3aa..b92a98eb40 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -22,6 +22,7 @@ struct LoopView: View { } private let rect = CGRect(x: 0, y: 0, width: 28, height: 28) + var body: some View { VStack(alignment: .center) { ZStack { diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index 7a32b8c12b..e809049b82 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -6,6 +6,7 @@ struct PumpView: View { @Binding var name: String @Binding var expiresAtDate: Date? @Binding var timerDate: Date + @Binding var timeZone: TimeZone? private var reservoirFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -39,6 +40,16 @@ struct PumpView: View { ) .font(.footnote).fontWeight(.bold) } + + if let timeZone = timeZone, timeZone.secondsFromGMT() != TimeZone.current.secondsFromGMT() { + Image(systemName: "clock.badge.exclamationmark.fill") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 13) + .symbolRenderingMode(.palette) + .foregroundStyle(.red, Color(.warning)) + .padding(.bottom, 10) + } }.frame(alignment: .top) } if let battery = battery, battery.display ?? false, expiresAtDate == nil { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index ed4c3645fd..20d9556621 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -153,7 +153,8 @@ extension Home { battery: $state.battery, name: $state.pumpName, expiresAtDate: $state.pumpExpiresAtDate, - timerDate: $state.timerDate + timerDate: $state.timerDate, + timeZone: $state.timeZone ) .onTapGesture { if state.pumpDisplayState != nil { diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 82fbda55a6..97e651e4b3 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -26,7 +26,7 @@ protocol HealthKitManager: GlucoseSource { /// Delete glucose with syncID func deleteGlucose(syncID: String) /// delete carbs with syncID - func deleteCarbs(syncID: String, isFPU: Bool?, fpuID: String?) + func deleteCarbs(syncID: String, fpuID: String) /// delete insulin with syncID func deleteInsulin(syncID: String) } @@ -46,7 +46,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P static let healthInsulinObject = HKObjectType.quantityType(forIdentifier: .insulinDelivery) // Meta-data key of FreeASPX data in HealthStore - static let freeAPSMetaKey = "fromFreeAPSX" + static let freeAPSMetaKey = "From iAPS" } @Injected() private var glucoseStorage: GlucoseStorage! @@ -186,7 +186,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P else { return } let carbsWithId = carbs.filter { c in - guard c.collectionID != nil else { return false } + guard c.id != nil else { return false } return true } @@ -194,7 +194,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let sampleIDs = samples.compactMap(\.syncIdentifier) let sampleDates = samples.map(\.startDate) let samplesToSave = carbsWithId - .filter { !sampleIDs.contains($0.collectionID!) } // id existing in AH + .filter { !sampleIDs.contains($0.id ?? "") } // id existing in AH .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime .map { HKQuantitySample( @@ -203,8 +203,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P start: $0.createdAt, end: $0.createdAt, metadata: [ - HKMetadataKeyExternalUUID: $0.collectionID ?? "_id", - HKMetadataKeySyncIdentifier: $0.collectionID ?? "_id", + HKMetadataKeySyncIdentifier: $0.id ?? "_id", HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true ] @@ -568,41 +567,41 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P // - MARK Carbs function - func deleteCarbs(syncID: String, isFPU: Bool?, fpuID: String?) { + func deleteCarbs(syncID: String, fpuID: String) { guard settingsManager.settings.useAppleHealth, let sampleType = Config.healthCarbObject, checkAvailabilitySave(objectTypeToHealthStore: sampleType) else { return } - if let isFPU = isFPU, !isFPU { - processQueue.async { - let predicate = HKQuery.predicateForObjects( - withMetadataKey: HKMetadataKeySyncIdentifier, - operatorType: .equalTo, - value: syncID - ) - self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) - } - } - } else { - // need to find all syncID - guard let fpuID = fpuID else { return } + print("meals 4: ID: " + syncID + " FPU ID: " + fpuID) - processQueue.async { - let recentCarbs: [CarbsEntry] = self.carbsStorage.recent() - let ids = recentCarbs.filter { $0.fpuID == fpuID }.compactMap(\.id) - let predicate = HKQuery.predicateForObjects( - withMetadataKey: HKMetadataKeySyncIdentifier, - allowedValues: ids - ) + if syncID != "" { + let predicate = HKQuery.predicateForObjects( + withMetadataKey: HKMetadataKeySyncIdentifier, + operatorType: .equalTo, + value: syncID + ) - self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error) - } + healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in + guard let error = error else { return } + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } + } + + if fpuID != "" { + // processQueue.async { + let recentCarbs: [CarbsEntry] = carbsStorage.recent() + let ids = recentCarbs.filter { $0.fpuID == fpuID }.compactMap(\.id) + let predicate = HKQuery.predicateForObjects( + withMetadataKey: HKMetadataKeySyncIdentifier, + allowedValues: ids + ) + print("found IDs: " + ids.description) + healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in + guard let error = error else { return } + warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error) } + // } } } diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index b5725df4d2..4dd8104922 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -141,18 +141,25 @@ extension NightscoutAPI { .eraseToAnyPublisher() } - func deleteCarbs(at uniqueID: String) -> AnyPublisher { + func deleteCarbs(_ treatement: DataTable.Treatment) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme components.host = url.host components.port = url.port components.path = Config.treatmentsPath + + var arguments = "find[_id][$eq]" + if treatement.isFPU ?? false { + arguments = "find[fpuID][$eq]" + } + let value = !(treatement.isFPU ?? false) ? treatement.id : (treatement.fpuID ?? "") + components.queryItems = [ // Removed below because it prevented all futire entries to be deleted. Don't know why? /* URLQueryItem(name: "find[carbs][$exists]", value: "true"), */ URLQueryItem( - name: "find[collectionID][$eq]", - value: uniqueID + name: arguments, + value: value ) ] diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 94b8118d20..4f767561fb 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource { func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never> func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> - func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) + func deleteCarbs(_ treatement: DataTable.Treatment, complexMeal: Bool) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -177,32 +177,98 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .eraseToAnyPublisher() } - func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) { - // remove in AH - healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID) - + func deleteCarbs(_ treatement: DataTable.Treatment, complexMeal: Bool) { guard let nightscout = nightscoutAPI, isUploadEnabled else { - carbsStorage.deleteCarbs(at: uniqueID) + carbsStorage.deleteCarbs(at: treatement.id, fpuID: treatement.fpuID ?? "", complex: complexMeal) return } - nightscout.deleteCarbs(at: uniqueID) - .collect() - .sink { completion in - self.carbsStorage.deleteCarbs(at: uniqueID) - switch completion { - case .finished: - debug(.nightscout, "Carbs deleted") - case let .failure(error): - info( - .nightscout, - "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", - type: MessageType.warning - ) - } - } receiveValue: { _ in } - .store(in: &lifetime) - // } + print("meals 3: ID: " + (treatement.id ?? "").description + " FPU ID: " + (treatement.fpuID ?? "").description) + + var arg1 = "" + var arg2 = "" + if complexMeal { + arg1 = treatement.id ?? "" + arg2 = treatement.fpuID ?? "" + } else if treatement.isFPU ?? false { + arg1 = "" + arg2 = treatement.fpuID ?? "" + } else { + arg1 = treatement.id + arg2 = "" + } + healthkitManager.deleteCarbs(syncID: arg1, fpuID: arg2) + + if complexMeal { + nightscout.deleteCarbs(treatement) + .collect() + .sink { completion in + self.carbsStorage.deleteCarbs(at: treatement.id ?? "", fpuID: treatement.fpuID ?? "", complex: true) + switch completion { + case .finished: + debug(.nightscout, "Carbs deleted") + case let .failure(error): + info( + .nightscout, + "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + + if (treatement.fpuID ?? "") != "" { + nightscout.deleteCarbs(treatement) + .collect() + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Carb equivalents deleted from NS") + case let .failure(error): + info( + .nightscout, + "Deletion of carb equivalents in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } + } else if treatement.isFPU ?? false { + nightscout.deleteCarbs(treatement) + .collect() + .sink { completion in + self.carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + switch completion { + case .finished: + debug(.nightscout, "Carb equivalents deleted") + case let .failure(error): + info( + .nightscout, + "Deletion of carb equivalents in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } else { + nightscout.deleteCarbs(treatement) + .collect() + .sink { completion in + self.carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) + switch completion { + case .finished: + debug(.nightscout, "Carbs deleted") + case let .failure(error): + info( + .nightscout, + "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } } func deleteInsulin(at date: Date) { diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index b8d91fdf01..d67a97e35a 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -330,7 +330,7 @@ extension BaseWatchManager: WCSessionDelegate { { carbsStorage.storeCarbs( [CarbsEntry( - collectionID: UUID().uuidString, + id: UUID().uuidString, createdAt: Date(), carbs: Decimal(carbs), fat: Decimal(fat), diff --git a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift index a230c4c2e5..e891f3012a 100644 --- a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift +++ b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift @@ -11,7 +11,7 @@ import Foundation carbsStorage.storeCarbs( [CarbsEntry( - collectionID: UUID().uuidString, + id: UUID().uuidString, createdAt: dateAdded, carbs: carbs, fat: Decimal(quantityFat), From 780ff6f0c8ef07acbd3dbc5890713c5cf40b3671 Mon Sep 17 00:00:00 2001 From: tmhastings <31315442+tmhastings@users.noreply.github.com> Date: Sat, 18 Nov 2023 16:44:55 -0500 Subject: [PATCH 247/405] Update Bolus Cancel Button (#352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Bolus Cancel Button * Refactor --------- Co-authored-by: Jon Mårtensson --- .../Modules/Home/View/HomeRootView.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 20d9556621..1b0a785e4c 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -315,14 +315,16 @@ extension Home { } if let progress = state.bolusProgress { - Text("Bolusing") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - ProgressView(value: Double(progress)) - .progressViewStyle(BolusProgressViewStyle()) - .padding(.trailing, 8) - .onTapGesture { - state.cancelBolus() - } + HStack { + Text("Bolusing") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + ProgressView(value: Double(progress)) + .progressViewStyle(BolusProgressViewStyle()) + .padding(.trailing, 8) + } + .onTapGesture { + state.cancelBolus() + } } } .frame(maxWidth: .infinity, maxHeight: 30) From 08f4501f03e8b567a0ea7ee10d98110c0d322e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 19 Nov 2023 17:36:34 +0100 Subject: [PATCH 248/405] Add Time buttons under main chart (along button to UX/UI settings) (#358) Configure X-axis (time in hours) from main chart. Draft which needs testing. --- .../Core_Data.xcdatamodel/contents | 4 + .../Sources/APS/Storage/CoreDataStorage.swift | 11 +++ .../Main/en.lproj/Localizable.strings | 15 ++++ .../Main/sv.lproj/Localizable.strings | 15 ++++ .../Sources/Modules/Home/HomeStateModel.swift | 13 ++- .../Home/View/Chart/MainChartView.swift | 10 ++- .../Modules/Home/View/HomeRootView.swift | 90 ++++++++++++++++++- .../StatConfig/StatConfigStateModel.swift | 8 -- .../StatConfig/View/StatConfigRootView.swift | 7 +- 9 files changed, 150 insertions(+), 23 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 88e0749cdc..5fa27f8f52 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -163,4 +163,8 @@ + + + + \ No newline at end of file diff --git a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift index c0caa2fd7d..c31cb41353 100644 --- a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift @@ -31,4 +31,15 @@ final class CoreDataStorage { } return overrideArray } + + func fetchSettings() -> [UXSettings] { + var settingsArray = [UXSettings]() + coredataContext.performAndWait { + let requestSetttings = UXSettings.fetchRequest() as NSFetchRequest + let sortSettings = NSSortDescriptor(key: "date", ascending: false) + requestSetttings.sortDescriptors = [sortSettings] + try? settingsArray = self.coredataContext.fetch(requestSetttings) + } + return settingsArray + } } diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index aed8151a98..bb87a5f2d8 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1655,6 +1655,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7609a4826d..36e6b9dec8 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1652,6 +1652,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Antal timmar att visa för X-axel (6 standard)"; +/* */ +"2 hours" = "2 timmar"; + +/* */ +"4 hours" = "4 timmar"; + +/* */ +"6 hours" = "6 timmar"; + +/* */ +"12 hours" = "12 timmar"; + +/* */ +"24 hours" = "24 timmar"; + /* Average BG = */ "Average" = "Medelvärde"; diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index d96bd43411..a86553bc12 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -56,11 +56,11 @@ extension Home { @Published var lowGlucose: Decimal = 4 / 0.0555 @Published var highGlucose: Decimal = 10 / 0.0555 @Published var overrideUnit: Bool = false - @Published var screenHours: Int = 6 @Published var displayXgridLines: Bool = false @Published var displayYgridLines: Bool = false @Published var thresholdLines: Bool = false @Published var timeZone: TimeZone? + @Published var hours: Int16 = 6 let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -95,7 +95,6 @@ extension Home { lowGlucose = settingsManager.settings.low highGlucose = settingsManager.settings.high overrideUnit = settingsManager.settings.overrideHbA1cUnit - screenHours = settingsManager.settings.hours displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks @@ -218,6 +217,15 @@ extension Home { } } + func saveSettings() { + coredataContext.perform { + let settings = UXSettings(context: self.coredataContext) + settings.hours = self.hours + settings.date = Date.now + try? self.coredataContext.save() + } + } + private func setupGlucose() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } @@ -427,7 +435,6 @@ extension Home.StateModel: lowGlucose = settingsManager.settings.low highGlucose = settingsManager.settings.high overrideUnit = settingsManager.settings.overrideHbA1cUnit - screenHours = settingsManager.settings.hours displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index fb4e82f57f..b71b6c83dd 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -72,7 +72,7 @@ struct MainChartView: View { @Binding var smooth: Bool @Binding var highGlucose: Decimal @Binding var lowGlucose: Decimal - @Binding var screenHours: Int + @Binding var screenHours: Int16 @Binding var displayXgridLines: Bool @Binding var displayYgridLines: Bool @Binding var thresholdLines: Bool @@ -195,6 +195,10 @@ struct MainChartView: View { .onChange(of: tempBasals) { _ in scroll.scrollTo(Config.endID, anchor: .trailing) } + .onChange(of: screenHours) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onAppear { // add trigger to the end of main queue DispatchQueue.main.async { @@ -819,8 +823,8 @@ extension MainChartView { path.addLine(to: CGPoint(x: 0, y: Config.basalHeight)) } let adjustForOptionalExtraHours = screenHours > 12 ? screenHours - 12 : 0 - let endDateTime = dayAgoTime + min(max(screenHours - adjustForOptionalExtraHours, 12), 24).hours - .timeInterval + min(max(screenHours - adjustForOptionalExtraHours, 12), 24).hours + let endDateTime = dayAgoTime + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours + .timeInterval + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours .timeInterval let autotunedBasalPoints = findRegularBasalPoints( timeBegin: dayAgoTime, diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 1b0a785e4c..a0d4477a75 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -12,6 +12,24 @@ extension Home { @State var isStatusPopupPresented = false @State var showCancelAlert = false + struct Buttons: Identifiable { + let label: String + let number: String + var active: Bool + let hours: Int16 + var id: String { label } + } + + @State var timeButtons: [Buttons] = [ + Buttons(label: "2 hours", number: "2", active: false, hours: 2), + Buttons(label: "4 hours", number: "4", active: false, hours: 4), + Buttons(label: "6 hours", number: "6", active: false, hours: 6), + Buttons(label: "12 hours", number: "12", active: false, hours: 12), + Buttons(label: "24 hours", number: "24", active: false, hours: 24) + ] + + let buttonFont = Font.custom("TimeButtonFont", size: 16) + @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme @@ -37,6 +55,11 @@ extension Home { sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)] ) var enactedSliderTT: FetchedResults + @FetchRequest( + entity: UXSettings.entity(), + sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)] + ) var fetchedSettings: FetchedResults + private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -330,6 +353,34 @@ extension Home { .frame(maxWidth: .infinity, maxHeight: 30) } + var timeInterval: some View { + HStack(alignment: .center) { + let saveButton = UXSettings(context: moc) + ForEach(timeButtons) { button in + Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { + let index = timeButtons.firstIndex(where: { $0.label == button.label }) ?? 0 + highlightButtons(index, onAppear: false) + saveButton.hours = button.hours + saveButton.date = Date.now + try? moc.save() + state.hours = button.hours + } + .foregroundStyle(button.active ? .primary : .secondary) + .frame(maxHeight: 20).padding(.horizontal) + .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) + } + Image(systemName: "ellipsis.circle.fill") + .foregroundStyle(.secondary) + .padding(.leading) + .onTapGesture { + state.showModal(for: .statisticsConfig) + } + } + .font(buttonFont) + .padding(.top, 20) + .padding(.bottom, 40) + } + var legendPanel: some View { ZStack { HStack(alignment: .center) { @@ -404,13 +455,13 @@ extension Home { smooth: $state.smooth, highGlucose: $state.highGlucose, lowGlucose: $state.lowGlucose, - screenHours: $state.screenHours, + screenHours: $state.hours, displayXgridLines: $state.displayXgridLines, displayYgridLines: $state.displayYgridLines, thresholdLines: $state.thresholdLines ) } - .padding(.bottom) + // .padding(.bottom) .modal(for: .dataTable, from: self) } @@ -479,6 +530,31 @@ extension Home { return (name: profileString, isOn: display) } + func highlightButtons(_ int: Int?, onAppear: Bool) { + var index = 0 + if let integer = int, !onAppear { + repeat { + if index == integer { + timeButtons[index].active = true + } else { + timeButtons[index].active = false + } + index += 1 + } while index < timeButtons.count + } else if onAppear { + let i = timeButtons.firstIndex(where: { $0.hours == (fetchedSettings.first?.hours ?? 6) }) ?? 2 + index = 0 + repeat { + if index == i { + timeButtons[index].active = true + } else { + timeButtons[index].active = false + } + index += 1 + } while index < timeButtons.count + } + } + @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { ZStack { Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) @@ -577,13 +653,18 @@ extension Home { header(geo) infoPanel mainChart + timeInterval legendPanel profiles(geo) bottomPanel(geo) } .edgesIgnoringSafeArea(.vertical) } - .onAppear(perform: configureView) + .onAppear { + configureView { + highlightButtons(nil, onAppear: true) + } + } .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) @@ -606,6 +687,9 @@ extension Home { } ) } + .onDisappear { + state.saveSettings() + } } private var popup: some View { diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 398f611e6d..a9632db0d1 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -5,7 +5,6 @@ extension StatConfig { @Published var overrideHbA1cUnit = false @Published var low: Decimal = 4 / 0.0555 @Published var high: Decimal = 10 / 0.0555 - @Published var hours: Decimal = 6 @Published var xGridLines = false @Published var yGridLines: Bool = false @Published var oneDimensionalGraph = false @@ -41,13 +40,6 @@ extension StatConfig { guard units == .mmolL else { return $0 } return $0.asMgdL }) - - subscribeSetting(\.hours, on: $hours.map(Int.init), initial: { - let value = max(min($0, 24), 2) - hours = Decimal(value) - }, map: { - $0 - }) } } } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index 6a2cd08b9f..fe7a0528db 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -31,12 +31,6 @@ extension StatConfig { Toggle("Display Chart Y - Grid lines", isOn: $state.yGridLines) Toggle("Display Chart Threshold lines for Low and High", isOn: $state.rulerMarks) Toggle("Standing / Laying TIR Chart", isOn: $state.oneDimensionalGraph) - HStack { - Text("Hours X-Axis (6 default)") - Spacer() - DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) - Text("hours").foregroundColor(.secondary) - } } header: { Text("Home Chart settings ") } Section { @@ -64,6 +58,7 @@ extension StatConfig { .onAppear(perform: configureView) .navigationBarTitle("UI/UX") .navigationBarTitleDisplayMode(.automatic) + .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } } } From 768187f5fa0f1c478cf29f795e507ceaad483ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 19 Nov 2023 17:53:37 +0100 Subject: [PATCH 249/405] smaller font size --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a0d4477a75..df6bbfaa83 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -28,7 +28,7 @@ extension Home { Buttons(label: "24 hours", number: "24", active: false, hours: 24) ] - let buttonFont = Font.custom("TimeButtonFont", size: 16) + let buttonFont = Font.custom("TimeButtonFont", size: 14) @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme From 1bd725049eb712ddfa2589bec35edbdf5987d51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 19 Nov 2023 18:25:52 +0100 Subject: [PATCH 250/405] Clean --- FreeAPS/Sources/APS/Storage/CoreDataStorage.swift | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift index c31cb41353..c0caa2fd7d 100644 --- a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift @@ -31,15 +31,4 @@ final class CoreDataStorage { } return overrideArray } - - func fetchSettings() -> [UXSettings] { - var settingsArray = [UXSettings]() - coredataContext.performAndWait { - let requestSetttings = UXSettings.fetchRequest() as NSFetchRequest - let sortSettings = NSSortDescriptor(key: "date", ascending: false) - requestSetttings.sortDescriptors = [sortSettings] - try? settingsArray = self.coredataContext.fetch(requestSetttings) - } - return settingsArray - } } From 2e3bd3c12bae7aa4e4e52a069750f46dbecd636f Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 19 Nov 2023 10:05:58 -0800 Subject: [PATCH 251/405] Implement swipe-to-delete for history treatments (#314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jon Mårtensson --- .../Main/ar.lproj/Localizable.strings | 6 +- .../Main/ca.lproj/Localizable.strings | 6 +- .../Main/da.lproj/Localizable.strings | 6 +- .../Main/de.lproj/Localizable.strings | 6 +- .../Main/en.lproj/Localizable.strings | 12 +- .../Main/es.lproj/Localizable.strings | 6 +- .../Main/fi.lproj/Localizable.strings | 6 +- .../Main/fr.lproj/Localizable.strings | 6 +- .../Main/he.lproj/Localizable.strings | 6 +- .../Main/it.lproj/Localizable.strings | 6 +- .../Main/nb.lproj/Localizable.strings | 6 +- .../Main/nl.lproj/Localizable.strings | 6 +- .../Main/pl.lproj/Localizable.strings | 6 +- .../Main/pt-BR.lproj/Localizable.strings | 6 +- .../Main/pt-PT.lproj/Localizable.strings | 6 +- .../Main/ru.lproj/Localizable.strings | 6 +- .../Main/sk.lproj/Localizable.strings | 6 +- .../Main/sv.lproj/Localizable.strings | 6 +- .../Main/tr.lproj/Localizable.strings | 6 +- .../Main/uk.lproj/Localizable.strings | 6 +- .../Main/zh-Hans.lproj/Localizable.strings | 6 +- .../DataTable/DataTableStateModel.swift | 10 +- .../DataTable/View/DataTableRootView.swift | 199 ++++++++++-------- 23 files changed, 182 insertions(+), 159 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index bb263464a4..88d4425739 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings index 26a52518a4..4867ce3d37 100644 --- a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings @@ -490,10 +490,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1250,7 +1250,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 1fb082e885..c07f513b4c 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige Mål"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Slet kulhydrater?"; +"Delete Carbs?" = "Slet kulhydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Slet insulin?"; +"Delete Insulin?" = "Slet insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 9d4bcfd7df..d3551983d0 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temporäre Ziele"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Kohlenhydrate löschen?"; +"Delete Carbs?" = "Kohlenhydrate löschen?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Insulin löschen?"; +"Delete Insulin?" = "Insulin löschen?"; /* Treatments list */ "Treatments" = "Behandlungen"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiken und Home-Ansicht"; /* Alert text */ -"Delete carb equivalents?" = "Kohlenhydratäquivalente löschen?"; +"Delete Carb Equivalents?" = "Kohlenhydratäquivalente löschen?"; /* */ "Meal Presets" = "Mahlzeit Voreinstellungen"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index bb87a5f2d8..886d42ee87 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1369,7 +1369,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 7edd2c6d2d..cd5d5fa82b 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "¿Eliminar carbohidratos?"; +"Delete Carbs?" = "¿Eliminar carbohidratos?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Tratamientos"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 20f51c0489..5a0ba58d82 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 590719b758..16e97e24d6 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Cibles temporaires"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Supprimer les glucides ?"; +"Delete Carbs?" = "Supprimer les glucides ?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Traitements"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index bb263464a4..88d4425739 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 41c750be38..89d12c07f2 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Obiettivi Temporanei"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Cancella carboidrati?"; +"Delete Carbs?" = "Cancella carboidrati?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Cancella l'insulina?"; +"Delete Insulin?" = "Cancella l'insulina?"; /* Treatments list */ "Treatments" = "Trattamenti"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiche e Vista Iniziale"; /* Alert text */ -"Delete carb equivalents?" = "Cancella i carb equivalenti?"; +"Delete Carb Equivalents?" = "Cancella i carb equivalenti?"; /* */ "Meal Presets" = "Pasto Predefinito"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 26360f63ad..bdc3b73ceb 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige mål"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Slette karbohydrater?"; +"Delete Carbs?" = "Slette karbohydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Slette insulin?"; +"Delete Insulin?" = "Slette insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistikk og startskjerm"; /* Alert text */ -"Delete carb equivalents?" = "Slette karboekvivalenter?"; +"Delete Carb Equivalents?" = "Slette karboekvivalenter?"; /* */ "Meal Presets" = "Forvalg av måltid"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index c587332bc0..7869423e7e 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Tijdelijk streefdoel"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Koolhydraten verwijderen?"; +"Delete Carbs?" = "Koolhydraten verwijderen?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Insuline verwijderen?"; +"Delete Insulin?" = "Insuline verwijderen?"; /* Treatments list */ "Treatments" = "Behandelingen"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistieken en Home View"; /* Alert text */ -"Delete carb equivalents?" = "Verwijder koolhydraten?"; +"Delete Carb Equivalents?" = "Verwijder koolhydraten?"; /* */ "Meal Presets" = "Maaltijd voorinstellingen"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 5aac11a498..a9407c6b7b 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -578,10 +578,10 @@ Połączono z Nightscout!"; "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1370,7 +1370,7 @@ Połączono z Nightscout!"; "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 7579185f41..bd3f2bf126 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Alvos Temporários"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Deletar carboidratos?"; +"Delete Carbs?" = "Deletar carboidratos?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Tratamentos"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index cb855c9ee5..9d7a38ad12 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ea74c1d3cf..afb32bed03 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Временные цели"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Удалить углеводы?"; +"Delete Carbs?" = "Удалить углеводы?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Удалить инсулин?"; +"Delete Insulin?" = "Удалить инсулин?"; /* Treatments list */ "Treatments" = "События"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Статистика и экран"; /* Alert text */ -"Delete carb equivalents?" = "Удалить эквиваленты углеводов?"; +"Delete Carb Equivalents?" = "Удалить эквиваленты углеводов?"; /* */ "Meal Presets" = "Шаблоны"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 76302570b0..8637bcd962 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Delete carbs?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Treatments"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 36e6b9dec8..22cbc84875 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Målvärden"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Ta bort kolhydrater?"; +"Delete Carbs?" = "Ta bort kolhydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Ta bort insulin?"; +"Delete Insulin?" = "Ta bort insulin?"; /* Treatments list */ "Treatments" = "Behandlingar"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistik och Diagram"; /* Alert text */ -"Delete carb equivalents?" = "Radera dessa poster?"; +"Delete Carb Equivalents?" = "Radera dessa poster?"; /* */ "Meal Presets" = "Förval"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 8398c9b6b4..682a5bb755 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Geçici Hedefler"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Karbonhidratları sil?"; +"Delete Carbs?" = "Karbonhidratları sil?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "İnsülin silinsin mi?"; +"Delete Insulin?" = "İnsülin silinsin mi?"; /* Treatments list */ "Treatments" = "Tedaviler"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index c69e0ab2df..0c19c62790 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Тимчасові цілі"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "Видалити вуглеводи?"; +"Delete Carbs?" = "Видалити вуглеводи?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Видалити інсулін?"; +"Delete Insulin?" = "Видалити інсулін?"; /* Treatments list */ "Treatments" = "Події"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Статистика та Домашня сторінка"; /* Alert text */ -"Delete carb equivalents?" = "Видалити вуглеводні еквіваленти?"; +"Delete Carb Equivalents?" = "Видалити вуглеводні еквіваленти?"; /* */ "Meal Presets" = "Попередні Налаштування Їжі"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index d301e052a6..82f87a29d4 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "临时目标"; /* Delete carbs from data table and Nightscout */ -"Delete carbs?" = "删除碳水?"; +"Delete Carbs?" = "删除碳水?"; /* Delete insulin from pump history and Nightscout */ -"Delete insulin?" = "Delete insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "治疗"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistics and Home View"; /* Alert text */ -"Delete carb equivalents?" = "Delete carb equivalents?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; /* */ "Meal Presets" = "Meal Presets"; diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 22a03d5cce..51de909215 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -152,9 +152,10 @@ extension DataTable { .store(in: &lifetime) } - func deleteGlucose(at index: Int) { - let id = glucose[index].id + func deleteGlucose(_ glucose: Glucose) { + let id = glucose.id provider.deleteGlucose(id: id) + let fetchRequest: NSFetchRequest fetchRequest = NSFetchRequest(entityName: "Readings") fetchRequest.predicate = NSPredicate(format: "id == %@", id) @@ -171,9 +172,10 @@ extension DataTable { ) } } catch { /* To do: handle any thrown errors. */ } + // Deletes Manual Glucose - if (glucose[index].glucose.type ?? "") == GlucoseType.manual.rawValue { - provider.deleteManualGlucose(date: glucose[index].glucose.dateString) + if (glucose.glucose.type ?? "") == GlucoseType.manual.rawValue { + provider.deleteManualGlucose(date: glucose.glucose.dateString) } } diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 327046d376..e2ab06e09b 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -6,11 +6,12 @@ extension DataTable { struct RootView: BaseView { let resolver: Resolver @StateObject var state = StateModel() + @State private var isRemoveHistoryItemAlertPresented: Bool = false + @State private var alertTitle: String = "" + @State private var alertMessage: String = "" + @State private var alertTreatmentToDelete: Treatment? + @State private var alertGlucoseToDelete: Glucose? - @State private var isRemoveCarbsAlertPresented = false - @State private var removeCarbsAlert: Alert? - @State private var isRemoveInsulinAlertPresented = false - @State private var removeInsulinAlert: Alert? @State private var showExternalInsulin: Bool = false @State private var showFutureEntries: Bool = false // default to hide future entries @State private var showManualGlucose: Bool = false @@ -133,7 +134,6 @@ extension DataTable { ForEach(state.glucose) { item in glucoseView(item, isManual: item.glucose) } - .onDelete(perform: deleteGlucose) } else { HStack { Text("No data.") @@ -185,87 +185,70 @@ extension DataTable { @ViewBuilder private func treatmentView(_ item: Treatment) -> some View { HStack { - Image(systemName: "circle.fill").foregroundColor(item.color) + if item.type == .bolus || item.type == .carbs { + Image(systemName: "circle.fill").foregroundColor(item.color).padding(.vertical) + } else { + Image(systemName: "circle.fill").foregroundColor(item.color) + } Text((item.isSMB ?? false) ? "SMB" : item.type.name) Text(item.amountText).foregroundColor(.secondary) if let duration = item.durationText { Text(duration).foregroundColor(.secondary) } + Spacer() + Text(dateFormatter.string(from: item.date)) + .moveDisabled(true) + } + .swipeActions { + Button( + "Delete", + systemImage: "trash.fill", + role: .none, + action: { + alertTreatmentToDelete = item - if item.type == .carbs { - if item.note != "" { - Spacer() - Text(item.note ?? "").foregroundColor(.brown) - } - Spacer() - Image(systemName: "xmark.circle").foregroundColor(.secondary) - .contentShape(Rectangle()) - .padding(.vertical) - .onTapGesture { - removeCarbsAlert = Alert( - title: Text("Delete carbs?"), - message: Text(item.amountText), - primaryButton: .destructive( - Text("Delete"), - action: { - state.deleteCarbs(item) } - ), - secondaryButton: .cancel() - ) - isRemoveCarbsAlertPresented = true - } - .alert(isPresented: $isRemoveCarbsAlertPresented) { - removeCarbsAlert! - } - } + if item.type == .carbs { + alertTitle = "Delete Carbs?" + alertMessage = dateFormatter.string(from: item.date) + ", " + item.amountText + } else if item.type == .fpus { + alertTitle = "Delete Carb Equivalents?" + alertMessage = "All FPUs of the meal will be deleted." + } else { + // item is insulin treatment; item.type == .bolus + alertTitle = "Delete Insulin?" + alertMessage = dateFormatter.string(from: item.date) + ", " + item.amountText - if item.type == .fpus { - Spacer() - Image(systemName: "xmark.circle").foregroundColor(.secondary) - .contentShape(Rectangle()) - .padding(.vertical) - .onTapGesture { - removeCarbsAlert = Alert( - title: Text("Delete carb equivalents?"), - message: Text(""), // Temporary fix. New to fix real amount of carb equivalents later - primaryButton: .destructive( - Text("Delete"), - action: { state.deleteCarbs(item) } - ), - secondaryButton: .cancel() - ) - isRemoveCarbsAlertPresented = true - } - .alert(isPresented: $isRemoveCarbsAlertPresented) { - removeCarbsAlert! + if item.isSMB ?? false { + // Add text snippet, so that alert message is more descriptive for SMBs + alertMessage += "SMB" + } } - } - if item.type == .bolus { - Spacer() - Image(systemName: "xmark.circle").foregroundColor(.secondary) - .contentShape(Rectangle()) - .padding(.vertical) - .onTapGesture { - removeInsulinAlert = Alert( - title: Text("Delete insulin?"), - message: Text(item.amountText), - primaryButton: .destructive( - Text("Delete"), - action: { state.deleteInsulin(item) } - ), - secondaryButton: .cancel() - ) - isRemoveInsulinAlertPresented = true - } - .alert(isPresented: $isRemoveInsulinAlertPresented) { - removeInsulinAlert! - } + isRemoveHistoryItemAlertPresented = true + } + ).tint(.red) + } + .disabled(item.type == .tempBasal || item.type == .tempTarget || item.type == .resume || item.type == .suspend) + .alert( + Text(NSLocalizedString(alertTitle, comment: "")), + isPresented: $isRemoveHistoryItemAlertPresented + ) { + Button("Cancel", role: .cancel) {} + Button("Delete", role: .destructive) { + guard let treatmentToDelete = alertTreatmentToDelete else { + debug(.default, "Cannot gracefully unwrap alertTreatmentToDelete!") + return + } + + if treatmentToDelete.type == .carbs || treatmentToDelete.type == .fpus { + state.deleteCarbs(treatmentToDelete) + } else { + state.deleteInsulin(treatmentToDelete) + } } - Spacer() - Text(dateFormatter.string(from: item.date)) - .moveDisabled(true) + } message: { + Text("\n" + NSLocalizedString(alertMessage, comment: "")) } } @@ -332,27 +315,59 @@ extension DataTable { } @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View { - VStack(alignment: .leading, spacing: 4) { - HStack { - Text(item.glucose.glucose.map { - glucoseFormatter.string(from: Double( - state.units == .mmolL ? $0.asMmolL : Decimal($0) - ) as NSNumber)! - } ?? "--") - if isManual.type == GlucoseType.manual.rawValue { - Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red) - } else { - Text(item.glucose.direction?.symbol ?? "--") + HStack { + Text(item.glucose.glucose.map { + glucoseFormatter.string(from: Double( + state.units == .mmolL ? $0.asMmolL : Decimal($0) + ) as NSNumber)! + } ?? "--") + if isManual.type == GlucoseType.manual.rawValue { + Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red) + } else { + Text(item.glucose.direction?.symbol ?? "--") + } + Spacer() + + Text(dateFormatter.string(from: item.glucose.dateString)) + } + .swipeActions { + Button( + "Delete", + systemImage: "trash.fill", + role: .none, + action: { + alertGlucoseToDelete = item + + let valueText = glucoseFormatter.string(from: Double( + state.units == .mmolL ? Double(item.glucose.value.asMmolL) : item.glucose.value + ) as NSNumber)! + " " + state.units.rawValue + + alertTitle = "Delete Glucose?" + alertMessage = dateFormatter.string(from: item.glucose.dateString) + ", " + valueText + + isRemoveHistoryItemAlertPresented = true + } + ).tint(.red) + } + .alert( + Text(NSLocalizedString(alertTitle, comment: "")), + isPresented: $isRemoveHistoryItemAlertPresented + ) { + Button("Cancel", role: .cancel) {} + Button("Delete", role: .destructive) { + // gracefully unwrap value here. + // value cannot ever really be nil because it is an existing(!) table entry + // but just to be sure. + guard let glucoseToDelete = alertGlucoseToDelete else { + print("Cannot gracefully unwrap alertTreatmentToDelete!") + return } - Spacer() - Text(dateFormatter.string(from: item.glucose.dateString)) + state.deleteGlucose(glucoseToDelete) } + } message: { + Text("\n" + NSLocalizedString(alertMessage, comment: "")) } } - - private func deleteGlucose(at offsets: IndexSet) { - state.deleteGlucose(at: offsets[offsets.startIndex]) - } } } From e6c4713d16410bebacf0362e1fa3b383373cf417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 20 Nov 2023 02:35:01 +0100 Subject: [PATCH 252/405] New Crowdin updates (#359) --- .../Main/ar.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/da.lproj/Localizable.strings | 25 +++++++++++++++-- .../Main/de.lproj/Localizable.strings | 27 ++++++++++++++++--- .../Main/es.lproj/Localizable.strings | 23 +++++++++++++++- .../Main/fi.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/fr.lproj/Localizable.strings | 23 +++++++++++++++- .../Main/he.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/it.lproj/Localizable.strings | 27 ++++++++++++++++--- .../Main/nb.lproj/Localizable.strings | 27 ++++++++++++++++--- .../Main/nl.lproj/Localizable.strings | 27 ++++++++++++++++--- .../Main/pl.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/pt-BR.lproj/Localizable.strings | 23 +++++++++++++++- .../Main/pt-PT.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/ru.lproj/Localizable.strings | 27 ++++++++++++++++--- .../Main/sk.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/sv.lproj/Localizable.strings | 8 +++++- .../Main/tr.lproj/Localizable.strings | 25 +++++++++++++++-- .../Main/uk.lproj/Localizable.strings | 21 +++++++++++++++ .../Main/zh-Hans.lproj/Localizable.strings | 23 +++++++++++++++- 19 files changed, 408 insertions(+), 24 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 88d4425739..2ef0efa18e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index c07f513b4c..8f799fbd8e 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige Mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Slet kulhydrater?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Slet insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 timer"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index fe812a9bdc..2c4796a934 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temporäre Ziele"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Kohlenhydrate löschen?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Insulin löschen?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlungen"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiken und Home-Ansicht"; /* Alert text */ -"Delete Carb Equivalents?" = "Kohlenhydratäquivalente löschen?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Mahlzeit Voreinstellungen"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Stunden X-Achse (6 Standard)"; +/* */ +"2 hours" = "2 Stunden"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Mittelwert"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index cd5d5fa82b..a7c0563fc7 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "¿Eliminar carbohidratos?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 5a0ba58d82..7f17ced838 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 16e97e24d6..2cf149aeea 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Cibles temporaires"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Supprimer les glucides ?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 88d4425739..2ef0efa18e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 89d12c07f2..a7b0c150f9 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Obiettivi Temporanei"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Cancella carboidrati?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Cancella l'insulina?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Trattamenti"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiche e Vista Iniziale"; /* Alert text */ -"Delete Carb Equivalents?" = "Cancella i carb equivalenti?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Pasto Predefinito"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Ore X-Axis (6 predefinito)"; +/* */ +"2 hours" = "2 ore"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Media"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index bdc3b73ceb..aa9d70c980 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Slette karbohydrater?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Slette insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistikk og startskjerm"; /* Alert text */ -"Delete Carb Equivalents?" = "Slette karboekvivalenter?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Forvalg av måltid"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Timer å vise (6 er standard)"; +/* */ +"2 hours" = "2 timer"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Gj.snitt"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index cd9b003214..f3a6b3c746 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Tijdelijk streefdoel"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Koolhydraten verwijderen?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Insuline verwijderen?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandelingen"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistieken en Home View"; /* Alert text */ -"Delete Carb Equivalents?" = "Verwijder koolhydraten?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Maaltijd voorinstellingen"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Uren X-as (standaard 6)"; +/* */ +"2 hours" = "2 uur"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Gemiddeld"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index a9407c6b7b..7eb2ed0404 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1372,6 +1372,12 @@ Połączono z Nightscout!"; /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1654,6 +1660,21 @@ Połączono z Nightscout!"; /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index bd3f2bf126..9a25f84900 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Alvos Temporários"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Deletar carboidratos?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 9d7a38ad12..549fce9b59 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 0694b86c19..abbe480dd6 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Временные цели"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Удалить углеводы?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Удалить инсулин?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "События"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Статистика и экран"; /* Alert text */ -"Delete Carb Equivalents?" = "Удалить эквиваленты углеводов?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Шаблоны"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Ширина графика по оси X (6 по-умолчанию)"; +/* */ +"2 hours" = "2 часа"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Средний"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 8637bcd962..21bdc245b9 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 22cbc84875..2963b127cc 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistik och Diagram"; /* Alert text */ -"Delete Carb Equivalents?" = "Radera dessa poster?"; +"Delete Carb Equivalents?" = "Ta bort dessa fett/protein-poster?"; + +/* */ +"All FPUs of the meal will be deleted." = "Alla poster fett/protein-poster tillhörande denna måltid kommer att tas bort."; + +/* */ +"Delete Glucose?" = "Ta bort blodsockervärde?"; /* */ "Meal Presets" = "Förval"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 682a5bb755..778b4b165c 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Geçici Hedefler"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Karbonhidratları sil?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "İnsülin silinsin mi?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Tedaviler"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 saat"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Ortalama"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 0c19c62790..32a6e7daec 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Видалити вуглеводні еквіваленти?"; +/* */ +"All FPUs of the meal will be deleted." = "Усі FPU страви буде видалено."; + +/* */ +"Delete Glucose?" = "Видалити глюкозу?"; + /* */ "Meal Presets" = "Попередні Налаштування Їжі"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Вісь Х годин (6 за замовчуванням)"; +/* */ +"2 hours" = "2 години"; + +/* */ +"4 hours" = "4 години"; + +/* */ +"6 hours" = "6 годин"; + +/* */ +"12 hours" = "12 годин"; + +/* */ +"24 hours" = "24 години"; + /* Average BG = */ "Average" = "Середній"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 82f87a29d4..b525731d44 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "临时目标"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "删除碳水?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; From 2dbf718e8523c7e6bfe1d2ba11e152eec336bdad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 20 Nov 2023 02:59:48 +0100 Subject: [PATCH 253/405] Allow future and past dates for meals (#361) Now saves both real dates of meals and the date of creation. Health store issue is only partly fixed. Will continue with this later. --- .../Core_Data.xcdatamodel/contents | 1 + FreeAPS/Resources/javascript/bundle/meal.js | 2 +- FreeAPS/Sources/APS/Storage/CarbsStorage.swift | 14 ++++++++------ FreeAPS/Sources/Models/CarbsEntry.swift | 2 ++ .../Modules/AddCarbs/AddCarbsStateModel.swift | 8 ++++++-- .../Modules/AddCarbs/View/AddCarbsRootView.swift | 7 ++----- .../Sources/Modules/Bolus/BolusStateModel.swift | 12 ++++++++++-- .../Modules/DataTable/DataTableStateModel.swift | 14 ++++++++++---- .../Modules/Home/View/Chart/MainChartView.swift | 12 ++++++++++-- .../Services/HealthKit/HealthKitManager.swift | 6 +++--- .../Sources/Services/Network/NightscoutAPI.swift | 2 +- .../Services/WatchManager/WatchManager.swift | 1 + .../Shortcuts/Carbs/CarbPresetIntentRequest.swift | 1 + 13 files changed, 56 insertions(+), 26 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 5fa27f8f52..023a0cebc0 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -66,6 +66,7 @@ + diff --git a/FreeAPS/Resources/javascript/bundle/meal.js b/FreeAPS/Resources/javascript/bundle/meal.js index 8e1b4763aa..c21a9a7863 100644 --- a/FreeAPS/Resources/javascript/bundle/meal.js +++ b/FreeAPS/Resources/javascript/bundle/meal.js @@ -1,2 +1,2 @@ /*! For license information please see meal.js.LICENSE.txt */ -var freeaps_meal;freeaps_meal=(()=>{var M={6873:(M,b,z)=>{var p=z(1836),e=z(7935),o=z(1678),O=z(3725);M.exports=function(M){var b=M.glucose_data.map((function(M){return M.glucose=M.glucose||M.sgv,M})),z=M.iob_inputs,n=M.basalprofile;profile=M.iob_inputs.profile;var a=new Date(M.mealTime),t=new Date(M.ciTime),d=o(M.iob_inputs),c=0,A=[];A[0]=b[0];var r,s=0,i=!1,q=0;(!b[0].glucose||b[0].glucose<39)&&(q=-1);for(var u=1;u6||i)){if(l<0&&(i=!0),void 0!==t){var m=(t-_)/27e5;if(m>1||m<0)continue}A[A.length-1].display_time?W=new Date(A[A.length-1].display_time.replace("T"," ")):q>=0&&b[q].display_time?W=new Date(b[q].display_time.replace("T"," ")):q>=0&&b[q].dateString?W=new Date(b[q].dateString):console.error("Could not determine last BG time");var L=(_-W)/6e4;if(Math.abs(L)>8){var f=b[q].glucose;for(L=Math.min(240,Math.abs(L));L>5;){var h=new Date(W.getTime()-3e5);A[++s]=[],A[s].date=h.getTime();var R=f+5/L*(b[u].glucose-f);A[s].glucose=Math.round(R),L-=5,f=R,W=new Date(h)}}else Math.abs(L)>2?(A[++s]=b[u],A[s].date=_.getTime()):A[s].glucose=(A[s].glucose+b[u].glucose)/2;q=u}}}var B=0,y=999,X=0,Y=999,T=[];for(u=0;u_&&T.push(Math.round(r)),profile.min_5m_carbimpact;else if(t>_){var S=Math.round(1e3*(k-w))/1e3,F=(S-r)/(_-t)*1e3*60*5;S>X&&(B=Math.min(0,F),X=S),Sa)c+=Math.max(v,r/2,profile.min_5m_carbimpact)*profile.carb_ratio/g}return{carbsAbsorbed:c,currentDeviation:r,maxDeviation:X,minDeviation:Y,slopeFromMaxDeviation:B,slopeFromMinDeviation:y,allDeviations:T}}},4556:(M,b)=>{M.exports=function(M,b,z,p,e,o){if(M.insulin){void 0===b&&(b=new Date);var O=new Date(M.date),n=Math.round((b-O)/1e3/60);return"bilinear"===z?function(M,b,z){var p=75,e=180,o=3/z*b,O=0,n=0,a=2/(60*z),t=a/p,d=a/(e-p)*-1;if(o120?(console.error("Setting maximum Insulin Peak Time of 120m for",e.curve,"insulin"),p=120):e.insulinPeakTime<50?(console.error("Setting minimum Insulin Peak Time of 50m for",e.curve,"insulin"),p=50):p=e.insulinPeakTime:p=75:"ultra-rapid"===e.curve?!0===e.useCustomPeakTime&&void 0!==e.insulinPeakTime?e.insulinPeakTime>100?(console.error("Setting maximum Insulin Peak Time of 100m for",e.curve,"insulin"),p=100):e.insulinPeakTime<35?(console.error("Setting minimum Insulin Peak Time of 35m for",e.curve,"insulin"),p=35):p=e.insulinPeakTime:p=55:console.error("Curve of",e.curve,"is not supported.");var o=60*z,O=0,n=0;if(b{var p=z(8),e=z(1836),o=z(6486),O=z(381);function n(M,b){var z=[M];if("recurring"===b.type){var p=60*M.started_at.getHours()+M.started_at.getMinutes(),e=p+M.duration;if(M.duration>30||pb.minutes||e>1440&&b.minutes30)t=30;else{var d=b.minutes;e>1440&&(d=1440),t=d-p}var c=O(M.started_at).add(t,"minutes");n.duration=t,a.duration=M.duration-t,a.timestamp=c.format(),a.started_at=new Date(a.timestamp),a.date=a.started_at.getTime(),z=[n,a]}}return z}function a(M,b){for(var z=[M],p=!0;p;){var e=[];p=!1,o.forEach(z,(function(M){o.forEach(b,(function(b){var z=n(M,b);if(z.length>1)return e=e.concat(z),p=!0,!1})),p||(e=e.concat([M]))})),z=e}return z}M.exports=function(M,b){var z,n,t=M.history,d=(M.history24,M.profile),c=M.autosens,A=[],r=[],s=[],i=[],q=!1,u=!1,_=new Date(p(M.clock));if(M.history24)t=[].concat(M.history).concat(M.history24);for(var W=_,l=0;l0&&(z=i[0].timestamp,(0===s.length||i[0].dates[l].date);L++);if(L>=i.length&&!u){u=1,n=s[l].timestamp;break}s[l].duration=(i[L].date-s[l].date)/60/1e3}for(q||u||i.length===s.length?q&&!u&&i.length-1!==s.length?console.error("Mismatched number of resumes("+i.length+") and suspends("+s.length+") assuming suspended prior to history block!"):!q&&u&&i.length!==s.length-1?console.error("Mismatched number of resumes("+i.length+") and suspends("+s.length+") assuming suspended past end of history block!"):q&&u&&i.length!==s.length&&console.error("Mismatched number of resumes("+i.length+") and suspends("+s.length+") assuming suspended prior to and past end of history block!"):console.error("Mismatched number of resumes("+i.length+") and suspends("+s.length+")!"),lW)){if(W=h,"Bolus"===f._type)(m={}).timestamp=f.timestamp,m.started_at=new Date(p(f.timestamp)),m.started_at>_?process.stderr.write(" "+f.amount+"U @ "+m.started_at):(m.date=m.started_at.getTime(),m.insulin=f.amount,r.push(m));else if("Meal Bolus"===f.eventType||"Correction Bolus"===f.eventType||"Snack Bolus"===f.eventType||"Bolus Wizard"===f.eventType){(m={}).timestamp=f.created_at,m.started_at=new Date(p(m.timestamp)),m.date=m.started_at.getTime(),m.insulin=f.insulin,r.push(m)}else if("xdrip"===f.enteredBy){(m={}).timestamp=f.timestamp,m.started_at=new Date(p(m.timestamp)),m.date=m.started_at.getTime(),m.insulin=f.insulin,r.push(m)}else if("HAPP_App"===f.enteredBy&&f.insulin){(m={}).timestamp=f.created_at,m.started_at=new Date(p(m.timestamp)),m.date=m.started_at.getTime(),m.insulin=f.insulin,r.push(m)}else if("Temp Basal"!==f.eventType||"HAPP_App"!==f.enteredBy&&"openaps://AndroidAPS"!==f.enteredBy){if("Temp Basal"===f.eventType){(m={}).rate=f.rate,m.duration=f.duration,m.timestamp=f.timestamp,m.started_at=new Date(p(m.timestamp)),m.date=m.started_at.getTime(),A.push(m)}else if("TempBasal"===f._type){if("percent"===f.temp)continue;var R,B=f.rate,y=f.timestamp;if(l>0&&t[l-1].timestamp===y&&"TempBasalDuration"===t[l-1]._type)R=t[l-1]["duration (min)"];else{for(var X=0;XA[l+1].date&&(A[l].duration=(A[l+1].date-A[l].date)/60/1e3,null===A[l+1].duration&&A.splice(l+1,1));var Y=[];o.forEach(d.basalprofile,(function(M){var b={type:"recurring"};b.minutes=M.minutes,Y.push(b)}));var T=[];o.forEach(A,(function(M){T=T.concat(a(M,Y))})),A=o.sortBy(A,(function(M){return M.date}));var D,k=!1;if(void 0!==d.suspend_zeros_iob&&(k=d.suspend_zeros_iob),k){var N=[];o.forEach(T,(function(M){var b=function(M,b,z,e,n,a){var t=[],d=new Date(z).getTime();if(new Date(n).getTime(),e&&M.daten&&(M.date>n?M.duration=0:M.duration=(d-M.date)/60/1e3),t.push(M),0===M.duration)return t;for(var c=0;cA.date){if(t[r].date+60*t[r].duration*1e3>A.date+60*A.duration*1e3){var s=o.cloneDeep(t[r]),i=O(A.started_at).add(A.duration,"minutes");s.timestamp=i.format(),s.started_at=new Date(p(s.timestamp)),s.date=A.date+60*A.duration*1e3,s.duration=(t[r].date+60*t[r].duration*1e3-(A.date+60*A.duration*1e3))/60/1e3,t.push(s)}t[r].duration=(A.date-t[r].date)/60/1e3}else if(A.date<=t[r].date&&A.date+60*A.duration*1e3>t[r].date){t[r].duration=(t[r].date+60*t[r].duration*1e3-(A.date+60*A.duration*1e3))/60/1e3;var q=O(A.started_at).add(A.duration,"minutes");t[r].timestamp=q.format(),t[r].started_at=new Date(p(t[r].timestamp)),t[r].date=A.date+60*A.duration*1e3}return t}(M,s,z,q,n,u);N=N.concat(b)}));var g=[];o.forEach(s,(function(M){var b=[{_type:"SuspendBasal",rate:0,duration:M.duration,date:M.date,started_at:M.started_at}];g=g.concat(b)}));var H=_.getTime()-288e5,w=new Date(z).getTime();if(q&&H0){var E,P=d.current_basal;o.isEmpty(d.basalprofile)||(P=e.basalLookup(d.basalprofile,new Date(x.timestamp))),void 0!==d.min_bg&&void 0!==d.max_bg&&(target_bg=(d.min_bg+d.max_bg)/2);var C=d;if(C.half_basal_exercise_target)var I=C.half_basal_exercise_target;else I=160;if(C.exercise_mode&&C.temptargetSet&&target_bg>=105){var V=I-100;E=V/(V+target_bg-100)}else void 0!==c&&(E=c.ratio);E&&(P*=E);var U=x.rate-P;D=U<0?-.05:.05;var J=Math.round(U*x.duration*10/6)/100,G=Math.round(J/D),K=x.duration/G;for(L=0;L{var p=z(8),e=z(1678),o=z(4556),O=z(8067);M.exports=function(M,b,z){if(z)n=[];else{z=e(M);var n=e(M,240)}var a={treatments:z,profile:M.profile,calculate:o};M.autosens&&(a.autosens=M.autosens);var d={treatments:n,profile:M.profile,calculate:o},c=[];/(Z|[+-][0-2][0-9]:?[034][05])+/.test(M.clock)||console.error("Warning: clock input "+M.clock+" is unzoned; please pass clock-zoned.json instead");var A,r=new Date(p(M.clock)),s=new Date(0).getTime(),i={};i.date=new Date(0).getTime(),z.forEach((function(M){M.insulin&&M.started_at?s=Math.max(s,M.started_at):"number"==typeof M.rate&&M.duration&&M.date>i.date&&((i=M).duration=Math.round(100*i.duration)/100)})),A=b?1:240;for(var q=0;q{M.exports=function(M,b){var z,p=b.getTime(),e=M.calculate,o=M.treatments,O=M.profile,n=O.dia,a=0,t=0,d=0,c=0,A=0,r=0;if(!o)return{};n<3&&(n=3);var s={bilinear:{requireLongDia:!1,peak:75},"rapid-acting":{requireLongDia:!0,peak:75,tdMin:300},"ultra-rapid":{requireLongDia:!0,peak:55,tdMin:300}},i="bilinear";void 0!==O.curve&&(i=O.curve.toLowerCase()),i in s||(console.error('Unsupported curve function: "'+i+'". Supported curves: "bilinear", "rapid-acting" (Novolog, Novorapid, Humalog, Apidra) and "ultra-rapid" (Fiasp). Defaulting to "rapid-acting".'),i="rapid-acting");var q=s[i];return q.requireLongDia&&n<5&&(n=5),z=q.peak,o.forEach((function(M){if(M.date<=p){var o=p-60*n*60*1e3;if(M.date>o){var s=e(M,b,i,n,z,O);s&&s.iobContrib&&(a+=s.iobContrib),s&&s.activityContrib&&(r+=s.activityContrib),M.insulin&&s&&s.iobContrib&&(M.insulin<.1?(t+=s.iobContrib,c+=M.insulin):(d+=s.iobContrib,A+=M.insulin))}}})),{iob:Math.round(1e3*a)/1e3,activity:Math.round(1e4*r)/1e4,basaliob:Math.round(1e3*t)/1e3,bolusiob:Math.round(1e3*d)/1e3,netbasalinsulin:Math.round(1e3*c)/1e3,bolusinsulin:Math.round(1e3*A)/1e3,time:b}}},367:(M,b)=>{function z(M,b,z){for(var p=0;pn&&o0?((a={}).carbs=n.carbs,a.nsCarbs=n.carbs,a.timestamp=n.created_at,a.bolus=n.insulin,z(e,n.timestamp,"carbs")?1:e.push(a)):"JournalEntryMealMarker"===n._type&&n.carb_input>0&&n.timestamp&&((a={}).timestamp=n.timestamp,a.carbs=n.carb_input,a.journalCarbs=n.carb_input,z(e,n.timestamp,"carbs")?1:e.push(a)):((a={}).timestamp=n.created_at,a.carbs=n.carbs,a.nsCarbs=n.carbs,z(e,n.created_at,"carbs")?1:e.push(a));for(O=0;O{var p=z(8),e=z(367),o=z(2638);M.exports=function(M){var b={treatments:e(M),profile:M.profile,pumphistory:M.history,glucose:M.glucose,basalprofile:M.basalprofile},z=new Date(p(M.clock));return o(b,z)}},2638:(M,b,z)=>{var p=z(8),e=z(6873);M.exports=function(M,b){var z=M.treatments,o=M.profile;if(void 0!==M.glucose)var O=M.glucose;var n=0,a=0,t=0,d=0,c=!1,A=b.getTime(),r=0;if(!z)return{};var s={glucose_data:O,iob_inputs:{profile:o,history:M.pumphistory},basalprofile:M.basalprofile,mealTime:A},i=0;z.sort((function(M,b){var z=new Date(p(M.timestamp));return new Date(p(b.timestamp)).getTime()-z.getTime()}));var q=0,u=0,_=0,W=0;z.forEach((function(M){var z=b.getTime(),o=z-216e5,O=new Date(p(M.timestamp)).getTime();if(O>o&&O<=z&&M.carbs>=1){M.nsCarbs>=1?a+=parseFloat(M.nsCarbs):M.bwCarbs>=1?(t+=parseFloat(M.bwCarbs),c=!0):M.journalCarbs>=1?d+=parseFloat(M.journalCarbs):console.error("Treatment carbs unclassified:",M),n+=parseFloat(M.carbs),s.mealTime=O,r=Math.max(r,O);var A=e(s).carbsAbsorbed,l=Math.max(0,n-A);"number"!=typeof l||isNaN(l)?console.error("Bad myMealCOB:",l,"mealCOB:",i,"carbs:",n,"myCarbsAbsorbed:",A):i=Math.max(i,l),l=1?u+=parseFloat(M.nsCarbs):M.bwCarbs>=1?_+=parseFloat(M.bwCarbs):M.journalCarbs>=1&&(W+=parseFloat(M.journalCarbs))):(q=0,u=0,_=0)}})),n-=q,a-=u,t-=_,d-=W,s.ciTime=b.getTime(),s.mealTime=b.getTime()-216e5;var l=e(s);return"number"!=typeof profile.maxCOB||isNaN(profile.maxCOB)?console.error("Bad profile.maxCOB:",profile.maxCOB):i=Math.min(profile.maxCOB,i),void 0!==l.currentDeviation&&null!==l.currentDeviation||(console.error(""),console.error("Warning: setting mealCOB to 0 because currentDeviation is null/undefined"),i=0),void 0!==l.maxDeviation&&null!==l.maxDeviation||(console.error(""),console.error("Warning: setting mealCOB to 0 because maxDeviation is 0 or undefined"),i=0),{carbs:Math.round(1e3*n)/1e3,nsCarbs:Math.round(1e3*a)/1e3,bwCarbs:Math.round(1e3*t)/1e3,journalCarbs:Math.round(1e3*d)/1e3,mealCOB:Math.round(i),currentDeviation:Math.round(100*l.currentDeviation)/100,maxDeviation:Math.round(100*l.maxDeviation)/100,minDeviation:Math.round(100*l.minDeviation)/100,slopeFromMaxDeviation:Math.round(1e3*l.slopeFromMaxDeviation)/1e3,slopeFromMinDeviation:Math.round(1e3*l.slopeFromMinDeviation)/1e3,allDeviations:l.allDeviations,lastCarbTime:r,bwFound:c}}},1836:(M,b,z)=>{var p=z(6486);b.maxDailyBasal=function(M){var b=p.maxBy(M.basals,(function(M){return Number(M.rate)}));return 1e3*Number(b.rate)/1e3},b.maxBasalLookup=function(M){return M.settings.maxBasal},b.basalLookup=function(M,b){var z=b;void 0===b&&(z=new Date);var e=p.sortBy(M,(function(M){return M.i})),o=e[e.length-1].rate;if(0!==o){for(var O=60*z.getHours()+z.getMinutes(),n=0;n=e[n].minutes&&O{var p=z(6486),e=null;function o(M,b){var z=b;void 0===b&&(z=new Date);var o=60*z.getHours()+z.getMinutes();if(e&&o>=e.offset&&o=t.offset&&o"']/g,K=RegExp(J.source),Q=RegExp(G.source),Z=/<%-([\s\S]+?)%>/g,$=/<%([\s\S]+?)%>/g,MM=/<%=([\s\S]+?)%>/g,bM=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,zM=/^\w*$/,pM=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,eM=/[\\^$.*+?()[\]{}|]/g,oM=RegExp(eM.source),OM=/^\s+|\s+$/g,nM=/^\s+/,aM=/\s+$/,tM=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,dM=/\{\n\/\* \[wrapped with (.+)\] \*/,cM=/,? & /,AM=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,rM=/\\(\\)?/g,sM=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,iM=/\w*$/,qM=/^[-+]0x[0-9a-f]+$/i,uM=/^0b[01]+$/i,_M=/^\[object .+?Constructor\]$/,WM=/^0o[0-7]+$/i,lM=/^(?:0|[1-9]\d*)$/,mM=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,LM=/($^)/,fM=/['\n\r\u2028\u2029\\]/g,hM="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",RM="\\u2700-\\u27bf",BM="a-z\\xdf-\\xf6\\xf8-\\xff",yM="A-Z\\xc0-\\xd6\\xd8-\\xde",XM="\\ufe0e\\ufe0f",YM="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",TM="['’]",DM="[\\ud800-\\udfff]",kM="["+YM+"]",NM="["+hM+"]",gM="\\d+",HM="[\\u2700-\\u27bf]",wM="["+BM+"]",vM="[^\\ud800-\\udfff"+YM+gM+RM+BM+yM+"]",SM="\\ud83c[\\udffb-\\udfff]",FM="[^\\ud800-\\udfff]",jM="(?:\\ud83c[\\udde6-\\uddff]){2}",xM="[\\ud800-\\udbff][\\udc00-\\udfff]",EM="["+yM+"]",PM="(?:"+wM+"|"+vM+")",CM="(?:"+EM+"|"+vM+")",IM="(?:['’](?:d|ll|m|re|s|t|ve))?",VM="(?:['’](?:D|LL|M|RE|S|T|VE))?",UM="(?:"+NM+"|"+SM+")"+"?",JM="[\\ufe0e\\ufe0f]?",GM=JM+UM+("(?:\\u200d(?:"+[FM,jM,xM].join("|")+")"+JM+UM+")*"),KM="(?:"+[HM,jM,xM].join("|")+")"+GM,QM="(?:"+[FM+NM+"?",NM,jM,xM,DM].join("|")+")",ZM=RegExp(TM,"g"),$M=RegExp(NM,"g"),Mb=RegExp(SM+"(?="+SM+")|"+QM+GM,"g"),bb=RegExp([EM+"?"+wM+"+"+IM+"(?="+[kM,EM,"$"].join("|")+")",CM+"+"+VM+"(?="+[kM,EM+PM,"$"].join("|")+")",EM+"?"+PM+"+"+IM,EM+"+"+VM,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gM,KM].join("|"),"g"),zb=RegExp("[\\u200d\\ud800-\\udfff"+hM+XM+"]"),pb=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,eb=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ob=-1,Ob={};Ob[w]=Ob[v]=Ob[S]=Ob[F]=Ob[j]=Ob[x]=Ob[E]=Ob[P]=Ob[C]=!0,Ob[_]=Ob[W]=Ob[g]=Ob[l]=Ob[H]=Ob[m]=Ob[L]=Ob[f]=Ob[R]=Ob[B]=Ob[y]=Ob[Y]=Ob[T]=Ob[D]=Ob[N]=!1;var nb={};nb[_]=nb[W]=nb[g]=nb[H]=nb[l]=nb[m]=nb[w]=nb[v]=nb[S]=nb[F]=nb[j]=nb[R]=nb[B]=nb[y]=nb[Y]=nb[T]=nb[D]=nb[k]=nb[x]=nb[E]=nb[P]=nb[C]=!0,nb[L]=nb[f]=nb[N]=!1;var ab={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},tb=parseFloat,db=parseInt,cb="object"==typeof z.g&&z.g&&z.g.Object===Object&&z.g,Ab="object"==typeof self&&self&&self.Object===Object&&self,rb=cb||Ab||Function("return this")(),sb=b&&!b.nodeType&&b,ib=sb&&M&&!M.nodeType&&M,qb=ib&&ib.exports===sb,ub=qb&&cb.process,_b=function(){try{var M=ib&&ib.require&&ib.require("util").types;return M||ub&&ub.binding&&ub.binding("util")}catch(M){}}(),Wb=_b&&_b.isArrayBuffer,lb=_b&&_b.isDate,mb=_b&&_b.isMap,Lb=_b&&_b.isRegExp,fb=_b&&_b.isSet,hb=_b&&_b.isTypedArray;function Rb(M,b,z){switch(z.length){case 0:return M.call(b);case 1:return M.call(b,z[0]);case 2:return M.call(b,z[0],z[1]);case 3:return M.call(b,z[0],z[1],z[2])}return M.apply(b,z)}function Bb(M,b,z,p){for(var e=-1,o=null==M?0:M.length;++e-1}function kb(M,b,z){for(var p=-1,e=null==M?0:M.length;++p-1;);return z}function Mz(M,b){for(var z=M.length;z--&&xb(b,M[z],0)>-1;);return z}function bz(M,b){for(var z=M.length,p=0;z--;)M[z]===b&&++p;return p}var zz=Vb({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"}),pz=Vb({"&":"&","<":"<",">":">",'"':""","'":"'"});function ez(M){return"\\"+ab[M]}function oz(M){return zb.test(M)}function Oz(M){var b=-1,z=Array(M.size);return M.forEach((function(M,p){z[++b]=[p,M]})),z}function nz(M,b){return function(z){return M(b(z))}}function az(M,b){for(var z=-1,p=M.length,e=0,o=[];++z",""":'"',"'":"'"});var sz=function M(b){var z,p=(b=null==b?rb:sz.defaults(rb.Object(),b,sz.pick(rb,eb))).Array,hM=b.Date,RM=b.Error,BM=b.Function,yM=b.Math,XM=b.Object,YM=b.RegExp,TM=b.String,DM=b.TypeError,kM=p.prototype,NM=BM.prototype,gM=XM.prototype,HM=b["__core-js_shared__"],wM=NM.toString,vM=gM.hasOwnProperty,SM=0,FM=(z=/[^.]+$/.exec(HM&&HM.keys&&HM.keys.IE_PROTO||""))?"Symbol(src)_1."+z:"",jM=gM.toString,xM=wM.call(XM),EM=rb._,PM=YM("^"+wM.call(vM).replace(eM,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),CM=qb?b.Buffer:e,IM=b.Symbol,VM=b.Uint8Array,UM=CM?CM.allocUnsafe:e,JM=nz(XM.getPrototypeOf,XM),GM=XM.create,KM=gM.propertyIsEnumerable,QM=kM.splice,Mb=IM?IM.isConcatSpreadable:e,zb=IM?IM.iterator:e,ab=IM?IM.toStringTag:e,cb=function(){try{var M=Ao(XM,"defineProperty");return M({},"",{}),M}catch(M){}}(),Ab=b.clearTimeout!==rb.clearTimeout&&b.clearTimeout,sb=hM&&hM.now!==rb.Date.now&&hM.now,ib=b.setTimeout!==rb.setTimeout&&b.setTimeout,ub=yM.ceil,_b=yM.floor,Sb=XM.getOwnPropertySymbols,Vb=CM?CM.isBuffer:e,iz=b.isFinite,qz=kM.join,uz=nz(XM.keys,XM),_z=yM.max,Wz=yM.min,lz=hM.now,mz=b.parseInt,Lz=yM.random,fz=kM.reverse,hz=Ao(b,"DataView"),Rz=Ao(b,"Map"),Bz=Ao(b,"Promise"),yz=Ao(b,"Set"),Xz=Ao(b,"WeakMap"),Yz=Ao(XM,"create"),Tz=Xz&&new Xz,Dz={},kz=Fo(hz),Nz=Fo(Rz),gz=Fo(Bz),Hz=Fo(yz),wz=Fo(Xz),vz=IM?IM.prototype:e,Sz=vz?vz.valueOf:e,Fz=vz?vz.toString:e;function jz(M){if(zn(M)&&!IO(M)&&!(M instanceof Cz)){if(M instanceof Pz)return M;if(vM.call(M,"__wrapped__"))return jo(M)}return new Pz(M)}var xz=function(){function M(){}return function(b){if(!bn(b))return{};if(GM)return GM(b);M.prototype=b;var z=new M;return M.prototype=e,z}}();function Ez(){}function Pz(M,b){this.__wrapped__=M,this.__actions__=[],this.__chain__=!!b,this.__index__=0,this.__values__=e}function Cz(M){this.__wrapped__=M,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=q,this.__views__=[]}function Iz(M){var b=-1,z=null==M?0:M.length;for(this.clear();++b=b?M:b)),M}function ap(M,b,z,p,o,O){var n,a=1&b,t=2&b,d=4&b;if(z&&(n=o?z(M,p,o,O):z(M)),n!==e)return n;if(!bn(M))return M;var c=IO(M);if(c){if(n=function(M){var b=M.length,z=new M.constructor(b);b&&"string"==typeof M[0]&&vM.call(M,"index")&&(z.index=M.index,z.input=M.input);return z}(M),!a)return Ye(M,n)}else{var A=io(M),r=A==f||A==h;if(GO(M))return fe(M,a);if(A==y||A==_||r&&!o){if(n=t||r?{}:uo(M),!a)return t?function(M,b){return Te(M,so(M),b)}(M,function(M,b){return M&&Te(b,gn(b),M)}(n,M)):function(M,b){return Te(M,ro(M),b)}(M,ep(n,M))}else{if(!nb[A])return o?M:{};n=function(M,b,z){var p=M.constructor;switch(b){case g:return he(M);case l:case m:return new p(+M);case H:return function(M,b){var z=b?he(M.buffer):M.buffer;return new M.constructor(z,M.byteOffset,M.byteLength)}(M,z);case w:case v:case S:case F:case j:case x:case E:case P:case C:return Re(M,z);case R:return new p;case B:case D:return new p(M);case Y:return function(M){var b=new M.constructor(M.source,iM.exec(M));return b.lastIndex=M.lastIndex,b}(M);case T:return new p;case k:return e=M,Sz?XM(Sz.call(e)):{}}var e}(M,A,a)}}O||(O=new Gz);var s=O.get(M);if(s)return s;O.set(M,n),nn(M)?M.forEach((function(p){n.add(ap(p,b,z,p,M,O))})):pn(M)&&M.forEach((function(p,e){n.set(e,ap(p,b,z,e,M,O))}));var i=c?e:(d?t?eo:po:t?gn:Nn)(M);return yb(i||M,(function(p,e){i&&(p=M[e=p]),bp(n,e,ap(p,b,z,e,M,O))})),n}function tp(M,b,z){var p=z.length;if(null==M)return!p;for(M=XM(M);p--;){var o=z[p],O=b[o],n=M[o];if(n===e&&!(o in M)||!O(n))return!1}return!0}function dp(M,b,z){if("function"!=typeof M)throw new DM(o);return ko((function(){M.apply(e,z)}),b)}function cp(M,b,z,p){var e=-1,o=Db,O=!0,n=M.length,a=[],t=b.length;if(!n)return a;z&&(b=Nb(b,Kb(z))),p?(o=kb,O=!1):b.length>=200&&(o=Zb,O=!1,b=new Jz(b));M:for(;++e-1},Vz.prototype.set=function(M,b){var z=this.__data__,p=zp(z,M);return p<0?(++this.size,z.push([M,b])):z[p][1]=b,this},Uz.prototype.clear=function(){this.size=0,this.__data__={hash:new Iz,map:new(Rz||Vz),string:new Iz}},Uz.prototype.delete=function(M){var b=to(this,M).delete(M);return this.size-=b?1:0,b},Uz.prototype.get=function(M){return to(this,M).get(M)},Uz.prototype.has=function(M){return to(this,M).has(M)},Uz.prototype.set=function(M,b){var z=to(this,M),p=z.size;return z.set(M,b),this.size+=z.size==p?0:1,this},Jz.prototype.add=Jz.prototype.push=function(M){return this.__data__.set(M,O),this},Jz.prototype.has=function(M){return this.__data__.has(M)},Gz.prototype.clear=function(){this.__data__=new Vz,this.size=0},Gz.prototype.delete=function(M){var b=this.__data__,z=b.delete(M);return this.size=b.size,z},Gz.prototype.get=function(M){return this.__data__.get(M)},Gz.prototype.has=function(M){return this.__data__.has(M)},Gz.prototype.set=function(M,b){var z=this.__data__;if(z instanceof Vz){var p=z.__data__;if(!Rz||p.length<199)return p.push([M,b]),this.size=++z.size,this;z=this.__data__=new Uz(p)}return z.set(M,b),this.size=z.size,this};var Ap=Ne(lp),rp=Ne(mp,!0);function sp(M,b){var z=!0;return Ap(M,(function(M,p,e){return z=!!b(M,p,e)})),z}function ip(M,b,z){for(var p=-1,o=M.length;++p0&&z(n)?b>1?up(n,b-1,z,p,e):gb(e,n):p||(e[e.length]=n)}return e}var _p=ge(),Wp=ge(!0);function lp(M,b){return M&&_p(M,b,Nn)}function mp(M,b){return M&&Wp(M,b,Nn)}function Lp(M,b){return Tb(b,(function(b){return ZO(M[b])}))}function fp(M,b){for(var z=0,p=(b=We(b,M)).length;null!=M&&zb}function yp(M,b){return null!=M&&vM.call(M,b)}function Xp(M,b){return null!=M&&b in XM(M)}function Yp(M,b,z){for(var o=z?kb:Db,O=M[0].length,n=M.length,a=n,t=p(n),d=1/0,c=[];a--;){var A=M[a];a&&b&&(A=Nb(A,Kb(b))),d=Wz(A.length,d),t[a]=!z&&(b||O>=120&&A.length>=120)?new Jz(a&&A):e}A=M[0];var r=-1,s=t[0];M:for(;++r=n?a:a*("desc"==z[p]?-1:1)}return M.index-b.index}(M,b,z)}))}function Ip(M,b,z){for(var p=-1,e=b.length,o={};++p-1;)n!==M&&QM.call(n,a,1),QM.call(M,a,1);return M}function Up(M,b){for(var z=M?b.length:0,p=z-1;z--;){var e=b[z];if(z==p||e!==o){var o=e;Wo(e)?QM.call(M,e,1):ce(M,e)}}return M}function Jp(M,b){return M+_b(Lz()*(b-M+1))}function Gp(M,b){var z="";if(!M||b<1||b>s)return z;do{b%2&&(z+=M),(b=_b(b/2))&&(M+=M)}while(b);return z}function Kp(M,b){return No(yo(M,b,oa),M+"")}function Qp(M){return Qz(En(M))}function Zp(M,b){var z=En(M);return wo(z,np(b,0,z.length))}function $p(M,b,z,p){if(!bn(M))return M;for(var o=-1,O=(b=We(b,M)).length,n=O-1,a=M;null!=a&&++oo?0:o+b),(z=z>o?o:z)<0&&(z+=o),o=b>z?0:z-b>>>0,b>>>=0;for(var O=p(o);++e>>1,O=M[o];null!==O&&!tn(O)&&(z?O<=b:O=200){var t=b?null:Ge(M);if(t)return tz(t);O=!1,e=Zb,a=new Jz}else a=b?[]:n;M:for(;++p=p?M:pe(M,b,z)}var Le=Ab||function(M){return rb.clearTimeout(M)};function fe(M,b){if(b)return M.slice();var z=M.length,p=UM?UM(z):new M.constructor(z);return M.copy(p),p}function he(M){var b=new M.constructor(M.byteLength);return new VM(b).set(new VM(M)),b}function Re(M,b){var z=b?he(M.buffer):M.buffer;return new M.constructor(z,M.byteOffset,M.length)}function Be(M,b){if(M!==b){var z=M!==e,p=null===M,o=M==M,O=tn(M),n=b!==e,a=null===b,t=b==b,d=tn(b);if(!a&&!d&&!O&&M>b||O&&n&&t&&!a&&!d||p&&n&&t||!z&&t||!o)return 1;if(!p&&!O&&!d&&M1?z[o-1]:e,n=o>2?z[2]:e;for(O=M.length>3&&"function"==typeof O?(o--,O):e,n&&lo(z[0],z[1],n)&&(O=o<3?e:O,o=1),b=XM(b);++p-1?o[O?b[n]:n]:e}}function Fe(M){return zo((function(b){var z=b.length,p=z,O=Pz.prototype.thru;for(M&&b.reverse();p--;){var n=b[p];if("function"!=typeof n)throw new DM(o);if(O&&!a&&"wrapper"==Oo(n))var a=new Pz([],!0)}for(p=a?p:z;++p1&&W.reverse(),r&&da))return!1;var d=O.get(M),c=O.get(b);if(d&&c)return d==b&&c==M;var A=-1,r=!0,s=2&z?new Jz:e;for(O.set(M,b),O.set(b,M);++A-1&&M%1==0&&M1?"& ":"")+b[p],b=b.join(z>2?", ":" "),M.replace(tM,"{\n/* [wrapped with "+b+"] */\n")}(p,function(M,b){return yb(u,(function(z){var p="_."+z[0];b&z[1]&&!Db(M,p)&&M.push(p)})),M.sort()}(function(M){var b=M.match(dM);return b?b[1].split(cM):[]}(p),z)))}function Ho(M){var b=0,z=0;return function(){var p=lz(),o=16-(p-z);if(z=p,o>0){if(++b>=800)return arguments[0]}else b=0;return M.apply(e,arguments)}}function wo(M,b){var z=-1,p=M.length,o=p-1;for(b=b===e?p:b;++z1?M[b-1]:e;return z="function"==typeof z?(M.pop(),z):e,OO(M,z)}));function rO(M){var b=jz(M);return b.__chain__=!0,b}function sO(M,b){return b(M)}var iO=zo((function(M){var b=M.length,z=b?M[0]:0,p=this.__wrapped__,o=function(b){return Op(b,M)};return!(b>1||this.__actions__.length)&&p instanceof Cz&&Wo(z)?((p=p.slice(z,+z+(b?1:0))).__actions__.push({func:sO,args:[o],thisArg:e}),new Pz(p,this.__chain__).thru((function(M){return b&&!M.length&&M.push(e),M}))):this.thru(o)}));var qO=De((function(M,b,z){vM.call(M,z)?++M[z]:op(M,z,1)}));var uO=Se(Co),_O=Se(Io);function WO(M,b){return(IO(M)?yb:Ap)(M,ao(b,3))}function lO(M,b){return(IO(M)?Xb:rp)(M,ao(b,3))}var mO=De((function(M,b,z){vM.call(M,z)?M[z].push(b):op(M,z,[b])}));var LO=Kp((function(M,b,z){var e=-1,o="function"==typeof b,O=UO(M)?p(M.length):[];return Ap(M,(function(M){O[++e]=o?Rb(b,M,z):Tp(M,b,z)})),O})),fO=De((function(M,b,z){op(M,z,b)}));function hO(M,b){return(IO(M)?Nb:Fp)(M,ao(b,3))}var RO=De((function(M,b,z){M[z?0:1].push(b)}),(function(){return[[],[]]}));var BO=Kp((function(M,b){if(null==M)return[];var z=b.length;return z>1&&lo(M,b[0],b[1])?b=[]:z>2&&lo(b[0],b[1],b[2])&&(b=[b[0]]),Cp(M,up(b,1),[])})),yO=sb||function(){return rb.Date.now()};function XO(M,b,z){return b=z?e:b,b=M&&null==b?M.length:b,Qe(M,c,e,e,e,e,b)}function YO(M,b){var z;if("function"!=typeof b)throw new DM(o);return M=qn(M),function(){return--M>0&&(z=b.apply(this,arguments)),M<=1&&(b=e),z}}var TO=Kp((function(M,b,z){var p=1;if(z.length){var e=az(z,no(TO));p|=t}return Qe(M,p,b,z,e)})),DO=Kp((function(M,b,z){var p=3;if(z.length){var e=az(z,no(DO));p|=t}return Qe(b,p,M,z,e)}));function kO(M,b,z){var p,O,n,a,t,d,c=0,A=!1,r=!1,s=!0;if("function"!=typeof M)throw new DM(o);function i(b){var z=p,o=O;return p=O=e,c=b,a=M.apply(o,z)}function q(M){return c=M,t=ko(_,b),A?i(M):a}function u(M){var z=M-d;return d===e||z>=b||z<0||r&&M-c>=n}function _(){var M=yO();if(u(M))return W(M);t=ko(_,function(M){var z=b-(M-d);return r?Wz(z,n-(M-c)):z}(M))}function W(M){return t=e,s&&p?i(M):(p=O=e,a)}function l(){var M=yO(),z=u(M);if(p=arguments,O=this,d=M,z){if(t===e)return q(d);if(r)return Le(t),t=ko(_,b),i(d)}return t===e&&(t=ko(_,b)),a}return b=_n(b)||0,bn(z)&&(A=!!z.leading,n=(r="maxWait"in z)?_z(_n(z.maxWait)||0,b):n,s="trailing"in z?!!z.trailing:s),l.cancel=function(){t!==e&&Le(t),c=0,p=d=O=t=e},l.flush=function(){return t===e?a:W(yO())},l}var NO=Kp((function(M,b){return dp(M,1,b)})),gO=Kp((function(M,b,z){return dp(M,_n(b)||0,z)}));function HO(M,b){if("function"!=typeof M||null!=b&&"function"!=typeof b)throw new DM(o);var z=function(){var p=arguments,e=b?b.apply(this,p):p[0],o=z.cache;if(o.has(e))return o.get(e);var O=M.apply(this,p);return z.cache=o.set(e,O)||o,O};return z.cache=new(HO.Cache||Uz),z}function wO(M){if("function"!=typeof M)throw new DM(o);return function(){var b=arguments;switch(b.length){case 0:return!M.call(this);case 1:return!M.call(this,b[0]);case 2:return!M.call(this,b[0],b[1]);case 3:return!M.call(this,b[0],b[1],b[2])}return!M.apply(this,b)}}HO.Cache=Uz;var vO=le((function(M,b){var z=(b=1==b.length&&IO(b[0])?Nb(b[0],Kb(ao())):Nb(up(b,1),Kb(ao()))).length;return Kp((function(p){for(var e=-1,o=Wz(p.length,z);++e=b})),CO=Dp(function(){return arguments}())?Dp:function(M){return zn(M)&&vM.call(M,"callee")&&!KM.call(M,"callee")},IO=p.isArray,VO=Wb?Kb(Wb):function(M){return zn(M)&&Rp(M)==g};function UO(M){return null!=M&&Mn(M.length)&&!ZO(M)}function JO(M){return zn(M)&&UO(M)}var GO=Vb||_a,KO=lb?Kb(lb):function(M){return zn(M)&&Rp(M)==m};function QO(M){if(!zn(M))return!1;var b=Rp(M);return b==L||"[object DOMException]"==b||"string"==typeof M.message&&"string"==typeof M.name&&!on(M)}function ZO(M){if(!bn(M))return!1;var b=Rp(M);return b==f||b==h||"[object AsyncFunction]"==b||"[object Proxy]"==b}function $O(M){return"number"==typeof M&&M==qn(M)}function Mn(M){return"number"==typeof M&&M>-1&&M%1==0&&M<=s}function bn(M){var b=typeof M;return null!=M&&("object"==b||"function"==b)}function zn(M){return null!=M&&"object"==typeof M}var pn=mb?Kb(mb):function(M){return zn(M)&&io(M)==R};function en(M){return"number"==typeof M||zn(M)&&Rp(M)==B}function on(M){if(!zn(M)||Rp(M)!=y)return!1;var b=JM(M);if(null===b)return!0;var z=vM.call(b,"constructor")&&b.constructor;return"function"==typeof z&&z instanceof z&&wM.call(z)==xM}var On=Lb?Kb(Lb):function(M){return zn(M)&&Rp(M)==Y};var nn=fb?Kb(fb):function(M){return zn(M)&&io(M)==T};function an(M){return"string"==typeof M||!IO(M)&&zn(M)&&Rp(M)==D}function tn(M){return"symbol"==typeof M||zn(M)&&Rp(M)==k}var dn=hb?Kb(hb):function(M){return zn(M)&&Mn(M.length)&&!!Ob[Rp(M)]};var cn=Ve(Sp),An=Ve((function(M,b){return M<=b}));function rn(M){if(!M)return[];if(UO(M))return an(M)?Az(M):Ye(M);if(zb&&M[zb])return function(M){for(var b,z=[];!(b=M.next()).done;)z.push(b.value);return z}(M[zb]());var b=io(M);return(b==R?Oz:b==T?tz:En)(M)}function sn(M){return M?(M=_n(M))===r||M===-1/0?17976931348623157e292*(M<0?-1:1):M==M?M:0:0===M?M:0}function qn(M){var b=sn(M),z=b%1;return b==b?z?b-z:b:0}function un(M){return M?np(qn(M),0,q):0}function _n(M){if("number"==typeof M)return M;if(tn(M))return i;if(bn(M)){var b="function"==typeof M.valueOf?M.valueOf():M;M=bn(b)?b+"":b}if("string"!=typeof M)return 0===M?M:+M;M=M.replace(OM,"");var z=uM.test(M);return z||WM.test(M)?db(M.slice(2),z?2:8):qM.test(M)?i:+M}function Wn(M){return Te(M,gn(M))}function ln(M){return null==M?"":te(M)}var mn=ke((function(M,b){if(ho(b)||UO(b))Te(b,Nn(b),M);else for(var z in b)vM.call(b,z)&&bp(M,z,b[z])})),Ln=ke((function(M,b){Te(b,gn(b),M)})),fn=ke((function(M,b,z,p){Te(b,gn(b),M,p)})),hn=ke((function(M,b,z,p){Te(b,Nn(b),M,p)})),Rn=zo(Op);var Bn=Kp((function(M,b){M=XM(M);var z=-1,p=b.length,o=p>2?b[2]:e;for(o&&lo(b[0],b[1],o)&&(p=1);++z1),b})),Te(M,eo(M),z),p&&(z=ap(z,7,Mo));for(var e=b.length;e--;)ce(z,b[e]);return z}));var Sn=zo((function(M,b){return null==M?{}:function(M,b){return Ip(M,b,(function(b,z){return Yn(M,z)}))}(M,b)}));function Fn(M,b){if(null==M)return{};var z=Nb(eo(M),(function(M){return[M]}));return b=ao(b),Ip(M,z,(function(M,z){return b(M,z[0])}))}var jn=Ke(Nn),xn=Ke(gn);function En(M){return null==M?[]:Qb(M,Nn(M))}var Pn=we((function(M,b,z){return b=b.toLowerCase(),M+(z?Cn(b):b)}));function Cn(M){return Zn(ln(M).toLowerCase())}function In(M){return(M=ln(M))&&M.replace(mM,zz).replace($M,"")}var Vn=we((function(M,b,z){return M+(z?"-":"")+b.toLowerCase()})),Un=we((function(M,b,z){return M+(z?" ":"")+b.toLowerCase()})),Jn=He("toLowerCase");var Gn=we((function(M,b,z){return M+(z?"_":"")+b.toLowerCase()}));var Kn=we((function(M,b,z){return M+(z?" ":"")+Zn(b)}));var Qn=we((function(M,b,z){return M+(z?" ":"")+b.toUpperCase()})),Zn=He("toUpperCase");function $n(M,b,z){return M=ln(M),(b=z?e:b)===e?function(M){return pb.test(M)}(M)?function(M){return M.match(bb)||[]}(M):function(M){return M.match(AM)||[]}(M):M.match(b)||[]}var Ma=Kp((function(M,b){try{return Rb(M,e,b)}catch(M){return QO(M)?M:new RM(M)}})),ba=zo((function(M,b){return yb(b,(function(b){b=So(b),op(M,b,TO(M[b],M))})),M}));function za(M){return function(){return M}}var pa=Fe(),ea=Fe(!0);function oa(M){return M}function Oa(M){return Hp("function"==typeof M?M:ap(M,1))}var na=Kp((function(M,b){return function(z){return Tp(z,M,b)}})),aa=Kp((function(M,b){return function(z){return Tp(M,z,b)}}));function ta(M,b,z){var p=Nn(b),e=Lp(b,p);null!=z||bn(b)&&(e.length||!p.length)||(z=b,b=M,M=this,e=Lp(b,Nn(b)));var o=!(bn(z)&&"chain"in z&&!z.chain),O=ZO(M);return yb(e,(function(z){var p=b[z];M[z]=p,O&&(M.prototype[z]=function(){var b=this.__chain__;if(o||b){var z=M(this.__wrapped__),e=z.__actions__=Ye(this.__actions__);return e.push({func:p,args:arguments,thisArg:M}),z.__chain__=b,z}return p.apply(M,gb([this.value()],arguments))})})),M}function da(){}var ca=Pe(Nb),Aa=Pe(Yb),ra=Pe(vb);function sa(M){return mo(M)?Ib(So(M)):function(M){return function(b){return fp(b,M)}}(M)}var ia=Ie(),qa=Ie(!0);function ua(){return[]}function _a(){return!1}var Wa=Ee((function(M,b){return M+b}),0),la=Je("ceil"),ma=Ee((function(M,b){return M/b}),1),La=Je("floor");var fa,ha=Ee((function(M,b){return M*b}),1),Ra=Je("round"),Ba=Ee((function(M,b){return M-b}),0);return jz.after=function(M,b){if("function"!=typeof b)throw new DM(o);return M=qn(M),function(){if(--M<1)return b.apply(this,arguments)}},jz.ary=XO,jz.assign=mn,jz.assignIn=Ln,jz.assignInWith=fn,jz.assignWith=hn,jz.at=Rn,jz.before=YO,jz.bind=TO,jz.bindAll=ba,jz.bindKey=DO,jz.castArray=function(){if(!arguments.length)return[];var M=arguments[0];return IO(M)?M:[M]},jz.chain=rO,jz.chunk=function(M,b,z){b=(z?lo(M,b,z):b===e)?1:_z(qn(b),0);var o=null==M?0:M.length;if(!o||b<1)return[];for(var O=0,n=0,a=p(ub(o/b));Oo?0:o+z),(p=p===e||p>o?o:qn(p))<0&&(p+=o),p=z>p?0:un(p);z>>0)?(M=ln(M))&&("string"==typeof b||null!=b&&!On(b))&&!(b=te(b))&&oz(M)?me(Az(M),0,z):M.split(b,z):[]},jz.spread=function(M,b){if("function"!=typeof M)throw new DM(o);return b=null==b?0:_z(qn(b),0),Kp((function(z){var p=z[b],e=me(z,0,b);return p&&gb(e,p),Rb(M,this,e)}))},jz.tail=function(M){var b=null==M?0:M.length;return b?pe(M,1,b):[]},jz.take=function(M,b,z){return M&&M.length?pe(M,0,(b=z||b===e?1:qn(b))<0?0:b):[]},jz.takeRight=function(M,b,z){var p=null==M?0:M.length;return p?pe(M,(b=p-(b=z||b===e?1:qn(b)))<0?0:b,p):[]},jz.takeRightWhile=function(M,b){return M&&M.length?re(M,ao(b,3),!1,!0):[]},jz.takeWhile=function(M,b){return M&&M.length?re(M,ao(b,3)):[]},jz.tap=function(M,b){return b(M),M},jz.throttle=function(M,b,z){var p=!0,e=!0;if("function"!=typeof M)throw new DM(o);return bn(z)&&(p="leading"in z?!!z.leading:p,e="trailing"in z?!!z.trailing:e),kO(M,b,{leading:p,maxWait:b,trailing:e})},jz.thru=sO,jz.toArray=rn,jz.toPairs=jn,jz.toPairsIn=xn,jz.toPath=function(M){return IO(M)?Nb(M,So):tn(M)?[M]:Ye(vo(ln(M)))},jz.toPlainObject=Wn,jz.transform=function(M,b,z){var p=IO(M),e=p||GO(M)||dn(M);if(b=ao(b,4),null==z){var o=M&&M.constructor;z=e?p?new o:[]:bn(M)&&ZO(o)?xz(JM(M)):{}}return(e?yb:lp)(M,(function(M,p,e){return b(z,M,p,e)})),z},jz.unary=function(M){return XO(M,1)},jz.union=zO,jz.unionBy=pO,jz.unionWith=eO,jz.uniq=function(M){return M&&M.length?de(M):[]},jz.uniqBy=function(M,b){return M&&M.length?de(M,ao(b,2)):[]},jz.uniqWith=function(M,b){return b="function"==typeof b?b:e,M&&M.length?de(M,e,b):[]},jz.unset=function(M,b){return null==M||ce(M,b)},jz.unzip=oO,jz.unzipWith=OO,jz.update=function(M,b,z){return null==M?M:Ae(M,b,_e(z))},jz.updateWith=function(M,b,z,p){return p="function"==typeof p?p:e,null==M?M:Ae(M,b,_e(z),p)},jz.values=En,jz.valuesIn=function(M){return null==M?[]:Qb(M,gn(M))},jz.without=nO,jz.words=$n,jz.wrap=function(M,b){return SO(_e(b),M)},jz.xor=aO,jz.xorBy=tO,jz.xorWith=dO,jz.zip=cO,jz.zipObject=function(M,b){return qe(M||[],b||[],bp)},jz.zipObjectDeep=function(M,b){return qe(M||[],b||[],$p)},jz.zipWith=AO,jz.entries=jn,jz.entriesIn=xn,jz.extend=Ln,jz.extendWith=fn,ta(jz,jz),jz.add=Wa,jz.attempt=Ma,jz.camelCase=Pn,jz.capitalize=Cn,jz.ceil=la,jz.clamp=function(M,b,z){return z===e&&(z=b,b=e),z!==e&&(z=(z=_n(z))==z?z:0),b!==e&&(b=(b=_n(b))==b?b:0),np(_n(M),b,z)},jz.clone=function(M){return ap(M,4)},jz.cloneDeep=function(M){return ap(M,5)},jz.cloneDeepWith=function(M,b){return ap(M,5,b="function"==typeof b?b:e)},jz.cloneWith=function(M,b){return ap(M,4,b="function"==typeof b?b:e)},jz.conformsTo=function(M,b){return null==b||tp(M,b,Nn(b))},jz.deburr=In,jz.defaultTo=function(M,b){return null==M||M!=M?b:M},jz.divide=ma,jz.endsWith=function(M,b,z){M=ln(M),b=te(b);var p=M.length,o=z=z===e?p:np(qn(z),0,p);return(z-=b.length)>=0&&M.slice(z,o)==b},jz.eq=xO,jz.escape=function(M){return(M=ln(M))&&Q.test(M)?M.replace(G,pz):M},jz.escapeRegExp=function(M){return(M=ln(M))&&oM.test(M)?M.replace(eM,"\\$&"):M},jz.every=function(M,b,z){var p=IO(M)?Yb:sp;return z&&lo(M,b,z)&&(b=e),p(M,ao(b,3))},jz.find=uO,jz.findIndex=Co,jz.findKey=function(M,b){return Fb(M,ao(b,3),lp)},jz.findLast=_O,jz.findLastIndex=Io,jz.findLastKey=function(M,b){return Fb(M,ao(b,3),mp)},jz.floor=La,jz.forEach=WO,jz.forEachRight=lO,jz.forIn=function(M,b){return null==M?M:_p(M,ao(b,3),gn)},jz.forInRight=function(M,b){return null==M?M:Wp(M,ao(b,3),gn)},jz.forOwn=function(M,b){return M&&lp(M,ao(b,3))},jz.forOwnRight=function(M,b){return M&&mp(M,ao(b,3))},jz.get=Xn,jz.gt=EO,jz.gte=PO,jz.has=function(M,b){return null!=M&&qo(M,b,yp)},jz.hasIn=Yn,jz.head=Uo,jz.identity=oa,jz.includes=function(M,b,z,p){M=UO(M)?M:En(M),z=z&&!p?qn(z):0;var e=M.length;return z<0&&(z=_z(e+z,0)),an(M)?z<=e&&M.indexOf(b,z)>-1:!!e&&xb(M,b,z)>-1},jz.indexOf=function(M,b,z){var p=null==M?0:M.length;if(!p)return-1;var e=null==z?0:qn(z);return e<0&&(e=_z(p+e,0)),xb(M,b,e)},jz.inRange=function(M,b,z){return b=sn(b),z===e?(z=b,b=0):z=sn(z),function(M,b,z){return M>=Wz(b,z)&&M<_z(b,z)}(M=_n(M),b,z)},jz.invoke=kn,jz.isArguments=CO,jz.isArray=IO,jz.isArrayBuffer=VO,jz.isArrayLike=UO,jz.isArrayLikeObject=JO,jz.isBoolean=function(M){return!0===M||!1===M||zn(M)&&Rp(M)==l},jz.isBuffer=GO,jz.isDate=KO,jz.isElement=function(M){return zn(M)&&1===M.nodeType&&!on(M)},jz.isEmpty=function(M){if(null==M)return!0;if(UO(M)&&(IO(M)||"string"==typeof M||"function"==typeof M.splice||GO(M)||dn(M)||CO(M)))return!M.length;var b=io(M);if(b==R||b==T)return!M.size;if(ho(M))return!wp(M).length;for(var z in M)if(vM.call(M,z))return!1;return!0},jz.isEqual=function(M,b){return kp(M,b)},jz.isEqualWith=function(M,b,z){var p=(z="function"==typeof z?z:e)?z(M,b):e;return p===e?kp(M,b,e,z):!!p},jz.isError=QO,jz.isFinite=function(M){return"number"==typeof M&&iz(M)},jz.isFunction=ZO,jz.isInteger=$O,jz.isLength=Mn,jz.isMap=pn,jz.isMatch=function(M,b){return M===b||Np(M,b,co(b))},jz.isMatchWith=function(M,b,z){return z="function"==typeof z?z:e,Np(M,b,co(b),z)},jz.isNaN=function(M){return en(M)&&M!=+M},jz.isNative=function(M){if(fo(M))throw new RM("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return gp(M)},jz.isNil=function(M){return null==M},jz.isNull=function(M){return null===M},jz.isNumber=en,jz.isObject=bn,jz.isObjectLike=zn,jz.isPlainObject=on,jz.isRegExp=On,jz.isSafeInteger=function(M){return $O(M)&&M>=-9007199254740991&&M<=s},jz.isSet=nn,jz.isString=an,jz.isSymbol=tn,jz.isTypedArray=dn,jz.isUndefined=function(M){return M===e},jz.isWeakMap=function(M){return zn(M)&&io(M)==N},jz.isWeakSet=function(M){return zn(M)&&"[object WeakSet]"==Rp(M)},jz.join=function(M,b){return null==M?"":qz.call(M,b)},jz.kebabCase=Vn,jz.last=Qo,jz.lastIndexOf=function(M,b,z){var p=null==M?0:M.length;if(!p)return-1;var o=p;return z!==e&&(o=(o=qn(z))<0?_z(p+o,0):Wz(o,p-1)),b==b?function(M,b,z){for(var p=z+1;p--;)if(M[p]===b)return p;return p}(M,b,o):jb(M,Pb,o,!0)},jz.lowerCase=Un,jz.lowerFirst=Jn,jz.lt=cn,jz.lte=An,jz.max=function(M){return M&&M.length?ip(M,oa,Bp):e},jz.maxBy=function(M,b){return M&&M.length?ip(M,ao(b,2),Bp):e},jz.mean=function(M){return Cb(M,oa)},jz.meanBy=function(M,b){return Cb(M,ao(b,2))},jz.min=function(M){return M&&M.length?ip(M,oa,Sp):e},jz.minBy=function(M,b){return M&&M.length?ip(M,ao(b,2),Sp):e},jz.stubArray=ua,jz.stubFalse=_a,jz.stubObject=function(){return{}},jz.stubString=function(){return""},jz.stubTrue=function(){return!0},jz.multiply=ha,jz.nth=function(M,b){return M&&M.length?Pp(M,qn(b)):e},jz.noConflict=function(){return rb._===this&&(rb._=EM),this},jz.noop=da,jz.now=yO,jz.pad=function(M,b,z){M=ln(M);var p=(b=qn(b))?cz(M):0;if(!b||p>=b)return M;var e=(b-p)/2;return Ce(_b(e),z)+M+Ce(ub(e),z)},jz.padEnd=function(M,b,z){M=ln(M);var p=(b=qn(b))?cz(M):0;return b&&pb){var p=M;M=b,b=p}if(z||M%1||b%1){var o=Lz();return Wz(M+o*(b-M+tb("1e-"+((o+"").length-1))),b)}return Jp(M,b)},jz.reduce=function(M,b,z){var p=IO(M)?Hb:Ub,e=arguments.length<3;return p(M,ao(b,4),z,e,Ap)},jz.reduceRight=function(M,b,z){var p=IO(M)?wb:Ub,e=arguments.length<3;return p(M,ao(b,4),z,e,rp)},jz.repeat=function(M,b,z){return b=(z?lo(M,b,z):b===e)?1:qn(b),Gp(ln(M),b)},jz.replace=function(){var M=arguments,b=ln(M[0]);return M.length<3?b:b.replace(M[1],M[2])},jz.result=function(M,b,z){var p=-1,o=(b=We(b,M)).length;for(o||(o=1,M=e);++ps)return[];var z=q,p=Wz(M,q);b=ao(b),M-=q;for(var e=Gb(p,b);++z=O)return M;var a=z-cz(p);if(a<1)return p;var t=n?me(n,0,a).join(""):M.slice(0,a);if(o===e)return t+p;if(n&&(a+=t.length-a),On(o)){if(M.slice(a).search(o)){var d,c=t;for(o.global||(o=YM(o.source,ln(iM.exec(o))+"g")),o.lastIndex=0;d=o.exec(c);)var A=d.index;t=t.slice(0,A===e?a:A)}}else if(M.indexOf(te(o),a)!=a){var r=t.lastIndexOf(o);r>-1&&(t=t.slice(0,r))}return t+p},jz.unescape=function(M){return(M=ln(M))&&K.test(M)?M.replace(J,rz):M},jz.uniqueId=function(M){var b=++SM;return ln(M)+b},jz.upperCase=Qn,jz.upperFirst=Zn,jz.each=WO,jz.eachRight=lO,jz.first=Uo,ta(jz,(fa={},lp(jz,(function(M,b){vM.call(jz.prototype,b)||(fa[b]=M)})),fa),{chain:!1}),jz.VERSION="4.17.20",yb(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(M){jz[M].placeholder=jz})),yb(["drop","take"],(function(M,b){Cz.prototype[M]=function(z){z=z===e?1:_z(qn(z),0);var p=this.__filtered__&&!b?new Cz(this):this.clone();return p.__filtered__?p.__takeCount__=Wz(z,p.__takeCount__):p.__views__.push({size:Wz(z,q),type:M+(p.__dir__<0?"Right":"")}),p},Cz.prototype[M+"Right"]=function(b){return this.reverse()[M](b).reverse()}})),yb(["filter","map","takeWhile"],(function(M,b){var z=b+1,p=1==z||3==z;Cz.prototype[M]=function(M){var b=this.clone();return b.__iteratees__.push({iteratee:ao(M,3),type:z}),b.__filtered__=b.__filtered__||p,b}})),yb(["head","last"],(function(M,b){var z="take"+(b?"Right":"");Cz.prototype[M]=function(){return this[z](1).value()[0]}})),yb(["initial","tail"],(function(M,b){var z="drop"+(b?"":"Right");Cz.prototype[M]=function(){return this.__filtered__?new Cz(this):this[z](1)}})),Cz.prototype.compact=function(){return this.filter(oa)},Cz.prototype.find=function(M){return this.filter(M).head()},Cz.prototype.findLast=function(M){return this.reverse().find(M)},Cz.prototype.invokeMap=Kp((function(M,b){return"function"==typeof M?new Cz(this):this.map((function(z){return Tp(z,M,b)}))})),Cz.prototype.reject=function(M){return this.filter(wO(ao(M)))},Cz.prototype.slice=function(M,b){M=qn(M);var z=this;return z.__filtered__&&(M>0||b<0)?new Cz(z):(M<0?z=z.takeRight(-M):M&&(z=z.drop(M)),b!==e&&(z=(b=qn(b))<0?z.dropRight(-b):z.take(b-M)),z)},Cz.prototype.takeRightWhile=function(M){return this.reverse().takeWhile(M).reverse()},Cz.prototype.toArray=function(){return this.take(q)},lp(Cz.prototype,(function(M,b){var z=/^(?:filter|find|map|reject)|While$/.test(b),p=/^(?:head|last)$/.test(b),o=jz[p?"take"+("last"==b?"Right":""):b],O=p||/^find/.test(b);o&&(jz.prototype[b]=function(){var b=this.__wrapped__,n=p?[1]:arguments,a=b instanceof Cz,t=n[0],d=a||IO(b),c=function(M){var b=o.apply(jz,gb([M],n));return p&&A?b[0]:b};d&&z&&"function"==typeof t&&1!=t.length&&(a=d=!1);var A=this.__chain__,r=!!this.__actions__.length,s=O&&!A,i=a&&!r;if(!O&&d){b=i?b:new Cz(this);var q=M.apply(b,n);return q.__actions__.push({func:sO,args:[c],thisArg:e}),new Pz(q,A)}return s&&i?M.apply(this,n):(q=this.thru(c),s?p?q.value()[0]:q.value():q)})})),yb(["pop","push","shift","sort","splice","unshift"],(function(M){var b=kM[M],z=/^(?:push|sort|unshift)$/.test(M)?"tap":"thru",p=/^(?:pop|shift)$/.test(M);jz.prototype[M]=function(){var M=arguments;if(p&&!this.__chain__){var e=this.value();return b.apply(IO(e)?e:[],M)}return this[z]((function(z){return b.apply(IO(z)?z:[],M)}))}})),lp(Cz.prototype,(function(M,b){var z=jz[b];if(z){var p=z.name+"";vM.call(Dz,p)||(Dz[p]=[]),Dz[p].push({name:b,func:z})}})),Dz[je(e,2).name]=[{name:"wrapper",func:e}],Cz.prototype.clone=function(){var M=new Cz(this.__wrapped__);return M.__actions__=Ye(this.__actions__),M.__dir__=this.__dir__,M.__filtered__=this.__filtered__,M.__iteratees__=Ye(this.__iteratees__),M.__takeCount__=this.__takeCount__,M.__views__=Ye(this.__views__),M},Cz.prototype.reverse=function(){if(this.__filtered__){var M=new Cz(this);M.__dir__=-1,M.__filtered__=!0}else(M=this.clone()).__dir__*=-1;return M},Cz.prototype.value=function(){var M=this.__wrapped__.value(),b=this.__dir__,z=IO(M),p=b<0,e=z?M.length:0,o=function(M,b,z){var p=-1,e=z.length;for(;++p=this.__values__.length;return{done:M,value:M?e:this.__values__[this.__index__++]}},jz.prototype.plant=function(M){for(var b,z=this;z instanceof Ez;){var p=jo(z);p.__index__=0,p.__values__=e,b?o.__wrapped__=p:b=p;var o=p;z=z.__wrapped__}return o.__wrapped__=M,b},jz.prototype.reverse=function(){var M=this.__wrapped__;if(M instanceof Cz){var b=M;return this.__actions__.length&&(b=new Cz(this)),(b=b.reverse()).__actions__.push({func:sO,args:[bO],thisArg:e}),new Pz(b,this.__chain__)}return this.thru(bO)},jz.prototype.toJSON=jz.prototype.valueOf=jz.prototype.value=function(){return se(this.__wrapped__,this.__actions__)},jz.prototype.first=jz.prototype.head,zb&&(jz.prototype[zb]=function(){return this}),jz}();rb._=sz,(p=function(){return sz}.call(b,z,b,M))===e||(M.exports=p)}.call(this)},4360:M=>{"use strict";M.exports=JSON.parse('{"version":"2018g","zones":["Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5","Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5","Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5","Africa/Algiers|LMT PMT WET WEST CET CEST|-c.c -9.l 0 -10 -10 -20|01232323232323232454542423234542324|-3bQob.c ME01.P cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5","Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6","Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4","Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5","Africa/Cairo|LMT EET EEST|-25.9 -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBC5.9 1AQM5.9 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6","Africa/Casablanca|LMT +00 +01|u.k 0 -10|0121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00|32e5","Africa/Ceuta|LMT WET WEST CET CEST|l.g 0 -10 -10 -20|0121212121212121212121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2M0M0 GdX0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|85e3","Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|01232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00|20e4","Africa/Johannesburg|LMT SAST SAST SAST|-1Q -1u -20 -30|0123232|-39EpQ qTcm 1Ajdu 1cL0 1cN0 1cL0|84e5","Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0","Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5","Africa/Monrovia|LMT MMT MMT GMT|H.8 H.8 I.u 0|0123|-3ygng.Q 1usM0 28G01.m|11e5","Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5","Africa/Sao_Tome|LMT LMT GMT WAT|-q.U A.J 0 -10|0123|-3tooq.U 18aoq.U 4i6N0","Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5","Africa/Tunis|LMT PMT CET CEST|-E.I -9.l -10 -20|01232323232323232323232323232323232|-3zO0E.I 1cBAv.n 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5","Africa/Windhoek|LMT +0130 SAST SAST CAT WAT|-18.o -1u -20 -30 -20 -10|012324545454545454545454545454545454545454545454545454|-39Ep8.o qTbC.o 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|LMT LMT NST NWT NPT BST BDT AHST HST HDT|-cd.m bK.C b0 a0 a0 b0 a0 a0 a0 90|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVzf.p 1EX1d.m 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|LMT LMT AST AWT APT AHST AHDT YST AKST AKDT|-e0.o 9X.A a0 90 90 a0 90 90 90 80|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVxs.n 1EX20.o 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3","America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4","America/Argentina/Buenos_Aires|LMT CMT -04 -03 -02|3R.M 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343434343|-331U6.c 125cn pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Catamarca|LMT CMT -04 -03 -02|4n.8 4g.M 40 30 20|012323232323232323232323232323232323232323234343434243432343|-331TA.Q 125bR.E pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Cordoba|LMT CMT -04 -03 -02|4g.M 4g.M 40 30 20|012323232323232323232323232323232323232323234343434243434343|-331TH.c 125c0 pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Jujuy|LMT CMT -04 -03 -02|4l.c 4g.M 40 30 20|0123232323232323232323232323232323232323232343434232434343|-331TC.M 125bT.A pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0","America/Argentina/La_Rioja|LMT CMT -04 -03 -02|4r.o 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342343432343|-331Tw.A 125bN.o pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Mendoza|LMT CMT -04 -03 -02|4z.g 4g.M 40 30 20|012323232323232323232323232323232323232323234343423232432343|-331To.I 125bF.w pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0","America/Argentina/Rio_Gallegos|LMT CMT -04 -03 -02|4A.Q 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343432343|-331Tn.8 125bD.U pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Salta|LMT CMT -04 -03 -02|4l.E 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342434343|-331TC.k 125bT.8 pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0","America/Argentina/San_Juan|LMT CMT -04 -03 -02|4y.4 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342343432343|-331Tp.U 125bG.I pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0","America/Argentina/San_Luis|LMT CMT -04 -03 -02|4p.o 4g.M 40 30 20|0123232323232323232323232323232323232323232343434232323432323|-331Ty.A 125bP.o pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0","America/Argentina/Tucuman|LMT CMT -04 -03 -02|4k.Q 4g.M 40 30 20|01232323232323232323232323232323232323232323434343424343234343|-331TD.8 125bT.U pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0","America/Argentina/Ushuaia|LMT CMT -04 -03 -02|4x.c 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343432343|-331Tq.M 125bH.A pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0","America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4","America/Asuncion|LMT AMT -04 -03|3O.E 3O.E 40 30|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-3eLw9.k 1FGo0 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0|28e5","America/Atikokan|LMT CST CDT CWT CPT EST|66.s 60 50 50 50 50|01212345|-32B5R.w UFdR.w 1in0 Rnb0 3je0 8x30 iw0|28e2","America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|84e3","America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5","America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4","America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5","America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3","America/Blanc-Sablon|LMT AST ADT AWT APT|3M.s 40 30 30 30|0121341|-3tokb.w 1nsqb.w 1in0 UGp0 8x50 iu0|11e2","America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2","America/Bogota|LMT BMT -05 -04|4U.g 4U.g 50 40|01232|-3sTv3.I 1eIo0 38yo3.I 2en0|90e5","America/Boise|LMT PST PDT MST MWT MPT MDT|7I.N 80 70 70 60 60 60|01212134536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-3tFE0 1nEe0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4","America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2","America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|77e4","America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|LMT CMT -0430 -04|4r.I 4r.E 4u 40|012323|-3eLvw.g ROnX.U 28KM2.k 1IwOu kqo0|29e5","America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3","America/Panama|LMT CMT EST|5i.8 5j.A 50|012|-3eLuF.Q Iy01.s|15e5","America/Chicago|LMT CST CDT EST CWT CPT|5O.A 60 50 50 50 50|012121212121212121212121212121212121213121212121214512121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|81e4","America/Costa_Rica|LMT SJMT CST CDT|5A.d 5A.d 60 50|01232323232|-3eLun.L 1fyo0 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5","America/Creston|LMT MST PST|7K.4 70 80|0121|-3togd.U 1jInd.U 43B0|53e2","America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|54e4","America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8","America/Dawson_Creek|LMT PST PDT PWT PPT MST|80.U 80 70 70 70 70|01213412121212121212121212121212121212121212121212121212125|-3tofX.4 1nspX.4 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3","America/Dawson|LMT YST YDT YWT YPT YDDT PST PDT|9h.E 90 80 80 80 70 80 70|01212134151676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-2MSeG.k GWpG.k 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2","America/Denver|LMT MST MDT MWT MPT|6X.U 70 60 60 60|012121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFF0 1nEe0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|012342525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 XQp0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5","America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5","America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3","America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5","America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5","America/Fort_Nelson|LMT PST PDT PWT PPT MST|8a.L 80 70 70 70 70|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121215|-3tofN.d 1nspN.d 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Fort_Wayne|LMT CST CDT CWT CPT EST EDT|5I.C 60 50 50 50 50 40|0121212134121212121212121212151565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5","America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e3","America/Goose_Bay|LMT NST NDT NST NDT NWT NPT AST ADT ADDT|41.E 3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|0121343434343434356343434343434343434343434343434343434343437878787878787878787878787878787878787878787879787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787|-3tojW.k 1nspt.c 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2","America/Grand_Turk|LMT KMT EST EDT AST|4I.w 57.a 50 40 40|012323232323232323232323232323232323232323232323232323232323232323232323232343232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLvf.s RK0m.C 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5","America/Guayaquil|LMT QMT -05 -04|5j.k 5e 50 40|01232|-3eLuE.E 1DNzS.E 2uILK rz0|27e5","America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4","America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Havana|LMT HMT CST CDT|5t.s 5t.A 50 40|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLuu.w 1qx00.8 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4","America/Indiana/Knox|LMT CST CDT CWT CPT EST|5K.u 60 50 50 50 50|01212134121212121212121212121212121212151212121212121212121212121212121212121212121212121252121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Marengo|LMT CST CDT CWT CPT EST EDT|5J.n 60 50 50 50 50 40|01212134121212121212121215656565656525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Petersburg|LMT CST CDT CWT CPT EST EDT|5N.7 60 50 50 50 50 40|012121341212121212121212121215121212121212121212121252125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Tell_City|LMT CST CDT CWT CPT EST EDT|5L.3 60 50 50 50 50 40|012121341212121212121212121212121565652121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vevay|LMT CST CDT CWT CPT EST EDT|5E.g 60 50 50 50 50 40|0121213415656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vincennes|LMT CST CDT CWT CPT EST EDT|5O.7 60 50 50 50 50 40|012121341212121212121212121212121565652125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Winamac|LMT CST CDT CWT CPT EST EDT|5K.p 60 50 50 50 50 40|012121341212121212121212121212121212121565652165656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2","America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2","America/Jamaica|LMT KMT EST EDT|57.a 57.a 50 40|01232323232323232323232|-3eLuQ.O RK00 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4","America/Juneau|LMT LMT PST PWT PPT PDT YDT YST AKST AKDT|-f2.j 8V.F 80 70 70 70 80 90 90 80|0123425252525252525252525252625252578989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVwq.s 1EX12.j 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3","America/Kentucky/Louisville|LMT CST CDT CWT CPT EST EDT|5H.2 60 50 50 50 50 40|01212121213412121212121212121212121212565656565656525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Kentucky/Monticello|LMT CST CDT CWT CPT EST EDT|5D.o 60 50 50 50 50 40|01212134121212121212121212121212121212121212121212121212121212121212121212565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/La_Paz|LMT CMT BST -04|4w.A 4w.A 3w.A 40|0123|-3eLvr.o 1FIo0 13b0|19e5","America/Lima|LMT LMT -05 -04|58.c 58.A 50 40|01232323232323232|-3eLuP.M JcM0.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6","America/Los_Angeles|LMT PST PDT PWT PPT|7Q.W 80 70 70 70|0121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFE0 1nEe0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4","America/Managua|LMT MMT CST EST CDT|5J.8 5J.c 60 50 50|01232424232324242|-3eLue.Q 1Mhc0.4 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5","America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5","America/Martinique|LMT FFMT AST ADT|44.k 44.k 40 30|01232|-3eLvT.E PTA0 2LPbT.E 19X0|39e4","America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4","America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|44e4","America/Menominee|LMT CST CDT CWT CPT EST|5O.r 60 50 50 50 50|012121341212152121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3pdG9.x 1jce9.x 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2","America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|11e5","America/Metlakatla|LMT LMT PST PWT PPT PDT AKST AKDT|-fd.G 8K.i 80 70 70 70 90 80|012342525252525252525252525252525252676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-48Pzs.L 1jVwf.5 1EX1d.G 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|20e6","America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Moncton|LMT EST AST ADT AWT APT|4j.8 50 40 30 30 30|0123232323232323232323245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3txvE.Q J4ME.Q CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3","America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|41e5","America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Toronto|LMT EST EDT EWT EPT|5h.w 50 40 40 40|012121212121212121212121212121212121212121212123412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B6G.s UFdG.s 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5","America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4","America/New_York|LMT EST EDT EWT EPT|4U.2 50 40 40 40|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFH0 1nEe0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Nipigon|LMT EST EDT EWT EPT|5R.4 50 40 40 40|0121234121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B66.U UFd6.U 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2","America/Nome|LMT LMT NST NWT NPT BST BDT YST AKST AKDT|-cW.m b1.C b0 a0 a0 b0 a0 90 90 80|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVyu.p 1EX1W.m 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2","America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2","America/North_Dakota/Beulah|LMT MST MDT MWT MPT CST CDT|6L.7 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/Center|LMT MST MDT MWT MPT CST CDT|6J.c 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/New_Salem|LMT MST MDT MWT MPT CST CDT|6J.D 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212121212121212121212121212565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4","America/Phoenix|LMT MST MDT MWT|7s.i 70 60 60|012121313121|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5","America/Port-au-Prince|LMT PPMT EST EDT|4N.k 4N 50 40|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLva.E 15RLX.E 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4","America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4","America/Puerto_Rico|LMT AST AWT APT|4o.p 40 30 30|01231|-2Qi7z.z 1IUbz.z 7XT0 iu0|24e5","America/Punta_Arenas|LMT SMT -05 -04 -03|4H.E 4G.K 50 40 30|01213132323232323232343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLvg.k MJbX.6 fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0","America/Rainy_River|LMT CST CDT CWT CPT|6i.g 60 50 50 50|0121234121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B5F.I UFdF.I 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842","America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2","America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5","America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4","America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229","America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4","America/Santiago|LMT SMT -05 -04 -03|4G.K 4G.K 50 40 30|0121313232323232323432343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLvh.e MJc0 fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0|62e5","America/Santo_Domingo|LMT SDMT EST EDT -0430 AST|4D.A 4E 50 40 4u 40|012324242424242525|-3eLvk.o 1Jic0.o 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5","America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|20e6","America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|452","America/Sitka|LMT LMT PST PWT PPT PDT YST AKST AKDT|-eW.L 91.d 80 70 70 70 90 90 80|0123425252525252525252525252525252567878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787|-48Pzs.L 1jVwu 1EX0W.L 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2","America/St_Johns|LMT NST NDT NST NDT NWT NPT NDDT|3u.Q 3u.Q 2u.Q 3u 2u 2u 2u 1u|012121212121212121212121212121212121213434343434343435634343434343434343434343434343434343434343434343434343434343434343434343434343434343437343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3tokt.8 1l020 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3","America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5","America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656","America/Thunder_Bay|LMT CST EST EWT EPT EDT|5V 60 50 40 40 40|01234252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-32B63 Avc3 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Vancouver|LMT PST PDT PWT PPT|8c.s 80 70 70 70|01213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tofL.w 1nspL.w 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Whitehorse|LMT YST YDT YWT YPT YDDT PST PDT|90.c 90 80 80 80 70 80 70|01212134151676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-2MSeX.M GWpX.M 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Winnipeg|LMT CST CDT CWT CPT|6s.A 60 50 50 50|0121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3kLtv.o 1a3bv.o WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4","America/Yakutat|LMT LMT YST YWT YPT YDT AKST AKDT|-eF.5 9i.T 90 80 80 80 90 80|0123425252525252525252525252525252526767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-48Pzs.L 1jVwL.G 1EX1F.5 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642","America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10","Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70","Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80","Antarctica/Macquarie|-00 AEST AEDT +11|0 -a0 -b0 -b0|01210121212121212121212121212121212121212121212121212121212121212121212121212121212121212123|-2OPc0 Fb40 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1","Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60","Pacific/Auckland|LMT NZMT NZST NZST NZDT|-bD.4 -bu -cu -c0 -d0|012131313131313131313131313134343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-46jLD.4 2nEO9.4 Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5","Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","Antarctica/Rothera|-00 -03|0 30|01|gOo0|130","Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20","Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|40","Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25","Europe/Oslo|LMT CET CEST|-H -10 -20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32BcH Q4oH Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|62e4","Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5","Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5","Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5","Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3","Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4","Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4","Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4","Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0","Asia/Baghdad|LMT BMT +03 +04|-2V.E -2V.A -30 -40|0123232323232323232323232323232323232323232323232323232|-3eLCV.E 18ao0.4 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5","Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4","Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|LMT BMT +07|-6G.4 -6G.4 -70|012|-3D8SG.4 1C000|15e6","Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0","Asia/Beirut|LMT EET EEST|-2m -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3D8Om 1BWom 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|22e5","Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4","Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4","Asia/Kolkata|LMT HMT MMT IST +0630|-5R.s -5R.k -5l.a -5u -6u|01234343|-4Fg5R.s BKo0.8 1rDcw.a 1r2LP.a 1un0 HB0 7zX0|15e6","Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4","Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3","Asia/Shanghai|LMT CST CDT|-85.H -80 -90|0121212121212121212121212121|-2M0U5.H 1zWo5.H Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6","Asia/Colombo|LMT MMT +0530 +06 +0630|-5j.o -5j.w -5u -60 -6u|012342432|-3D8Rj.o 13inX.Q 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5","Asia/Dhaka|LMT HMT +0630 +0530 +06 +07|-61.E -5R.k -6u -5u -60 -70|01232454|-3eLG1.E 26008.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6","Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5","Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4","Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5","Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4","Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Asia/Gaza|LMT EET EEST IST IDT|-2h.Q -20 -30 -20 -30|0121212121212121212121212121212123434343434343434343434343431212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBCh.Q 1Azch.Q 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|18e5","Asia/Hebron|LMT EET EEST IST IDT|-2k.n -20 -30 -20 -30|012121212121212121212121212121212343434343434343434343434343121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBCk.n 1Azck.n 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|25e4","Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5","Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5","Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|LMT IMT +07 +08 +09|-6V.5 -6V.5 -70 -80 -90|012343434343434343434343234343434343434343434343434343434343434343|-3D8SV.5 1Bxc0 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Europe/Istanbul|LMT IMT EET EEST +04 +03|-1T.Q -1U.U -20 -30 -40 -30|0123232323232323232323232323232323232323232323232323232345454545453232323232323232323232323232323232323232323232323232323232323235|-3D8NT.Q 1ePXW.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|LMT BMT +0720 +0730 +09 +08 WIB|-77.c -77.c -7k -7u -90 -80 -70|012343536|-49jH7.c 2hiLL.c luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6","Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4","Asia/Jerusalem|LMT JMT IST IDT IDDT|-2k.S -2k.E -20 -30 -40|012323232323243232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3D8Ok.S 1wvA0.e SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0|81e4","Asia/Kabul|LMT +04 +0430|-4A.M -40 -4u|012|-3eLEA.M 2dTcA.M|46e5","Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4","Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6","Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5","Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5","Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2","Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Asia/Kuala_Lumpur|LMT SMT +07 +0720 +0730 +09 +08|-6K.K -6T.p -70 -7k -7u -90 -80|01234546|-2M0SK.K aILP.l 17anT.p l5XE 17bO 8Fyu 1so1u|71e5","Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4","Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4","Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3","Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5","Asia/Manila|LMT LMT PST PDT JST|fU -84 -80 -90 -90|01232423232|-54m84 2clc0 1vfc4 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6","Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|32e4","Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4","Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5","Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5","Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4","Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4","Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5","Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4","Asia/Rangoon|LMT RMT +0630 +09|-6o.L -6o.L -6u -90|01232|-3D8So.L 1BnA0 SmnS.L 7j9u|48e5","Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4","Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4","Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6","Asia/Singapore|LMT SMT +07 +0720 +0730 +09 +08|-6T.p -6T.p -70 -7k -7u -90 -80|01234546|-2M0ST.p aIM0 17anT.p l5XE 17bO 8Fyu 1so1u|56e5","Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2","Asia/Taipei|LMT CST JST CDT|-86 -80 -90 -90|012131313131313131313131313131313131313131|-30bk6 1FDc6 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5","Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5","Asia/Tbilisi|LMT TBMT +03 +04 +05|-2X.b -2X.b -30 -40 -50|01234343434343434343434323232343434343434343434323|-3D8OX.b 1LUM0 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5","Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6","Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3","Asia/Tokyo|LMT JST JDT|-9i.X -90 -a0|0121212121|-3jE90 2qSo0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6","Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5","Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5","Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2","Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4","Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5","Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5","Atlantic/Azores|LMT HMT -02 -01 +00 WET|1G.E 1S.w 20 10 0 0|012323232323232323232323232323232323232323232343234323432343232323232323232323232323232323232323232343434343434343434343434343434345434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3tomh.k 18aoh.k aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|25e4","Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3","Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4","Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|49e3","Atlantic/Madeira|LMT FMT -01 +00 +01 WET WEST|17.A 17.A 10 0 -10 0 -10|012323232323232323232323232323232323232323232343234323432343232323232323232323232323232323232323232565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tomQ.o 18anQ.o aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e4","Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4","Atlantic/South_Georgia|LMT -02|2q.8 20|01|-3eLxx.Q|30","Atlantic/Stanley|LMT SMT -04 -03 -02|3P.o 3P.o 40 30 20|0123232323232323434323232323232323232323232323232323232323232323232323|-3eLw8.A S200 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2","Australia/Sydney|LMT AEST AEDT|-a4.Q -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-32oW4.Q RlA5.Q xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|LMT ACST ACST ACDT|-9e.k -90 -9u -au|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-32oVe.k ak0e.k H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|LMT AEST AEDT|-ac.8 -a0 -b0|012121212121212121|-32Bmc.8 Ry0d.8 xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5","Australia/Broken_Hill|LMT AEST ACST ACST ACDT|-9p.M -a0 -90 -9u -au|0123434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-32oVp.M 3Lzp.M 6wp0 H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|18e3","Australia/Currie|LMT AEST AEDT|-9z.s -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-3109z.s Pk1z.s 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|746","Australia/Darwin|LMT ACST ACST ACDT|-8H.k -90 -9u -au|01232323232|-32oUH.k ajXH.k H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4","Australia/Eucla|LMT +0845 +0945|-8z.s -8J -9J|01212121212121212121|-30nIz.s PknP.s xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368","Australia/Hobart|LMT AEST AEDT|-9N.g -a0 -b0|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-3109N.g Pk1N.g 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|21e4","Australia/Lord_Howe|LMT AEST +1030 +1130 +11|-aA.k -a0 -au -bu -b0|01232323232424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424|-32oWA.k 3tzAA.k 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Lindeman|LMT AEST AEDT|-9T.U -a0 -b0|0121212121212121212121|-32BlT.U RxXU.U xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10","Australia/Melbourne|LMT AEST AEDT|-9D.Q -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-32oVD.Q RlzE.Q xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|39e5","Australia/Perth|LMT AWST AWDT|-7H.o -80 -90|01212121212121212121|-30nHH.o PknI.o xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5","CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Pacific/Easter|LMT EMT -07 -06 -05|7h.s 7h.s 70 60 50|0123232323232323232323232323234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLsG.w 1HRc0 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0|30e2","CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Europe/Dublin|LMT DMT IST GMT BST IST|p p.l -y.D 0 -10 -10|012343434343435353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353|-3BHbz 1ra20.l Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","EST|EST|50|0|","EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Etc/GMT-0|GMT|0|0|","Etc/GMT-1|+01|-10|0|","Etc/GMT-10|+10|-a0|0|","Etc/GMT-11|+11|-b0|0|","Etc/GMT-12|+12|-c0|0|","Etc/GMT-13|+13|-d0|0|","Etc/GMT-14|+14|-e0|0|","Etc/GMT-2|+02|-20|0|","Etc/GMT-3|+03|-30|0|","Etc/GMT-4|+04|-40|0|","Etc/GMT-5|+05|-50|0|","Etc/GMT-6|+06|-60|0|","Etc/GMT-7|+07|-70|0|","Etc/GMT-8|+08|-80|0|","Etc/GMT-9|+09|-90|0|","Etc/GMT+1|-01|10|0|","Etc/GMT+10|-10|a0|0|","Etc/GMT+11|-11|b0|0|","Etc/GMT+12|-12|c0|0|","Etc/GMT+2|-02|20|0|","Etc/GMT+3|-03|30|0|","Etc/GMT+4|-04|40|0|","Etc/GMT+5|-05|50|0|","Etc/GMT+6|-06|60|0|","Etc/GMT+7|-07|70|0|","Etc/GMT+8|-08|80|0|","Etc/GMT+9|-09|90|0|","Etc/UCT|UCT|0|0|","Etc/UTC|UTC|0|0|","Europe/Amsterdam|LMT AMT NST +0120 +0020 CEST CET|-j.w -j.w -1j.w -1k -k -20 -10|0121212121212121212121212121212121212121212123434345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656|-5sHcj.w 3i200 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|16e5","Europe/Andorra|LMT WET CET CEST|-6.4 0 -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2M0M6.4 1Pnc6.4 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|79e3","Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5","Europe/Athens|LMT AMT EET EEST CEST CET|-1y.Q -1y.Q -20 -30 -20 -10|0123234545232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-30SNy.Q OMM1 CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|35e5","Europe/London|LMT GMT BST BDST|1.f 0 -10 -20|01212121212121212121212121212121212121212121212121232323232321212321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-4VgnW.J 2KHdW.J Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|10e6","Europe/Belgrade|LMT CET CEST|-1m -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3topm 2juLm 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Berlin|LMT CET CEST CEMT|-R.s -10 -20 -30|012121212121212321212321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-36RcR.s UbWR.s 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|41e5","Europe/Prague|LMT PMT CET CEST GMT|-V.I -V.I -10 -20 0|0123232323232323232423232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4QbAV.I 1FDc0 XPaV.I 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|13e5","Europe/Brussels|LMT BMT WET CET CEST WEST|-h.u -h.u 0 -10 -20 -10|012343434325252525252525252525252525252525252525252525434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3D8Mh.u u1M0 SNMh.u 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|21e5","Europe/Bucharest|LMT BMT EET EEST|-1I.o -1I.o -20 -30|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3awpI.o 1AU00 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|19e5","Europe/Budapest|LMT CET CEST|-1g.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3cWpg.k 12hbg.k 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e5","Europe/Zurich|LMT BMT CET CEST|-y.8 -t.K -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4HyMy.8 1Dw04.m 1SfAt.K 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|38e4","Europe/Chisinau|LMT CMT BMT EET EEST CEST CET MSK MSD|-1T.k -1T -1I.o -20 -30 -20 -10 -30 -40|0123434343434343434345656578787878787878787878434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3D8NT.k 1wNA0.k wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|67e4","Europe/Copenhagen|LMT CMT CET CEST|-O.k -O.k -10 -20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLAO.k 9Io0 SryO.k Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Gibraltar|LMT GMT BST BDST CET CEST|l.o 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123232323232121232121212121212121212145454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-3BHbC.A 1ra1C.A Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|30e3","Europe/Helsinki|LMT HMT EET EEST|-1D.N -1D.N -20 -30|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3H0ND.N 1Iu00 OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Kaliningrad|LMT CET CEST CET CEST MSK MSD EEST EET +03|-1m -10 -20 -20 -30 -30 -40 -30 -20 -30|01212121212121343565656565656565657878787878787878787878787878787878787878787898|-36Rdm UbXm 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4","Europe/Kiev|LMT KMT EET MSK CEST CET MSD EEST|-22.4 -22.4 -20 -30 -20 -10 -40 -30|01234545363636363636363636367272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-3D8O2.4 1LUM0 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|34e5","Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4","Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Europe/Madrid|LMT WET WEST WEMT CET CEST|e.I 0 -10 -20 -10 -20|0121212121212121212321454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2M0M0 G5z0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|62e5","Europe/Malta|LMT CET CEST|-W.4 -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-35rcW.4 SXzW.4 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|42e4","Europe/Minsk|LMT MMT EET MSK CEST CET MSD EEST +03|-1O.g -1O -20 -30 -20 -10 -40 -30 -30|012345454363636363636363636372727272727272727272727272727272727272728|-3D8NO.g 1LUM0.g eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5","Europe/Monaco|LMT PMT WET WEST WEMT CET CEST|-t.w -9.l 0 -10 -20 -10 -20|012323232323232323232323232323232323232323232323232343434343456565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3bQot.w ME0k.b cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|38e3","Europe/Moscow|LMT MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|01232434565756865656565656565656565698656565656565656565656565656565656565656a6|-3D8Ou.h 1sQM0 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6","Europe/Paris|LMT PMT WET WEST CEST CET WEMT|-9.l -9.l 0 -10 -20 -10 -20|01232323232323232323232323232323232323232323232323234545463654545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-3bQo8.l ME00 cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e6","Europe/Riga|LMT RMT LST EET MSK CEST CET MSD EEST|-1A.y -1A.y -2A.y -20 -30 -20 -10 -40 -30|0121213456565647474747474747474838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383|-3D8NA.y 1xde0 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|64e4","Europe/Rome|LMT RMT CET CEST|-N.U -N.U -10 -20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4bsoN.U 160LN.U T000 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|39e5","Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5","Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810","Europe/Simferopol|LMT SMT EET MSK CEST CET MSD EEST MSK|-2g.o -2g -20 -30 -20 -10 -40 -30 -40|0123454543636363636363636363272727636363727272727272727272727272727272727283|-3D8Og.o 1LUM0.o eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Sofia|LMT IMT EET CET CEST EEST|-1x.g -1U.U -20 -10 -20 -30|0123434325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-3D8Nx.g AiLA.k 1UFeU.U WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Stockholm|LMT SET CET CEST|-1c.c -10.e -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3FyNc.c P80b.W DPb0.e TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|15e5","Europe/Tallinn|LMT TMT CET CEST EET MSK MSD EEST|-1D -1D -10 -20 -20 -30 -40 -30|0123214532323565656565656565657474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474|-3D8ND 1wI00 teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|41e4","Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|42e4","Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5","Europe/Uzhgorod|LMT CET CEST MSK MSD EET EEST|-1t.c -10 -20 -30 -40 -20 -30|0121212134343434343434343431565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3cWpt.c 20vCt.c 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e4","Europe/Vienna|LMT CET CEST|-15.l -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-36Rd5.l UbX5.l 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|18e5","Europe/Vilnius|LMT WMT KMT CET EET MSK CEST MSD EEST|-1F.g -1o -1z.A -10 -20 -30 -20 -40 -30|0123435636365757575757575757584848484848484848463648484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484|-3D8NF.g 1u5Ah.g 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0|10e5","Europe/Warsaw|LMT WMT CET CEST EET EEST|-1o -1o -10 -20 -20 -30|0123232345423232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3D8No 1qDA0 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e5","Europe/Zaporozhye|LMT +0220 EET MSK CEST CET MSD EEST|-2k.E -2k -20 -30 -20 -10 -40 -30|012345453636363636363636363637272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-3D8Ok.E 1LUM0.E eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|77e4","HST|HST|a0|0|","Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2","Indian/Christmas|LMT +07|-72.Q -70|01|-32oT2.Q|21e2","Indian/Cocos|LMT +0630|-6r.E -6u|01|-2OqSr.E|596","Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130","Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3","Indian/Maldives|LMT MMT +05|-4S -4S -50|012|-3D8QS 3eLA0|35e4","Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4","Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4","Pacific/Kwajalein|LMT +11 -12 +12|-b9.k -b0 c0 -c0|0123|-2M0X9.k 2Lo09.k W9X0|14e3","MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","MST|MST|70|0|","MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Pacific/Chatham|LMT +1215 +1245 +1345|-cd.M -cf -cJ -dJ|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-46jMd.M 37RbW.M 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|LMT LMT -1130 -11 -10 +14 +13|-cx.4 bq.U bu b0 a0 -e0 -d0|012343456565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-38Fox.4 J1A0 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3","Pacific/Bougainville|LMT PMMT +10 +09 +11|-am.g -9M.w -a0 -90 -b0|012324|-3D8Wm.g AvAx.I 1TCLM.w 7CN0 2MQp0|18e4","Pacific/Chuuk|LMT +10|-a7.8 -a0|01|-2M0W7.8|49e3","Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3","Pacific/Enderbury|LMT -12 -11 +13|bo.k c0 b0 -d0|0123|-2M0Az.E 3bIMz.E B7X0|1","Pacific/Fakaofo|LMT -11 +13|bo.U b0 -d0|012|-2M0Az.4 4ufXz.4|483","Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0|88e4","Pacific/Funafuti|LMT +12|-bU.Q -c0|01|-2M0XU.Q|45e2","Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3","Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125","Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4","Pacific/Guam|LMT LMT GST ChST|el -9D -a0 -a0|0123|-54m9D 2glc0 43qnD|17e4","Pacific/Honolulu|LMT HST HDT HWT HPT HST|av.q au 9u 9u 9u a0|01213415|-3061s.y 1uMdW.y 8x0 lef0 8wWu iAu 46p0|37e4","Pacific/Kiritimati|LMT -1040 -10 +14|at.k aE a0 -e0|0123|-2M0Bu.E 3bIMa.E B7Xk|51e2","Pacific/Kosrae|LMT +11 +12|-aP.U -b0 -c0|0121|-2M0WP.U 2LnXP.U 1bdz0|66e2","Pacific/Majuro|LMT +11 +12|-bo.M -b0 -c0|012|-2M0Xo.M 2Lo0o.M|28e3","Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2","Pacific/Pago_Pago|LMT LMT SST|-cB.c bm.M b0|012|-38FoB.c J1A0|37e2","Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3","Pacific/Niue|LMT -1120 -1130 -11|bj.E bk bu b0|0123|-2M0AE.k 21IM0.k 17y0a|12e2","Pacific/Norfolk|LMT +1112 +1130 +1230 +11|-bb.Q -bc -bu -cu -b0|012324|-2M0Xb.Q 21ILX.Q W01G On0 1COp0|25e4","Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3","Pacific/Palau|LMT +09|-8V.U -90|01|-2M0UV.U|21e3","Pacific/Pitcairn|LMT -0830 -08|8E.k 8u 80|012|-2M0Dj.E 3UVXN.E|56","Pacific/Pohnpei|LMT +11|-aw.Q -b0|01|-2M0Ww.Q|34e3","Pacific/Port_Moresby|LMT PMMT +10|-9M.E -9M.w -a0|012|-3D8VM.E AvA0.8|25e4","Pacific/Rarotonga|LMT -1030 -0930 -10|aD.4 au 9u a0|0123232323232323232323232323|-2M0Bk.U 39zzO.U IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3","Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4","Pacific/Tarawa|LMT +12|-bw.4 -c0|01|-2M0Xw.4|29e3","Pacific/Tongatapu|LMT +1220 +13 +14|-cj.k -ck -d0 -e0|01232323232|-2M10j.k 1BnXX.k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3","Pacific/Wake|LMT +12|-b6.s -c0|01|-2M0X6.s|16e3","Pacific/Wallis|LMT +12|-cf.k -c0|01|-2M10f.k|94","PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00"],"links":["Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|Atlantic/St_Helena","Africa/Cairo|Egypt","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|US/Alaska","America/Argentina/Buenos_Aires|America/Buenos_Aires","America/Argentina/Catamarca|America/Argentina/ComodRivadavia","America/Argentina/Catamarca|America/Catamarca","America/Argentina/Cordoba|America/Cordoba","America/Argentina/Cordoba|America/Rosario","America/Argentina/Jujuy|America/Jujuy","America/Argentina/Mendoza|America/Mendoza","America/Atikokan|America/Coral_Harbour","America/Chicago|US/Central","America/Curacao|America/Aruba","America/Curacao|America/Kralendijk","America/Curacao|America/Lower_Princes","America/Denver|America/Shiprock","America/Denver|Navajo","America/Denver|US/Mountain","America/Detroit|US/Michigan","America/Edmonton|Canada/Mountain","America/Fort_Wayne|America/Indiana/Indianapolis","America/Fort_Wayne|America/Indianapolis","America/Fort_Wayne|US/East-Indiana","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Indiana/Knox|America/Knox_IN","America/Indiana/Knox|US/Indiana-Starke","America/Jamaica|Jamaica","America/Kentucky/Louisville|America/Louisville","America/Los_Angeles|US/Pacific","America/Los_Angeles|US/Pacific-New","America/Manaus|Brazil/West","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|Mexico/General","America/New_York|US/Eastern","America/Noronha|Brazil/DeNoronha","America/Panama|America/Cayman","America/Phoenix|US/Arizona","America/Port_of_Spain|America/Anguilla","America/Port_of_Spain|America/Antigua","America/Port_of_Spain|America/Dominica","America/Port_of_Spain|America/Grenada","America/Port_of_Spain|America/Guadeloupe","America/Port_of_Spain|America/Marigot","America/Port_of_Spain|America/Montserrat","America/Port_of_Spain|America/St_Barthelemy","America/Port_of_Spain|America/St_Kitts","America/Port_of_Spain|America/St_Lucia","America/Port_of_Spain|America/St_Thomas","America/Port_of_Spain|America/St_Vincent","America/Port_of_Spain|America/Tortola","America/Port_of_Spain|America/Virgin","America/Regina|Canada/Saskatchewan","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Tijuana|America/Ensenada","America/Tijuana|America/Santa_Isabel","America/Tijuana|Mexico/BajaNorte","America/Toronto|America/Montreal","America/Toronto|Canada/Eastern","America/Vancouver|Canada/Pacific","America/Whitehorse|Canada/Yukon","America/Winnipeg|Canada/Central","Asia/Ashgabat|Asia/Ashkhabad","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Vientiane","Asia/Dhaka|Asia/Dacca","Asia/Dubai|Asia/Muscat","Asia/Ho_Chi_Minh|Asia/Saigon","Asia/Hong_Kong|Hongkong","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Macau|Asia/Macao","Asia/Makassar|Asia/Ujung_Pandang","Asia/Nicosia|Europe/Nicosia","Asia/Qatar|Asia/Bahrain","Asia/Rangoon|Asia/Yangon","Asia/Riyadh|Asia/Aden","Asia/Riyadh|Asia/Kuwait","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|PRC","Asia/Singapore|Singapore","Asia/Taipei|ROC","Asia/Tehran|Iran","Asia/Thimphu|Asia/Thimbu","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Urumqi|Asia/Kashgar","Atlantic/Faroe|Atlantic/Faeroe","Atlantic/Reykjavik|Iceland","Australia/Adelaide|Australia/South","Australia/Brisbane|Australia/Queensland","Australia/Broken_Hill|Australia/Yancowinna","Australia/Darwin|Australia/North","Australia/Hobart|Australia/Tasmania","Australia/Lord_Howe|Australia/LHI","Australia/Melbourne|Australia/Victoria","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/NSW","Etc/GMT-0|Etc/GMT","Etc/GMT-0|Etc/GMT+0","Etc/GMT-0|Etc/GMT0","Etc/GMT-0|Etc/Greenwich","Etc/GMT-0|GMT","Etc/GMT-0|GMT+0","Etc/GMT-0|GMT-0","Etc/GMT-0|GMT0","Etc/GMT-0|Greenwich","Etc/UCT|UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Belgrade|Europe/Ljubljana","Europe/Belgrade|Europe/Podgorica","Europe/Belgrade|Europe/Sarajevo","Europe/Belgrade|Europe/Skopje","Europe/Belgrade|Europe/Zagreb","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Helsinki|Europe/Mariehamn","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Portugal","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Oslo|Arctic/Longyearbyen","Europe/Oslo|Atlantic/Jan_Mayen","Europe/Prague|Europe/Bratislava","Europe/Rome|Europe/San_Marino","Europe/Rome|Europe/Vatican","Europe/Warsaw|Poland","Europe/Zurich|Europe/Busingen","Europe/Zurich|Europe/Vaduz","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Chuuk|Pacific/Truk","Pacific/Chuuk|Pacific/Yap","Pacific/Easter|Chile/EasterIsland","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kwajalein|Kwajalein","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pohnpei|Pacific/Ponape"]}')},8:(M,b,z)=>{(M.exports=z(5177)).tz.load(z(4360))},5177:function(M,b,z){var p,e,o;!function(O,n){"use strict";M.exports?M.exports=n(z(8708)):(e=[z(8708)],void 0===(o="function"==typeof(p=n)?p.apply(b,e):p)||(M.exports=o))}(0,(function(M){"use strict";var b,z={},p={},e={},o={};M&&"string"==typeof M.version||y("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var O=M.version.split("."),n=+O[0],a=+O[1];function t(M){return M>96?M-87:M>64?M-29:M-48}function d(M){var b=0,z=M.split("."),p=z[0],e=z[1]||"",o=1,O=0,n=1;for(45===M.charCodeAt(0)&&(b=1,n=-1);b3){var b=e[L(M)];if(b)return b;y("Moment Timezone found "+M+" from the Intl api, but did not have that data loaded.")}}catch(M){}var z,p,o,O=function(){var M,b,z,p=(new Date).getFullYear()-2,e=new i(new Date(p,0,1)),o=[e];for(z=1;z<48;z++)(b=new i(new Date(p,z,1))).offset!==e.offset&&(M=u(e,b),o.push(M),o.push(new i(new Date(M.at+6e4)))),e=b;for(z=0;z<4;z++)o.push(new i(new Date(p+z,0,1))),o.push(new i(new Date(p+z,6,1)));return o}(),n=O.length,a=l(O),t=[];for(p=0;p0?t[0].zone.name:void 0}function L(M){return(M||"").toLowerCase().replace(/\//g,"_")}function f(M){var b,p,o,O;for("string"==typeof M&&(M=[M]),b=0;b= 2.6.0. You are using Moment.js "+M.version+". See momentjs.com"),s.prototype={_set:function(M){this.name=M.name,this.abbrs=M.abbrs,this.untils=M.untils,this.offsets=M.offsets,this.population=M.population},_index:function(M){var b,z=+M,p=this.untils;for(b=0;bp&&X.moveInvalidForward&&(b=p),o= 2.9.0. You are using Moment.js "+M.version+"."),M.defaultZone=b?h(b):null,M};var k=M.momentProperties;return"[object Array]"===Object.prototype.toString.call(k)?(k.push("_z"),k.push("_a")):k&&(k._z=null),M}))},7246:function(M,b,z){!function(M){"use strict";M.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(M){return/^nm$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"vm":"VM":z?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(8708))},7901:function(M,b,z){!function(M){"use strict";var b=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},z={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},p=function(M){return function(p,e,o,O){var n=b(p),a=z[M][b(p)];return 2===n&&(a=a[e?0:1]),a.replace(/%d/i,p)}},e=["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-dz",{months:e,monthsShort:e,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:p("s"),ss:p("s"),m:p("m"),mm:p("m"),h:p("h"),hh:p("h"),d:p("d"),dd:p("d"),M:p("M"),MM:p("M"),y:p("y"),yy:p("y")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:0,doy:4}})}(z(8708))},7781:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})}(z(8708))},3229:function(M,b,z){!function(M){"use strict";var b={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},z=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},p={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},e=function(M){return function(b,e,o,O){var n=z(b),a=p[M][z(b)];return 2===n&&(a=a[e?0:1]),a.replace(/%d/i,b)}},o=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:e("s"),ss:e("s"),m:e("m"),mm:e("m"),h:e("h"),hh:e("h"),d:e("d"),dd:e("d"),M:e("M"),MM:e("M"),y:e("y"),yy:e("y")},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(8708))},7416:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(8708))},3388:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};M.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:0,doy:6}})}(z(8708))},6122:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(8708))},508:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},o=function(M){return function(b,z,o,O){var n=p(b),a=e[M][p(b)];return 2===n&&(a=a[z?0:1]),a.replace(/%d/i,b)}},O=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar",{months:O,monthsShort:O,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(8708))},8876:function(M,b,z){!function(M){"use strict";var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};M.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"bir neçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(M){return/^(gündüz|axşam)$/.test(M)},meridiem:function(M,b,z){return M<4?"gecə":M<12?"səhər":M<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(M){if(0===M)return M+"-ıncı";var z=M%10,p=M%100-z,e=M>=100?100:null;return M+(b[z]||b[p]||b[e])},week:{dow:1,doy:7}})}(z(8708))},7626:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвіліна":"хвіліну":"h"===p?z?"гадзіна":"гадзіну":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:z?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"}[p],+M)}M.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:z,mm:z,h:z,hh:z,d:"дзень",dd:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(M){return/^(дня|вечара)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночы":M<12?"раніцы":M<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M%10!=2&&M%10!=3||M%100==12||M%100==13?M+"-ы":M+"-і";case"D":return M+"-га";default:return M}},week:{dow:1,doy:7}})}(z(8708))},1607:function(M,b,z){!function(M){"use strict";M.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Миналата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Миналия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",w:"седмица",ww:"%d седмици",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(8708))},4843:function(M,b,z){!function(M){"use strict";M.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},calendar:{sameDay:"[Bi lɛrɛ] LT",nextDay:"[Sini lɛrɛ] LT",nextWeek:"dddd [don lɛrɛ] LT",lastDay:"[Kunu lɛrɛ] LT",lastWeek:"dddd [tɛmɛnen lɛrɛ] LT",sameElse:"L"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(z(8708))},1224:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn-bd",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b?M<4?M:M+12:"ভোর"===b||"সকাল"===b?M:"দুপুর"===b?M>=3?M:M+12:"বিকাল"===b||"সন্ধ্যা"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"রাত":M<6?"ভোর":M<12?"সকাল":M<15?"দুপুর":M<18?"বিকাল":M<20?"সন্ধ্যা":"রাত"},week:{dow:0,doy:6}})}(z(8708))},4208:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b&&M>=4||"দুপুর"===b&&M<5||"বিকাল"===b?M+12:M},meridiem:function(M,b,z){return M<4?"রাত":M<10?"সকাল":M<17?"দুপুর":M<20?"বিকাল":"রাত"},week:{dow:0,doy:6}})}(z(8708))},6901:function(M,b,z){!function(M){"use strict";var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},z={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};M.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12".split("_"),monthsShortRegex:/^(ཟླ་\d{1,2})/,monthsParseExact:!0,weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",ss:"%d སྐར་ཆ།",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(M){return M.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(M,b){return 12===M&&(M=0),"མཚན་མོ"===b&&M>=4||"ཉིན་གུང"===b&&M<5||"དགོང་དག"===b?M+12:M},meridiem:function(M,b,z){return M<4?"མཚན་མོ":M<10?"ཞོགས་ཀས":M<17?"ཉིན་གུང":M<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}(z(8708))},6149:function(M,b,z){!function(M){"use strict";function b(M,b,z){return M+" "+e({mm:"munutenn",MM:"miz",dd:"devezh"}[z],M)}function z(M){switch(p(M)){case 1:case 3:case 4:case 5:case 9:return M+" bloaz";default:return M+" vloaz"}}function p(M){return M>9?p(M%10):M}function e(M,b){return 2===b?o(M):M}function o(M){var b={m:"v",b:"v",d:"z"};return void 0===b[M.charAt(0)]?M:b[M.charAt(0)]+M.substring(1)}var O=[/^gen/i,/^c[ʼ\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],n=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,a=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,t=/^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,d=[/^sul/i,/^lun/i,/^meurzh/i,/^merc[ʼ\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],c=[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],A=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];M.defineLocale("br",{months:"Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:A,fullWeekdaysParse:d,shortWeekdaysParse:c,minWeekdaysParse:A,monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:a,monthsShortStrictRegex:t,monthsParse:O,longMonthsParse:O,shortMonthsParse:O,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warcʼhoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Decʼh da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s ʼzo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:z},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(M){return M+(1===M?"añ":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(M){return"g.m."===M},meridiem:function(M,b,z){return M<12?"a.m.":"g.m."}})}(z(8708))},4348:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},4206:function(M,b,z){!function(M){"use strict";M.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(8708))},5316:function(M,b,z){!function(M){"use strict";var b="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),z="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),p=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],e=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;function o(M){return M>1&&M<5&&1!=~~(M/10)}function O(M,b,z,p){var e=M+" ";switch(z){case"s":return b||p?"pár sekund":"pár sekundami";case"ss":return b||p?e+(o(M)?"sekundy":"sekund"):e+"sekundami";case"m":return b?"minuta":p?"minutu":"minutou";case"mm":return b||p?e+(o(M)?"minuty":"minut"):e+"minutami";case"h":return b?"hodina":p?"hodinu":"hodinou";case"hh":return b||p?e+(o(M)?"hodiny":"hodin"):e+"hodinami";case"d":return b||p?"den":"dnem";case"dd":return b||p?e+(o(M)?"dny":"dní"):e+"dny";case"M":return b||p?"měsíc":"měsícem";case"MM":return b||p?e+(o(M)?"měsíce":"měsíců"):e+"měsíci";case"y":return b||p?"rok":"rokem";case"yy":return b||p?e+(o(M)?"roky":"let"):e+"lety"}}M.defineLocale("cs",{months:b,monthsShort:z,monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:O,ss:O,m:O,mm:O,h:O,hh:O,d:O,dd:O,M:O,MM:O,y:O,yy:O},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},1105:function(M,b,z){!function(M){"use strict";M.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(M){return M+(/сехет$/i.exec(M)?"рен":/ҫул$/i.exec(M)?"тан":"ран")},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}})}(z(8708))},538:function(M,b,z){!function(M){"use strict";M.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(M){var b="";return M>20?b=40===M||50===M||60===M||80===M||100===M?"fed":"ain":M>0&&(b=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][M]),M+b},week:{dow:1,doy:4}})}(z(8708))},4337:function(M,b,z){!function(M){"use strict";M.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},2583:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},135:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},9219:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},9580:function(M,b,z){!function(M){"use strict";var b=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],z=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];M.defineLocale("dv",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(M){return"މފ"===M},meridiem:function(M,b,z){return M<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:7,doy:12}})}(z(8708))},6611:function(M,b,z){!function(M){"use strict";function b(M){return"undefined"!=typeof Function&&M instanceof Function||"[object Function]"===Object.prototype.toString.call(M)}M.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(M,b){return M?"string"==typeof b&&/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[M.month()]:this._monthsNominativeEl[M.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(M,b,z){return M>11?z?"μμ":"ΜΜ":z?"πμ":"ΠΜ"},isPM:function(M){return"μ"===(M+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(M,z){var p=this._calendarEl[M],e=z&&z.hours();return b(p)&&(p=p.apply(z)),p.replace("{}",e%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}(z(8708))},6576:function(M,b,z){!function(M){"use strict";M.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:4}})}(z(8708))},4877:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(8708))},6463:function(M,b,z){!function(M){"use strict";M.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},9121:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},5288:function(M,b,z){!function(M){"use strict";M.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(8708))},1465:function(M,b,z){!function(M){"use strict";M.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:6}})}(z(8708))},3153:function(M,b,z){!function(M){"use strict";M.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},3802:function(M,b,z){!function(M){"use strict";M.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},5250:function(M,b,z){!function(M){"use strict";M.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(M){return"p"===M.charAt(0).toLowerCase()},meridiem:function(M,b,z){return M>11?z?"p.t.m.":"P.T.M.":z?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(z(8708))},1736:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},3759:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:4},invalidDate:"Fecha inválida"})}(z(8708))},1475:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})}(z(8708))},8442:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4},invalidDate:"Fecha inválida"})}(z(8708))},5294:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[M+"sekundi",M+"sekundit"],m:["ühe minuti","üks minut"],mm:[M+" minuti",M+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[M+" tunni",M+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[M+" kuu",M+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[M+" aasta",M+" aastat"]};return b?e[z][2]?e[z][2]:e[z][1]:p?e[z][0]:e[z][1]}M.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},4466:function(M,b,z){!function(M){"use strict";M.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},6980:function(M,b,z){!function(M){"use strict";var b={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},z={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};M.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(M){return/بعد از ظهر/.test(M)},meridiem:function(M,b,z){return M<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"%d ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(M){return M.replace(/[۰-۹]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})}(z(8708))},2192:function(M,b,z){!function(M){"use strict";var b="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),z=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",b[7],b[8],b[9]];function p(M,b,z,p){var o="";switch(z){case"s":return p?"muutaman sekunnin":"muutama sekunti";case"ss":o=p?"sekunnin":"sekuntia";break;case"m":return p?"minuutin":"minuutti";case"mm":o=p?"minuutin":"minuuttia";break;case"h":return p?"tunnin":"tunti";case"hh":o=p?"tunnin":"tuntia";break;case"d":return p?"päivän":"päivä";case"dd":o=p?"päivän":"päivää";break;case"M":return p?"kuukauden":"kuukausi";case"MM":o=p?"kuukauden":"kuukautta";break;case"y":return p?"vuoden":"vuosi";case"yy":o=p?"vuoden":"vuotta"}return o=e(M,p)+" "+o}function e(M,p){return M<10?p?z[M]:b[M]:M}M.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},9166:function(M,b,z){!function(M){"use strict";M.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(8708))},7696:function(M,b,z){!function(M){"use strict";M.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},7916:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}}})}(z(8708))},8298:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(8708))},241:function(M,b,z){!function(M){"use strict";var b=/^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,z=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,p=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,e=[/^janv/i,/^févr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^août/i,/^sept/i,/^oct/i,/^nov/i,/^déc/i];M.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsRegex:p,monthsShortRegex:p,monthsStrictRegex:b,monthsShortStrictRegex:z,monthsParse:e,longMonthsParse:e,shortMonthsParse:e,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(M,b){switch(b){case"D":return M+(1===M?"er":"");default:case"M":case"Q":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(8708))},8224:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),z="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");M.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(8708))},6120:function(M,b,z){!function(M){"use strict";var b=["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],z=["Ean","Feabh","Márt","Aib","Beal","Meith","Iúil","Lún","M.F.","D.F.","Samh","Noll"],p=["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],e=["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],o=["Do","Lu","Má","Cé","Dé","A","Sa"];M.defineLocale("ga",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:e,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Amárach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inné ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",ss:"%d soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d míonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(8708))},8698:function(M,b,z){!function(M){"use strict";var b=["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],z=["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],p=["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],e=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],o=["Dò","Lu","Mà","Ci","Ar","Ha","Sa"];M.defineLocale("gd",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:e,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(8708))},3906:function(M,b,z){!function(M){"use strict";M.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(M){return 0===M.indexOf("un")?"n"+M:"en "+M},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},2409:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["थोडया सॅकंडांनी","थोडे सॅकंड"],ss:[M+" सॅकंडांनी",M+" सॅकंड"],m:["एका मिणटान","एक मिनूट"],mm:[M+" मिणटांनी",M+" मिणटां"],h:["एका वरान","एक वर"],hh:[M+" वरांनी",M+" वरां"],d:["एका दिसान","एक दीस"],dd:[M+" दिसांनी",M+" दीस"],M:["एका म्हयन्यान","एक म्हयनो"],MM:[M+" म्हयन्यानी",M+" म्हयने"],y:["एका वर्सान","एक वर्स"],yy:[M+" वर्सांनी",M+" वर्सां"]};return p?e[z][0]:e[z][1]}M.defineLocale("gom-deva",{months:{standalone:"जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),format:"जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार".split("_"),weekdaysShort:"आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.".split("_"),weekdaysMin:"आ_सो_मं_बु_ब्रे_सु_शे".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [वाजतां]",LTS:"A h:mm:ss [वाजतां]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [वाजतां]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [वाजतां]",llll:"ddd, D MMM YYYY, A h:mm [वाजतां]"},calendar:{sameDay:"[आयज] LT",nextDay:"[फाल्यां] LT",nextWeek:"[फुडलो] dddd[,] LT",lastDay:"[काल] LT",lastWeek:"[फाटलो] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s आदीं",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(वेर)/,ordinal:function(M,b){switch(b){case"D":return M+"वेर";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return M}},week:{dow:0,doy:3},meridiemParse:/राती|सकाळीं|दनपारां|सांजे/,meridiemHour:function(M,b){return 12===M&&(M=0),"राती"===b?M<4?M:M+12:"सकाळीं"===b?M:"दनपारां"===b?M>12?M:M+12:"सांजे"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"राती":M<12?"सकाळीं":M<16?"दनपारां":M<20?"सांजे":"राती"}})}(z(8708))},6723:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["thoddea sekondamni","thodde sekond"],ss:[M+" sekondamni",M+" sekond"],m:["eka mintan","ek minut"],mm:[M+" mintamni",M+" mintam"],h:["eka voran","ek vor"],hh:[M+" voramni",M+" voram"],d:["eka disan","ek dis"],dd:[M+" disamni",M+" dis"],M:["eka mhoinean","ek mhoino"],MM:[M+" mhoineamni",M+" mhoine"],y:["eka vorsan","ek voros"],yy:[M+" vorsamni",M+" vorsam"]};return p?e[z][0]:e[z][1]}M.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(M,b){switch(b){case"D":return M+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return M}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(M,b){return 12===M&&(M=0),"rati"===b?M<4?M:M+12:"sokallim"===b?M:"donparam"===b?M>12?M:M+12:"sanje"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"rati":M<12?"sokallim":M<16?"donparam":M<20?"sanje":"rati"}})}(z(8708))},3869:function(M,b,z){!function(M){"use strict";var b={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},z={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};M.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),longDateFormat:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},calendar:{sameDay:"[આજ] LT",nextDay:"[કાલે] LT",nextWeek:"dddd, LT",lastDay:"[ગઇકાલે] LT",lastWeek:"[પાછલા] dddd, LT",sameElse:"L"},relativeTime:{future:"%s મા",past:"%s પહેલા",s:"અમુક પળો",ss:"%d સેકંડ",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"},preparse:function(M){return M.replace(/[૧૨૩૪૫૬૭૮૯૦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/રાત|બપોર|સવાર|સાંજ/,meridiemHour:function(M,b){return 12===M&&(M=0),"રાત"===b?M<4?M:M+12:"સવાર"===b?M:"બપોર"===b?M>=10?M:M+12:"સાંજ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"રાત":M<10?"સવાર":M<17?"બપોર":M<20?"સાંજ":"રાત"},week:{dow:0,doy:6}})}(z(8708))},564:function(M,b,z){!function(M){"use strict";M.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(M){return 2===M?"שעתיים":M+" שעות"},d:"יום",dd:function(M){return 2===M?"יומיים":M+" ימים"},M:"חודש",MM:function(M){return 2===M?"חודשיים":M+" חודשים"},y:"שנה",yy:function(M){return 2===M?"שנתיים":M%10==0&&10!==M?M+" שנה":M+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(M){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(M)},meridiem:function(M,b,z){return M<5?"לפנות בוקר":M<10?"בבוקר":M<12?z?'לפנה"צ':"לפני הצהריים":M<18?z?'אחה"צ':"אחרי הצהריים":"בערב"}})}(z(8708))},3776:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},p=[/^जन/i,/^फ़र|फर/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सितं|सित/i,/^अक्टू/i,/^नव|नवं/i,/^दिसं|दिस/i],e=[/^जन/i,/^फ़र/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सित/i,/^अक्टू/i,/^नव/i,/^दिस/i];M.defineLocale("hi",{months:{format:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),standalone:"जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर".split("_")},monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},monthsParse:p,longMonthsParse:p,shortMonthsParse:e,monthsRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsShortRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsStrictRegex:/^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,monthsShortStrictRegex:/^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(M,b){return 12===M&&(M=0),"रात"===b?M<4?M:M+12:"सुबह"===b?M:"दोपहर"===b?M>=10?M:M+12:"शाम"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"रात":M<10?"सुबह":M<17?"दोपहर":M<20?"शाम":"रात"},week:{dow:0,doy:6}})}(z(8708))},3315:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:return"[prošlu] [nedjelju] [u] LT";case 3:return"[prošlu] [srijedu] [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},5887:function(M,b,z){!function(M){"use strict";var b="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function z(M,b,z,p){var e=M;switch(z){case"s":return p||b?"néhány másodperc":"néhány másodperce";case"ss":return e+(p||b)?" másodperc":" másodperce";case"m":return"egy"+(p||b?" perc":" perce");case"mm":return e+(p||b?" perc":" perce");case"h":return"egy"+(p||b?" óra":" órája");case"hh":return e+(p||b?" óra":" órája");case"d":return"egy"+(p||b?" nap":" napja");case"dd":return e+(p||b?" nap":" napja");case"M":return"egy"+(p||b?" hónap":" hónapja");case"MM":return e+(p||b?" hónap":" hónapja");case"y":return"egy"+(p||b?" év":" éve");case"yy":return e+(p||b?" év":" éve")}return""}function p(M){return(M?"":"[múlt] ")+"["+b[this.day()]+"] LT[-kor]"}M.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(M){return"u"===M.charAt(1).toLowerCase()},meridiem:function(M,b,z){return M<12?!0===z?"de":"DE":!0===z?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return p.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return p.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:z,ss:z,m:z,mm:z,h:z,hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},7199:function(M,b,z){!function(M){"use strict";M.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",ss:"%d վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(M){return/^(ցերեկվա|երեկոյան)$/.test(M)},meridiem:function(M){return M<4?"գիշերվա":M<12?"առավոտվա":M<17?"ցերեկվա":"երեկոյան"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(M,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===M?M+"-ին":M+"-րդ";default:return M}},week:{dow:1,doy:7}})}(z(8708))},440:function(M,b,z){!function(M){"use strict";M.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"siang"===b?M>=11?M:M+12:"sore"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"siang":M<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(z(8708))},5046:function(M,b,z){!function(M){"use strict";function b(M){return M%100==11||M%10!=1}function z(M,z,p,e){var o=M+" ";switch(p){case"s":return z||e?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return b(M)?o+(z||e?"sekúndur":"sekúndum"):o+"sekúnda";case"m":return z?"mínúta":"mínútu";case"mm":return b(M)?o+(z||e?"mínútur":"mínútum"):z?o+"mínúta":o+"mínútu";case"hh":return b(M)?o+(z||e?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return z?"dagur":e?"dag":"degi";case"dd":return b(M)?z?o+"dagar":o+(e?"daga":"dögum"):z?o+"dagur":o+(e?"dag":"degi");case"M":return z?"mánuður":e?"mánuð":"mánuði";case"MM":return b(M)?z?o+"mánuðir":o+(e?"mánuði":"mánuðum"):z?o+"mánuður":o+(e?"mánuð":"mánuði");case"y":return z||e?"ár":"ári";case"yy":return b(M)?o+(z||e?"ár":"árum"):o+(z||e?"ár":"ári")}}M.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:z,ss:z,m:z,mm:z,h:"klukkustund",hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},4939:function(M,b,z){!function(M){"use strict";M.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(M){return(/^[0-9].+$/.test(M)?"tra":"in")+" "+M},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},4347:function(M,b,z){!function(M){"use strict";M.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},2438:function(M,b,z){!function(M){"use strict";M.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"令和",narrow:"㋿",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"平成",narrow:"㍻",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"昭和",narrow:"㍼",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"大正",narrow:"㍽",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"明治",narrow:"㍾",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"西暦",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"紀元前",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(元|\d+)年/,eraYearOrdinalParse:function(M,b){return"元"===b[1]?1:parseInt(b[1]||M,10)},months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(M){return"午後"===M},meridiem:function(M,b,z){return M<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(M){return M.week()!==this.week()?"[来週]dddd LT":"dddd LT"},lastDay:"[昨日] LT",lastWeek:function(M){return this.week()!==M.week()?"[先週]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}日/,ordinal:function(M,b){switch(b){case"y":return 1===M?"元年":M+"年";case"d":case"D":case"DDD":return M+"日";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",ss:"%d秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})}(z(8708))},3781:function(M,b,z){!function(M){"use strict";M.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(M,b){return 12===M&&(M=0),"enjing"===b?M:"siyang"===b?M>=11?M:M+12:"sonten"===b||"ndalu"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"enjing":M<15?"siyang":M<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(z(8708))},4707:function(M,b,z){!function(M){"use strict";M.defineLocale("ka",{months:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(M){return M.replace(/(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,(function(M,b,z){return"ი"===z?b+"ში":b+z+"ში"}))},past:function(M){return/(წამი|წუთი|საათი|დღე|თვე)/.test(M)?M.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(M)?M.replace(/წელი$/,"წლის წინ"):M},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(M){return 0===M?M:1===M?M+"-ლი":M<20||M<=100&&M%20==0||M%100==0?"მე-"+M:M+"-ე"},week:{dow:1,doy:7}})}(z(8708))},5521:function(M,b,z){!function(M){"use strict";var b={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};M.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(8708))},3025:function(M,b,z){!function(M){"use strict";var b={1:"១",2:"២",3:"៣",4:"៤",5:"៥",6:"៦",7:"៧",8:"៨",9:"៩",0:"០"},z={"១":"1","២":"2","៣":"3","៤":"4","៥":"5","៦":"6","៧":"7","៨":"8","៩":"9","០":"0"};M.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ព្រឹក|ល្ងាច/,isPM:function(M){return"ល្ងាច"===M},meridiem:function(M,b,z){return M<12?"ព្រឹក":"ល្ងាច"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",ss:"%d វិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},dayOfMonthOrdinalParse:/ទី\d{1,2}/,ordinal:"ទី%d",preparse:function(M){return M.replace(/[១២៣៤៥៦៧៨៩០]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(8708))},3621:function(M,b,z){!function(M){"use strict";var b={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},z={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"};M.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(M){return M.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ರಾತ್ರಿ"===b?M<4?M:M+12:"ಬೆಳಿಗ್ಗೆ"===b?M:"ಮಧ್ಯಾಹ್ನ"===b?M>=10?M:M+12:"ಸಂಜೆ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ರಾತ್ರಿ":M<10?"ಬೆಳಿಗ್ಗೆ":M<17?"ಮಧ್ಯಾಹ್ನ":M<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(M){return M+"ನೇ"},week:{dow:0,doy:6}})}(z(8708))},2387:function(M,b,z){!function(M){"use strict";M.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"일";case"M":return M+"월";case"w":case"W":return M+"주";default:return M}},meridiemParse:/오전|오후/,isPM:function(M){return"오후"===M},meridiem:function(M,b,z){return M<12?"오전":"오후"}})}(z(8708))},8870:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمموز","ئاب","ئەیلوول","تشرینی یەكەم","تشرینی دووەم","كانونی یەکەم"];M.defineLocale("ku",{months:p,monthsShort:p,weekdays:"یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌".split("_"),weekdaysShort:"یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌".split("_"),weekdaysMin:"ی_د_س_چ_پ_ه_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ئێواره‌|به‌یانی/,isPM:function(M){return/ئێواره‌/.test(M)},meridiem:function(M,b,z){return M<12?"به‌یانی":"ئێواره‌"},calendar:{sameDay:"[ئه‌مرۆ كاتژمێر] LT",nextDay:"[به‌یانی كاتژمێر] LT",nextWeek:"dddd [كاتژمێر] LT",lastDay:"[دوێنێ كاتژمێر] LT",lastWeek:"dddd [كاتژمێر] LT",sameElse:"L"},relativeTime:{future:"له‌ %s",past:"%s",s:"چه‌ند چركه‌یه‌ك",ss:"چركه‌ %d",m:"یه‌ك خوله‌ك",mm:"%d خوله‌ك",h:"یه‌ك كاتژمێر",hh:"%d كاتژمێر",d:"یه‌ك ڕۆژ",dd:"%d ڕۆژ",M:"یه‌ك مانگ",MM:"%d مانگ",y:"یه‌ك ساڵ",yy:"%d ساڵ"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(8708))},809:function(M,b,z){!function(M){"use strict";var b={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};M.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кечээ саат] LT",lastWeek:"[Өткөн аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",ss:"%d секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(8708))},7162:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?e[z][0]:e[z][1]}function z(M){return e(M.substr(0,M.indexOf(" ")))?"a "+M:"an "+M}function p(M){return e(M.substr(0,M.indexOf(" ")))?"viru "+M:"virun "+M}function e(M){if(M=parseInt(M,10),isNaN(M))return!1;if(M<0)return!0;if(M<10)return 4<=M&&M<=7;if(M<100){var b=M%10;return e(0===b?M/10:b)}if(M<1e4){for(;M>=10;)M/=10;return e(M)}return e(M/=1e3)}M.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:z,past:p,s:"e puer Sekonnen",ss:"%d Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},2445:function(M,b,z){!function(M){"use strict";M.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(M){return"ຕອນແລງ"===M},meridiem:function(M,b,z){return M<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",ss:"%d ວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},dayOfMonthOrdinalParse:/(ທີ່)\d{1,2}/,ordinal:function(M){return"ທີ່"+M}})}(z(8708))},3335:function(M,b,z){!function(M){"use strict";var b={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function z(M,b,z,p){return b?"kelios sekundės":p?"kelių sekundžių":"kelias sekundes"}function p(M,b,z,p){return b?o(z)[0]:p?o(z)[1]:o(z)[2]}function e(M){return M%10==0||M>10&&M<20}function o(M){return b[M].split("_")}function O(M,b,z,O){var n=M+" ";return 1===M?n+p(M,b,z[0],O):b?n+(e(M)?o(z)[1]:o(z)[0]):O?n+o(z)[1]:n+(e(M)?o(z)[1]:o(z)[2])}M.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:z,ss:O,m:p,mm:O,h:p,hh:O,d:p,dd:O,M:p,MM:O,y:p,yy:O},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(M){return M+"-oji"},week:{dow:1,doy:4}})}(z(8708))},1992:function(M,b,z){!function(M){"use strict";var b={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function z(M,b,z){return z?b%10==1&&b%100!=11?M[2]:M[3]:b%10==1&&b%100!=11?M[0]:M[1]}function p(M,p,e){return M+" "+z(b[e],M,p)}function e(M,p,e){return z(b[e],M,p)}function o(M,b){return b?"dažas sekundes":"dažām sekundēm"}M.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:o,ss:p,m:e,mm:p,h:e,hh:p,d:e,dd:p,M:e,MM:p,y:e,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},8206:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mjesec",MM:b.translate,y:"godinu",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},4310:function(M,b,z){!function(M){"use strict";M.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},12:function(M,b,z){!function(M){"use strict";M.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"за %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"една минута",mm:"%d минути",h:"еден час",hh:"%d часа",d:"еден ден",dd:"%d дена",M:"еден месец",MM:"%d месеци",y:"една година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(8708))},5895:function(M,b,z){!function(M){"use strict";M.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(M,b){return 12===M&&(M=0),"രാത്രി"===b&&M>=4||"ഉച്ച കഴിഞ്ഞ്"===b||"വൈകുന്നേരം"===b?M+12:M},meridiem:function(M,b,z){return M<4?"രാത്രി":M<12?"രാവിലെ":M<17?"ഉച്ച കഴിഞ്ഞ്":M<20?"വൈകുന്നേരം":"രാത്രി"}})}(z(8708))},6350:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){switch(z){case"s":return b?"хэдхэн секунд":"хэдхэн секундын";case"ss":return M+(b?" секунд":" секундын");case"m":case"mm":return M+(b?" минут":" минутын");case"h":case"hh":return M+(b?" цаг":" цагийн");case"d":case"dd":return M+(b?" өдөр":" өдрийн");case"M":case"MM":return M+(b?" сар":" сарын");case"y":case"yy":return M+(b?" жил":" жилийн");default:return M}}M.defineLocale("mn",{months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),monthsParseExact:!0,weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},meridiemParse:/ҮӨ|ҮХ/i,isPM:function(M){return"ҮХ"===M},meridiem:function(M,b,z){return M<12?"ҮӨ":"ҮХ"},calendar:{sameDay:"[Өнөөдөр] LT",nextDay:"[Маргааш] LT",nextWeek:"[Ирэх] dddd LT",lastDay:"[Өчигдөр] LT",lastWeek:"[Өнгөрсөн] dddd LT",sameElse:"L"},relativeTime:{future:"%s дараа",past:"%s өмнө",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2} өдөр/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+" өдөр";default:return M}}})}(z(8708))},3644:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function p(M,b,z,p){var e="";if(b)switch(z){case"s":e="काही सेकंद";break;case"ss":e="%d सेकंद";break;case"m":e="एक मिनिट";break;case"mm":e="%d मिनिटे";break;case"h":e="एक तास";break;case"hh":e="%d तास";break;case"d":e="एक दिवस";break;case"dd":e="%d दिवस";break;case"M":e="एक महिना";break;case"MM":e="%d महिने";break;case"y":e="एक वर्ष";break;case"yy":e="%d वर्षे"}else switch(z){case"s":e="काही सेकंदां";break;case"ss":e="%d सेकंदां";break;case"m":e="एका मिनिटा";break;case"mm":e="%d मिनिटां";break;case"h":e="एका तासा";break;case"hh":e="%d तासां";break;case"d":e="एका दिवसा";break;case"dd":e="%d दिवसां";break;case"M":e="एका महिन्या";break;case"MM":e="%d महिन्यां";break;case"y":e="एका वर्षा";break;case"yy":e="%d वर्षां"}return e.replace(/%d/i,M)}M.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,meridiemHour:function(M,b){return 12===M&&(M=0),"पहाटे"===b||"सकाळी"===b?M:"दुपारी"===b||"सायंकाळी"===b||"रात्री"===b?M>=12?M:M+12:void 0},meridiem:function(M,b,z){return M>=0&&M<6?"पहाटे":M<12?"सकाळी":M<17?"दुपारी":M<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}(z(8708))},1e3:function(M,b,z){!function(M){"use strict";M.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(8708))},7405:function(M,b,z){!function(M){"use strict";M.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(8708))},1132:function(M,b,z){!function(M){"use strict";M.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},2113:function(M,b,z){!function(M){"use strict";var b={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},z={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};M.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(M){return M.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(8708))},2657:function(M,b,z){!function(M){"use strict";M.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},1249:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};M.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(M,b){return 12===M&&(M=0),"राति"===b?M<4?M:M+12:"बिहान"===b?M:"दिउँसो"===b?M>=10?M:M+12:"साँझ"===b?M+12:void 0},meridiem:function(M,b,z){return M<3?"राति":M<12?"बिहान":M<16?"दिउँसो":M<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}})}(z(8708))},7934:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(8708))},7375:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",w:"één week",ww:"%d weken",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(8708))},2293:function(M,b,z){!function(M){"use strict";M.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._må._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_må_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},6804:function(M,b,z){!function(M){"use strict";M.defineLocale("oc-lnc",{months:{standalone:"genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre".split("_"),format:"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[uèi a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[ièr a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(8708))},7159:function(M,b,z){!function(M){"use strict";var b={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},z={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};M.defineLocale("pa-in",{months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"[ਅਗਲਾ] dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",ss:"%d ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(M){return M.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ਰਾਤ"===b?M<4?M:M+12:"ਸਵੇਰ"===b?M:"ਦੁਪਹਿਰ"===b?M>=10?M:M+12:"ਸ਼ਾਮ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ਰਾਤ":M<10?"ਸਵੇਰ":M<17?"ਦੁਪਹਿਰ":M<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,doy:6}})}(z(8708))},5661:function(M,b,z){!function(M){"use strict";var b="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),z="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),p=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^paź/i,/^lis/i,/^gru/i];function e(M){return M%10<5&&M%10>1&&~~(M/10)%10!=1}function o(M,b,z){var p=M+" ";switch(z){case"ss":return p+(e(M)?"sekundy":"sekund");case"m":return b?"minuta":"minutę";case"mm":return p+(e(M)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return p+(e(M)?"godziny":"godzin");case"ww":return p+(e(M)?"tygodnie":"tygodni");case"MM":return p+(e(M)?"miesiące":"miesięcy");case"yy":return p+(e(M)?"lata":"lat")}}M.defineLocale("pl",{months:function(M,p){return M?/D MMMM/.test(p)?z[M.month()]:b[M.month()]:b},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:o,m:o,mm:o,h:o,hh:o,d:"1 dzień",dd:"%d dni",w:"tydzień",ww:o,M:"miesiąc",MM:o,y:"rok",yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},9343:function(M,b,z){!function(M){"use strict";M.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"do_2ª_3ª_4ª_5ª_6ª_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",invalidDate:"Data inválida"})}(z(8708))},930:function(M,b,z){!function(M){"use strict";M.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(8708))},875:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=" ";return(M%100>=20||M>=100&&M%100==0)&&(p=" de "),M+p+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"săptămâni",MM:"luni",yy:"ani"}[z]}M.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:b,m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,w:"o săptămână",ww:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}(z(8708))},3811:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"минута":"минуту":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",ww:"неделя_недели_недель",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[p],+M)}var p=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];M.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:z,m:z,mm:z,h:"час",hh:z,d:"день",dd:z,w:"неделя",ww:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(M){return/^(дня|вечера)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночи":M<12?"утра":M<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":return M+"-й";case"D":return M+"-го";case"w":case"W":return M+"-я";default:return M}},week:{dow:1,doy:4}})}(z(8708))},9883:function(M,b,z){!function(M){"use strict";var b=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],z=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"];M.defineLocale("sd",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(8708))},4959:function(M,b,z){!function(M){"use strict";M.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},4938:function(M,b,z){!function(M){"use strict";M.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",ss:"තත්පර %d",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},dayOfMonthOrdinalParse:/\d{1,2} වැනි/,ordinal:function(M){return M+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(M){return"ප.ව."===M||"පස් වරු"===M},meridiem:function(M,b,z){return M>11?z?"ප.ව.":"පස් වරු":z?"පෙ.ව.":"පෙර වරු"}})}(z(8708))},3606:function(M,b,z){!function(M){"use strict";var b="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),z="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function p(M){return M>1&&M<5}function e(M,b,z,e){var o=M+" ";switch(z){case"s":return b||e?"pár sekúnd":"pár sekundami";case"ss":return b||e?o+(p(M)?"sekundy":"sekúnd"):o+"sekundami";case"m":return b?"minúta":e?"minútu":"minútou";case"mm":return b||e?o+(p(M)?"minúty":"minút"):o+"minútami";case"h":return b?"hodina":e?"hodinu":"hodinou";case"hh":return b||e?o+(p(M)?"hodiny":"hodín"):o+"hodinami";case"d":return b||e?"deň":"dňom";case"dd":return b||e?o+(p(M)?"dni":"dní"):o+"dňami";case"M":return b||e?"mesiac":"mesiacom";case"MM":return b||e?o+(p(M)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return b||e?"rok":"rokom";case"yy":return b||e?o+(p(M)?"roky":"rokov"):o+"rokmi"}}M.defineLocale("sk",{months:b,monthsShort:z,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},3168:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e=M+" ";switch(z){case"s":return b||p?"nekaj sekund":"nekaj sekundami";case"ss":return e+=1===M?b?"sekundo":"sekundi":2===M?b||p?"sekundi":"sekundah":M<5?b||p?"sekunde":"sekundah":"sekund";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===M?b?"minuta":"minuto":2===M?b||p?"minuti":"minutama":M<5?b||p?"minute":"minutami":b||p?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===M?b?"ura":"uro":2===M?b||p?"uri":"urama":M<5?b||p?"ure":"urami":b||p?"ur":"urami";case"d":return b||p?"en dan":"enim dnem";case"dd":return e+=1===M?b||p?"dan":"dnem":2===M?b||p?"dni":"dnevoma":b||p?"dni":"dnevi";case"M":return b||p?"en mesec":"enim mesecem";case"MM":return e+=1===M?b||p?"mesec":"mesecem":2===M?b||p?"meseca":"mesecema":M<5?b||p?"mesece":"meseci":b||p?"mesecev":"meseci";case"y":return b||p?"eno leto":"enim letom";case"yy":return e+=1===M?b||p?"leto":"letom":2===M?b||p?"leti":"letoma":M<5?b||p?"leta":"leti":b||p?"let":"leti"}}M.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},624:function(M,b,z){!function(M){"use strict";M.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(M){return"M"===M.charAt(0)},meridiem:function(M,b,z){return M<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},4805:function(M,b,z){!function(M){"use strict";var b={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"месец",MM:b.translate,y:"годину",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},4175:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(8708))},2412:function(M,b,z){!function(M){"use strict";M.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(M,b,z){return M<11?"ekuseni":M<15?"emini":M<19?"entsambama":"ebusuku"},meridiemHour:function(M,b){return 12===M&&(M=0),"ekuseni"===b?M:"emini"===b?M>=11?M:M+12:"entsambama"===b||"ebusuku"===b?0===M?0:M+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(z(8708))},8609:function(M,b,z){!function(M){"use strict";M.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?":e":1===b||2===b?":a":":e")},week:{dow:1,doy:4}})}(z(8708))},9575:function(M,b,z){!function(M){"use strict";M.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(z(8708))},1993:function(M,b,z){!function(M){"use strict";var b={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},z={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};M.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(M){return M+"வது"},preparse:function(M){return M.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(M,b,z){return M<2?" யாமம்":M<6?" வைகறை":M<10?" காலை":M<14?" நண்பகல்":M<18?" எற்பாடு":M<22?" மாலை":" யாமம்"},meridiemHour:function(M,b){return 12===M&&(M=0),"யாமம்"===b?M<2?M:M+12:"வைகறை"===b||"காலை"===b||"நண்பகல்"===b&&M>=10?M:M+12},week:{dow:0,doy:6}})}(z(8708))},2008:function(M,b,z){!function(M){"use strict";M.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(M,b){return 12===M&&(M=0),"రాత్రి"===b?M<4?M:M+12:"ఉదయం"===b?M:"మధ్యాహ్నం"===b?M>=10?M:M+12:"సాయంత్రం"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"రాత్రి":M<10?"ఉదయం":M<17?"మధ్యాహ్నం":M<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}})}(z(8708))},5583:function(M,b,z){!function(M){"use strict";M.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},5929:function(M,b,z){!function(M){"use strict";var b={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};M.defineLocale("tg",{months:{format:"январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри".split("_"),standalone:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_")},monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Фардо соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(M,b){return 12===M&&(M=0),"шаб"===b?M<4?M:M+12:"субҳ"===b?M:"рӯз"===b?M>=11?M:M+12:"бегоҳ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"шаб":M<11?"субҳ":M<16?"рӯз":M<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(8708))},9728:function(M,b,z){!function(M){"use strict";M.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(M){return"หลังเที่ยง"===M},meridiem:function(M,b,z){return M<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",w:"1 สัปดาห์",ww:"%d สัปดาห์",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}(z(8708))},7122:function(M,b,z){!function(M){"use strict";var b={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'ünji",4:"'ünji",100:"'ünji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};M.defineLocale("tk",{months:"Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr".split("_"),monthsShort:"Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek".split("_"),weekdays:"Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe".split("_"),weekdaysShort:"Ýek_Duş_Siş_Çar_Pen_Ann_Şen".split("_"),weekdaysMin:"Ýk_Dş_Sş_Çr_Pn_An_Şn".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[düýn] LT",lastWeek:"[geçen] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s soň",past:"%s öň",s:"birnäçe sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir gün",dd:"%d gün",M:"bir aý",MM:"%d aý",y:"bir ýyl",yy:"%d ýyl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'unjy";var p=M%10,e=M%100-p,o=M>=100?100:null;return M+(b[p]||b[e]||b[o])}},week:{dow:1,doy:7}})}(z(8708))},6735:function(M,b,z){!function(M){"use strict";M.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(8708))},5956:function(M,b,z){!function(M){"use strict";var b="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function z(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"leS":-1!==M.indexOf("jar")?b.slice(0,-3)+"waQ":-1!==M.indexOf("DIS")?b.slice(0,-3)+"nem":b+" pIq"}function p(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"Hu’":-1!==M.indexOf("jar")?b.slice(0,-3)+"wen":-1!==M.indexOf("DIS")?b.slice(0,-3)+"ben":b+" ret"}function e(M,b,z,p){var e=o(M);switch(z){case"ss":return e+" lup";case"mm":return e+" tup";case"hh":return e+" rep";case"dd":return e+" jaj";case"MM":return e+" jar";case"yy":return e+" DIS"}}function o(M){var z=Math.floor(M%1e3/100),p=Math.floor(M%100/10),e=M%10,o="";return z>0&&(o+=b[z]+"vatlh"),p>0&&(o+=(""!==o?" ":"")+b[p]+"maH"),e>0&&(o+=(""!==o?" ":"")+b[e]),""===o?"pagh":o}M.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:z,past:p,s:"puS lup",ss:e,m:"wa’ tup",mm:e,h:"wa’ rep",hh:e,d:"wa’ jaj",dd:e,M:"wa’ jar",MM:e,y:"wa’ DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},3233:function(M,b,z){!function(M){"use strict";var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};M.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),meridiem:function(M,b,z){return M<12?z?"öö":"ÖÖ":z?"ös":"ÖS"},meridiemParse:/öö|ÖÖ|ös|ÖS/,isPM:function(M){return"ös"===M||"ÖS"===M},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'ıncı";var p=M%10,e=M%100-p,o=M>=100?100:null;return M+(b[p]||b[e]||b[o])}},week:{dow:1,doy:7}})}(z(8708))},7394:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["viensas secunds","'iensas secunds"],ss:[M+" secunds",M+" secunds"],m:["'n míut","'iens míut"],mm:[M+" míuts",M+" míuts"],h:["'n þora","'iensa þora"],hh:[M+" þoras",M+" þoras"],d:["'n ziua","'iensa ziua"],dd:[M+" ziuas",M+" ziuas"],M:["'n mes","'iens mes"],MM:[M+" mesen",M+" mesen"],y:["'n ar","'iens ar"],yy:[M+" ars",M+" ars"]};return p||b?e[z][0]:e[z][1]}M.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(M){return"d'o"===M.toLowerCase()},meridiem:function(M,b,z){return M>11?z?"d'o":"D'O":z?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(8708))},8324:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(z(8708))},6426:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",ss:"%d ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}(z(8708))},978:function(M,b,z){!function(M){"use strict";M.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(M,b){return 12===M&&(M=0),"يېرىم كېچە"===b||"سەھەر"===b||"چۈشتىن بۇرۇن"===b?M:"چۈشتىن كېيىن"===b||"كەچ"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"يېرىم كېچە":p<900?"سەھەر":p<1130?"چۈشتىن بۇرۇن":p<1230?"چۈش":p<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"-كۈنى";case"w":case"W":return M+"-ھەپتە";default:return M}},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:7}})}(z(8708))},8554:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвилина":"хвилину":"h"===p?z?"година":"годину":M+" "+b({ss:z?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:z?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:z?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"}[p],+M)}function p(M,b){var z={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};return!0===M?z.nominative.slice(1,7).concat(z.nominative.slice(0,1)):M?z[/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative"][M.day()]:z.nominative}function e(M){return function(){return M+"о"+(11===this.hours()?"б":"")+"] LT"}}M.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:p,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:e("[Сьогодні "),nextDay:e("[Завтра "),lastDay:e("[Вчора "),nextWeek:e("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[Минулої] dddd [").call(this);case 1:case 2:case 4:return e("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:z,m:z,mm:z,h:"годину",hh:z,d:"день",dd:z,M:"місяць",MM:z,y:"рік",yy:z},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(M){return/^(дня|вечора)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночі":M<12?"ранку":M<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M+"-й";case"D":return M+"-го";default:return M}},week:{dow:1,doy:7}})}(z(8708))},9482:function(M,b,z){!function(M){"use strict";var b=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],z=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];M.defineLocale("ur",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(8708))},2677:function(M,b,z){!function(M){"use strict";M.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(z(8708))},7534:function(M,b,z){!function(M){"use strict";M.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",ss:"%d фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}(z(8708))},9192:function(M,b,z){!function(M){"use strict";M.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(M){return/^ch$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"sa":"SA":z?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần trước lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",w:"một tuần",ww:"%d tuần",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(8708))},5884:function(M,b,z){!function(M){"use strict";M.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",ss:"%d s~écóñ~ds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(8708))},9335:function(M,b,z){!function(M){"use strict";M.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}})}(z(8708))},1018:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"下午"===b||"晚上"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(M){return M.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(M){return this.week()!==M.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"周";default:return M}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})}(z(8708))},8720:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1200?"上午":1200===p?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(8708))},6061:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-mo",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"D/M/YYYY",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(8708))},4225:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(8708))},1799:(M,b,z)=>{var p={"./af":7246,"./af.js":7246,"./ar":508,"./ar-dz":7901,"./ar-dz.js":7901,"./ar-kw":7781,"./ar-kw.js":7781,"./ar-ly":3229,"./ar-ly.js":3229,"./ar-ma":7416,"./ar-ma.js":7416,"./ar-sa":3388,"./ar-sa.js":3388,"./ar-tn":6122,"./ar-tn.js":6122,"./ar.js":508,"./az":8876,"./az.js":8876,"./be":7626,"./be.js":7626,"./bg":1607,"./bg.js":1607,"./bm":4843,"./bm.js":4843,"./bn":4208,"./bn-bd":1224,"./bn-bd.js":1224,"./bn.js":4208,"./bo":6901,"./bo.js":6901,"./br":6149,"./br.js":6149,"./bs":4348,"./bs.js":4348,"./ca":4206,"./ca.js":4206,"./cs":5316,"./cs.js":5316,"./cv":1105,"./cv.js":1105,"./cy":538,"./cy.js":538,"./da":4337,"./da.js":4337,"./de":9219,"./de-at":2583,"./de-at.js":2583,"./de-ch":135,"./de-ch.js":135,"./de.js":9219,"./dv":9580,"./dv.js":9580,"./el":6611,"./el.js":6611,"./en-au":6576,"./en-au.js":6576,"./en-ca":4877,"./en-ca.js":4877,"./en-gb":6463,"./en-gb.js":6463,"./en-ie":9121,"./en-ie.js":9121,"./en-il":5288,"./en-il.js":5288,"./en-in":1465,"./en-in.js":1465,"./en-nz":3153,"./en-nz.js":3153,"./en-sg":3802,"./en-sg.js":3802,"./eo":5250,"./eo.js":5250,"./es":8442,"./es-do":1736,"./es-do.js":1736,"./es-mx":3759,"./es-mx.js":3759,"./es-us":1475,"./es-us.js":1475,"./es.js":8442,"./et":5294,"./et.js":5294,"./eu":4466,"./eu.js":4466,"./fa":6980,"./fa.js":6980,"./fi":2192,"./fi.js":2192,"./fil":9166,"./fil.js":9166,"./fo":7696,"./fo.js":7696,"./fr":241,"./fr-ca":7916,"./fr-ca.js":7916,"./fr-ch":8298,"./fr-ch.js":8298,"./fr.js":241,"./fy":8224,"./fy.js":8224,"./ga":6120,"./ga.js":6120,"./gd":8698,"./gd.js":8698,"./gl":3906,"./gl.js":3906,"./gom-deva":2409,"./gom-deva.js":2409,"./gom-latn":6723,"./gom-latn.js":6723,"./gu":3869,"./gu.js":3869,"./he":564,"./he.js":564,"./hi":3776,"./hi.js":3776,"./hr":3315,"./hr.js":3315,"./hu":5887,"./hu.js":5887,"./hy-am":7199,"./hy-am.js":7199,"./id":440,"./id.js":440,"./is":5046,"./is.js":5046,"./it":4347,"./it-ch":4939,"./it-ch.js":4939,"./it.js":4347,"./ja":2438,"./ja.js":2438,"./jv":3781,"./jv.js":3781,"./ka":4707,"./ka.js":4707,"./kk":5521,"./kk.js":5521,"./km":3025,"./km.js":3025,"./kn":3621,"./kn.js":3621,"./ko":2387,"./ko.js":2387,"./ku":8870,"./ku.js":8870,"./ky":809,"./ky.js":809,"./lb":7162,"./lb.js":7162,"./lo":2445,"./lo.js":2445,"./lt":3335,"./lt.js":3335,"./lv":1992,"./lv.js":1992,"./me":8206,"./me.js":8206,"./mi":4310,"./mi.js":4310,"./mk":12,"./mk.js":12,"./ml":5895,"./ml.js":5895,"./mn":6350,"./mn.js":6350,"./mr":3644,"./mr.js":3644,"./ms":7405,"./ms-my":1e3,"./ms-my.js":1e3,"./ms.js":7405,"./mt":1132,"./mt.js":1132,"./my":2113,"./my.js":2113,"./nb":2657,"./nb.js":2657,"./ne":1249,"./ne.js":1249,"./nl":7375,"./nl-be":7934,"./nl-be.js":7934,"./nl.js":7375,"./nn":2293,"./nn.js":2293,"./oc-lnc":6804,"./oc-lnc.js":6804,"./pa-in":7159,"./pa-in.js":7159,"./pl":5661,"./pl.js":5661,"./pt":930,"./pt-br":9343,"./pt-br.js":9343,"./pt.js":930,"./ro":875,"./ro.js":875,"./ru":3811,"./ru.js":3811,"./sd":9883,"./sd.js":9883,"./se":4959,"./se.js":4959,"./si":4938,"./si.js":4938,"./sk":3606,"./sk.js":3606,"./sl":3168,"./sl.js":3168,"./sq":624,"./sq.js":624,"./sr":4175,"./sr-cyrl":4805,"./sr-cyrl.js":4805,"./sr.js":4175,"./ss":2412,"./ss.js":2412,"./sv":8609,"./sv.js":8609,"./sw":9575,"./sw.js":9575,"./ta":1993,"./ta.js":1993,"./te":2008,"./te.js":2008,"./tet":5583,"./tet.js":5583,"./tg":5929,"./tg.js":5929,"./th":9728,"./th.js":9728,"./tk":7122,"./tk.js":7122,"./tl-ph":6735,"./tl-ph.js":6735,"./tlh":5956,"./tlh.js":5956,"./tr":3233,"./tr.js":3233,"./tzl":7394,"./tzl.js":7394,"./tzm":6426,"./tzm-latn":8324,"./tzm-latn.js":8324,"./tzm.js":6426,"./ug-cn":978,"./ug-cn.js":978,"./uk":8554,"./uk.js":8554,"./ur":9482,"./ur.js":9482,"./uz":7534,"./uz-latn":2677,"./uz-latn.js":2677,"./uz.js":7534,"./vi":9192,"./vi.js":9192,"./x-pseudo":5884,"./x-pseudo.js":5884,"./yo":9335,"./yo.js":9335,"./zh-cn":1018,"./zh-cn.js":1018,"./zh-hk":8720,"./zh-hk.js":8720,"./zh-mo":6061,"./zh-mo.js":6061,"./zh-tw":4225,"./zh-tw.js":4225};function e(M){var b=o(M);return z(b)}function o(M){if(!z.o(p,M)){var b=new Error("Cannot find module '"+M+"'");throw b.code="MODULE_NOT_FOUND",b}return p[M]}e.keys=function(){return Object.keys(p)},e.resolve=o,M.exports=e,e.id=1799},8708:function(M,b,z){(M=z.nmd(M)).exports=function(){"use strict";var b,p;function e(){return b.apply(null,arguments)}function o(M){b=M}function O(M){return M instanceof Array||"[object Array]"===Object.prototype.toString.call(M)}function n(M){return null!=M&&"[object Object]"===Object.prototype.toString.call(M)}function a(M,b){return Object.prototype.hasOwnProperty.call(M,b)}function t(M){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(M).length;var b;for(b in M)if(a(M,b))return!1;return!0}function d(M){return void 0===M}function c(M){return"number"==typeof M||"[object Number]"===Object.prototype.toString.call(M)}function A(M){return M instanceof Date||"[object Date]"===Object.prototype.toString.call(M)}function r(M,b){var z,p=[];for(z=0;z>>0;for(b=0;b0)for(z=0;z=0?z?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+p}var v=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,S=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,F={},j={};function x(M,b,z,p){var e=p;"string"==typeof p&&(e=function(){return this[p]()}),M&&(j[M]=e),b&&(j[b[0]]=function(){return w(e.apply(this,arguments),b[1],b[2])}),z&&(j[z]=function(){return this.localeData().ordinal(e.apply(this,arguments),M)})}function E(M){return M.match(/\[[\s\S]/)?M.replace(/^\[|\]$/g,""):M.replace(/\\/g,"")}function P(M){var b,z,p=M.match(v);for(b=0,z=p.length;b=0&&S.test(M);)M=M.replace(S,p),S.lastIndex=0,z-=1;return M}var V={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function U(M){var b=this._longDateFormat[M],z=this._longDateFormat[M.toUpperCase()];return b||!z?b:(this._longDateFormat[M]=z.match(v).map((function(M){return"MMMM"===M||"MM"===M||"DD"===M||"dddd"===M?M.slice(1):M})).join(""),this._longDateFormat[M])}var J="Invalid date";function G(){return this._invalidDate}var K="%d",Q=/\d{1,2}/;function Z(M){return this._ordinal.replace("%d",M)}var $={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function MM(M,b,z,p){var e=this._relativeTime[z];return T(e)?e(M,b,z,p):e.replace(/%d/i,M)}function bM(M,b){var z=this._relativeTime[M>0?"future":"past"];return T(z)?z(b):z.replace(/%s/i,b)}var zM={};function pM(M,b){var z=M.toLowerCase();zM[z]=zM[z+"s"]=zM[b]=M}function eM(M){return"string"==typeof M?zM[M]||zM[M.toLowerCase()]:void 0}function oM(M){var b,z,p={};for(z in M)a(M,z)&&(b=eM(z))&&(p[b]=M[z]);return p}var OM={};function nM(M,b){OM[M]=b}function aM(M){var b,z=[];for(b in M)a(M,b)&&z.push({unit:b,priority:OM[b]});return z.sort((function(M,b){return M.priority-b.priority})),z}function tM(M){return M%4==0&&M%100!=0||M%400==0}function dM(M){return M<0?Math.ceil(M)||0:Math.floor(M)}function cM(M){var b=+M,z=0;return 0!==b&&isFinite(b)&&(z=dM(b)),z}function AM(M,b){return function(z){return null!=z?(sM(this,M,z),e.updateOffset(this,b),this):rM(this,M)}}function rM(M,b){return M.isValid()?M._d["get"+(M._isUTC?"UTC":"")+b]():NaN}function sM(M,b,z){M.isValid()&&!isNaN(z)&&("FullYear"===b&&tM(M.year())&&1===M.month()&&29===M.date()?(z=cM(z),M._d["set"+(M._isUTC?"UTC":"")+b](z,M.month(),Mb(z,M.month()))):M._d["set"+(M._isUTC?"UTC":"")+b](z))}function iM(M){return T(this[M=eM(M)])?this[M]():this}function qM(M,b){if("object"==typeof M){var z,p=aM(M=oM(M));for(z=0;z68?1900:2e3)};var ub=AM("FullYear",!0);function _b(){return tM(this.year())}function Wb(M,b,z,p,e,o,O){var n;return M<100&&M>=0?(n=new Date(M+400,b,z,p,e,o,O),isFinite(n.getFullYear())&&n.setFullYear(M)):n=new Date(M,b,z,p,e,o,O),n}function lb(M){var b,z;return M<100&&M>=0?((z=Array.prototype.slice.call(arguments))[0]=M+400,b=new Date(Date.UTC.apply(null,z)),isFinite(b.getUTCFullYear())&&b.setUTCFullYear(M)):b=new Date(Date.UTC.apply(null,arguments)),b}function mb(M,b,z){var p=7+b-z;return-(7+lb(M,0,p).getUTCDay()-b)%7+p-1}function Lb(M,b,z,p,e){var o,O,n=1+7*(b-1)+(7+z-p)%7+mb(M,p,e);return n<=0?O=qb(o=M-1)+n:n>qb(M)?(o=M+1,O=n-qb(M)):(o=M,O=n),{year:o,dayOfYear:O}}function fb(M,b,z){var p,e,o=mb(M.year(),b,z),O=Math.floor((M.dayOfYear()-o-1)/7)+1;return O<1?p=O+hb(e=M.year()-1,b,z):O>hb(M.year(),b,z)?(p=O-hb(M.year(),b,z),e=M.year()+1):(e=M.year(),p=O),{week:p,year:e}}function hb(M,b,z){var p=mb(M,b,z),e=mb(M+1,b,z);return(qb(M)-p+e)/7}function Rb(M){return fb(M,this._week.dow,this._week.doy).week}x("w",["ww",2],"wo","week"),x("W",["WW",2],"Wo","isoWeek"),pM("week","w"),pM("isoWeek","W"),nM("week",5),nM("isoWeek",5),HM("w",fM),HM("ww",fM,WM),HM("W",fM),HM("WW",fM,WM),xM(["w","ww","W","WW"],(function(M,b,z,p){b[p.substr(0,1)]=cM(M)}));var Bb={dow:0,doy:6};function yb(){return this._week.dow}function Xb(){return this._week.doy}function Yb(M){var b=this.localeData().week(this);return null==M?b:this.add(7*(M-b),"d")}function Tb(M){var b=fb(this,1,4).week;return null==M?b:this.add(7*(M-b),"d")}function Db(M,b){return"string"!=typeof M?M:isNaN(M)?"number"==typeof(M=b.weekdaysParse(M))?M:null:parseInt(M,10)}function kb(M,b){return"string"==typeof M?b.weekdaysParse(M)%7||7:isNaN(M)?null:M}function Nb(M,b){return M.slice(b,7).concat(M.slice(0,b))}x("d",0,"do","day"),x("dd",0,0,(function(M){return this.localeData().weekdaysMin(this,M)})),x("ddd",0,0,(function(M){return this.localeData().weekdaysShort(this,M)})),x("dddd",0,0,(function(M){return this.localeData().weekdays(this,M)})),x("e",0,0,"weekday"),x("E",0,0,"isoWeekday"),pM("day","d"),pM("weekday","e"),pM("isoWeekday","E"),nM("day",11),nM("weekday",11),nM("isoWeekday",11),HM("d",fM),HM("e",fM),HM("E",fM),HM("dd",(function(M,b){return b.weekdaysMinRegex(M)})),HM("ddd",(function(M,b){return b.weekdaysShortRegex(M)})),HM("dddd",(function(M,b){return b.weekdaysRegex(M)})),xM(["dd","ddd","dddd"],(function(M,b,z,p){var e=z._locale.weekdaysParse(M,p,z._strict);null!=e?b.d=e:u(z).invalidWeekday=M})),xM(["d","e","E"],(function(M,b,z,p){b[p]=cM(M)}));var gb="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Hb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),wb="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),vb=gM,Sb=gM,Fb=gM;function jb(M,b){var z=O(this._weekdays)?this._weekdays:this._weekdays[M&&!0!==M&&this._weekdays.isFormat.test(b)?"format":"standalone"];return!0===M?Nb(z,this._week.dow):M?z[M.day()]:z}function xb(M){return!0===M?Nb(this._weekdaysShort,this._week.dow):M?this._weekdaysShort[M.day()]:this._weekdaysShort}function Eb(M){return!0===M?Nb(this._weekdaysMin,this._week.dow):M?this._weekdaysMin[M.day()]:this._weekdaysMin}function Pb(M,b,z){var p,e,o,O=M.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)o=i([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(o,"").toLocaleLowerCase();return z?"dddd"===b?-1!==(e=PM.call(this._weekdaysParse,O))?e:null:"ddd"===b?-1!==(e=PM.call(this._shortWeekdaysParse,O))?e:null:-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:"dddd"===b?-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._shortWeekdaysParse,O))||-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:"ddd"===b?-1!==(e=PM.call(this._shortWeekdaysParse,O))||-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:-1!==(e=PM.call(this._minWeekdaysParse,O))||-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._shortWeekdaysParse,O))?e:null}function Cb(M,b,z){var p,e,o;if(this._weekdaysParseExact)return Pb.call(this,M,b,z);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(e=i([2e3,1]).day(p),z&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(e,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(e,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(e,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(o="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[p]=new RegExp(o.replace(".",""),"i")),z&&"dddd"===b&&this._fullWeekdaysParse[p].test(M))return p;if(z&&"ddd"===b&&this._shortWeekdaysParse[p].test(M))return p;if(z&&"dd"===b&&this._minWeekdaysParse[p].test(M))return p;if(!z&&this._weekdaysParse[p].test(M))return p}}function Ib(M){if(!this.isValid())return null!=M?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=M?(M=Db(M,this.localeData()),this.add(M-b,"d")):b}function Vb(M){if(!this.isValid())return null!=M?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==M?b:this.add(M-b,"d")}function Ub(M){if(!this.isValid())return null!=M?this:NaN;if(null!=M){var b=kb(M,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Jb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysStrictRegex:this._weekdaysRegex):(a(this,"_weekdaysRegex")||(this._weekdaysRegex=vb),this._weekdaysStrictRegex&&M?this._weekdaysStrictRegex:this._weekdaysRegex)}function Gb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(a(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Sb),this._weekdaysShortStrictRegex&&M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Kb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(a(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Fb),this._weekdaysMinStrictRegex&&M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qb(){function M(M,b){return b.length-M.length}var b,z,p,e,o,O=[],n=[],a=[],t=[];for(b=0;b<7;b++)z=i([2e3,1]).day(b),p=SM(this.weekdaysMin(z,"")),e=SM(this.weekdaysShort(z,"")),o=SM(this.weekdays(z,"")),O.push(p),n.push(e),a.push(o),t.push(p),t.push(e),t.push(o);O.sort(M),n.sort(M),a.sort(M),t.sort(M),this._weekdaysRegex=new RegExp("^("+t.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+O.join("|")+")","i")}function Zb(){return this.hours()%12||12}function $b(){return this.hours()||24}function Mz(M,b){x(M,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)}))}function bz(M,b){return b._meridiemParse}function zz(M){return"p"===(M+"").toLowerCase().charAt(0)}x("H",["HH",2],0,"hour"),x("h",["hh",2],0,Zb),x("k",["kk",2],0,$b),x("hmm",0,0,(function(){return""+Zb.apply(this)+w(this.minutes(),2)})),x("hmmss",0,0,(function(){return""+Zb.apply(this)+w(this.minutes(),2)+w(this.seconds(),2)})),x("Hmm",0,0,(function(){return""+this.hours()+w(this.minutes(),2)})),x("Hmmss",0,0,(function(){return""+this.hours()+w(this.minutes(),2)+w(this.seconds(),2)})),Mz("a",!0),Mz("A",!1),pM("hour","h"),nM("hour",13),HM("a",bz),HM("A",bz),HM("H",fM),HM("h",fM),HM("k",fM),HM("HH",fM,WM),HM("hh",fM,WM),HM("kk",fM,WM),HM("hmm",hM),HM("hmmss",RM),HM("Hmm",hM),HM("Hmmss",RM),jM(["H","HH"],UM),jM(["k","kk"],(function(M,b,z){var p=cM(M);b[UM]=24===p?0:p})),jM(["a","A"],(function(M,b,z){z._isPm=z._locale.isPM(M),z._meridiem=M})),jM(["h","hh"],(function(M,b,z){b[UM]=cM(M),u(z).bigHour=!0})),jM("hmm",(function(M,b,z){var p=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p)),u(z).bigHour=!0})),jM("hmmss",(function(M,b,z){var p=M.length-4,e=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p,2)),b[GM]=cM(M.substr(e)),u(z).bigHour=!0})),jM("Hmm",(function(M,b,z){var p=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p))})),jM("Hmmss",(function(M,b,z){var p=M.length-4,e=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p,2)),b[GM]=cM(M.substr(e))}));var pz=/[ap]\.?m?\.?/i,ez=AM("Hours",!0);function oz(M,b,z){return M>11?z?"pm":"PM":z?"am":"AM"}var Oz,nz={calendar:g,longDateFormat:V,invalidDate:J,ordinal:K,dayOfMonthOrdinalParse:Q,relativeTime:$,months:bb,monthsShort:zb,week:Bb,weekdays:gb,weekdaysMin:wb,weekdaysShort:Hb,meridiemParse:pz},az={},tz={};function dz(M,b){var z,p=Math.min(M.length,b.length);for(z=0;z0;){if(p=rz(e.slice(0,b).join("-")))return p;if(z&&z.length>=b&&dz(e,z)>=b-1)break;b--}o++}return Oz}function rz(b){var p=null;if(void 0===az[b]&&M&&M.exports)try{p=Oz._abbr,z(1799)("./"+b),sz(p)}catch(M){az[b]=null}return az[b]}function sz(M,b){var z;return M&&((z=d(b)?uz(M):iz(M,b))?Oz=z:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+M+" not found. Did you forget to load it?")),Oz._abbr}function iz(M,b){if(null!==b){var z,p=nz;if(b.abbr=M,null!=az[M])Y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=az[M]._config;else if(null!=b.parentLocale)if(null!=az[b.parentLocale])p=az[b.parentLocale]._config;else{if(null==(z=rz(b.parentLocale)))return tz[b.parentLocale]||(tz[b.parentLocale]=[]),tz[b.parentLocale].push({name:M,config:b}),null;p=z._config}return az[M]=new N(k(p,b)),tz[M]&&tz[M].forEach((function(M){iz(M.name,M.config)})),sz(M),az[M]}return delete az[M],null}function qz(M,b){if(null!=b){var z,p,e=nz;null!=az[M]&&null!=az[M].parentLocale?az[M].set(k(az[M]._config,b)):(null!=(p=rz(M))&&(e=p._config),b=k(e,b),null==p&&(b.abbr=M),(z=new N(b)).parentLocale=az[M],az[M]=z),sz(M)}else null!=az[M]&&(null!=az[M].parentLocale?(az[M]=az[M].parentLocale,M===sz()&&sz(M)):null!=az[M]&&delete az[M]);return az[M]}function uz(M){var b;if(M&&M._locale&&M._locale._abbr&&(M=M._locale._abbr),!M)return Oz;if(!O(M)){if(b=rz(M))return b;M=[M]}return Az(M)}function _z(){return y(az)}function Wz(M){var b,z=M._a;return z&&-2===u(M).overflow&&(b=z[IM]<0||z[IM]>11?IM:z[VM]<1||z[VM]>Mb(z[CM],z[IM])?VM:z[UM]<0||z[UM]>24||24===z[UM]&&(0!==z[JM]||0!==z[GM]||0!==z[KM])?UM:z[JM]<0||z[JM]>59?JM:z[GM]<0||z[GM]>59?GM:z[KM]<0||z[KM]>999?KM:-1,u(M)._overflowDayOfYear&&(bVM)&&(b=VM),u(M)._overflowWeeks&&-1===b&&(b=QM),u(M)._overflowWeekday&&-1===b&&(b=ZM),u(M).overflow=b),M}var lz=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mz=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Lz=/Z|[+-]\d\d(?::?\d\d)?/,fz=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],hz=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Rz=/^\/?Date\((-?\d+)/i,Bz=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,yz={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Xz(M){var b,z,p,e,o,O,n=M._i,a=lz.exec(n)||mz.exec(n);if(a){for(u(M).iso=!0,b=0,z=fz.length;bqb(o)||0===M._dayOfYear)&&(u(M)._overflowDayOfYear=!0),z=lb(o,0,M._dayOfYear),M._a[IM]=z.getUTCMonth(),M._a[VM]=z.getUTCDate()),b=0;b<3&&null==M._a[b];++b)M._a[b]=O[b]=p[b];for(;b<7;b++)M._a[b]=O[b]=null==M._a[b]?2===b?1:0:M._a[b];24===M._a[UM]&&0===M._a[JM]&&0===M._a[GM]&&0===M._a[KM]&&(M._nextDay=!0,M._a[UM]=0),M._d=(M._useUTC?lb:Wb).apply(null,O),e=M._useUTC?M._d.getUTCDay():M._d.getDay(),null!=M._tzm&&M._d.setUTCMinutes(M._d.getUTCMinutes()-M._tzm),M._nextDay&&(M._a[UM]=24),M._w&&void 0!==M._w.d&&M._w.d!==e&&(u(M).weekdayMismatch=!0)}}function Fz(M){var b,z,p,e,o,O,n,a,t;null!=(b=M._w).GG||null!=b.W||null!=b.E?(o=1,O=4,z=wz(b.GG,M._a[CM],fb(Jz(),1,4).year),p=wz(b.W,1),((e=wz(b.E,1))<1||e>7)&&(a=!0)):(o=M._locale._week.dow,O=M._locale._week.doy,t=fb(Jz(),o,O),z=wz(b.gg,M._a[CM],t.year),p=wz(b.w,t.week),null!=b.d?((e=b.d)<0||e>6)&&(a=!0):null!=b.e?(e=b.e+o,(b.e<0||b.e>6)&&(a=!0)):e=o),p<1||p>hb(z,o,O)?u(M)._overflowWeeks=!0:null!=a?u(M)._overflowWeekday=!0:(n=Lb(z,p,e,o,O),M._a[CM]=n.year,M._dayOfYear=n.dayOfYear)}function jz(M){if(M._f!==e.ISO_8601)if(M._f!==e.RFC_2822){M._a=[],u(M).empty=!0;var b,z,p,o,O,n,a=""+M._i,t=a.length,d=0;for(p=I(M._f,M._locale).match(v)||[],b=0;b0&&u(M).unusedInput.push(O),a=a.slice(a.indexOf(z)+z.length),d+=z.length),j[o]?(z?u(M).empty=!1:u(M).unusedTokens.push(o),EM(o,z,M)):M._strict&&!z&&u(M).unusedTokens.push(o);u(M).charsLeftOver=t-d,a.length>0&&u(M).unusedInput.push(a),M._a[UM]<=12&&!0===u(M).bigHour&&M._a[UM]>0&&(u(M).bigHour=void 0),u(M).parsedDateParts=M._a.slice(0),u(M).meridiem=M._meridiem,M._a[UM]=xz(M._locale,M._a[UM],M._meridiem),null!==(n=u(M).era)&&(M._a[CM]=M._locale.erasConvertYear(n,M._a[CM])),Sz(M),Wz(M)}else gz(M);else Xz(M)}function xz(M,b,z){var p;return null==z?b:null!=M.meridiemHour?M.meridiemHour(b,z):null!=M.isPM?((p=M.isPM(z))&&b<12&&(b+=12),p||12!==b||(b=0),b):b}function Ez(M){var b,z,p,e,o,O,n=!1;if(0===M._f.length)return u(M).invalidFormat=!0,void(M._d=new Date(NaN));for(e=0;ethis?this:M:W()}));function Qz(M,b){var z,p;if(1===b.length&&O(b[0])&&(b=b[0]),!b.length)return Jz();for(z=b[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function mp(){if(!d(this._isDSTShifted))return this._isDSTShifted;var M,b={};return L(b,this),(b=Iz(b))._a?(M=b._isUTC?i(b._a):Jz(b._a),this._isDSTShifted=this.isValid()&&ap(b._a,M.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function Lp(){return!!this.isValid()&&!this._isUTC}function fp(){return!!this.isValid()&&this._isUTC}function hp(){return!!this.isValid()&&this._isUTC&&0===this._offset}e.updateOffset=function(){};var Rp=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Bp=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function yp(M,b){var z,p,e,o=M,O=null;return Op(M)?o={ms:M._milliseconds,d:M._days,M:M._months}:c(M)||!isNaN(+M)?(o={},b?o[b]=+M:o.milliseconds=+M):(O=Rp.exec(M))?(z="-"===O[1]?-1:1,o={y:0,d:cM(O[VM])*z,h:cM(O[UM])*z,m:cM(O[JM])*z,s:cM(O[GM])*z,ms:cM(np(1e3*O[KM]))*z}):(O=Bp.exec(M))?(z="-"===O[1]?-1:1,o={y:Xp(O[2],z),M:Xp(O[3],z),w:Xp(O[4],z),d:Xp(O[5],z),h:Xp(O[6],z),m:Xp(O[7],z),s:Xp(O[8],z)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(e=Tp(Jz(o.from),Jz(o.to)),(o={}).ms=e.milliseconds,o.M=e.months),p=new op(o),Op(M)&&a(M,"_locale")&&(p._locale=M._locale),Op(M)&&a(M,"_isValid")&&(p._isValid=M._isValid),p}function Xp(M,b){var z=M&&parseFloat(M.replace(",","."));return(isNaN(z)?0:z)*b}function Yp(M,b){var z={};return z.months=b.month()-M.month()+12*(b.year()-M.year()),M.clone().add(z.months,"M").isAfter(b)&&--z.months,z.milliseconds=+b-+M.clone().add(z.months,"M"),z}function Tp(M,b){var z;return M.isValid()&&b.isValid()?(b=Ap(b,M),M.isBefore(b)?z=Yp(M,b):((z=Yp(b,M)).milliseconds=-z.milliseconds,z.months=-z.months),z):{milliseconds:0,months:0}}function Dp(M,b){return function(z,p){var e;return null===p||isNaN(+p)||(Y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),e=z,z=p,p=e),kp(this,yp(z,p),M),this}}function kp(M,b,z,p){var o=b._milliseconds,O=np(b._days),n=np(b._months);M.isValid()&&(p=null==p||p,n&&db(M,rM(M,"Month")+n*z),O&&sM(M,"Date",rM(M,"Date")+O*z),o&&M._d.setTime(M._d.valueOf()+o*z),p&&e.updateOffset(M,O||n))}yp.fn=op.prototype,yp.invalid=ep;var Np=Dp(1,"add"),gp=Dp(-1,"subtract");function Hp(M){return"string"==typeof M||M instanceof String}function wp(M){return h(M)||A(M)||Hp(M)||c(M)||Sp(M)||vp(M)||null==M}function vp(M){var b,z,p=n(M)&&!t(M),e=!1,o=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"];for(b=0;bz.valueOf():z.valueOf()9999?C(z,b?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?b?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",C(z,"Z")):C(z,b?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function $p(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var M,b,z,p,e="moment",o="";return this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",o="Z"),M="["+e+'("]',b=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",z="-MM-DD[T]HH:mm:ss.SSS",p=o+'[")]',this.format(M+b+z+p)}function Me(M){M||(M=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var b=C(this,M);return this.localeData().postformat(b)}function be(M,b){return this.isValid()&&(h(M)&&M.isValid()||Jz(M).isValid())?yp({to:this,from:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ze(M){return this.from(Jz(),M)}function pe(M,b){return this.isValid()&&(h(M)&&M.isValid()||Jz(M).isValid())?yp({from:this,to:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ee(M){return this.to(Jz(),M)}function oe(M){var b;return void 0===M?this._locale._abbr:(null!=(b=uz(M))&&(this._locale=b),this)}e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Oe=B("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(M){return void 0===M?this.localeData():this.locale(M)}));function ne(){return this._locale}var ae=1e3,te=60*ae,de=60*te,ce=3506328*de;function Ae(M,b){return(M%b+b)%b}function re(M,b,z){return M<100&&M>=0?new Date(M+400,b,z)-ce:new Date(M,b,z).valueOf()}function se(M,b,z){return M<100&&M>=0?Date.UTC(M+400,b,z)-ce:Date.UTC(M,b,z)}function ie(M){var b,z;if(void 0===(M=eM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?se:re,M){case"year":b=z(this.year(),0,1);break;case"quarter":b=z(this.year(),this.month()-this.month()%3,1);break;case"month":b=z(this.year(),this.month(),1);break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":b=z(this.year(),this.month(),this.date());break;case"hour":b=this._d.valueOf(),b-=Ae(b+(this._isUTC?0:this.utcOffset()*te),de);break;case"minute":b=this._d.valueOf(),b-=Ae(b,te);break;case"second":b=this._d.valueOf(),b-=Ae(b,ae)}return this._d.setTime(b),e.updateOffset(this,!0),this}function qe(M){var b,z;if(void 0===(M=eM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?se:re,M){case"year":b=z(this.year()+1,0,1)-1;break;case"quarter":b=z(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":b=z(this.year(),this.month()+1,1)-1;break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":b=z(this.year(),this.month(),this.date()+1)-1;break;case"hour":b=this._d.valueOf(),b+=de-Ae(b+(this._isUTC?0:this.utcOffset()*te),de)-1;break;case"minute":b=this._d.valueOf(),b+=te-Ae(b,te)-1;break;case"second":b=this._d.valueOf(),b+=ae-Ae(b,ae)-1}return this._d.setTime(b),e.updateOffset(this,!0),this}function ue(){return this._d.valueOf()-6e4*(this._offset||0)}function _e(){return Math.floor(this.valueOf()/1e3)}function We(){return new Date(this.valueOf())}function le(){var M=this;return[M.year(),M.month(),M.date(),M.hour(),M.minute(),M.second(),M.millisecond()]}function me(){var M=this;return{years:M.year(),months:M.month(),date:M.date(),hours:M.hours(),minutes:M.minutes(),seconds:M.seconds(),milliseconds:M.milliseconds()}}function Le(){return this.isValid()?this.toISOString():null}function fe(){return _(this)}function he(){return s({},u(this))}function Re(){return u(this).overflow}function Be(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function ye(M,b){var z,p,o,O=this._eras||uz("en")._eras;for(z=0,p=O.length;z=0)return a[p]}function Ye(M,b){var z=M.since<=M.until?1:-1;return void 0===b?e(M.since).year():e(M.since).year()+(b-M.offset)*z}function Te(){var M,b,z,p=this.localeData().eras();for(M=0,b=p.length;M(o=hb(M,p,e))&&(b=o),Ke.call(this,M,b,z,p,e))}function Ke(M,b,z,p,e){var o=Lb(M,b,z,p,e),O=lb(o.year,0,o.dayOfYear);return this.year(O.getUTCFullYear()),this.month(O.getUTCMonth()),this.date(O.getUTCDate()),this}function Qe(M){return null==M?Math.ceil((this.month()+1)/3):this.month(3*(M-1)+this.month()%3)}x("N",0,0,"eraAbbr"),x("NN",0,0,"eraAbbr"),x("NNN",0,0,"eraAbbr"),x("NNNN",0,0,"eraName"),x("NNNNN",0,0,"eraNarrow"),x("y",["y",1],"yo","eraYear"),x("y",["yy",2],0,"eraYear"),x("y",["yyy",3],0,"eraYear"),x("y",["yyyy",4],0,"eraYear"),HM("N",ve),HM("NN",ve),HM("NNN",ve),HM("NNNN",Se),HM("NNNNN",Fe),jM(["N","NN","NNN","NNNN","NNNNN"],(function(M,b,z,p){var e=z._locale.erasParse(M,p,z._strict);e?u(z).era=e:u(z).invalidEra=M})),HM("y",YM),HM("yy",YM),HM("yyy",YM),HM("yyyy",YM),HM("yo",je),jM(["y","yy","yyy","yyyy"],CM),jM(["yo"],(function(M,b,z,p){var e;z._locale._eraYearOrdinalRegex&&(e=M.match(z._locale._eraYearOrdinalRegex)),z._locale.eraYearOrdinalParse?b[CM]=z._locale.eraYearOrdinalParse(M,e):b[CM]=parseInt(M,10)})),x(0,["gg",2],0,(function(){return this.weekYear()%100})),x(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Ee("gggg","weekYear"),Ee("ggggg","weekYear"),Ee("GGGG","isoWeekYear"),Ee("GGGGG","isoWeekYear"),pM("weekYear","gg"),pM("isoWeekYear","GG"),nM("weekYear",1),nM("isoWeekYear",1),HM("G",TM),HM("g",TM),HM("GG",fM,WM),HM("gg",fM,WM),HM("GGGG",yM,mM),HM("gggg",yM,mM),HM("GGGGG",XM,LM),HM("ggggg",XM,LM),xM(["gggg","ggggg","GGGG","GGGGG"],(function(M,b,z,p){b[p.substr(0,2)]=cM(M)})),xM(["gg","GG"],(function(M,b,z,p){b[p]=e.parseTwoDigitYear(M)})),x("Q",0,"Qo","quarter"),pM("quarter","Q"),nM("quarter",7),HM("Q",_M),jM("Q",(function(M,b){b[IM]=3*(cM(M)-1)})),x("D",["DD",2],"Do","date"),pM("date","D"),nM("date",9),HM("D",fM),HM("DD",fM,WM),HM("Do",(function(M,b){return M?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient})),jM(["D","DD"],VM),jM("Do",(function(M,b){b[VM]=cM(M.match(fM)[0])}));var Ze=AM("Date",!0);function $e(M){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==M?b:this.add(M-b,"d")}x("DDD",["DDDD",3],"DDDo","dayOfYear"),pM("dayOfYear","DDD"),nM("dayOfYear",4),HM("DDD",BM),HM("DDDD",lM),jM(["DDD","DDDD"],(function(M,b,z){z._dayOfYear=cM(M)})),x("m",["mm",2],0,"minute"),pM("minute","m"),nM("minute",14),HM("m",fM),HM("mm",fM,WM),jM(["m","mm"],JM);var Mo=AM("Minutes",!1);x("s",["ss",2],0,"second"),pM("second","s"),nM("second",15),HM("s",fM),HM("ss",fM,WM),jM(["s","ss"],GM);var bo,zo,po=AM("Seconds",!1);for(x("S",0,0,(function(){return~~(this.millisecond()/100)})),x(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),x(0,["SSS",3],0,"millisecond"),x(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),x(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),x(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),x(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),x(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),x(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),pM("millisecond","ms"),nM("millisecond",16),HM("S",BM,_M),HM("SS",BM,WM),HM("SSS",BM,lM),bo="SSSS";bo.length<=9;bo+="S")HM(bo,YM);function eo(M,b){b[KM]=cM(1e3*("0."+M))}for(bo="S";bo.length<=9;bo+="S")jM(bo,eo);function oo(){return this._isUTC?"UTC":""}function Oo(){return this._isUTC?"Coordinated Universal Time":""}zo=AM("Milliseconds",!1),x("z",0,0,"zoneAbbr"),x("zz",0,0,"zoneName");var no=f.prototype;function ao(M){return Jz(1e3*M)}function to(){return Jz.apply(null,arguments).parseZone()}function co(M){return M}no.add=Np,no.calendar=xp,no.clone=Ep,no.diff=Gp,no.endOf=qe,no.format=Me,no.from=be,no.fromNow=ze,no.to=pe,no.toNow=ee,no.get=iM,no.invalidAt=Re,no.isAfter=Pp,no.isBefore=Cp,no.isBetween=Ip,no.isSame=Vp,no.isSameOrAfter=Up,no.isSameOrBefore=Jp,no.isValid=fe,no.lang=Oe,no.locale=oe,no.localeData=ne,no.max=Kz,no.min=Gz,no.parsingFlags=he,no.set=qM,no.startOf=ie,no.subtract=gp,no.toArray=le,no.toObject=me,no.toDate=We,no.toISOString=Zp,no.inspect=$p,"undefined"!=typeof Symbol&&null!=Symbol.for&&(no[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),no.toJSON=Le,no.toString=Qp,no.unix=_e,no.valueOf=ue,no.creationData=Be,no.eraName=Te,no.eraNarrow=De,no.eraAbbr=ke,no.eraYear=Ne,no.year=ub,no.isLeapYear=_b,no.weekYear=Pe,no.isoWeekYear=Ce,no.quarter=no.quarters=Qe,no.month=cb,no.daysInMonth=Ab,no.week=no.weeks=Yb,no.isoWeek=no.isoWeeks=Tb,no.weeksInYear=Ue,no.weeksInWeekYear=Je,no.isoWeeksInYear=Ie,no.isoWeeksInISOWeekYear=Ve,no.date=Ze,no.day=no.days=Ib,no.weekday=Vb,no.isoWeekday=Ub,no.dayOfYear=$e,no.hour=no.hours=ez,no.minute=no.minutes=Mo,no.second=no.seconds=po,no.millisecond=no.milliseconds=zo,no.utcOffset=sp,no.utc=qp,no.local=up,no.parseZone=_p,no.hasAlignedHourOffset=Wp,no.isDST=lp,no.isLocal=Lp,no.isUtcOffset=fp,no.isUtc=hp,no.isUTC=hp,no.zoneAbbr=oo,no.zoneName=Oo,no.dates=B("dates accessor is deprecated. Use date instead.",Ze),no.months=B("months accessor is deprecated. Use month instead",cb),no.years=B("years accessor is deprecated. Use year instead",ub),no.zone=B("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",ip),no.isDSTShifted=B("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",mp);var Ao=N.prototype;function ro(M,b,z,p){var e=uz(),o=i().set(p,b);return e[z](o,M)}function so(M,b,z){if(c(M)&&(b=M,M=void 0),M=M||"",null!=b)return ro(M,b,z,"month");var p,e=[];for(p=0;p<12;p++)e[p]=ro(M,p,z,"month");return e}function io(M,b,z,p){"boolean"==typeof M?(c(b)&&(z=b,b=void 0),b=b||""):(z=b=M,M=!1,c(b)&&(z=b,b=void 0),b=b||"");var e,o=uz(),O=M?o._week.dow:0,n=[];if(null!=z)return ro(b,(z+O)%7,p,"day");for(e=0;e<7;e++)n[e]=ro(b,(e+O)%7,p,"day");return n}function qo(M,b){return so(M,b,"months")}function uo(M,b){return so(M,b,"monthsShort")}function _o(M,b,z){return io(M,b,z,"weekdays")}function Wo(M,b,z){return io(M,b,z,"weekdaysShort")}function lo(M,b,z){return io(M,b,z,"weekdaysMin")}Ao.calendar=H,Ao.longDateFormat=U,Ao.invalidDate=G,Ao.ordinal=Z,Ao.preparse=co,Ao.postformat=co,Ao.relativeTime=MM,Ao.pastFuture=bM,Ao.set=D,Ao.eras=ye,Ao.erasParse=Xe,Ao.erasConvertYear=Ye,Ao.erasAbbrRegex=He,Ao.erasNameRegex=ge,Ao.erasNarrowRegex=we,Ao.months=Ob,Ao.monthsShort=nb,Ao.monthsParse=tb,Ao.monthsRegex=sb,Ao.monthsShortRegex=rb,Ao.week=Rb,Ao.firstDayOfYear=Xb,Ao.firstDayOfWeek=yb,Ao.weekdays=jb,Ao.weekdaysMin=Eb,Ao.weekdaysShort=xb,Ao.weekdaysParse=Cb,Ao.weekdaysRegex=Jb,Ao.weekdaysShortRegex=Gb,Ao.weekdaysMinRegex=Kb,Ao.isPM=zz,Ao.meridiem=oz,sz("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1===cM(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),e.lang=B("moment.lang is deprecated. Use moment.locale instead.",sz),e.langData=B("moment.langData is deprecated. Use moment.localeData instead.",uz);var mo=Math.abs;function Lo(){var M=this._data;return this._milliseconds=mo(this._milliseconds),this._days=mo(this._days),this._months=mo(this._months),M.milliseconds=mo(M.milliseconds),M.seconds=mo(M.seconds),M.minutes=mo(M.minutes),M.hours=mo(M.hours),M.months=mo(M.months),M.years=mo(M.years),this}function fo(M,b,z,p){var e=yp(b,z);return M._milliseconds+=p*e._milliseconds,M._days+=p*e._days,M._months+=p*e._months,M._bubble()}function ho(M,b){return fo(this,M,b,1)}function Ro(M,b){return fo(this,M,b,-1)}function Bo(M){return M<0?Math.floor(M):Math.ceil(M)}function yo(){var M,b,z,p,e,o=this._milliseconds,O=this._days,n=this._months,a=this._data;return o>=0&&O>=0&&n>=0||o<=0&&O<=0&&n<=0||(o+=864e5*Bo(Yo(n)+O),O=0,n=0),a.milliseconds=o%1e3,M=dM(o/1e3),a.seconds=M%60,b=dM(M/60),a.minutes=b%60,z=dM(b/60),a.hours=z%24,O+=dM(z/24),n+=e=dM(Xo(O)),O-=Bo(Yo(e)),p=dM(n/12),n%=12,a.days=O,a.months=n,a.years=p,this}function Xo(M){return 4800*M/146097}function Yo(M){return 146097*M/4800}function To(M){if(!this.isValid())return NaN;var b,z,p=this._milliseconds;if("month"===(M=eM(M))||"quarter"===M||"year"===M)switch(b=this._days+p/864e5,z=this._months+Xo(b),M){case"month":return z;case"quarter":return z/3;case"year":return z/12}else switch(b=this._days+Math.round(Yo(this._months)),M){case"week":return b/7+p/6048e5;case"day":return b+p/864e5;case"hour":return 24*b+p/36e5;case"minute":return 1440*b+p/6e4;case"second":return 86400*b+p/1e3;case"millisecond":return Math.floor(864e5*b)+p;default:throw new Error("Unknown unit "+M)}}function Do(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*cM(this._months/12):NaN}function ko(M){return function(){return this.as(M)}}var No=ko("ms"),go=ko("s"),Ho=ko("m"),wo=ko("h"),vo=ko("d"),So=ko("w"),Fo=ko("M"),jo=ko("Q"),xo=ko("y");function Eo(){return yp(this)}function Po(M){return M=eM(M),this.isValid()?this[M+"s"]():NaN}function Co(M){return function(){return this.isValid()?this._data[M]:NaN}}var Io=Co("milliseconds"),Vo=Co("seconds"),Uo=Co("minutes"),Jo=Co("hours"),Go=Co("days"),Ko=Co("months"),Qo=Co("years");function Zo(){return dM(this.days()/7)}var $o=Math.round,MO={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function bO(M,b,z,p,e){return e.relativeTime(b||1,!!z,M,p)}function zO(M,b,z,p){var e=yp(M).abs(),o=$o(e.as("s")),O=$o(e.as("m")),n=$o(e.as("h")),a=$o(e.as("d")),t=$o(e.as("M")),d=$o(e.as("w")),c=$o(e.as("y")),A=o<=z.ss&&["s",o]||o0,A[4]=p,bO.apply(null,A)}function pO(M){return void 0===M?$o:"function"==typeof M&&($o=M,!0)}function eO(M,b){return void 0!==MO[M]&&(void 0===b?MO[M]:(MO[M]=b,"s"===M&&(MO.ss=b-1),!0))}function oO(M,b){if(!this.isValid())return this.localeData().invalidDate();var z,p,e=!1,o=MO;return"object"==typeof M&&(b=M,M=!1),"boolean"==typeof M&&(e=M),"object"==typeof b&&(o=Object.assign({},MO,b),null!=b.s&&null==b.ss&&(o.ss=b.s-1)),p=zO(this,!e,o,z=this.localeData()),e&&(p=z.pastFuture(+this,p)),z.postformat(p)}var OO=Math.abs;function nO(M){return(M>0)-(M<0)||+M}function aO(){if(!this.isValid())return this.localeData().invalidDate();var M,b,z,p,e,o,O,n,a=OO(this._milliseconds)/1e3,t=OO(this._days),d=OO(this._months),c=this.asSeconds();return c?(M=dM(a/60),b=dM(M/60),a%=60,M%=60,z=dM(d/12),d%=12,p=a?a.toFixed(3).replace(/\.?0+$/,""):"",e=c<0?"-":"",o=nO(this._months)!==nO(c)?"-":"",O=nO(this._days)!==nO(c)?"-":"",n=nO(this._milliseconds)!==nO(c)?"-":"",e+"P"+(z?o+z+"Y":"")+(d?o+d+"M":"")+(t?O+t+"D":"")+(b||M||a?"T":"")+(b?n+b+"H":"")+(M?n+M+"M":"")+(a?n+p+"S":"")):"P0D"}var tO=op.prototype;return tO.isValid=pp,tO.abs=Lo,tO.add=ho,tO.subtract=Ro,tO.as=To,tO.asMilliseconds=No,tO.asSeconds=go,tO.asMinutes=Ho,tO.asHours=wo,tO.asDays=vo,tO.asWeeks=So,tO.asMonths=Fo,tO.asQuarters=jo,tO.asYears=xo,tO.valueOf=Do,tO._bubble=yo,tO.clone=Eo,tO.get=Po,tO.milliseconds=Io,tO.seconds=Vo,tO.minutes=Uo,tO.hours=Jo,tO.days=Go,tO.weeks=Zo,tO.months=Ko,tO.years=Qo,tO.humanize=oO,tO.toISOString=aO,tO.toString=aO,tO.toJSON=aO,tO.locale=oe,tO.localeData=ne,tO.toIsoString=B("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",aO),tO.lang=Oe,x("X",0,0,"unix"),x("x",0,0,"valueOf"),HM("x",TM),HM("X",NM),jM("X",(function(M,b,z){z._d=new Date(1e3*parseFloat(M))})),jM("x",(function(M,b,z){z._d=new Date(cM(M))})),e.version="2.29.1",o(Jz),e.fn=no,e.min=Zz,e.max=$z,e.now=Mp,e.utc=i,e.unix=ao,e.months=qo,e.isDate=A,e.locale=sz,e.invalid=W,e.duration=yp,e.isMoment=h,e.weekdays=_o,e.parseZone=to,e.localeData=uz,e.isDuration=Op,e.monthsShort=uo,e.weekdaysMin=lo,e.defineLocale=iz,e.updateLocale=qz,e.locales=_z,e.weekdaysShort=Wo,e.normalizeUnits=eM,e.relativeTimeRounding=pO,e.relativeTimeThreshold=eO,e.calendarFormat=jp,e.prototype=no,e.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},e}()},2786:function(M,b,z){!function(M){"use strict";M.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(M){return/^nm$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"vm":"VM":z?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},4130:function(M,b,z){!function(M){"use strict";var b=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},z={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},p=function(M){return function(p,e,o,O){var n=b(p),a=z[M][b(p)];return 2===n&&(a=a[e?0:1]),a.replace(/%d/i,p)}},e=["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-dz",{months:e,monthsShort:e,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:p("s"),ss:p("s"),m:p("m"),mm:p("m"),h:p("h"),hh:p("h"),d:p("d"),dd:p("d"),M:p("M"),MM:p("M"),y:p("y"),yy:p("y")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:0,doy:4}})}(z(381))},6135:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})}(z(381))},6440:function(M,b,z){!function(M){"use strict";var b={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},z=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},p={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},e=function(M){return function(b,e,o,O){var n=z(b),a=p[M][z(b)];return 2===n&&(a=a[e?0:1]),a.replace(/%d/i,b)}},o=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:e("s"),ss:e("s"),m:e("m"),mm:e("m"),h:e("h"),hh:e("h"),d:e("d"),dd:e("d"),M:e("M"),MM:e("M"),y:e("y"),yy:e("y")},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},7702:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(381))},6040:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};M.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:0,doy:6}})}(z(381))},7100:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(381))},867:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},o=function(M){return function(b,z,o,O){var n=p(b),a=e[M][p(b)];return 2===n&&(a=a[z?0:1]),a.replace(/%d/i,b)}},O=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar",{months:O,monthsShort:O,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},1083:function(M,b,z){!function(M){"use strict";var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};M.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"bir neçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(M){return/^(gündüz|axşam)$/.test(M)},meridiem:function(M,b,z){return M<4?"gecə":M<12?"səhər":M<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(M){if(0===M)return M+"-ıncı";var z=M%10,p=M%100-z,e=M>=100?100:null;return M+(b[z]||b[p]||b[e])},week:{dow:1,doy:7}})}(z(381))},9808:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвіліна":"хвіліну":"h"===p?z?"гадзіна":"гадзіну":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:z?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"}[p],+M)}M.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:z,mm:z,h:z,hh:z,d:"дзень",dd:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(M){return/^(дня|вечара)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночы":M<12?"раніцы":M<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M%10!=2&&M%10!=3||M%100==12||M%100==13?M+"-ы":M+"-і";case"D":return M+"-га";default:return M}},week:{dow:1,doy:7}})}(z(381))},8338:function(M,b,z){!function(M){"use strict";M.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Миналата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Миналия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",w:"седмица",ww:"%d седмици",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(381))},7438:function(M,b,z){!function(M){"use strict";M.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},calendar:{sameDay:"[Bi lɛrɛ] LT",nextDay:"[Sini lɛrɛ] LT",nextWeek:"dddd [don lɛrɛ] LT",lastDay:"[Kunu lɛrɛ] LT",lastWeek:"dddd [tɛmɛnen lɛrɛ] LT",sameElse:"L"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(z(381))},6225:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn-bd",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b?M<4?M:M+12:"ভোর"===b||"সকাল"===b?M:"দুপুর"===b?M>=3?M:M+12:"বিকাল"===b||"সন্ধ্যা"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"রাত":M<6?"ভোর":M<12?"সকাল":M<15?"দুপুর":M<18?"বিকাল":M<20?"সন্ধ্যা":"রাত"},week:{dow:0,doy:6}})}(z(381))},8905:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b&&M>=4||"দুপুর"===b&&M<5||"বিকাল"===b?M+12:M},meridiem:function(M,b,z){return M<4?"রাত":M<10?"সকাল":M<17?"দুপুর":M<20?"বিকাল":"রাত"},week:{dow:0,doy:6}})}(z(381))},1560:function(M,b,z){!function(M){"use strict";var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},z={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};M.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12".split("_"),monthsShortRegex:/^(ཟླ་\d{1,2})/,monthsParseExact:!0,weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",ss:"%d སྐར་ཆ།",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(M){return M.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(M,b){return 12===M&&(M=0),"མཚན་མོ"===b&&M>=4||"ཉིན་གུང"===b&&M<5||"དགོང་དག"===b?M+12:M},meridiem:function(M,b,z){return M<4?"མཚན་མོ":M<10?"ཞོགས་ཀས":M<17?"ཉིན་གུང":M<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}(z(381))},1278:function(M,b,z){!function(M){"use strict";function b(M,b,z){return M+" "+e({mm:"munutenn",MM:"miz",dd:"devezh"}[z],M)}function z(M){switch(p(M)){case 1:case 3:case 4:case 5:case 9:return M+" bloaz";default:return M+" vloaz"}}function p(M){return M>9?p(M%10):M}function e(M,b){return 2===b?o(M):M}function o(M){var b={m:"v",b:"v",d:"z"};return void 0===b[M.charAt(0)]?M:b[M.charAt(0)]+M.substring(1)}var O=[/^gen/i,/^c[ʼ\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],n=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,a=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,t=/^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,d=[/^sul/i,/^lun/i,/^meurzh/i,/^merc[ʼ\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],c=[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],A=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];M.defineLocale("br",{months:"Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:A,fullWeekdaysParse:d,shortWeekdaysParse:c,minWeekdaysParse:A,monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:a,monthsShortStrictRegex:t,monthsParse:O,longMonthsParse:O,shortMonthsParse:O,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warcʼhoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Decʼh da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s ʼzo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:z},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(M){return M+(1===M?"añ":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(M){return"g.m."===M},meridiem:function(M,b,z){return M<12?"a.m.":"g.m."}})}(z(381))},622:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},2468:function(M,b,z){!function(M){"use strict";M.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(381))},5822:function(M,b,z){!function(M){"use strict";var b="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),z="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),p=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],e=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;function o(M){return M>1&&M<5&&1!=~~(M/10)}function O(M,b,z,p){var e=M+" ";switch(z){case"s":return b||p?"pár sekund":"pár sekundami";case"ss":return b||p?e+(o(M)?"sekundy":"sekund"):e+"sekundami";case"m":return b?"minuta":p?"minutu":"minutou";case"mm":return b||p?e+(o(M)?"minuty":"minut"):e+"minutami";case"h":return b?"hodina":p?"hodinu":"hodinou";case"hh":return b||p?e+(o(M)?"hodiny":"hodin"):e+"hodinami";case"d":return b||p?"den":"dnem";case"dd":return b||p?e+(o(M)?"dny":"dní"):e+"dny";case"M":return b||p?"měsíc":"měsícem";case"MM":return b||p?e+(o(M)?"měsíce":"měsíců"):e+"měsíci";case"y":return b||p?"rok":"rokem";case"yy":return b||p?e+(o(M)?"roky":"let"):e+"lety"}}M.defineLocale("cs",{months:b,monthsShort:z,monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:O,ss:O,m:O,mm:O,h:O,hh:O,d:O,dd:O,M:O,MM:O,y:O,yy:O},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},877:function(M,b,z){!function(M){"use strict";M.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(M){return M+(/сехет$/i.exec(M)?"рен":/ҫул$/i.exec(M)?"тан":"ран")},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}})}(z(381))},7373:function(M,b,z){!function(M){"use strict";M.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(M){var b="";return M>20?b=40===M||50===M||60===M||80===M||100===M?"fed":"ain":M>0&&(b=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][M]),M+b},week:{dow:1,doy:4}})}(z(381))},4780:function(M,b,z){!function(M){"use strict";M.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},217:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},894:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9740:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?e[z][0]:e[z][1]}M.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},5300:function(M,b,z){!function(M){"use strict";var b=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],z=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];M.defineLocale("dv",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(M){return"މފ"===M},meridiem:function(M,b,z){return M<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:7,doy:12}})}(z(381))},837:function(M,b,z){!function(M){"use strict";function b(M){return"undefined"!=typeof Function&&M instanceof Function||"[object Function]"===Object.prototype.toString.call(M)}M.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(M,b){return M?"string"==typeof b&&/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[M.month()]:this._monthsNominativeEl[M.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(M,b,z){return M>11?z?"μμ":"ΜΜ":z?"πμ":"ΠΜ"},isPM:function(M){return"μ"===(M+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(M,z){var p=this._calendarEl[M],e=z&&z.hours();return b(p)&&(p=p.apply(z)),p.replace("{}",e%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}(z(381))},8348:function(M,b,z){!function(M){"use strict";M.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:4}})}(z(381))},7925:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(381))},2243:function(M,b,z){!function(M){"use strict";M.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},6436:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},7207:function(M,b,z){!function(M){"use strict";M.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(381))},2127:function(M,b,z){!function(M){"use strict";M.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:6}})}(z(381))},6319:function(M,b,z){!function(M){"use strict";M.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},1662:function(M,b,z){!function(M){"use strict";M.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},2915:function(M,b,z){!function(M){"use strict";M.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(M){return"p"===M.charAt(0).toLowerCase()},meridiem:function(M,b,z){return M>11?z?"p.t.m.":"P.T.M.":z?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(z(381))},5251:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6112:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:4},invalidDate:"Fecha inválida"})}(z(381))},1146:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})}(z(381))},5655:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4},invalidDate:"Fecha inválida"})}(z(381))},5603:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[M+"sekundi",M+"sekundit"],m:["ühe minuti","üks minut"],mm:[M+" minuti",M+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[M+" tunni",M+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[M+" kuu",M+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[M+" aasta",M+" aastat"]};return b?e[z][2]?e[z][2]:e[z][1]:p?e[z][0]:e[z][1]}M.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},7763:function(M,b,z){!function(M){"use strict";M.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},6959:function(M,b,z){!function(M){"use strict";var b={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},z={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};M.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(M){return/بعد از ظهر/.test(M)},meridiem:function(M,b,z){return M<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"%d ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(M){return M.replace(/[۰-۹]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})}(z(381))},1897:function(M,b,z){!function(M){"use strict";var b="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),z=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",b[7],b[8],b[9]];function p(M,b,z,p){var o="";switch(z){case"s":return p?"muutaman sekunnin":"muutama sekunti";case"ss":o=p?"sekunnin":"sekuntia";break;case"m":return p?"minuutin":"minuutti";case"mm":o=p?"minuutin":"minuuttia";break;case"h":return p?"tunnin":"tunti";case"hh":o=p?"tunnin":"tuntia";break;case"d":return p?"päivän":"päivä";case"dd":o=p?"päivän":"päivää";break;case"M":return p?"kuukauden":"kuukausi";case"MM":o=p?"kuukauden":"kuukautta";break;case"y":return p?"vuoden":"vuosi";case"yy":o=p?"vuoden":"vuotta"}return o=e(M,p)+" "+o}function e(M,p){return M<10?p?z[M]:b[M]:M}M.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2549:function(M,b,z){!function(M){"use strict";M.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},4694:function(M,b,z){!function(M){"use strict";M.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},3049:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}}})}(z(381))},2330:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(381))},4470:function(M,b,z){!function(M){"use strict";var b=/^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,z=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,p=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,e=[/^janv/i,/^févr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^août/i,/^sept/i,/^oct/i,/^nov/i,/^déc/i];M.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsRegex:p,monthsShortRegex:p,monthsStrictRegex:b,monthsShortStrictRegex:z,monthsParse:e,longMonthsParse:e,shortMonthsParse:e,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(M,b){switch(b){case"D":return M+(1===M?"er":"");default:case"M":case"Q":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(381))},5044:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),z="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");M.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},9295:function(M,b,z){!function(M){"use strict";var b=["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],z=["Ean","Feabh","Márt","Aib","Beal","Meith","Iúil","Lún","M.F.","D.F.","Samh","Noll"],p=["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],e=["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],o=["Do","Lu","Má","Cé","Dé","A","Sa"];M.defineLocale("ga",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:e,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Amárach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inné ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",ss:"%d soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d míonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(381))},2101:function(M,b,z){!function(M){"use strict";var b=["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],z=["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],p=["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],e=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],o=["Dò","Lu","Mà","Ci","Ar","Ha","Sa"];M.defineLocale("gd",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:e,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(381))},8794:function(M,b,z){!function(M){"use strict";M.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(M){return 0===M.indexOf("un")?"n"+M:"en "+M},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},7884:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["थोडया सॅकंडांनी","थोडे सॅकंड"],ss:[M+" सॅकंडांनी",M+" सॅकंड"],m:["एका मिणटान","एक मिनूट"],mm:[M+" मिणटांनी",M+" मिणटां"],h:["एका वरान","एक वर"],hh:[M+" वरांनी",M+" वरां"],d:["एका दिसान","एक दीस"],dd:[M+" दिसांनी",M+" दीस"],M:["एका म्हयन्यान","एक म्हयनो"],MM:[M+" म्हयन्यानी",M+" म्हयने"],y:["एका वर्सान","एक वर्स"],yy:[M+" वर्सांनी",M+" वर्सां"]};return p?e[z][0]:e[z][1]}M.defineLocale("gom-deva",{months:{standalone:"जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),format:"जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार".split("_"),weekdaysShort:"आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.".split("_"),weekdaysMin:"आ_सो_मं_बु_ब्रे_सु_शे".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [वाजतां]",LTS:"A h:mm:ss [वाजतां]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [वाजतां]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [वाजतां]",llll:"ddd, D MMM YYYY, A h:mm [वाजतां]"},calendar:{sameDay:"[आयज] LT",nextDay:"[फाल्यां] LT",nextWeek:"[फुडलो] dddd[,] LT",lastDay:"[काल] LT",lastWeek:"[फाटलो] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s आदीं",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(वेर)/,ordinal:function(M,b){switch(b){case"D":return M+"वेर";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return M}},week:{dow:0,doy:3},meridiemParse:/राती|सकाळीं|दनपारां|सांजे/,meridiemHour:function(M,b){return 12===M&&(M=0),"राती"===b?M<4?M:M+12:"सकाळीं"===b?M:"दनपारां"===b?M>12?M:M+12:"सांजे"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"राती":M<12?"सकाळीं":M<16?"दनपारां":M<20?"सांजे":"राती"}})}(z(381))},7149:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["thoddea sekondamni","thodde sekond"],ss:[M+" sekondamni",M+" sekond"],m:["eka mintan","ek minut"],mm:[M+" mintamni",M+" mintam"],h:["eka voran","ek vor"],hh:[M+" voramni",M+" voram"],d:["eka disan","ek dis"],dd:[M+" disamni",M+" dis"],M:["eka mhoinean","ek mhoino"],MM:[M+" mhoineamni",M+" mhoine"],y:["eka vorsan","ek voros"],yy:[M+" vorsamni",M+" vorsam"]};return p?e[z][0]:e[z][1]}M.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(M,b){switch(b){case"D":return M+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return M}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(M,b){return 12===M&&(M=0),"rati"===b?M<4?M:M+12:"sokallim"===b?M:"donparam"===b?M>12?M:M+12:"sanje"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"rati":M<12?"sokallim":M<16?"donparam":M<20?"sanje":"rati"}})}(z(381))},5349:function(M,b,z){!function(M){"use strict";var b={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},z={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};M.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),longDateFormat:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},calendar:{sameDay:"[આજ] LT",nextDay:"[કાલે] LT",nextWeek:"dddd, LT",lastDay:"[ગઇકાલે] LT",lastWeek:"[પાછલા] dddd, LT",sameElse:"L"},relativeTime:{future:"%s મા",past:"%s પહેલા",s:"અમુક પળો",ss:"%d સેકંડ",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"},preparse:function(M){return M.replace(/[૧૨૩૪૫૬૭૮૯૦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/રાત|બપોર|સવાર|સાંજ/,meridiemHour:function(M,b){return 12===M&&(M=0),"રાત"===b?M<4?M:M+12:"સવાર"===b?M:"બપોર"===b?M>=10?M:M+12:"સાંજ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"રાત":M<10?"સવાર":M<17?"બપોર":M<20?"સાંજ":"રાત"},week:{dow:0,doy:6}})}(z(381))},8315:function(M,b,z){!function(M){"use strict";M.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(M){return 2===M?"שעתיים":M+" שעות"},d:"יום",dd:function(M){return 2===M?"יומיים":M+" ימים"},M:"חודש",MM:function(M){return 2===M?"חודשיים":M+" חודשים"},y:"שנה",yy:function(M){return 2===M?"שנתיים":M%10==0&&10!==M?M+" שנה":M+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(M){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(M)},meridiem:function(M,b,z){return M<5?"לפנות בוקר":M<10?"בבוקר":M<12?z?'לפנה"צ':"לפני הצהריים":M<18?z?'אחה"צ':"אחרי הצהריים":"בערב"}})}(z(381))},94:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},p=[/^जन/i,/^फ़र|फर/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सितं|सित/i,/^अक्टू/i,/^नव|नवं/i,/^दिसं|दिस/i],e=[/^जन/i,/^फ़र/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सित/i,/^अक्टू/i,/^नव/i,/^दिस/i];M.defineLocale("hi",{months:{format:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),standalone:"जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर".split("_")},monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},monthsParse:p,longMonthsParse:p,shortMonthsParse:e,monthsRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsShortRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsStrictRegex:/^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,monthsShortStrictRegex:/^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(M,b){return 12===M&&(M=0),"रात"===b?M<4?M:M+12:"सुबह"===b?M:"दोपहर"===b?M>=10?M:M+12:"शाम"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"रात":M<10?"सुबह":M<17?"दोपहर":M<20?"शाम":"रात"},week:{dow:0,doy:6}})}(z(381))},316:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:return"[prošlu] [nedjelju] [u] LT";case 3:return"[prošlu] [srijedu] [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},2138:function(M,b,z){!function(M){"use strict";var b="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function z(M,b,z,p){var e=M;switch(z){case"s":return p||b?"néhány másodperc":"néhány másodperce";case"ss":return e+(p||b)?" másodperc":" másodperce";case"m":return"egy"+(p||b?" perc":" perce");case"mm":return e+(p||b?" perc":" perce");case"h":return"egy"+(p||b?" óra":" órája");case"hh":return e+(p||b?" óra":" órája");case"d":return"egy"+(p||b?" nap":" napja");case"dd":return e+(p||b?" nap":" napja");case"M":return"egy"+(p||b?" hónap":" hónapja");case"MM":return e+(p||b?" hónap":" hónapja");case"y":return"egy"+(p||b?" év":" éve");case"yy":return e+(p||b?" év":" éve")}return""}function p(M){return(M?"":"[múlt] ")+"["+b[this.day()]+"] LT[-kor]"}M.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(M){return"u"===M.charAt(1).toLowerCase()},meridiem:function(M,b,z){return M<12?!0===z?"de":"DE":!0===z?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return p.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return p.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:z,ss:z,m:z,mm:z,h:z,hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},1423:function(M,b,z){!function(M){"use strict";M.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",ss:"%d վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(M){return/^(ցերեկվա|երեկոյան)$/.test(M)},meridiem:function(M){return M<4?"գիշերվա":M<12?"առավոտվա":M<17?"ցերեկվա":"երեկոյան"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(M,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===M?M+"-ին":M+"-րդ";default:return M}},week:{dow:1,doy:7}})}(z(381))},9218:function(M,b,z){!function(M){"use strict";M.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"siang"===b?M>=11?M:M+12:"sore"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"siang":M<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(z(381))},8529:function(M,b,z){!function(M){"use strict";function b(M){return M%100==11||M%10!=1}function z(M,z,p,e){var o=M+" ";switch(p){case"s":return z||e?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return b(M)?o+(z||e?"sekúndur":"sekúndum"):o+"sekúnda";case"m":return z?"mínúta":"mínútu";case"mm":return b(M)?o+(z||e?"mínútur":"mínútum"):z?o+"mínúta":o+"mínútu";case"hh":return b(M)?o+(z||e?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return z?"dagur":e?"dag":"degi";case"dd":return b(M)?z?o+"dagar":o+(e?"daga":"dögum"):z?o+"dagur":o+(e?"dag":"degi");case"M":return z?"mánuður":e?"mánuð":"mánuði";case"MM":return b(M)?z?o+"mánuðir":o+(e?"mánuði":"mánuðum"):z?o+"mánuður":o+(e?"mánuð":"mánuði");case"y":return z||e?"ár":"ári";case"yy":return b(M)?o+(z||e?"ár":"árum"):o+(z||e?"ár":"ári")}}M.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:z,ss:z,m:z,mm:z,h:"klukkustund",hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},150:function(M,b,z){!function(M){"use strict";M.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(M){return(/^[0-9].+$/.test(M)?"tra":"in")+" "+M},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},626:function(M,b,z){!function(M){"use strict";M.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},9183:function(M,b,z){!function(M){"use strict";M.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"令和",narrow:"㋿",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"平成",narrow:"㍻",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"昭和",narrow:"㍼",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"大正",narrow:"㍽",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"明治",narrow:"㍾",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"西暦",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"紀元前",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(元|\d+)年/,eraYearOrdinalParse:function(M,b){return"元"===b[1]?1:parseInt(b[1]||M,10)},months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(M){return"午後"===M},meridiem:function(M,b,z){return M<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(M){return M.week()!==this.week()?"[来週]dddd LT":"dddd LT"},lastDay:"[昨日] LT",lastWeek:function(M){return this.week()!==M.week()?"[先週]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}日/,ordinal:function(M,b){switch(b){case"y":return 1===M?"元年":M+"年";case"d":case"D":case"DDD":return M+"日";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",ss:"%d秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})}(z(381))},4286:function(M,b,z){!function(M){"use strict";M.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(M,b){return 12===M&&(M=0),"enjing"===b?M:"siyang"===b?M>=11?M:M+12:"sonten"===b||"ndalu"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"enjing":M<15?"siyang":M<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(z(381))},2105:function(M,b,z){!function(M){"use strict";M.defineLocale("ka",{months:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(M){return M.replace(/(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,(function(M,b,z){return"ი"===z?b+"ში":b+z+"ში"}))},past:function(M){return/(წამი|წუთი|საათი|დღე|თვე)/.test(M)?M.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(M)?M.replace(/წელი$/,"წლის წინ"):M},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(M){return 0===M?M:1===M?M+"-ლი":M<20||M<=100&&M%20==0||M%100==0?"მე-"+M:M+"-ე"},week:{dow:1,doy:7}})}(z(381))},7772:function(M,b,z){!function(M){"use strict";var b={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};M.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},8758:function(M,b,z){!function(M){"use strict";var b={1:"១",2:"២",3:"៣",4:"៤",5:"៥",6:"៦",7:"៧",8:"៨",9:"៩",0:"០"},z={"១":"1","២":"2","៣":"3","៤":"4","៥":"5","៦":"6","៧":"7","៨":"8","៩":"9","០":"0"};M.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ព្រឹក|ល្ងាច/,isPM:function(M){return"ល្ងាច"===M},meridiem:function(M,b,z){return M<12?"ព្រឹក":"ល្ងាច"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",ss:"%d វិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},dayOfMonthOrdinalParse:/ទី\d{1,2}/,ordinal:"ទី%d",preparse:function(M){return M.replace(/[១២៣៤៥៦៧៨៩០]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(381))},9282:function(M,b,z){!function(M){"use strict";var b={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},z={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"};M.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(M){return M.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ರಾತ್ರಿ"===b?M<4?M:M+12:"ಬೆಳಿಗ್ಗೆ"===b?M:"ಮಧ್ಯಾಹ್ನ"===b?M>=10?M:M+12:"ಸಂಜೆ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ರಾತ್ರಿ":M<10?"ಬೆಳಿಗ್ಗೆ":M<17?"ಮಧ್ಯಾಹ್ನ":M<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(M){return M+"ನೇ"},week:{dow:0,doy:6}})}(z(381))},3730:function(M,b,z){!function(M){"use strict";M.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"일";case"M":return M+"월";case"w":case"W":return M+"주";default:return M}},meridiemParse:/오전|오후/,isPM:function(M){return"오후"===M},meridiem:function(M,b,z){return M<12?"오전":"오후"}})}(z(381))},1408:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمموز","ئاب","ئەیلوول","تشرینی یەكەم","تشرینی دووەم","كانونی یەکەم"];M.defineLocale("ku",{months:p,monthsShort:p,weekdays:"یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌".split("_"),weekdaysShort:"یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌".split("_"),weekdaysMin:"ی_د_س_چ_پ_ه_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ئێواره‌|به‌یانی/,isPM:function(M){return/ئێواره‌/.test(M)},meridiem:function(M,b,z){return M<12?"به‌یانی":"ئێواره‌"},calendar:{sameDay:"[ئه‌مرۆ كاتژمێر] LT",nextDay:"[به‌یانی كاتژمێر] LT",nextWeek:"dddd [كاتژمێر] LT",lastDay:"[دوێنێ كاتژمێر] LT",lastWeek:"dddd [كاتژمێر] LT",sameElse:"L"},relativeTime:{future:"له‌ %s",past:"%s",s:"چه‌ند چركه‌یه‌ك",ss:"چركه‌ %d",m:"یه‌ك خوله‌ك",mm:"%d خوله‌ك",h:"یه‌ك كاتژمێر",hh:"%d كاتژمێر",d:"یه‌ك ڕۆژ",dd:"%d ڕۆژ",M:"یه‌ك مانگ",MM:"%d مانگ",y:"یه‌ك ساڵ",yy:"%d ساڵ"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},3291:function(M,b,z){!function(M){"use strict";var b={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};M.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кечээ саат] LT",lastWeek:"[Өткөн аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",ss:"%d секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},6841:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?e[z][0]:e[z][1]}function z(M){return e(M.substr(0,M.indexOf(" ")))?"a "+M:"an "+M}function p(M){return e(M.substr(0,M.indexOf(" ")))?"viru "+M:"virun "+M}function e(M){if(M=parseInt(M,10),isNaN(M))return!1;if(M<0)return!0;if(M<10)return 4<=M&&M<=7;if(M<100){var b=M%10;return e(0===b?M/10:b)}if(M<1e4){for(;M>=10;)M/=10;return e(M)}return e(M/=1e3)}M.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:z,past:p,s:"e puer Sekonnen",ss:"%d Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},5466:function(M,b,z){!function(M){"use strict";M.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(M){return"ຕອນແລງ"===M},meridiem:function(M,b,z){return M<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",ss:"%d ວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},dayOfMonthOrdinalParse:/(ທີ່)\d{1,2}/,ordinal:function(M){return"ທີ່"+M}})}(z(381))},7010:function(M,b,z){!function(M){"use strict";var b={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function z(M,b,z,p){return b?"kelios sekundės":p?"kelių sekundžių":"kelias sekundes"}function p(M,b,z,p){return b?o(z)[0]:p?o(z)[1]:o(z)[2]}function e(M){return M%10==0||M>10&&M<20}function o(M){return b[M].split("_")}function O(M,b,z,O){var n=M+" ";return 1===M?n+p(M,b,z[0],O):b?n+(e(M)?o(z)[1]:o(z)[0]):O?n+o(z)[1]:n+(e(M)?o(z)[1]:o(z)[2])}M.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:z,ss:O,m:p,mm:O,h:p,hh:O,d:p,dd:O,M:p,MM:O,y:p,yy:O},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(M){return M+"-oji"},week:{dow:1,doy:4}})}(z(381))},7595:function(M,b,z){!function(M){"use strict";var b={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function z(M,b,z){return z?b%10==1&&b%100!=11?M[2]:M[3]:b%10==1&&b%100!=11?M[0]:M[1]}function p(M,p,e){return M+" "+z(b[e],M,p)}function e(M,p,e){return z(b[e],M,p)}function o(M,b){return b?"dažas sekundes":"dažām sekundēm"}M.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:o,ss:p,m:e,mm:p,h:e,hh:p,d:e,dd:p,M:e,MM:p,y:e,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9861:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mjesec",MM:b.translate,y:"godinu",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},5493:function(M,b,z){!function(M){"use strict";M.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},5966:function(M,b,z){!function(M){"use strict";M.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"за %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"една минута",mm:"%d минути",h:"еден час",hh:"%d часа",d:"еден ден",dd:"%d дена",M:"еден месец",MM:"%d месеци",y:"една година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(381))},7341:function(M,b,z){!function(M){"use strict";M.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(M,b){return 12===M&&(M=0),"രാത്രി"===b&&M>=4||"ഉച്ച കഴിഞ്ഞ്"===b||"വൈകുന്നേരം"===b?M+12:M},meridiem:function(M,b,z){return M<4?"രാത്രി":M<12?"രാവിലെ":M<17?"ഉച്ച കഴിഞ്ഞ്":M<20?"വൈകുന്നേരം":"രാത്രി"}})}(z(381))},5115:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){switch(z){case"s":return b?"хэдхэн секунд":"хэдхэн секундын";case"ss":return M+(b?" секунд":" секундын");case"m":case"mm":return M+(b?" минут":" минутын");case"h":case"hh":return M+(b?" цаг":" цагийн");case"d":case"dd":return M+(b?" өдөр":" өдрийн");case"M":case"MM":return M+(b?" сар":" сарын");case"y":case"yy":return M+(b?" жил":" жилийн");default:return M}}M.defineLocale("mn",{months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),monthsParseExact:!0,weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},meridiemParse:/ҮӨ|ҮХ/i,isPM:function(M){return"ҮХ"===M},meridiem:function(M,b,z){return M<12?"ҮӨ":"ҮХ"},calendar:{sameDay:"[Өнөөдөр] LT",nextDay:"[Маргааш] LT",nextWeek:"[Ирэх] dddd LT",lastDay:"[Өчигдөр] LT",lastWeek:"[Өнгөрсөн] dddd LT",sameElse:"L"},relativeTime:{future:"%s дараа",past:"%s өмнө",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2} өдөр/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+" өдөр";default:return M}}})}(z(381))},370:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function p(M,b,z,p){var e="";if(b)switch(z){case"s":e="काही सेकंद";break;case"ss":e="%d सेकंद";break;case"m":e="एक मिनिट";break;case"mm":e="%d मिनिटे";break;case"h":e="एक तास";break;case"hh":e="%d तास";break;case"d":e="एक दिवस";break;case"dd":e="%d दिवस";break;case"M":e="एक महिना";break;case"MM":e="%d महिने";break;case"y":e="एक वर्ष";break;case"yy":e="%d वर्षे"}else switch(z){case"s":e="काही सेकंदां";break;case"ss":e="%d सेकंदां";break;case"m":e="एका मिनिटा";break;case"mm":e="%d मिनिटां";break;case"h":e="एका तासा";break;case"hh":e="%d तासां";break;case"d":e="एका दिवसा";break;case"dd":e="%d दिवसां";break;case"M":e="एका महिन्या";break;case"MM":e="%d महिन्यां";break;case"y":e="एका वर्षा";break;case"yy":e="%d वर्षां"}return e.replace(/%d/i,M)}M.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,meridiemHour:function(M,b){return 12===M&&(M=0),"पहाटे"===b||"सकाळी"===b?M:"दुपारी"===b||"सायंकाळी"===b||"रात्री"===b?M>=12?M:M+12:void 0},meridiem:function(M,b,z){return M>=0&&M<6?"पहाटे":M<12?"सकाळी":M<17?"दुपारी":M<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}(z(381))},1237:function(M,b,z){!function(M){"use strict";M.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(381))},9847:function(M,b,z){!function(M){"use strict";M.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(381))},2126:function(M,b,z){!function(M){"use strict";M.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6165:function(M,b,z){!function(M){"use strict";var b={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},z={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};M.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(M){return M.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(381))},4924:function(M,b,z){!function(M){"use strict";M.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},6744:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};M.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(M,b){return 12===M&&(M=0),"राति"===b?M<4?M:M+12:"बिहान"===b?M:"दिउँसो"===b?M>=10?M:M+12:"साँझ"===b?M+12:void 0},meridiem:function(M,b,z){return M<3?"राति":M<12?"बिहान":M<16?"दिउँसो":M<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}})}(z(381))},9814:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},3901:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",w:"één week",ww:"%d weken",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},3877:function(M,b,z){!function(M){"use strict";M.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._må._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_må_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2135:function(M,b,z){!function(M){"use strict";M.defineLocale("oc-lnc",{months:{standalone:"genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre".split("_"),format:"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[uèi a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[ièr a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(381))},5858:function(M,b,z){!function(M){"use strict";var b={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},z={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};M.defineLocale("pa-in",{months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"[ਅਗਲਾ] dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",ss:"%d ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(M){return M.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ਰਾਤ"===b?M<4?M:M+12:"ਸਵੇਰ"===b?M:"ਦੁਪਹਿਰ"===b?M>=10?M:M+12:"ਸ਼ਾਮ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ਰਾਤ":M<10?"ਸਵੇਰ":M<17?"ਦੁਪਹਿਰ":M<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,doy:6}})}(z(381))},4495:function(M,b,z){!function(M){"use strict";var b="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),z="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),p=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^paź/i,/^lis/i,/^gru/i];function e(M){return M%10<5&&M%10>1&&~~(M/10)%10!=1}function o(M,b,z){var p=M+" ";switch(z){case"ss":return p+(e(M)?"sekundy":"sekund");case"m":return b?"minuta":"minutę";case"mm":return p+(e(M)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return p+(e(M)?"godziny":"godzin");case"ww":return p+(e(M)?"tygodnie":"tygodni");case"MM":return p+(e(M)?"miesiące":"miesięcy");case"yy":return p+(e(M)?"lata":"lat")}}M.defineLocale("pl",{months:function(M,p){return M?/D MMMM/.test(p)?z[M.month()]:b[M.month()]:b},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:o,m:o,mm:o,h:o,hh:o,d:"1 dzień",dd:"%d dni",w:"tydzień",ww:o,M:"miesiąc",MM:o,y:"rok",yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},7971:function(M,b,z){!function(M){"use strict";M.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"do_2ª_3ª_4ª_5ª_6ª_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",invalidDate:"Data inválida"})}(z(381))},9520:function(M,b,z){!function(M){"use strict";M.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6459:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=" ";return(M%100>=20||M>=100&&M%100==0)&&(p=" de "),M+p+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"săptămâni",MM:"luni",yy:"ani"}[z]}M.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:b,m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,w:"o săptămână",ww:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}(z(381))},1793:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"минута":"минуту":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",ww:"неделя_недели_недель",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[p],+M)}var p=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];M.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:z,m:z,mm:z,h:"час",hh:z,d:"день",dd:z,w:"неделя",ww:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(M){return/^(дня|вечера)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночи":M<12?"утра":M<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":return M+"-й";case"D":return M+"-го";case"w":case"W":return M+"-я";default:return M}},week:{dow:1,doy:4}})}(z(381))},950:function(M,b,z){!function(M){"use strict";var b=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],z=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"];M.defineLocale("sd",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(381))},490:function(M,b,z){!function(M){"use strict";M.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},124:function(M,b,z){!function(M){"use strict";M.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",ss:"තත්පර %d",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},dayOfMonthOrdinalParse:/\d{1,2} වැනි/,ordinal:function(M){return M+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(M){return"ප.ව."===M||"පස් වරු"===M},meridiem:function(M,b,z){return M>11?z?"ප.ව.":"පස් වරු":z?"පෙ.ව.":"පෙර වරු"}})}(z(381))},4249:function(M,b,z){!function(M){"use strict";var b="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),z="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function p(M){return M>1&&M<5}function e(M,b,z,e){var o=M+" ";switch(z){case"s":return b||e?"pár sekúnd":"pár sekundami";case"ss":return b||e?o+(p(M)?"sekundy":"sekúnd"):o+"sekundami";case"m":return b?"minúta":e?"minútu":"minútou";case"mm":return b||e?o+(p(M)?"minúty":"minút"):o+"minútami";case"h":return b?"hodina":e?"hodinu":"hodinou";case"hh":return b||e?o+(p(M)?"hodiny":"hodín"):o+"hodinami";case"d":return b||e?"deň":"dňom";case"dd":return b||e?o+(p(M)?"dni":"dní"):o+"dňami";case"M":return b||e?"mesiac":"mesiacom";case"MM":return b||e?o+(p(M)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return b||e?"rok":"rokom";case"yy":return b||e?o+(p(M)?"roky":"rokov"):o+"rokmi"}}M.defineLocale("sk",{months:b,monthsShort:z,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},4985:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e=M+" ";switch(z){case"s":return b||p?"nekaj sekund":"nekaj sekundami";case"ss":return e+=1===M?b?"sekundo":"sekundi":2===M?b||p?"sekundi":"sekundah":M<5?b||p?"sekunde":"sekundah":"sekund";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===M?b?"minuta":"minuto":2===M?b||p?"minuti":"minutama":M<5?b||p?"minute":"minutami":b||p?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===M?b?"ura":"uro":2===M?b||p?"uri":"urama":M<5?b||p?"ure":"urami":b||p?"ur":"urami";case"d":return b||p?"en dan":"enim dnem";case"dd":return e+=1===M?b||p?"dan":"dnem":2===M?b||p?"dni":"dnevoma":b||p?"dni":"dnevi";case"M":return b||p?"en mesec":"enim mesecem";case"MM":return e+=1===M?b||p?"mesec":"mesecem":2===M?b||p?"meseca":"mesecema":M<5?b||p?"mesece":"meseci":b||p?"mesecev":"meseci";case"y":return b||p?"eno leto":"enim letom";case"yy":return e+=1===M?b||p?"leto":"letom":2===M?b||p?"leti":"letoma":M<5?b||p?"leta":"leti":b||p?"let":"leti"}}M.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},1104:function(M,b,z){!function(M){"use strict";M.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(M){return"M"===M.charAt(0)},meridiem:function(M,b,z){return M<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9915:function(M,b,z){!function(M){"use strict";var b={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"месец",MM:b.translate,y:"годину",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},9131:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var e=b.words[p];return 1===p.length?z?e[0]:e[1]:M+" "+b.correctGrammaticalCase(M,e)}};M.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},5893:function(M,b,z){!function(M){"use strict";M.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(M,b,z){return M<11?"ekuseni":M<15?"emini":M<19?"entsambama":"ebusuku"},meridiemHour:function(M,b){return 12===M&&(M=0),"ekuseni"===b?M:"emini"===b?M>=11?M:M+12:"entsambama"===b||"ebusuku"===b?0===M?0:M+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(z(381))},8760:function(M,b,z){!function(M){"use strict";M.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?":e":1===b||2===b?":a":":e")},week:{dow:1,doy:4}})}(z(381))},1172:function(M,b,z){!function(M){"use strict";M.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(z(381))},7333:function(M,b,z){!function(M){"use strict";var b={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},z={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};M.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(M){return M+"வது"},preparse:function(M){return M.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(M,b,z){return M<2?" யாமம்":M<6?" வைகறை":M<10?" காலை":M<14?" நண்பகல்":M<18?" எற்பாடு":M<22?" மாலை":" யாமம்"},meridiemHour:function(M,b){return 12===M&&(M=0),"யாமம்"===b?M<2?M:M+12:"வைகறை"===b||"காலை"===b||"நண்பகல்"===b&&M>=10?M:M+12},week:{dow:0,doy:6}})}(z(381))},3110:function(M,b,z){!function(M){"use strict";M.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(M,b){return 12===M&&(M=0),"రాత్రి"===b?M<4?M:M+12:"ఉదయం"===b?M:"మధ్యాహ్నం"===b?M>=10?M:M+12:"సాయంత్రం"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"రాత్రి":M<10?"ఉదయం":M<17?"మధ్యాహ్నం":M<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}})}(z(381))},2095:function(M,b,z){!function(M){"use strict";M.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},7321:function(M,b,z){!function(M){"use strict";var b={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};M.defineLocale("tg",{months:{format:"январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри".split("_"),standalone:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_")},monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Фардо соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(M,b){return 12===M&&(M=0),"шаб"===b?M<4?M:M+12:"субҳ"===b?M:"рӯз"===b?M>=11?M:M+12:"бегоҳ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"шаб":M<11?"субҳ":M<16?"рӯз":M<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},9041:function(M,b,z){!function(M){"use strict";M.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(M){return"หลังเที่ยง"===M},meridiem:function(M,b,z){return M<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",w:"1 สัปดาห์",ww:"%d สัปดาห์",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}(z(381))},9005:function(M,b,z){!function(M){"use strict";var b={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'ünji",4:"'ünji",100:"'ünji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};M.defineLocale("tk",{months:"Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr".split("_"),monthsShort:"Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek".split("_"),weekdays:"Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe".split("_"),weekdaysShort:"Ýek_Duş_Siş_Çar_Pen_Ann_Şen".split("_"),weekdaysMin:"Ýk_Dş_Sş_Çr_Pn_An_Şn".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[düýn] LT",lastWeek:"[geçen] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s soň",past:"%s öň",s:"birnäçe sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir gün",dd:"%d gün",M:"bir aý",MM:"%d aý",y:"bir ýyl",yy:"%d ýyl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'unjy";var p=M%10,e=M%100-p,o=M>=100?100:null;return M+(b[p]||b[e]||b[o])}},week:{dow:1,doy:7}})}(z(381))},5768:function(M,b,z){!function(M){"use strict";M.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},9444:function(M,b,z){!function(M){"use strict";var b="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function z(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"leS":-1!==M.indexOf("jar")?b.slice(0,-3)+"waQ":-1!==M.indexOf("DIS")?b.slice(0,-3)+"nem":b+" pIq"}function p(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"Hu’":-1!==M.indexOf("jar")?b.slice(0,-3)+"wen":-1!==M.indexOf("DIS")?b.slice(0,-3)+"ben":b+" ret"}function e(M,b,z,p){var e=o(M);switch(z){case"ss":return e+" lup";case"mm":return e+" tup";case"hh":return e+" rep";case"dd":return e+" jaj";case"MM":return e+" jar";case"yy":return e+" DIS"}}function o(M){var z=Math.floor(M%1e3/100),p=Math.floor(M%100/10),e=M%10,o="";return z>0&&(o+=b[z]+"vatlh"),p>0&&(o+=(""!==o?" ":"")+b[p]+"maH"),e>0&&(o+=(""!==o?" ":"")+b[e]),""===o?"pagh":o}M.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:z,past:p,s:"puS lup",ss:e,m:"wa’ tup",mm:e,h:"wa’ rep",hh:e,d:"wa’ jaj",dd:e,M:"wa’ jar",MM:e,y:"wa’ DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2397:function(M,b,z){!function(M){"use strict";var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};M.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),meridiem:function(M,b,z){return M<12?z?"öö":"ÖÖ":z?"ös":"ÖS"},meridiemParse:/öö|ÖÖ|ös|ÖS/,isPM:function(M){return"ös"===M||"ÖS"===M},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'ıncı";var p=M%10,e=M%100-p,o=M>=100?100:null;return M+(b[p]||b[e]||b[o])}},week:{dow:1,doy:7}})}(z(381))},8254:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var e={s:["viensas secunds","'iensas secunds"],ss:[M+" secunds",M+" secunds"],m:["'n míut","'iens míut"],mm:[M+" míuts",M+" míuts"],h:["'n þora","'iensa þora"],hh:[M+" þoras",M+" þoras"],d:["'n ziua","'iensa ziua"],dd:[M+" ziuas",M+" ziuas"],M:["'n mes","'iens mes"],MM:[M+" mesen",M+" mesen"],y:["'n ar","'iens ar"],yy:[M+" ars",M+" ars"]};return p||b?e[z][0]:e[z][1]}M.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(M){return"d'o"===M.toLowerCase()},meridiem:function(M,b,z){return M>11?z?"d'o":"D'O":z?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},699:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(z(381))},1106:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",ss:"%d ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}(z(381))},9288:function(M,b,z){!function(M){"use strict";M.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(M,b){return 12===M&&(M=0),"يېرىم كېچە"===b||"سەھەر"===b||"چۈشتىن بۇرۇن"===b?M:"چۈشتىن كېيىن"===b||"كەچ"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"يېرىم كېچە":p<900?"سەھەر":p<1130?"چۈشتىن بۇرۇن":p<1230?"چۈش":p<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"-كۈنى";case"w":case"W":return M+"-ھەپتە";default:return M}},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:7}})}(z(381))},7691:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвилина":"хвилину":"h"===p?z?"година":"годину":M+" "+b({ss:z?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:z?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:z?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"}[p],+M)}function p(M,b){var z={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};return!0===M?z.nominative.slice(1,7).concat(z.nominative.slice(0,1)):M?z[/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative"][M.day()]:z.nominative}function e(M){return function(){return M+"о"+(11===this.hours()?"б":"")+"] LT"}}M.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:p,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:e("[Сьогодні "),nextDay:e("[Завтра "),lastDay:e("[Вчора "),nextWeek:e("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[Минулої] dddd [").call(this);case 1:case 2:case 4:return e("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:z,m:z,mm:z,h:"годину",hh:z,d:"день",dd:z,M:"місяць",MM:z,y:"рік",yy:z},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(M){return/^(дня|вечора)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночі":M<12?"ранку":M<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M+"-й";case"D":return M+"-го";default:return M}},week:{dow:1,doy:7}})}(z(381))},3795:function(M,b,z){!function(M){"use strict";var b=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],z=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];M.defineLocale("ur",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(381))},588:function(M,b,z){!function(M){"use strict";M.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(z(381))},6791:function(M,b,z){!function(M){"use strict";M.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",ss:"%d фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}(z(381))},5666:function(M,b,z){!function(M){"use strict";M.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(M){return/^ch$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"sa":"SA":z?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần trước lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",w:"một tuần",ww:"%d tuần",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},4378:function(M,b,z){!function(M){"use strict";M.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",ss:"%d s~écóñ~ds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},5805:function(M,b,z){!function(M){"use strict";M.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}})}(z(381))},3839:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"下午"===b||"晚上"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(M){return M.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(M){return this.week()!==M.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"周";default:return M}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})}(z(381))},5726:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1200?"上午":1200===p?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},9807:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-mo",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"D/M/YYYY",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},4152:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},6700:(M,b,z)=>{var p={"./af":2786,"./af.js":2786,"./ar":867,"./ar-dz":4130,"./ar-dz.js":4130,"./ar-kw":6135,"./ar-kw.js":6135,"./ar-ly":6440,"./ar-ly.js":6440,"./ar-ma":7702,"./ar-ma.js":7702,"./ar-sa":6040,"./ar-sa.js":6040,"./ar-tn":7100,"./ar-tn.js":7100,"./ar.js":867,"./az":1083,"./az.js":1083,"./be":9808,"./be.js":9808,"./bg":8338,"./bg.js":8338,"./bm":7438,"./bm.js":7438,"./bn":8905,"./bn-bd":6225,"./bn-bd.js":6225,"./bn.js":8905,"./bo":1560,"./bo.js":1560,"./br":1278,"./br.js":1278,"./bs":622,"./bs.js":622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":877,"./cv.js":877,"./cy":7373,"./cy.js":7373,"./da":4780,"./da.js":4780,"./de":9740,"./de-at":217,"./de-at.js":217,"./de-ch":894,"./de-ch.js":894,"./de.js":9740,"./dv":5300,"./dv.js":5300,"./el":837,"./el.js":837,"./en-au":8348,"./en-au.js":8348,"./en-ca":7925,"./en-ca.js":7925,"./en-gb":2243,"./en-gb.js":2243,"./en-ie":6436,"./en-ie.js":6436,"./en-il":7207,"./en-il.js":7207,"./en-in":2127,"./en-in.js":2127,"./en-nz":6319,"./en-nz.js":6319,"./en-sg":1662,"./en-sg.js":1662,"./eo":2915,"./eo.js":2915,"./es":5655,"./es-do":5251,"./es-do.js":5251,"./es-mx":6112,"./es-mx.js":6112,"./es-us":1146,"./es-us.js":1146,"./es.js":5655,"./et":5603,"./et.js":5603,"./eu":7763,"./eu.js":7763,"./fa":6959,"./fa.js":6959,"./fi":1897,"./fi.js":1897,"./fil":2549,"./fil.js":2549,"./fo":4694,"./fo.js":4694,"./fr":4470,"./fr-ca":3049,"./fr-ca.js":3049,"./fr-ch":2330,"./fr-ch.js":2330,"./fr.js":4470,"./fy":5044,"./fy.js":5044,"./ga":9295,"./ga.js":9295,"./gd":2101,"./gd.js":2101,"./gl":8794,"./gl.js":8794,"./gom-deva":7884,"./gom-deva.js":7884,"./gom-latn":7149,"./gom-latn.js":7149,"./gu":5349,"./gu.js":5349,"./he":8315,"./he.js":8315,"./hi":94,"./hi.js":94,"./hr":316,"./hr.js":316,"./hu":2138,"./hu.js":2138,"./hy-am":1423,"./hy-am.js":1423,"./id":9218,"./id.js":9218,"./is":8529,"./is.js":8529,"./it":626,"./it-ch":150,"./it-ch.js":150,"./it.js":626,"./ja":9183,"./ja.js":9183,"./jv":4286,"./jv.js":4286,"./ka":2105,"./ka.js":2105,"./kk":7772,"./kk.js":7772,"./km":8758,"./km.js":8758,"./kn":9282,"./kn.js":9282,"./ko":3730,"./ko.js":3730,"./ku":1408,"./ku.js":1408,"./ky":3291,"./ky.js":3291,"./lb":6841,"./lb.js":6841,"./lo":5466,"./lo.js":5466,"./lt":7010,"./lt.js":7010,"./lv":7595,"./lv.js":7595,"./me":9861,"./me.js":9861,"./mi":5493,"./mi.js":5493,"./mk":5966,"./mk.js":5966,"./ml":7341,"./ml.js":7341,"./mn":5115,"./mn.js":5115,"./mr":370,"./mr.js":370,"./ms":9847,"./ms-my":1237,"./ms-my.js":1237,"./ms.js":9847,"./mt":2126,"./mt.js":2126,"./my":6165,"./my.js":6165,"./nb":4924,"./nb.js":4924,"./ne":6744,"./ne.js":6744,"./nl":3901,"./nl-be":9814,"./nl-be.js":9814,"./nl.js":3901,"./nn":3877,"./nn.js":3877,"./oc-lnc":2135,"./oc-lnc.js":2135,"./pa-in":5858,"./pa-in.js":5858,"./pl":4495,"./pl.js":4495,"./pt":9520,"./pt-br":7971,"./pt-br.js":7971,"./pt.js":9520,"./ro":6459,"./ro.js":6459,"./ru":1793,"./ru.js":1793,"./sd":950,"./sd.js":950,"./se":490,"./se.js":490,"./si":124,"./si.js":124,"./sk":4249,"./sk.js":4249,"./sl":4985,"./sl.js":4985,"./sq":1104,"./sq.js":1104,"./sr":9131,"./sr-cyrl":9915,"./sr-cyrl.js":9915,"./sr.js":9131,"./ss":5893,"./ss.js":5893,"./sv":8760,"./sv.js":8760,"./sw":1172,"./sw.js":1172,"./ta":7333,"./ta.js":7333,"./te":3110,"./te.js":3110,"./tet":2095,"./tet.js":2095,"./tg":7321,"./tg.js":7321,"./th":9041,"./th.js":9041,"./tk":9005,"./tk.js":9005,"./tl-ph":5768,"./tl-ph.js":5768,"./tlh":9444,"./tlh.js":9444,"./tr":2397,"./tr.js":2397,"./tzl":8254,"./tzl.js":8254,"./tzm":1106,"./tzm-latn":699,"./tzm-latn.js":699,"./tzm.js":1106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":7691,"./uk.js":7691,"./ur":3795,"./ur.js":3795,"./uz":6791,"./uz-latn":588,"./uz-latn.js":588,"./uz.js":6791,"./vi":5666,"./vi.js":5666,"./x-pseudo":4378,"./x-pseudo.js":4378,"./yo":5805,"./yo.js":5805,"./zh-cn":3839,"./zh-cn.js":3839,"./zh-hk":5726,"./zh-hk.js":5726,"./zh-mo":9807,"./zh-mo.js":9807,"./zh-tw":4152,"./zh-tw.js":4152};function e(M){var b=o(M);return z(b)}function o(M){if(!z.o(p,M)){var b=new Error("Cannot find module '"+M+"'");throw b.code="MODULE_NOT_FOUND",b}return p[M]}e.keys=function(){return Object.keys(p)},e.resolve=o,M.exports=e,e.id=6700},381:function(M,b,z){(M=z.nmd(M)).exports=function(){"use strict";var b,p;function e(){return b.apply(null,arguments)}function o(M){b=M}function O(M){return M instanceof Array||"[object Array]"===Object.prototype.toString.call(M)}function n(M){return null!=M&&"[object Object]"===Object.prototype.toString.call(M)}function a(M,b){return Object.prototype.hasOwnProperty.call(M,b)}function t(M){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(M).length;var b;for(b in M)if(a(M,b))return!1;return!0}function d(M){return void 0===M}function c(M){return"number"==typeof M||"[object Number]"===Object.prototype.toString.call(M)}function A(M){return M instanceof Date||"[object Date]"===Object.prototype.toString.call(M)}function r(M,b){var z,p=[];for(z=0;z>>0;for(b=0;b0)for(z=0;z=0?z?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+p}var v=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,S=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,F={},j={};function x(M,b,z,p){var e=p;"string"==typeof p&&(e=function(){return this[p]()}),M&&(j[M]=e),b&&(j[b[0]]=function(){return w(e.apply(this,arguments),b[1],b[2])}),z&&(j[z]=function(){return this.localeData().ordinal(e.apply(this,arguments),M)})}function E(M){return M.match(/\[[\s\S]/)?M.replace(/^\[|\]$/g,""):M.replace(/\\/g,"")}function P(M){var b,z,p=M.match(v);for(b=0,z=p.length;b=0&&S.test(M);)M=M.replace(S,p),S.lastIndex=0,z-=1;return M}var V={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function U(M){var b=this._longDateFormat[M],z=this._longDateFormat[M.toUpperCase()];return b||!z?b:(this._longDateFormat[M]=z.match(v).map((function(M){return"MMMM"===M||"MM"===M||"DD"===M||"dddd"===M?M.slice(1):M})).join(""),this._longDateFormat[M])}var J="Invalid date";function G(){return this._invalidDate}var K="%d",Q=/\d{1,2}/;function Z(M){return this._ordinal.replace("%d",M)}var $={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function MM(M,b,z,p){var e=this._relativeTime[z];return T(e)?e(M,b,z,p):e.replace(/%d/i,M)}function bM(M,b){var z=this._relativeTime[M>0?"future":"past"];return T(z)?z(b):z.replace(/%s/i,b)}var zM={};function pM(M,b){var z=M.toLowerCase();zM[z]=zM[z+"s"]=zM[b]=M}function eM(M){return"string"==typeof M?zM[M]||zM[M.toLowerCase()]:void 0}function oM(M){var b,z,p={};for(z in M)a(M,z)&&(b=eM(z))&&(p[b]=M[z]);return p}var OM={};function nM(M,b){OM[M]=b}function aM(M){var b,z=[];for(b in M)a(M,b)&&z.push({unit:b,priority:OM[b]});return z.sort((function(M,b){return M.priority-b.priority})),z}function tM(M){return M%4==0&&M%100!=0||M%400==0}function dM(M){return M<0?Math.ceil(M)||0:Math.floor(M)}function cM(M){var b=+M,z=0;return 0!==b&&isFinite(b)&&(z=dM(b)),z}function AM(M,b){return function(z){return null!=z?(sM(this,M,z),e.updateOffset(this,b),this):rM(this,M)}}function rM(M,b){return M.isValid()?M._d["get"+(M._isUTC?"UTC":"")+b]():NaN}function sM(M,b,z){M.isValid()&&!isNaN(z)&&("FullYear"===b&&tM(M.year())&&1===M.month()&&29===M.date()?(z=cM(z),M._d["set"+(M._isUTC?"UTC":"")+b](z,M.month(),Mb(z,M.month()))):M._d["set"+(M._isUTC?"UTC":"")+b](z))}function iM(M){return T(this[M=eM(M)])?this[M]():this}function qM(M,b){if("object"==typeof M){var z,p=aM(M=oM(M));for(z=0;z68?1900:2e3)};var ub=AM("FullYear",!0);function _b(){return tM(this.year())}function Wb(M,b,z,p,e,o,O){var n;return M<100&&M>=0?(n=new Date(M+400,b,z,p,e,o,O),isFinite(n.getFullYear())&&n.setFullYear(M)):n=new Date(M,b,z,p,e,o,O),n}function lb(M){var b,z;return M<100&&M>=0?((z=Array.prototype.slice.call(arguments))[0]=M+400,b=new Date(Date.UTC.apply(null,z)),isFinite(b.getUTCFullYear())&&b.setUTCFullYear(M)):b=new Date(Date.UTC.apply(null,arguments)),b}function mb(M,b,z){var p=7+b-z;return-(7+lb(M,0,p).getUTCDay()-b)%7+p-1}function Lb(M,b,z,p,e){var o,O,n=1+7*(b-1)+(7+z-p)%7+mb(M,p,e);return n<=0?O=qb(o=M-1)+n:n>qb(M)?(o=M+1,O=n-qb(M)):(o=M,O=n),{year:o,dayOfYear:O}}function fb(M,b,z){var p,e,o=mb(M.year(),b,z),O=Math.floor((M.dayOfYear()-o-1)/7)+1;return O<1?p=O+hb(e=M.year()-1,b,z):O>hb(M.year(),b,z)?(p=O-hb(M.year(),b,z),e=M.year()+1):(e=M.year(),p=O),{week:p,year:e}}function hb(M,b,z){var p=mb(M,b,z),e=mb(M+1,b,z);return(qb(M)-p+e)/7}function Rb(M){return fb(M,this._week.dow,this._week.doy).week}x("w",["ww",2],"wo","week"),x("W",["WW",2],"Wo","isoWeek"),pM("week","w"),pM("isoWeek","W"),nM("week",5),nM("isoWeek",5),HM("w",fM),HM("ww",fM,WM),HM("W",fM),HM("WW",fM,WM),xM(["w","ww","W","WW"],(function(M,b,z,p){b[p.substr(0,1)]=cM(M)}));var Bb={dow:0,doy:6};function yb(){return this._week.dow}function Xb(){return this._week.doy}function Yb(M){var b=this.localeData().week(this);return null==M?b:this.add(7*(M-b),"d")}function Tb(M){var b=fb(this,1,4).week;return null==M?b:this.add(7*(M-b),"d")}function Db(M,b){return"string"!=typeof M?M:isNaN(M)?"number"==typeof(M=b.weekdaysParse(M))?M:null:parseInt(M,10)}function kb(M,b){return"string"==typeof M?b.weekdaysParse(M)%7||7:isNaN(M)?null:M}function Nb(M,b){return M.slice(b,7).concat(M.slice(0,b))}x("d",0,"do","day"),x("dd",0,0,(function(M){return this.localeData().weekdaysMin(this,M)})),x("ddd",0,0,(function(M){return this.localeData().weekdaysShort(this,M)})),x("dddd",0,0,(function(M){return this.localeData().weekdays(this,M)})),x("e",0,0,"weekday"),x("E",0,0,"isoWeekday"),pM("day","d"),pM("weekday","e"),pM("isoWeekday","E"),nM("day",11),nM("weekday",11),nM("isoWeekday",11),HM("d",fM),HM("e",fM),HM("E",fM),HM("dd",(function(M,b){return b.weekdaysMinRegex(M)})),HM("ddd",(function(M,b){return b.weekdaysShortRegex(M)})),HM("dddd",(function(M,b){return b.weekdaysRegex(M)})),xM(["dd","ddd","dddd"],(function(M,b,z,p){var e=z._locale.weekdaysParse(M,p,z._strict);null!=e?b.d=e:u(z).invalidWeekday=M})),xM(["d","e","E"],(function(M,b,z,p){b[p]=cM(M)}));var gb="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Hb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),wb="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),vb=gM,Sb=gM,Fb=gM;function jb(M,b){var z=O(this._weekdays)?this._weekdays:this._weekdays[M&&!0!==M&&this._weekdays.isFormat.test(b)?"format":"standalone"];return!0===M?Nb(z,this._week.dow):M?z[M.day()]:z}function xb(M){return!0===M?Nb(this._weekdaysShort,this._week.dow):M?this._weekdaysShort[M.day()]:this._weekdaysShort}function Eb(M){return!0===M?Nb(this._weekdaysMin,this._week.dow):M?this._weekdaysMin[M.day()]:this._weekdaysMin}function Pb(M,b,z){var p,e,o,O=M.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)o=i([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(o,"").toLocaleLowerCase();return z?"dddd"===b?-1!==(e=PM.call(this._weekdaysParse,O))?e:null:"ddd"===b?-1!==(e=PM.call(this._shortWeekdaysParse,O))?e:null:-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:"dddd"===b?-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._shortWeekdaysParse,O))||-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:"ddd"===b?-1!==(e=PM.call(this._shortWeekdaysParse,O))||-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._minWeekdaysParse,O))?e:null:-1!==(e=PM.call(this._minWeekdaysParse,O))||-1!==(e=PM.call(this._weekdaysParse,O))||-1!==(e=PM.call(this._shortWeekdaysParse,O))?e:null}function Cb(M,b,z){var p,e,o;if(this._weekdaysParseExact)return Pb.call(this,M,b,z);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(e=i([2e3,1]).day(p),z&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(e,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(e,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(e,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(o="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[p]=new RegExp(o.replace(".",""),"i")),z&&"dddd"===b&&this._fullWeekdaysParse[p].test(M))return p;if(z&&"ddd"===b&&this._shortWeekdaysParse[p].test(M))return p;if(z&&"dd"===b&&this._minWeekdaysParse[p].test(M))return p;if(!z&&this._weekdaysParse[p].test(M))return p}}function Ib(M){if(!this.isValid())return null!=M?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=M?(M=Db(M,this.localeData()),this.add(M-b,"d")):b}function Vb(M){if(!this.isValid())return null!=M?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==M?b:this.add(M-b,"d")}function Ub(M){if(!this.isValid())return null!=M?this:NaN;if(null!=M){var b=kb(M,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Jb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysStrictRegex:this._weekdaysRegex):(a(this,"_weekdaysRegex")||(this._weekdaysRegex=vb),this._weekdaysStrictRegex&&M?this._weekdaysStrictRegex:this._weekdaysRegex)}function Gb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(a(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Sb),this._weekdaysShortStrictRegex&&M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Kb(M){return this._weekdaysParseExact?(a(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(a(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Fb),this._weekdaysMinStrictRegex&&M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qb(){function M(M,b){return b.length-M.length}var b,z,p,e,o,O=[],n=[],a=[],t=[];for(b=0;b<7;b++)z=i([2e3,1]).day(b),p=SM(this.weekdaysMin(z,"")),e=SM(this.weekdaysShort(z,"")),o=SM(this.weekdays(z,"")),O.push(p),n.push(e),a.push(o),t.push(p),t.push(e),t.push(o);O.sort(M),n.sort(M),a.sort(M),t.sort(M),this._weekdaysRegex=new RegExp("^("+t.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+O.join("|")+")","i")}function Zb(){return this.hours()%12||12}function $b(){return this.hours()||24}function Mz(M,b){x(M,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)}))}function bz(M,b){return b._meridiemParse}function zz(M){return"p"===(M+"").toLowerCase().charAt(0)}x("H",["HH",2],0,"hour"),x("h",["hh",2],0,Zb),x("k",["kk",2],0,$b),x("hmm",0,0,(function(){return""+Zb.apply(this)+w(this.minutes(),2)})),x("hmmss",0,0,(function(){return""+Zb.apply(this)+w(this.minutes(),2)+w(this.seconds(),2)})),x("Hmm",0,0,(function(){return""+this.hours()+w(this.minutes(),2)})),x("Hmmss",0,0,(function(){return""+this.hours()+w(this.minutes(),2)+w(this.seconds(),2)})),Mz("a",!0),Mz("A",!1),pM("hour","h"),nM("hour",13),HM("a",bz),HM("A",bz),HM("H",fM),HM("h",fM),HM("k",fM),HM("HH",fM,WM),HM("hh",fM,WM),HM("kk",fM,WM),HM("hmm",hM),HM("hmmss",RM),HM("Hmm",hM),HM("Hmmss",RM),jM(["H","HH"],UM),jM(["k","kk"],(function(M,b,z){var p=cM(M);b[UM]=24===p?0:p})),jM(["a","A"],(function(M,b,z){z._isPm=z._locale.isPM(M),z._meridiem=M})),jM(["h","hh"],(function(M,b,z){b[UM]=cM(M),u(z).bigHour=!0})),jM("hmm",(function(M,b,z){var p=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p)),u(z).bigHour=!0})),jM("hmmss",(function(M,b,z){var p=M.length-4,e=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p,2)),b[GM]=cM(M.substr(e)),u(z).bigHour=!0})),jM("Hmm",(function(M,b,z){var p=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p))})),jM("Hmmss",(function(M,b,z){var p=M.length-4,e=M.length-2;b[UM]=cM(M.substr(0,p)),b[JM]=cM(M.substr(p,2)),b[GM]=cM(M.substr(e))}));var pz=/[ap]\.?m?\.?/i,ez=AM("Hours",!0);function oz(M,b,z){return M>11?z?"pm":"PM":z?"am":"AM"}var Oz,nz={calendar:g,longDateFormat:V,invalidDate:J,ordinal:K,dayOfMonthOrdinalParse:Q,relativeTime:$,months:bb,monthsShort:zb,week:Bb,weekdays:gb,weekdaysMin:wb,weekdaysShort:Hb,meridiemParse:pz},az={},tz={};function dz(M,b){var z,p=Math.min(M.length,b.length);for(z=0;z0;){if(p=rz(e.slice(0,b).join("-")))return p;if(z&&z.length>=b&&dz(e,z)>=b-1)break;b--}o++}return Oz}function rz(b){var p=null;if(void 0===az[b]&&M&&M.exports)try{p=Oz._abbr,z(6700)("./"+b),sz(p)}catch(M){az[b]=null}return az[b]}function sz(M,b){var z;return M&&((z=d(b)?uz(M):iz(M,b))?Oz=z:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+M+" not found. Did you forget to load it?")),Oz._abbr}function iz(M,b){if(null!==b){var z,p=nz;if(b.abbr=M,null!=az[M])Y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=az[M]._config;else if(null!=b.parentLocale)if(null!=az[b.parentLocale])p=az[b.parentLocale]._config;else{if(null==(z=rz(b.parentLocale)))return tz[b.parentLocale]||(tz[b.parentLocale]=[]),tz[b.parentLocale].push({name:M,config:b}),null;p=z._config}return az[M]=new N(k(p,b)),tz[M]&&tz[M].forEach((function(M){iz(M.name,M.config)})),sz(M),az[M]}return delete az[M],null}function qz(M,b){if(null!=b){var z,p,e=nz;null!=az[M]&&null!=az[M].parentLocale?az[M].set(k(az[M]._config,b)):(null!=(p=rz(M))&&(e=p._config),b=k(e,b),null==p&&(b.abbr=M),(z=new N(b)).parentLocale=az[M],az[M]=z),sz(M)}else null!=az[M]&&(null!=az[M].parentLocale?(az[M]=az[M].parentLocale,M===sz()&&sz(M)):null!=az[M]&&delete az[M]);return az[M]}function uz(M){var b;if(M&&M._locale&&M._locale._abbr&&(M=M._locale._abbr),!M)return Oz;if(!O(M)){if(b=rz(M))return b;M=[M]}return Az(M)}function _z(){return y(az)}function Wz(M){var b,z=M._a;return z&&-2===u(M).overflow&&(b=z[IM]<0||z[IM]>11?IM:z[VM]<1||z[VM]>Mb(z[CM],z[IM])?VM:z[UM]<0||z[UM]>24||24===z[UM]&&(0!==z[JM]||0!==z[GM]||0!==z[KM])?UM:z[JM]<0||z[JM]>59?JM:z[GM]<0||z[GM]>59?GM:z[KM]<0||z[KM]>999?KM:-1,u(M)._overflowDayOfYear&&(bVM)&&(b=VM),u(M)._overflowWeeks&&-1===b&&(b=QM),u(M)._overflowWeekday&&-1===b&&(b=ZM),u(M).overflow=b),M}var lz=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mz=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Lz=/Z|[+-]\d\d(?::?\d\d)?/,fz=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],hz=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Rz=/^\/?Date\((-?\d+)/i,Bz=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,yz={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Xz(M){var b,z,p,e,o,O,n=M._i,a=lz.exec(n)||mz.exec(n);if(a){for(u(M).iso=!0,b=0,z=fz.length;bqb(o)||0===M._dayOfYear)&&(u(M)._overflowDayOfYear=!0),z=lb(o,0,M._dayOfYear),M._a[IM]=z.getUTCMonth(),M._a[VM]=z.getUTCDate()),b=0;b<3&&null==M._a[b];++b)M._a[b]=O[b]=p[b];for(;b<7;b++)M._a[b]=O[b]=null==M._a[b]?2===b?1:0:M._a[b];24===M._a[UM]&&0===M._a[JM]&&0===M._a[GM]&&0===M._a[KM]&&(M._nextDay=!0,M._a[UM]=0),M._d=(M._useUTC?lb:Wb).apply(null,O),e=M._useUTC?M._d.getUTCDay():M._d.getDay(),null!=M._tzm&&M._d.setUTCMinutes(M._d.getUTCMinutes()-M._tzm),M._nextDay&&(M._a[UM]=24),M._w&&void 0!==M._w.d&&M._w.d!==e&&(u(M).weekdayMismatch=!0)}}function Fz(M){var b,z,p,e,o,O,n,a,t;null!=(b=M._w).GG||null!=b.W||null!=b.E?(o=1,O=4,z=wz(b.GG,M._a[CM],fb(Jz(),1,4).year),p=wz(b.W,1),((e=wz(b.E,1))<1||e>7)&&(a=!0)):(o=M._locale._week.dow,O=M._locale._week.doy,t=fb(Jz(),o,O),z=wz(b.gg,M._a[CM],t.year),p=wz(b.w,t.week),null!=b.d?((e=b.d)<0||e>6)&&(a=!0):null!=b.e?(e=b.e+o,(b.e<0||b.e>6)&&(a=!0)):e=o),p<1||p>hb(z,o,O)?u(M)._overflowWeeks=!0:null!=a?u(M)._overflowWeekday=!0:(n=Lb(z,p,e,o,O),M._a[CM]=n.year,M._dayOfYear=n.dayOfYear)}function jz(M){if(M._f!==e.ISO_8601)if(M._f!==e.RFC_2822){M._a=[],u(M).empty=!0;var b,z,p,o,O,n,a=""+M._i,t=a.length,d=0;for(p=I(M._f,M._locale).match(v)||[],b=0;b0&&u(M).unusedInput.push(O),a=a.slice(a.indexOf(z)+z.length),d+=z.length),j[o]?(z?u(M).empty=!1:u(M).unusedTokens.push(o),EM(o,z,M)):M._strict&&!z&&u(M).unusedTokens.push(o);u(M).charsLeftOver=t-d,a.length>0&&u(M).unusedInput.push(a),M._a[UM]<=12&&!0===u(M).bigHour&&M._a[UM]>0&&(u(M).bigHour=void 0),u(M).parsedDateParts=M._a.slice(0),u(M).meridiem=M._meridiem,M._a[UM]=xz(M._locale,M._a[UM],M._meridiem),null!==(n=u(M).era)&&(M._a[CM]=M._locale.erasConvertYear(n,M._a[CM])),Sz(M),Wz(M)}else gz(M);else Xz(M)}function xz(M,b,z){var p;return null==z?b:null!=M.meridiemHour?M.meridiemHour(b,z):null!=M.isPM?((p=M.isPM(z))&&b<12&&(b+=12),p||12!==b||(b=0),b):b}function Ez(M){var b,z,p,e,o,O,n=!1;if(0===M._f.length)return u(M).invalidFormat=!0,void(M._d=new Date(NaN));for(e=0;ethis?this:M:W()}));function Qz(M,b){var z,p;if(1===b.length&&O(b[0])&&(b=b[0]),!b.length)return Jz();for(z=b[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function mp(){if(!d(this._isDSTShifted))return this._isDSTShifted;var M,b={};return L(b,this),(b=Iz(b))._a?(M=b._isUTC?i(b._a):Jz(b._a),this._isDSTShifted=this.isValid()&&ap(b._a,M.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function Lp(){return!!this.isValid()&&!this._isUTC}function fp(){return!!this.isValid()&&this._isUTC}function hp(){return!!this.isValid()&&this._isUTC&&0===this._offset}e.updateOffset=function(){};var Rp=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Bp=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function yp(M,b){var z,p,e,o=M,O=null;return Op(M)?o={ms:M._milliseconds,d:M._days,M:M._months}:c(M)||!isNaN(+M)?(o={},b?o[b]=+M:o.milliseconds=+M):(O=Rp.exec(M))?(z="-"===O[1]?-1:1,o={y:0,d:cM(O[VM])*z,h:cM(O[UM])*z,m:cM(O[JM])*z,s:cM(O[GM])*z,ms:cM(np(1e3*O[KM]))*z}):(O=Bp.exec(M))?(z="-"===O[1]?-1:1,o={y:Xp(O[2],z),M:Xp(O[3],z),w:Xp(O[4],z),d:Xp(O[5],z),h:Xp(O[6],z),m:Xp(O[7],z),s:Xp(O[8],z)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(e=Tp(Jz(o.from),Jz(o.to)),(o={}).ms=e.milliseconds,o.M=e.months),p=new op(o),Op(M)&&a(M,"_locale")&&(p._locale=M._locale),Op(M)&&a(M,"_isValid")&&(p._isValid=M._isValid),p}function Xp(M,b){var z=M&&parseFloat(M.replace(",","."));return(isNaN(z)?0:z)*b}function Yp(M,b){var z={};return z.months=b.month()-M.month()+12*(b.year()-M.year()),M.clone().add(z.months,"M").isAfter(b)&&--z.months,z.milliseconds=+b-+M.clone().add(z.months,"M"),z}function Tp(M,b){var z;return M.isValid()&&b.isValid()?(b=Ap(b,M),M.isBefore(b)?z=Yp(M,b):((z=Yp(b,M)).milliseconds=-z.milliseconds,z.months=-z.months),z):{milliseconds:0,months:0}}function Dp(M,b){return function(z,p){var e;return null===p||isNaN(+p)||(Y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),e=z,z=p,p=e),kp(this,yp(z,p),M),this}}function kp(M,b,z,p){var o=b._milliseconds,O=np(b._days),n=np(b._months);M.isValid()&&(p=null==p||p,n&&db(M,rM(M,"Month")+n*z),O&&sM(M,"Date",rM(M,"Date")+O*z),o&&M._d.setTime(M._d.valueOf()+o*z),p&&e.updateOffset(M,O||n))}yp.fn=op.prototype,yp.invalid=ep;var Np=Dp(1,"add"),gp=Dp(-1,"subtract");function Hp(M){return"string"==typeof M||M instanceof String}function wp(M){return h(M)||A(M)||Hp(M)||c(M)||Sp(M)||vp(M)||null==M}function vp(M){var b,z,p=n(M)&&!t(M),e=!1,o=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"];for(b=0;bz.valueOf():z.valueOf()9999?C(z,b?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?b?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",C(z,"Z")):C(z,b?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function $p(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var M,b,z,p,e="moment",o="";return this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",o="Z"),M="["+e+'("]',b=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",z="-MM-DD[T]HH:mm:ss.SSS",p=o+'[")]',this.format(M+b+z+p)}function Me(M){M||(M=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var b=C(this,M);return this.localeData().postformat(b)}function be(M,b){return this.isValid()&&(h(M)&&M.isValid()||Jz(M).isValid())?yp({to:this,from:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ze(M){return this.from(Jz(),M)}function pe(M,b){return this.isValid()&&(h(M)&&M.isValid()||Jz(M).isValid())?yp({from:this,to:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ee(M){return this.to(Jz(),M)}function oe(M){var b;return void 0===M?this._locale._abbr:(null!=(b=uz(M))&&(this._locale=b),this)}e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Oe=B("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(M){return void 0===M?this.localeData():this.locale(M)}));function ne(){return this._locale}var ae=1e3,te=60*ae,de=60*te,ce=3506328*de;function Ae(M,b){return(M%b+b)%b}function re(M,b,z){return M<100&&M>=0?new Date(M+400,b,z)-ce:new Date(M,b,z).valueOf()}function se(M,b,z){return M<100&&M>=0?Date.UTC(M+400,b,z)-ce:Date.UTC(M,b,z)}function ie(M){var b,z;if(void 0===(M=eM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?se:re,M){case"year":b=z(this.year(),0,1);break;case"quarter":b=z(this.year(),this.month()-this.month()%3,1);break;case"month":b=z(this.year(),this.month(),1);break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":b=z(this.year(),this.month(),this.date());break;case"hour":b=this._d.valueOf(),b-=Ae(b+(this._isUTC?0:this.utcOffset()*te),de);break;case"minute":b=this._d.valueOf(),b-=Ae(b,te);break;case"second":b=this._d.valueOf(),b-=Ae(b,ae)}return this._d.setTime(b),e.updateOffset(this,!0),this}function qe(M){var b,z;if(void 0===(M=eM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?se:re,M){case"year":b=z(this.year()+1,0,1)-1;break;case"quarter":b=z(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":b=z(this.year(),this.month()+1,1)-1;break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":b=z(this.year(),this.month(),this.date()+1)-1;break;case"hour":b=this._d.valueOf(),b+=de-Ae(b+(this._isUTC?0:this.utcOffset()*te),de)-1;break;case"minute":b=this._d.valueOf(),b+=te-Ae(b,te)-1;break;case"second":b=this._d.valueOf(),b+=ae-Ae(b,ae)-1}return this._d.setTime(b),e.updateOffset(this,!0),this}function ue(){return this._d.valueOf()-6e4*(this._offset||0)}function _e(){return Math.floor(this.valueOf()/1e3)}function We(){return new Date(this.valueOf())}function le(){var M=this;return[M.year(),M.month(),M.date(),M.hour(),M.minute(),M.second(),M.millisecond()]}function me(){var M=this;return{years:M.year(),months:M.month(),date:M.date(),hours:M.hours(),minutes:M.minutes(),seconds:M.seconds(),milliseconds:M.milliseconds()}}function Le(){return this.isValid()?this.toISOString():null}function fe(){return _(this)}function he(){return s({},u(this))}function Re(){return u(this).overflow}function Be(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function ye(M,b){var z,p,o,O=this._eras||uz("en")._eras;for(z=0,p=O.length;z=0)return a[p]}function Ye(M,b){var z=M.since<=M.until?1:-1;return void 0===b?e(M.since).year():e(M.since).year()+(b-M.offset)*z}function Te(){var M,b,z,p=this.localeData().eras();for(M=0,b=p.length;M(o=hb(M,p,e))&&(b=o),Ke.call(this,M,b,z,p,e))}function Ke(M,b,z,p,e){var o=Lb(M,b,z,p,e),O=lb(o.year,0,o.dayOfYear);return this.year(O.getUTCFullYear()),this.month(O.getUTCMonth()),this.date(O.getUTCDate()),this}function Qe(M){return null==M?Math.ceil((this.month()+1)/3):this.month(3*(M-1)+this.month()%3)}x("N",0,0,"eraAbbr"),x("NN",0,0,"eraAbbr"),x("NNN",0,0,"eraAbbr"),x("NNNN",0,0,"eraName"),x("NNNNN",0,0,"eraNarrow"),x("y",["y",1],"yo","eraYear"),x("y",["yy",2],0,"eraYear"),x("y",["yyy",3],0,"eraYear"),x("y",["yyyy",4],0,"eraYear"),HM("N",ve),HM("NN",ve),HM("NNN",ve),HM("NNNN",Se),HM("NNNNN",Fe),jM(["N","NN","NNN","NNNN","NNNNN"],(function(M,b,z,p){var e=z._locale.erasParse(M,p,z._strict);e?u(z).era=e:u(z).invalidEra=M})),HM("y",YM),HM("yy",YM),HM("yyy",YM),HM("yyyy",YM),HM("yo",je),jM(["y","yy","yyy","yyyy"],CM),jM(["yo"],(function(M,b,z,p){var e;z._locale._eraYearOrdinalRegex&&(e=M.match(z._locale._eraYearOrdinalRegex)),z._locale.eraYearOrdinalParse?b[CM]=z._locale.eraYearOrdinalParse(M,e):b[CM]=parseInt(M,10)})),x(0,["gg",2],0,(function(){return this.weekYear()%100})),x(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Ee("gggg","weekYear"),Ee("ggggg","weekYear"),Ee("GGGG","isoWeekYear"),Ee("GGGGG","isoWeekYear"),pM("weekYear","gg"),pM("isoWeekYear","GG"),nM("weekYear",1),nM("isoWeekYear",1),HM("G",TM),HM("g",TM),HM("GG",fM,WM),HM("gg",fM,WM),HM("GGGG",yM,mM),HM("gggg",yM,mM),HM("GGGGG",XM,LM),HM("ggggg",XM,LM),xM(["gggg","ggggg","GGGG","GGGGG"],(function(M,b,z,p){b[p.substr(0,2)]=cM(M)})),xM(["gg","GG"],(function(M,b,z,p){b[p]=e.parseTwoDigitYear(M)})),x("Q",0,"Qo","quarter"),pM("quarter","Q"),nM("quarter",7),HM("Q",_M),jM("Q",(function(M,b){b[IM]=3*(cM(M)-1)})),x("D",["DD",2],"Do","date"),pM("date","D"),nM("date",9),HM("D",fM),HM("DD",fM,WM),HM("Do",(function(M,b){return M?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient})),jM(["D","DD"],VM),jM("Do",(function(M,b){b[VM]=cM(M.match(fM)[0])}));var Ze=AM("Date",!0);function $e(M){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==M?b:this.add(M-b,"d")}x("DDD",["DDDD",3],"DDDo","dayOfYear"),pM("dayOfYear","DDD"),nM("dayOfYear",4),HM("DDD",BM),HM("DDDD",lM),jM(["DDD","DDDD"],(function(M,b,z){z._dayOfYear=cM(M)})),x("m",["mm",2],0,"minute"),pM("minute","m"),nM("minute",14),HM("m",fM),HM("mm",fM,WM),jM(["m","mm"],JM);var Mo=AM("Minutes",!1);x("s",["ss",2],0,"second"),pM("second","s"),nM("second",15),HM("s",fM),HM("ss",fM,WM),jM(["s","ss"],GM);var bo,zo,po=AM("Seconds",!1);for(x("S",0,0,(function(){return~~(this.millisecond()/100)})),x(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),x(0,["SSS",3],0,"millisecond"),x(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),x(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),x(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),x(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),x(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),x(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),pM("millisecond","ms"),nM("millisecond",16),HM("S",BM,_M),HM("SS",BM,WM),HM("SSS",BM,lM),bo="SSSS";bo.length<=9;bo+="S")HM(bo,YM);function eo(M,b){b[KM]=cM(1e3*("0."+M))}for(bo="S";bo.length<=9;bo+="S")jM(bo,eo);function oo(){return this._isUTC?"UTC":""}function Oo(){return this._isUTC?"Coordinated Universal Time":""}zo=AM("Milliseconds",!1),x("z",0,0,"zoneAbbr"),x("zz",0,0,"zoneName");var no=f.prototype;function ao(M){return Jz(1e3*M)}function to(){return Jz.apply(null,arguments).parseZone()}function co(M){return M}no.add=Np,no.calendar=xp,no.clone=Ep,no.diff=Gp,no.endOf=qe,no.format=Me,no.from=be,no.fromNow=ze,no.to=pe,no.toNow=ee,no.get=iM,no.invalidAt=Re,no.isAfter=Pp,no.isBefore=Cp,no.isBetween=Ip,no.isSame=Vp,no.isSameOrAfter=Up,no.isSameOrBefore=Jp,no.isValid=fe,no.lang=Oe,no.locale=oe,no.localeData=ne,no.max=Kz,no.min=Gz,no.parsingFlags=he,no.set=qM,no.startOf=ie,no.subtract=gp,no.toArray=le,no.toObject=me,no.toDate=We,no.toISOString=Zp,no.inspect=$p,"undefined"!=typeof Symbol&&null!=Symbol.for&&(no[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),no.toJSON=Le,no.toString=Qp,no.unix=_e,no.valueOf=ue,no.creationData=Be,no.eraName=Te,no.eraNarrow=De,no.eraAbbr=ke,no.eraYear=Ne,no.year=ub,no.isLeapYear=_b,no.weekYear=Pe,no.isoWeekYear=Ce,no.quarter=no.quarters=Qe,no.month=cb,no.daysInMonth=Ab,no.week=no.weeks=Yb,no.isoWeek=no.isoWeeks=Tb,no.weeksInYear=Ue,no.weeksInWeekYear=Je,no.isoWeeksInYear=Ie,no.isoWeeksInISOWeekYear=Ve,no.date=Ze,no.day=no.days=Ib,no.weekday=Vb,no.isoWeekday=Ub,no.dayOfYear=$e,no.hour=no.hours=ez,no.minute=no.minutes=Mo,no.second=no.seconds=po,no.millisecond=no.milliseconds=zo,no.utcOffset=sp,no.utc=qp,no.local=up,no.parseZone=_p,no.hasAlignedHourOffset=Wp,no.isDST=lp,no.isLocal=Lp,no.isUtcOffset=fp,no.isUtc=hp,no.isUTC=hp,no.zoneAbbr=oo,no.zoneName=Oo,no.dates=B("dates accessor is deprecated. Use date instead.",Ze),no.months=B("months accessor is deprecated. Use month instead",cb),no.years=B("years accessor is deprecated. Use year instead",ub),no.zone=B("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",ip),no.isDSTShifted=B("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",mp);var Ao=N.prototype;function ro(M,b,z,p){var e=uz(),o=i().set(p,b);return e[z](o,M)}function so(M,b,z){if(c(M)&&(b=M,M=void 0),M=M||"",null!=b)return ro(M,b,z,"month");var p,e=[];for(p=0;p<12;p++)e[p]=ro(M,p,z,"month");return e}function io(M,b,z,p){"boolean"==typeof M?(c(b)&&(z=b,b=void 0),b=b||""):(z=b=M,M=!1,c(b)&&(z=b,b=void 0),b=b||"");var e,o=uz(),O=M?o._week.dow:0,n=[];if(null!=z)return ro(b,(z+O)%7,p,"day");for(e=0;e<7;e++)n[e]=ro(b,(e+O)%7,p,"day");return n}function qo(M,b){return so(M,b,"months")}function uo(M,b){return so(M,b,"monthsShort")}function _o(M,b,z){return io(M,b,z,"weekdays")}function Wo(M,b,z){return io(M,b,z,"weekdaysShort")}function lo(M,b,z){return io(M,b,z,"weekdaysMin")}Ao.calendar=H,Ao.longDateFormat=U,Ao.invalidDate=G,Ao.ordinal=Z,Ao.preparse=co,Ao.postformat=co,Ao.relativeTime=MM,Ao.pastFuture=bM,Ao.set=D,Ao.eras=ye,Ao.erasParse=Xe,Ao.erasConvertYear=Ye,Ao.erasAbbrRegex=He,Ao.erasNameRegex=ge,Ao.erasNarrowRegex=we,Ao.months=Ob,Ao.monthsShort=nb,Ao.monthsParse=tb,Ao.monthsRegex=sb,Ao.monthsShortRegex=rb,Ao.week=Rb,Ao.firstDayOfYear=Xb,Ao.firstDayOfWeek=yb,Ao.weekdays=jb,Ao.weekdaysMin=Eb,Ao.weekdaysShort=xb,Ao.weekdaysParse=Cb,Ao.weekdaysRegex=Jb,Ao.weekdaysShortRegex=Gb,Ao.weekdaysMinRegex=Kb,Ao.isPM=zz,Ao.meridiem=oz,sz("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1===cM(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),e.lang=B("moment.lang is deprecated. Use moment.locale instead.",sz),e.langData=B("moment.langData is deprecated. Use moment.localeData instead.",uz);var mo=Math.abs;function Lo(){var M=this._data;return this._milliseconds=mo(this._milliseconds),this._days=mo(this._days),this._months=mo(this._months),M.milliseconds=mo(M.milliseconds),M.seconds=mo(M.seconds),M.minutes=mo(M.minutes),M.hours=mo(M.hours),M.months=mo(M.months),M.years=mo(M.years),this}function fo(M,b,z,p){var e=yp(b,z);return M._milliseconds+=p*e._milliseconds,M._days+=p*e._days,M._months+=p*e._months,M._bubble()}function ho(M,b){return fo(this,M,b,1)}function Ro(M,b){return fo(this,M,b,-1)}function Bo(M){return M<0?Math.floor(M):Math.ceil(M)}function yo(){var M,b,z,p,e,o=this._milliseconds,O=this._days,n=this._months,a=this._data;return o>=0&&O>=0&&n>=0||o<=0&&O<=0&&n<=0||(o+=864e5*Bo(Yo(n)+O),O=0,n=0),a.milliseconds=o%1e3,M=dM(o/1e3),a.seconds=M%60,b=dM(M/60),a.minutes=b%60,z=dM(b/60),a.hours=z%24,O+=dM(z/24),n+=e=dM(Xo(O)),O-=Bo(Yo(e)),p=dM(n/12),n%=12,a.days=O,a.months=n,a.years=p,this}function Xo(M){return 4800*M/146097}function Yo(M){return 146097*M/4800}function To(M){if(!this.isValid())return NaN;var b,z,p=this._milliseconds;if("month"===(M=eM(M))||"quarter"===M||"year"===M)switch(b=this._days+p/864e5,z=this._months+Xo(b),M){case"month":return z;case"quarter":return z/3;case"year":return z/12}else switch(b=this._days+Math.round(Yo(this._months)),M){case"week":return b/7+p/6048e5;case"day":return b+p/864e5;case"hour":return 24*b+p/36e5;case"minute":return 1440*b+p/6e4;case"second":return 86400*b+p/1e3;case"millisecond":return Math.floor(864e5*b)+p;default:throw new Error("Unknown unit "+M)}}function Do(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*cM(this._months/12):NaN}function ko(M){return function(){return this.as(M)}}var No=ko("ms"),go=ko("s"),Ho=ko("m"),wo=ko("h"),vo=ko("d"),So=ko("w"),Fo=ko("M"),jo=ko("Q"),xo=ko("y");function Eo(){return yp(this)}function Po(M){return M=eM(M),this.isValid()?this[M+"s"]():NaN}function Co(M){return function(){return this.isValid()?this._data[M]:NaN}}var Io=Co("milliseconds"),Vo=Co("seconds"),Uo=Co("minutes"),Jo=Co("hours"),Go=Co("days"),Ko=Co("months"),Qo=Co("years");function Zo(){return dM(this.days()/7)}var $o=Math.round,MO={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function bO(M,b,z,p,e){return e.relativeTime(b||1,!!z,M,p)}function zO(M,b,z,p){var e=yp(M).abs(),o=$o(e.as("s")),O=$o(e.as("m")),n=$o(e.as("h")),a=$o(e.as("d")),t=$o(e.as("M")),d=$o(e.as("w")),c=$o(e.as("y")),A=o<=z.ss&&["s",o]||o0,A[4]=p,bO.apply(null,A)}function pO(M){return void 0===M?$o:"function"==typeof M&&($o=M,!0)}function eO(M,b){return void 0!==MO[M]&&(void 0===b?MO[M]:(MO[M]=b,"s"===M&&(MO.ss=b-1),!0))}function oO(M,b){if(!this.isValid())return this.localeData().invalidDate();var z,p,e=!1,o=MO;return"object"==typeof M&&(b=M,M=!1),"boolean"==typeof M&&(e=M),"object"==typeof b&&(o=Object.assign({},MO,b),null!=b.s&&null==b.ss&&(o.ss=b.s-1)),p=zO(this,!e,o,z=this.localeData()),e&&(p=z.pastFuture(+this,p)),z.postformat(p)}var OO=Math.abs;function nO(M){return(M>0)-(M<0)||+M}function aO(){if(!this.isValid())return this.localeData().invalidDate();var M,b,z,p,e,o,O,n,a=OO(this._milliseconds)/1e3,t=OO(this._days),d=OO(this._months),c=this.asSeconds();return c?(M=dM(a/60),b=dM(M/60),a%=60,M%=60,z=dM(d/12),d%=12,p=a?a.toFixed(3).replace(/\.?0+$/,""):"",e=c<0?"-":"",o=nO(this._months)!==nO(c)?"-":"",O=nO(this._days)!==nO(c)?"-":"",n=nO(this._milliseconds)!==nO(c)?"-":"",e+"P"+(z?o+z+"Y":"")+(d?o+d+"M":"")+(t?O+t+"D":"")+(b||M||a?"T":"")+(b?n+b+"H":"")+(M?n+M+"M":"")+(a?n+p+"S":"")):"P0D"}var tO=op.prototype;return tO.isValid=pp,tO.abs=Lo,tO.add=ho,tO.subtract=Ro,tO.as=To,tO.asMilliseconds=No,tO.asSeconds=go,tO.asMinutes=Ho,tO.asHours=wo,tO.asDays=vo,tO.asWeeks=So,tO.asMonths=Fo,tO.asQuarters=jo,tO.asYears=xo,tO.valueOf=Do,tO._bubble=yo,tO.clone=Eo,tO.get=Po,tO.milliseconds=Io,tO.seconds=Vo,tO.minutes=Uo,tO.hours=Jo,tO.days=Go,tO.weeks=Zo,tO.months=Ko,tO.years=Qo,tO.humanize=oO,tO.toISOString=aO,tO.toString=aO,tO.toJSON=aO,tO.locale=oe,tO.localeData=ne,tO.toIsoString=B("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",aO),tO.lang=Oe,x("X",0,0,"unix"),x("x",0,0,"valueOf"),HM("x",TM),HM("X",NM),jM("X",(function(M,b,z){z._d=new Date(1e3*parseFloat(M))})),jM("x",(function(M,b,z){z._d=new Date(cM(M))})),e.version="2.29.1",o(Jz),e.fn=no,e.min=Zz,e.max=$z,e.now=Mp,e.utc=i,e.unix=ao,e.months=qo,e.isDate=A,e.locale=sz,e.invalid=W,e.duration=yp,e.isMoment=h,e.weekdays=_o,e.parseZone=to,e.localeData=uz,e.isDuration=Op,e.monthsShort=uo,e.weekdaysMin=lo,e.defineLocale=iz,e.updateLocale=qz,e.locales=_z,e.weekdaysShort=Wo,e.normalizeUnits=eM,e.relativeTimeRounding=pO,e.relativeTimeThreshold=eO,e.calendarFormat=jp,e.prototype=no,e.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},e}()}},b={};function z(p){if(b[p])return b[p].exports;var e=b[p]={id:p,loaded:!1,exports:{}};return M[p].call(e.exports,e,e.exports,z),e.loaded=!0,e.exports}return z.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(M){if("object"==typeof window)return window}}(),z.o=(M,b)=>Object.prototype.hasOwnProperty.call(M,b),z.nmd=M=>(M.paths=[],M.children||(M.children=[]),M),z(3477)})(); \ No newline at end of file +var freeaps_meal;(()=>{var M={6873:(M,b,z)=>{"use strict";var p=z(1836),O=z(7935),o=z(1678),A=z(3725);M.exports=function(M){var b=M.glucose_data.map((function(M){return M.glucose=M.glucose||M.sgv,M})),z=M.iob_inputs,c=M.basalprofile,n=M.iob_inputs.profile,e=new Date(M.mealTime),q=new Date(M.ciTime),a=o(M.iob_inputs),d=0,t=[];t[0]=b[0];var r,W=0,i=!1,s=0;(!b[0].glucose||b[0].glucose<39)&&(s=-1);for(var u=1;u6||i)){if(_<0&&(i=!0),void 0!==q){var f=(q-l)/27e5;if(f>1||f<0)continue}t[t.length-1].display_time?L=new Date(t[t.length-1].display_time.replace("T"," ")):s>=0&&b[s].display_time?L=new Date(b[s].display_time.replace("T"," ")):s>=0&&b[s].dateString?L=new Date(b[s].dateString):console.error("Could not determine last BG time");var m=(l-L)/6e4;if(Math.abs(m)>8){var R=b[s].glucose;for(m=Math.min(240,Math.abs(m));m>5;){var B=new Date(L.getTime()-3e5);t[++W]=[],t[W].date=B.getTime();var X=R+5/m*(b[u].glucose-R);t[W].glucose=Math.round(X),m-=5,R=X,L=new Date(B)}}else Math.abs(m)>2?(t[++W]=b[u],t[W].date=l.getTime()):t[W].glucose=(t[W].glucose+b[u].glucose)/2;s=u}}}var h=0,N=999,y=0,T=999,Y=[],H=null;for(u=0;ul&&Y.push(Math.round(r)),n.min_5m_carbimpact;else if(q>l){var j=Math.round(1e3*(k-S))/1e3,E=(j-r)/(l-q)*1e3*60*5;j>y&&(h=Math.min(0,E),y=j),je)d+=Math.max(F,r/2,n.min_5m_carbimpact)*n.carb_ratio/g}return{carbsAbsorbed:d,currentDeviation:r,maxDeviation:y,minDeviation:T,slopeFromMaxDeviation:h,slopeFromMinDeviation:N,allDeviations:Y}}},4556:(M,b)=>{"use strict";M.exports=function(M,b,z,p,O,o){if(M.insulin){void 0===b&&(b=new Date);var A=new Date(M.date),c=Math.round((b-A)/1e3/60);return"bilinear"===z?function(M,b,z){var p=75,O=180,o=3/z*b,A=0,c=0,n=2/(60*z),e=n/p,q=n/(O-p)*-1;if(o120?(console.error("Setting maximum Insulin Peak Time of 120m for",O.curve,"insulin"),p=120):O.insulinPeakTime<50?(console.error("Setting minimum Insulin Peak Time of 50m for",O.curve,"insulin"),p=50):p=O.insulinPeakTime:p=75:"ultra-rapid"===O.curve?!0===O.useCustomPeakTime&&void 0!==O.insulinPeakTime?O.insulinPeakTime>100?(console.error("Setting maximum Insulin Peak Time of 100m for",O.curve,"insulin"),p=100):O.insulinPeakTime<35?(console.error("Setting minimum Insulin Peak Time of 35m for",O.curve,"insulin"),p=35):p=O.insulinPeakTime:p=55:console.error("Curve of",O.curve,"is not supported.");var o=60*z,A=0,c=0;if(b{"use strict";var p=z(8),O=z(1836),o=z(6486),A=z(381);function c(M,b){var z=[M];if("recurring"===b.type){var p=60*M.started_at.getHours()+M.started_at.getMinutes(),O=p+M.duration;if(M.duration>30||pb.minutes||O>1440&&b.minutes30)e=30;else{var q=b.minutes;O>1440&&(q=1440),e=q-p}var a=A(M.started_at).add(e,"minutes");c.duration=e,n.duration=M.duration-e,n.timestamp=a.format(),n.started_at=new Date(n.timestamp),n.date=n.started_at.getTime(),z=[c,n]}}return z}function n(M,b){for(var z=[M],p=!0;p;){var O=[];p=!1,o.forEach(z,(function(M){o.forEach(b,(function(b){var z=c(M,b);if(z.length>1)return O=O.concat(z),p=!0,!1})),p||(O=O.concat([M]))})),z=O}return z}M.exports=function(M,b){var z,c,e=M.history,q=(M.history24,M.profile),a=M.autosens,d=[],t=[],r=[],W=[],i=!1,s=!1,u=new Date(p(M.clock));if(M.history24)e=[].concat(M.history).concat(M.history24);for(var l=u,L=0;L0&&(z=W[0].timestamp,(0===r.length||W[0].dater[L].date);f++);if(f>=W.length&&!s){s=1,c=r[L].timestamp;break}r[L].duration=(W[f].date-r[L].date)/60/1e3}for(i||s||W.length===r.length?i&&!s&&W.length-1!==r.length?console.error("Mismatched number of resumes("+W.length+") and suspends("+r.length+") assuming suspended prior to history block!"):!i&&s&&W.length!==r.length-1?console.error("Mismatched number of resumes("+W.length+") and suspends("+r.length+") assuming suspended past end of history block!"):i&&s&&W.length!==r.length&&console.error("Mismatched number of resumes("+W.length+") and suspends("+r.length+") assuming suspended prior to and past end of history block!"):console.error("Mismatched number of resumes("+W.length+") and suspends("+r.length+")!"),Ll)){if(l=R,"Bolus"===m._type)(_={}).timestamp=m.timestamp,_.started_at=new Date(p(m.timestamp)),_.started_at>u?process.stderr.write(" "+m.amount+"U @ "+_.started_at):(_.date=_.started_at.getTime(),_.insulin=m.amount,t.push(_));else if("Meal Bolus"===m.eventType||"Correction Bolus"===m.eventType||"Snack Bolus"===m.eventType||"Bolus Wizard"===m.eventType){(_={}).timestamp=m.created_at,_.started_at=new Date(p(_.timestamp)),_.date=_.started_at.getTime(),_.insulin=m.insulin,t.push(_)}else if("xdrip"===m.enteredBy){(_={}).timestamp=m.timestamp,_.started_at=new Date(p(_.timestamp)),_.date=_.started_at.getTime(),_.insulin=m.insulin,t.push(_)}else if("HAPP_App"===m.enteredBy&&m.insulin){(_={}).timestamp=m.created_at,_.started_at=new Date(p(_.timestamp)),_.date=_.started_at.getTime(),_.insulin=m.insulin,t.push(_)}else if("Temp Basal"!==m.eventType||"HAPP_App"!==m.enteredBy&&"openaps://AndroidAPS"!==m.enteredBy){if("Temp Basal"===m.eventType){(_={}).rate=m.rate,_.duration=m.duration,void 0!==m.amount&&(_.rate=m.amount/m.duration*60),_.timestamp=m.timestamp,_.started_at=new Date(p(_.timestamp)),_.date=_.started_at.getTime(),d.push(_)}else if("TempBasal"===m._type){if("percent"===m.temp)continue;var B,X=m.rate,h=m.timestamp;if(L>0&&e[L-1].timestamp===h&&"TempBasalDuration"===e[L-1]._type)B=e[L-1]["duration (min)"];else{for(var N=0;Nd[L+1].date&&(d[L].duration=(d[L+1].date-d[L].date)/60/1e3,null===d[L+1].duration&&d.splice(L+1,1));var y=[];o.forEach(q.basalprofile,(function(M){var b={type:"recurring"};b.minutes=M.minutes,y.push(b)}));var T=[];o.forEach(d,(function(M){T=T.concat(n(M,y))})),d=o.sortBy(d,(function(M){return M.date}));var Y,H=!1;if(void 0!==q.suspend_zeros_iob&&(H=q.suspend_zeros_iob),H){var g=[];o.forEach(T,(function(M){var b=function(M,b,z,O,c,n){var e=[],q=new Date(z).getTime();if(new Date(c).getTime(),O&&M.datec&&(M.date>c?M.duration=0:M.duration=(q-M.date)/60/1e3),e.push(M),0===M.duration)return e;for(var a=0;ad.date){if(e[t].date+60*e[t].duration*1e3>d.date+60*d.duration*1e3){var r=o.cloneDeep(e[t]),W=A(d.started_at).add(d.duration,"minutes");r.timestamp=W.format(),r.started_at=new Date(p(r.timestamp)),r.date=d.date+60*d.duration*1e3,r.duration=(e[t].date+60*e[t].duration*1e3-(d.date+60*d.duration*1e3))/60/1e3,e.push(r)}e[t].duration=(d.date-e[t].date)/60/1e3}else if(d.date<=e[t].date&&d.date+60*d.duration*1e3>e[t].date){e[t].duration=(e[t].date+60*e[t].duration*1e3-(d.date+60*d.duration*1e3))/60/1e3;var i=A(d.started_at).add(d.duration,"minutes");e[t].timestamp=i.format(),e[t].started_at=new Date(p(e[t].timestamp)),e[t].date=d.date+60*d.duration*1e3}return e}(M,r,z,i,c,s);g=g.concat(b)}));var D=[];o.forEach(r,(function(M){var b=[{_type:"SuspendBasal",rate:0,duration:M.duration,date:M.date,started_at:M.started_at}];D=D.concat(b)}));var k=u.getTime()-288e5,v=new Date(z).getTime();if(i&&k0){var x,C,P=q.current_basal;o.isEmpty(q.basalprofile)||(P=O.basalLookup(q.basalprofile,new Date(E.timestamp))),void 0!==q.min_bg&&void 0!==q.max_bg&&(x=(q.min_bg+q.max_bg)/2);var I=q;if(I.half_basal_exercise_target)var V=I.half_basal_exercise_target;else V=160;if(I.exercise_mode&&I.temptargetSet&&x>=105){var U=V-100;C=U/(U+x-100)}else void 0!==a&&(C=a.ratio);C&&(P*=C);var J=E.rate-P;Y=J<0?-.05:.05;var G=Math.round(J*E.duration*10/6)/100,K=Math.round(G/Y),Q=E.duration/K;for(f=0;f{"use strict";var p=z(8),O=z(1678),o=z(4556),A=z(8067);M.exports=function(M,b,z){if(z)c=[];else{z=O(M);var c=O(M,240)}var n={treatments:z,profile:M.profile,calculate:o};M.autosens&&(n.autosens=M.autosens);var e={treatments:c,profile:M.profile,calculate:o},q=[];/(Z|[+-][0-2][0-9]:?[034][05])+/.test(M.clock)||console.error("Warning: clock input "+M.clock+" is unzoned; please pass clock-zoned.json instead");var a,d=new Date(p(M.clock)),t=new Date(0).getTime(),r={};r.date=new Date(0).getTime(),z.forEach((function(M){M.insulin&&M.started_at?t=Math.max(t,M.started_at):"number"==typeof M.rate&&M.duration&&M.date>r.date&&((r=M).duration=Math.round(100*r.duration)/100)})),a=b?1:240;for(var W=0;W{"use strict";M.exports=function(M,b){var z,p=b.getTime(),O=M.calculate,o=M.treatments,A=M.profile,c=A.dia,n=0,e=0,q=0,a=0,d=0,t=0;if(!o)return{};c<3&&(c=3);var r={bilinear:{requireLongDia:!1,peak:75},"rapid-acting":{requireLongDia:!0,peak:75,tdMin:300},"ultra-rapid":{requireLongDia:!0,peak:55,tdMin:300}},W="bilinear";void 0!==A.curve&&(W=A.curve.toLowerCase()),W in r||(console.error('Unsupported curve function: "'+W+'". Supported curves: "bilinear", "rapid-acting" (Novolog, Novorapid, Humalog, Apidra) and "ultra-rapid" (Fiasp). Defaulting to "rapid-acting".'),W="rapid-acting");var i=r[W];return i.requireLongDia&&c<5&&(c=5),z=i.peak,o.forEach((function(M){if(M.date<=p){var o=p-60*c*60*1e3;if(M.date>o){var r=O(M,b,W,c,z,A);r&&r.iobContrib&&(n+=r.iobContrib),r&&r.activityContrib&&(t+=r.activityContrib),M.insulin&&r&&r.iobContrib&&(M.insulin<.1?(e+=r.iobContrib,a+=M.insulin):(q+=r.iobContrib,d+=M.insulin))}}})),{iob:Math.round(1e3*n)/1e3,activity:Math.round(1e4*t)/1e4,basaliob:Math.round(1e3*e)/1e3,bolusiob:Math.round(1e3*q)/1e3,netbasalinsulin:Math.round(1e3*a)/1e3,bolusinsulin:Math.round(1e3*d)/1e3,time:b}}},367:(M,b)=>{"use strict";function z(M,b,z){for(var p=0;pc&&o0?((n={}).carbs=c.carbs,n.nsCarbs=c.carbs,n.timestamp=c.created_at,c.actualDate&&(n.timestamp=c.actualDate),n.bolus=c.insulin,z(O,c.timestamp,"carbs")?1:O.push(n)):"JournalEntryMealMarker"===c._type&&c.carb_input>0&&c.timestamp&&((n={}).timestamp=c.timestamp,n.carbs=c.carb_input,n.journalCarbs=c.carb_input,z(O,c.timestamp,"carbs")?1:O.push(n)):((n={}).timestamp=c.created_at,c.actualDate&&(n.timestamp=c.actualDate),n.carbs=c.carbs,n.nsCarbs=c.carbs);for(A=0;A{"use strict";var p=z(8),O=z(367),o=z(2638);M.exports=function(M){var b={treatments:O(M),profile:M.profile,pumphistory:M.history,glucose:M.glucose,basalprofile:M.basalprofile},z=new Date(p(M.clock));return o(b,z)}},2638:(M,b,z)=>{"use strict";var p=z(8),O=z(6873);M.exports=function(M,b){var z=M.treatments,o=M.profile;if(void 0!==M.glucose)var A=M.glucose;var c=0,n=0,e=0,q=0,a=!1,d=b.getTime(),t=0;if(!z)return{};var r={glucose_data:A,iob_inputs:{profile:o,history:M.pumphistory},basalprofile:M.basalprofile,mealTime:d},W=0;z.sort((function(M,b){var z=new Date(p(M.timestamp));return new Date(p(b.timestamp)).getTime()-z.getTime()}));var i=0,s=0,u=0,l=0;z.forEach((function(M){var z=b.getTime(),o=z-216e5,A=new Date(p(M.timestamp)).getTime();if(A>o&&A<=z&&M.carbs>=1){M.nsCarbs>=1?n+=parseFloat(M.nsCarbs):M.bwCarbs>=1?(e+=parseFloat(M.bwCarbs),a=!0):M.journalCarbs>=1?q+=parseFloat(M.journalCarbs):console.error("Treatment carbs unclassified:",M),c+=parseFloat(M.carbs),r.mealTime=A,t=Math.max(t,A);var d=O(r).carbsAbsorbed,L=Math.max(0,c-d);"number"!=typeof L||isNaN(L)?console.error("Bad myMealCOB:",L,"mealCOB:",W,"carbs:",c,"myCarbsAbsorbed:",d):W=Math.max(W,L),L=1?s+=parseFloat(M.nsCarbs):M.bwCarbs>=1?u+=parseFloat(M.bwCarbs):M.journalCarbs>=1&&(l+=parseFloat(M.journalCarbs))):(i=0,s=0,u=0)}})),c-=i,n-=s,e-=u,q-=l,r.ciTime=b.getTime(),r.mealTime=b.getTime()-216e5;var L=O(r);return"number"!=typeof o.maxCOB||isNaN(o.maxCOB)?console.error("Bad profile.maxCOB:",o.maxCOB):W=Math.min(o.maxCOB,W),void 0!==L.currentDeviation&&null!==L.currentDeviation||(console.error(""),console.error("Warning: setting mealCOB to 0 because currentDeviation is null/undefined"),W=0),void 0!==L.maxDeviation&&null!==L.maxDeviation||(console.error(""),console.error("Warning: setting mealCOB to 0 because maxDeviation is 0 or undefined"),W=0),{carbs:Math.round(1e3*c)/1e3,nsCarbs:Math.round(1e3*n)/1e3,bwCarbs:Math.round(1e3*e)/1e3,journalCarbs:Math.round(1e3*q)/1e3,mealCOB:Math.round(W),currentDeviation:Math.round(100*L.currentDeviation)/100,maxDeviation:Math.round(100*L.maxDeviation)/100,minDeviation:Math.round(100*L.minDeviation)/100,slopeFromMaxDeviation:Math.round(1e3*L.slopeFromMaxDeviation)/1e3,slopeFromMinDeviation:Math.round(1e3*L.slopeFromMinDeviation)/1e3,allDeviations:L.allDeviations,lastCarbTime:t,bwFound:a}}},1836:(M,b,z)=>{"use strict";var p=z(6486);b.maxDailyBasal=function(M){var b=p.maxBy(M.basals,(function(M){return Number(M.rate)}));return 1e3*Number(b.rate)/1e3},b.maxBasalLookup=function(M){return M.settings.maxBasal},b.basalLookup=function(M,b){var z=b;void 0===b&&(z=new Date);var O=p.sortBy(M,(function(M){return M.i})),o=O[O.length-1].rate;if(0!==o){for(var A=60*z.getHours()+z.getMinutes(),c=0;c=O[c].minutes&&A{"use strict";var p=z(6486);function O(M,b,z){var O=b;void 0===b&&(O=new Date);var o=60*O.getHours()+O.getMinutes();if(z&&o>=z.offset&&o=e.offset&&o"']/g,K=RegExp(J.source),Q=RegExp(G.source),Z=/<%-([\s\S]+?)%>/g,$=/<%([\s\S]+?)%>/g,MM=/<%=([\s\S]+?)%>/g,bM=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,zM=/^\w*$/,pM=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,OM=/[\\^$.*+?()[\]{}|]/g,oM=RegExp(OM.source),AM=/^\s+/,cM=/\s/,nM=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,eM=/\{\n\/\* \[wrapped with (.+)\] \*/,qM=/,? & /,aM=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,dM=/[()=,{}\[\]\/\s]/,tM=/\\(\\)?/g,rM=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,WM=/\w*$/,iM=/^[-+]0x[0-9a-f]+$/i,sM=/^0b[01]+$/i,uM=/^\[object .+?Constructor\]$/,lM=/^0o[0-7]+$/i,LM=/^(?:0|[1-9]\d*)$/,_M=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,fM=/($^)/,mM=/['\n\r\u2028\u2029\\]/g,RM="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",BM="\\u2700-\\u27bf",XM="a-z\\xdf-\\xf6\\xf8-\\xff",hM="A-Z\\xc0-\\xd6\\xd8-\\xde",NM="\\ufe0e\\ufe0f",yM="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",TM="['’]",YM="[\\ud800-\\udfff]",HM="["+yM+"]",gM="["+RM+"]",DM="\\d+",kM="[\\u2700-\\u27bf]",vM="["+XM+"]",wM="[^\\ud800-\\udfff"+yM+DM+BM+XM+hM+"]",SM="\\ud83c[\\udffb-\\udfff]",FM="[^\\ud800-\\udfff]",jM="(?:\\ud83c[\\udde6-\\uddff]){2}",EM="[\\ud800-\\udbff][\\udc00-\\udfff]",xM="["+hM+"]",CM="(?:"+vM+"|"+wM+")",PM="(?:"+xM+"|"+wM+")",IM="(?:['’](?:d|ll|m|re|s|t|ve))?",VM="(?:['’](?:D|LL|M|RE|S|T|VE))?",UM="(?:"+gM+"|"+SM+")"+"?",JM="[\\ufe0e\\ufe0f]?",GM=JM+UM+("(?:\\u200d(?:"+[FM,jM,EM].join("|")+")"+JM+UM+")*"),KM="(?:"+[kM,jM,EM].join("|")+")"+GM,QM="(?:"+[FM+gM+"?",gM,jM,EM,YM].join("|")+")",ZM=RegExp(TM,"g"),$M=RegExp(gM,"g"),Mb=RegExp(SM+"(?="+SM+")|"+QM+GM,"g"),bb=RegExp([xM+"?"+vM+"+"+IM+"(?="+[HM,xM,"$"].join("|")+")",PM+"+"+VM+"(?="+[HM,xM+CM,"$"].join("|")+")",xM+"?"+CM+"+"+IM,xM+"+"+VM,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",DM,KM].join("|"),"g"),zb=RegExp("[\\u200d\\ud800-\\udfff"+RM+NM+"]"),pb=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ob=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ob=-1,Ab={};Ab[v]=Ab[w]=Ab[S]=Ab[F]=Ab[j]=Ab[E]=Ab[x]=Ab[C]=Ab[P]=!0,Ab[u]=Ab[l]=Ab[D]=Ab[L]=Ab[k]=Ab[_]=Ab[f]=Ab[m]=Ab[B]=Ab[X]=Ab[h]=Ab[y]=Ab[T]=Ab[Y]=Ab[g]=!1;var cb={};cb[u]=cb[l]=cb[D]=cb[k]=cb[L]=cb[_]=cb[v]=cb[w]=cb[S]=cb[F]=cb[j]=cb[B]=cb[X]=cb[h]=cb[y]=cb[T]=cb[Y]=cb[H]=cb[E]=cb[x]=cb[C]=cb[P]=!0,cb[f]=cb[m]=cb[g]=!1;var nb={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},eb=parseFloat,qb=parseInt,ab="object"==typeof z.g&&z.g&&z.g.Object===Object&&z.g,db="object"==typeof self&&self&&self.Object===Object&&self,tb=ab||db||Function("return this")(),rb=b&&!b.nodeType&&b,Wb=rb&&M&&!M.nodeType&&M,ib=Wb&&Wb.exports===rb,sb=ib&&ab.process,ub=function(){try{var M=Wb&&Wb.require&&Wb.require("util").types;return M||sb&&sb.binding&&sb.binding("util")}catch(M){}}(),lb=ub&&ub.isArrayBuffer,Lb=ub&&ub.isDate,_b=ub&&ub.isMap,fb=ub&&ub.isRegExp,mb=ub&&ub.isSet,Rb=ub&&ub.isTypedArray;function Bb(M,b,z){switch(z.length){case 0:return M.call(b);case 1:return M.call(b,z[0]);case 2:return M.call(b,z[0],z[1]);case 3:return M.call(b,z[0],z[1],z[2])}return M.apply(b,z)}function Xb(M,b,z,p){for(var O=-1,o=null==M?0:M.length;++O-1}function Hb(M,b,z){for(var p=-1,O=null==M?0:M.length;++p-1;);return z}function bz(M,b){for(var z=M.length;z--&&Eb(b,M[z],0)>-1;);return z}function zz(M,b){for(var z=M.length,p=0;z--;)M[z]===b&&++p;return p}var pz=Vb({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"}),Oz=Vb({"&":"&","<":"<",">":">",'"':""","'":"'"});function oz(M){return"\\"+nb[M]}function Az(M){return zb.test(M)}function cz(M){var b=-1,z=Array(M.size);return M.forEach((function(M,p){z[++b]=[p,M]})),z}function nz(M,b){return function(z){return M(b(z))}}function ez(M,b){for(var z=-1,p=M.length,O=0,o=[];++z",""":'"',"'":"'"});var iz=function M(b){var z,p=(b=null==b?tb:iz.defaults(tb.Object(),b,iz.pick(tb,Ob))).Array,cM=b.Date,RM=b.Error,BM=b.Function,XM=b.Math,hM=b.Object,NM=b.RegExp,yM=b.String,TM=b.TypeError,YM=p.prototype,HM=BM.prototype,gM=hM.prototype,DM=b["__core-js_shared__"],kM=HM.toString,vM=gM.hasOwnProperty,wM=0,SM=(z=/[^.]+$/.exec(DM&&DM.keys&&DM.keys.IE_PROTO||""))?"Symbol(src)_1."+z:"",FM=gM.toString,jM=kM.call(hM),EM=tb._,xM=NM("^"+kM.call(vM).replace(OM,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),CM=ib?b.Buffer:O,PM=b.Symbol,IM=b.Uint8Array,VM=CM?CM.allocUnsafe:O,UM=nz(hM.getPrototypeOf,hM),JM=hM.create,GM=gM.propertyIsEnumerable,KM=YM.splice,QM=PM?PM.isConcatSpreadable:O,Mb=PM?PM.iterator:O,zb=PM?PM.toStringTag:O,nb=function(){try{var M=to(hM,"defineProperty");return M({},"",{}),M}catch(M){}}(),ab=b.clearTimeout!==tb.clearTimeout&&b.clearTimeout,db=cM&&cM.now!==tb.Date.now&&cM.now,rb=b.setTimeout!==tb.setTimeout&&b.setTimeout,Wb=XM.ceil,sb=XM.floor,ub=hM.getOwnPropertySymbols,Sb=CM?CM.isBuffer:O,Vb=b.isFinite,sz=YM.join,uz=nz(hM.keys,hM),lz=XM.max,Lz=XM.min,_z=cM.now,fz=b.parseInt,mz=XM.random,Rz=YM.reverse,Bz=to(b,"DataView"),Xz=to(b,"Map"),hz=to(b,"Promise"),Nz=to(b,"Set"),yz=to(b,"WeakMap"),Tz=to(hM,"create"),Yz=yz&&new yz,Hz={},gz=jo(Bz),Dz=jo(Xz),kz=jo(hz),vz=jo(Nz),wz=jo(yz),Sz=PM?PM.prototype:O,Fz=Sz?Sz.valueOf:O,jz=Sz?Sz.toString:O;function Ez(M){if(pc(M)&&!VA(M)&&!(M instanceof Iz)){if(M instanceof Pz)return M;if(vM.call(M,"__wrapped__"))return Eo(M)}return new Pz(M)}var xz=function(){function M(){}return function(b){if(!zc(b))return{};if(JM)return JM(b);M.prototype=b;var z=new M;return M.prototype=O,z}}();function Cz(){}function Pz(M,b){this.__wrapped__=M,this.__actions__=[],this.__chain__=!!b,this.__index__=0,this.__values__=O}function Iz(M){this.__wrapped__=M,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=i,this.__views__=[]}function Vz(M){var b=-1,z=null==M?0:M.length;for(this.clear();++b=b?M:b)),M}function ep(M,b,z,p,o,A){var c,n=1&b,e=2&b,q=4&b;if(z&&(c=o?z(M,p,o,A):z(M)),c!==O)return c;if(!zc(M))return M;var a=VA(M);if(a){if(c=function(M){var b=M.length,z=new M.constructor(b);b&&"string"==typeof M[0]&&vM.call(M,"index")&&(z.index=M.index,z.input=M.input);return z}(M),!n)return TO(M,c)}else{var d=io(M),t=d==m||d==R;if(KA(M))return RO(M,n);if(d==h||d==u||t&&!o){if(c=e||t?{}:uo(M),!n)return e?function(M,b){return YO(M,Wo(M),b)}(M,function(M,b){return M&&YO(b,Dc(b),M)}(c,M)):function(M,b){return YO(M,ro(M),b)}(M,op(c,M))}else{if(!cb[d])return o?M:{};c=function(M,b,z){var p=M.constructor;switch(b){case D:return BO(M);case L:case _:return new p(+M);case k:return function(M,b){var z=b?BO(M.buffer):M.buffer;return new M.constructor(z,M.byteOffset,M.byteLength)}(M,z);case v:case w:case S:case F:case j:case E:case x:case C:case P:return XO(M,z);case B:return new p;case X:case Y:return new p(M);case y:return function(M){var b=new M.constructor(M.source,WM.exec(M));return b.lastIndex=M.lastIndex,b}(M);case T:return new p;case H:return O=M,Fz?hM(Fz.call(O)):{}}var O}(M,d,n)}}A||(A=new Kz);var r=A.get(M);if(r)return r;A.set(M,c),nc(M)?M.forEach((function(p){c.add(ep(p,b,z,p,M,A))})):Oc(M)&&M.forEach((function(p,O){c.set(O,ep(p,b,z,O,M,A))}));var W=a?O:(q?e?oo:Oo:e?Dc:gc)(M);return hb(W||M,(function(p,O){W&&(p=M[O=p]),zp(c,O,ep(p,b,z,O,M,A))})),c}function qp(M,b,z){var p=z.length;if(null==M)return!p;for(M=hM(M);p--;){var o=z[p],A=b[o],c=M[o];if(c===O&&!(o in M)||!A(c))return!1}return!0}function ap(M,b,z){if("function"!=typeof M)throw new TM(o);return go((function(){M.apply(O,z)}),b)}function dp(M,b,z,p){var O=-1,o=Yb,A=!0,c=M.length,n=[],e=b.length;if(!c)return n;z&&(b=gb(b,Qb(z))),p?(o=Hb,A=!1):b.length>=200&&(o=$b,A=!1,b=new Gz(b));M:for(;++O-1},Uz.prototype.set=function(M,b){var z=this.__data__,p=pp(z,M);return p<0?(++this.size,z.push([M,b])):z[p][1]=b,this},Jz.prototype.clear=function(){this.size=0,this.__data__={hash:new Vz,map:new(Xz||Uz),string:new Vz}},Jz.prototype.delete=function(M){var b=qo(this,M).delete(M);return this.size-=b?1:0,b},Jz.prototype.get=function(M){return qo(this,M).get(M)},Jz.prototype.has=function(M){return qo(this,M).has(M)},Jz.prototype.set=function(M,b){var z=qo(this,M),p=z.size;return z.set(M,b),this.size+=z.size==p?0:1,this},Gz.prototype.add=Gz.prototype.push=function(M){return this.__data__.set(M,A),this},Gz.prototype.has=function(M){return this.__data__.has(M)},Kz.prototype.clear=function(){this.__data__=new Uz,this.size=0},Kz.prototype.delete=function(M){var b=this.__data__,z=b.delete(M);return this.size=b.size,z},Kz.prototype.get=function(M){return this.__data__.get(M)},Kz.prototype.has=function(M){return this.__data__.has(M)},Kz.prototype.set=function(M,b){var z=this.__data__;if(z instanceof Uz){var p=z.__data__;if(!Xz||p.length<199)return p.push([M,b]),this.size=++z.size,this;z=this.__data__=new Jz(p)}return z.set(M,b),this.size=z.size,this};var tp=DO(_p),rp=DO(fp,!0);function Wp(M,b){var z=!0;return tp(M,(function(M,p,O){return z=!!b(M,p,O)})),z}function ip(M,b,z){for(var p=-1,o=M.length;++p0&&z(c)?b>1?up(c,b-1,z,p,O):Db(O,c):p||(O[O.length]=c)}return O}var lp=kO(),Lp=kO(!0);function _p(M,b){return M&&lp(M,b,gc)}function fp(M,b){return M&&Lp(M,b,gc)}function mp(M,b){return Tb(b,(function(b){return $A(M[b])}))}function Rp(M,b){for(var z=0,p=(b=LO(b,M)).length;null!=M&&zb}function Np(M,b){return null!=M&&vM.call(M,b)}function yp(M,b){return null!=M&&b in hM(M)}function Tp(M,b,z){for(var o=z?Hb:Yb,A=M[0].length,c=M.length,n=c,e=p(c),q=1/0,a=[];n--;){var d=M[n];n&&b&&(d=gb(d,Qb(b))),q=Lz(d.length,q),e[n]=!z&&(b||A>=120&&d.length>=120)?new Gz(n&&d):O}d=M[0];var t=-1,r=e[0];M:for(;++t=c?n:n*("desc"==z[p]?-1:1)}return M.index-b.index}(M,b,z)}))}function Vp(M,b,z){for(var p=-1,O=b.length,o={};++p-1;)c!==M&&KM.call(c,n,1),KM.call(M,n,1);return M}function Jp(M,b){for(var z=M?b.length:0,p=z-1;z--;){var O=b[z];if(z==p||O!==o){var o=O;Lo(O)?KM.call(M,O,1):dO(M,O)}}return M}function Gp(M,b){return M+sb(mz()*(b-M+1))}function Kp(M,b){var z="";if(!M||b<1||b>r)return z;do{b%2&&(z+=M),(b=sb(b/2))&&(M+=M)}while(b);return z}function Qp(M,b){return Do(No(M,b,on),M+"")}function Zp(M){return Zz(xc(M))}function $p(M,b){var z=xc(M);return wo(z,np(b,0,z.length))}function MO(M,b,z,p){if(!zc(M))return M;for(var o=-1,A=(b=LO(b,M)).length,c=A-1,n=M;null!=n&&++oo?0:o+b),(z=z>o?o:z)<0&&(z+=o),o=b>z?0:z-b>>>0,b>>>=0;for(var A=p(o);++O>>1,A=M[o];null!==A&&!qc(A)&&(z?A<=b:A=200){var e=b?null:KO(M);if(e)return qz(e);A=!1,O=$b,n=new Gz}else n=b?[]:c;M:for(;++p=p?M:OO(M,b,z)}var mO=ab||function(M){return tb.clearTimeout(M)};function RO(M,b){if(b)return M.slice();var z=M.length,p=VM?VM(z):new M.constructor(z);return M.copy(p),p}function BO(M){var b=new M.constructor(M.byteLength);return new IM(b).set(new IM(M)),b}function XO(M,b){var z=b?BO(M.buffer):M.buffer;return new M.constructor(z,M.byteOffset,M.length)}function hO(M,b){if(M!==b){var z=M!==O,p=null===M,o=M==M,A=qc(M),c=b!==O,n=null===b,e=b==b,q=qc(b);if(!n&&!q&&!A&&M>b||A&&c&&e&&!n&&!q||p&&c&&e||!z&&e||!o)return 1;if(!p&&!A&&!q&&M1?z[o-1]:O,c=o>2?z[2]:O;for(A=M.length>3&&"function"==typeof A?(o--,A):O,c&&_o(z[0],z[1],c)&&(A=o<3?O:A,o=1),b=hM(b);++p-1?o[A?b[c]:c]:O}}function jO(M){return po((function(b){var z=b.length,p=z,A=Pz.prototype.thru;for(M&&b.reverse();p--;){var c=b[p];if("function"!=typeof c)throw new TM(o);if(A&&!n&&"wrapper"==co(c))var n=new Pz([],!0)}for(p=n?p:z;++p1&&l.reverse(),t&&qn))return!1;var q=A.get(M),a=A.get(b);if(q&&a)return q==b&&a==M;var d=-1,t=!0,r=2&z?new Gz:O;for(A.set(M,b),A.set(b,M);++d-1&&M%1==0&&M1?"& ":"")+b[p],b=b.join(z>2?", ":" "),M.replace(nM,"{\n/* [wrapped with "+b+"] */\n")}(p,function(M,b){return hb(s,(function(z){var p="_."+z[0];b&z[1]&&!Yb(M,p)&&M.push(p)})),M.sort()}(function(M){var b=M.match(eM);return b?b[1].split(qM):[]}(p),z)))}function vo(M){var b=0,z=0;return function(){var p=_z(),o=16-(p-z);if(z=p,o>0){if(++b>=800)return arguments[0]}else b=0;return M.apply(O,arguments)}}function wo(M,b){var z=-1,p=M.length,o=p-1;for(b=b===O?p:b;++z1?M[b-1]:O;return z="function"==typeof z?(M.pop(),z):O,cA(M,z)}));function rA(M){var b=Ez(M);return b.__chain__=!0,b}function WA(M,b){return b(M)}var iA=po((function(M){var b=M.length,z=b?M[0]:0,p=this.__wrapped__,o=function(b){return cp(b,M)};return!(b>1||this.__actions__.length)&&p instanceof Iz&&Lo(z)?((p=p.slice(z,+z+(b?1:0))).__actions__.push({func:WA,args:[o],thisArg:O}),new Pz(p,this.__chain__).thru((function(M){return b&&!M.length&&M.push(O),M}))):this.thru(o)}));var sA=HO((function(M,b,z){vM.call(M,z)?++M[z]:Ap(M,z,1)}));var uA=FO(Io),lA=FO(Vo);function LA(M,b){return(VA(M)?hb:tp)(M,eo(b,3))}function _A(M,b){return(VA(M)?Nb:rp)(M,eo(b,3))}var fA=HO((function(M,b,z){vM.call(M,z)?M[z].push(b):Ap(M,z,[b])}));var mA=Qp((function(M,b,z){var O=-1,o="function"==typeof b,A=JA(M)?p(M.length):[];return tp(M,(function(M){A[++O]=o?Bb(b,M,z):Yp(M,b,z)})),A})),RA=HO((function(M,b,z){Ap(M,z,b)}));function BA(M,b){return(VA(M)?gb:jp)(M,eo(b,3))}var XA=HO((function(M,b,z){M[z?0:1].push(b)}),(function(){return[[],[]]}));var hA=Qp((function(M,b){if(null==M)return[];var z=b.length;return z>1&&_o(M,b[0],b[1])?b=[]:z>2&&_o(b[0],b[1],b[2])&&(b=[b[0]]),Ip(M,up(b,1),[])})),NA=db||function(){return tb.Date.now()};function yA(M,b,z){return b=z?O:b,b=M&&null==b?M.length:b,ZO(M,a,O,O,O,O,b)}function TA(M,b){var z;if("function"!=typeof b)throw new TM(o);return M=ic(M),function(){return--M>0&&(z=b.apply(this,arguments)),M<=1&&(b=O),z}}var YA=Qp((function(M,b,z){var p=1;if(z.length){var O=ez(z,no(YA));p|=e}return ZO(M,p,b,z,O)})),HA=Qp((function(M,b,z){var p=3;if(z.length){var O=ez(z,no(HA));p|=e}return ZO(b,p,M,z,O)}));function gA(M,b,z){var p,A,c,n,e,q,a=0,d=!1,t=!1,r=!0;if("function"!=typeof M)throw new TM(o);function W(b){var z=p,o=A;return p=A=O,a=b,n=M.apply(o,z)}function i(M){return a=M,e=go(u,b),d?W(M):n}function s(M){var z=M-q;return q===O||z>=b||z<0||t&&M-a>=c}function u(){var M=NA();if(s(M))return l(M);e=go(u,function(M){var z=b-(M-q);return t?Lz(z,c-(M-a)):z}(M))}function l(M){return e=O,r&&p?W(M):(p=A=O,n)}function L(){var M=NA(),z=s(M);if(p=arguments,A=this,q=M,z){if(e===O)return i(q);if(t)return mO(e),e=go(u,b),W(q)}return e===O&&(e=go(u,b)),n}return b=uc(b)||0,zc(z)&&(d=!!z.leading,c=(t="maxWait"in z)?lz(uc(z.maxWait)||0,b):c,r="trailing"in z?!!z.trailing:r),L.cancel=function(){e!==O&&mO(e),a=0,p=q=A=e=O},L.flush=function(){return e===O?n:l(NA())},L}var DA=Qp((function(M,b){return ap(M,1,b)})),kA=Qp((function(M,b,z){return ap(M,uc(b)||0,z)}));function vA(M,b){if("function"!=typeof M||null!=b&&"function"!=typeof b)throw new TM(o);var z=function(){var p=arguments,O=b?b.apply(this,p):p[0],o=z.cache;if(o.has(O))return o.get(O);var A=M.apply(this,p);return z.cache=o.set(O,A)||o,A};return z.cache=new(vA.Cache||Jz),z}function wA(M){if("function"!=typeof M)throw new TM(o);return function(){var b=arguments;switch(b.length){case 0:return!M.call(this);case 1:return!M.call(this,b[0]);case 2:return!M.call(this,b[0],b[1]);case 3:return!M.call(this,b[0],b[1],b[2])}return!M.apply(this,b)}}vA.Cache=Jz;var SA=_O((function(M,b){var z=(b=1==b.length&&VA(b[0])?gb(b[0],Qb(eo())):gb(up(b,1),Qb(eo()))).length;return Qp((function(p){for(var O=-1,o=Lz(p.length,z);++O=b})),IA=Hp(function(){return arguments}())?Hp:function(M){return pc(M)&&vM.call(M,"callee")&&!GM.call(M,"callee")},VA=p.isArray,UA=lb?Qb(lb):function(M){return pc(M)&&Xp(M)==D};function JA(M){return null!=M&&bc(M.length)&&!$A(M)}function GA(M){return pc(M)&&JA(M)}var KA=Sb||ln,QA=Lb?Qb(Lb):function(M){return pc(M)&&Xp(M)==_};function ZA(M){if(!pc(M))return!1;var b=Xp(M);return b==f||"[object DOMException]"==b||"string"==typeof M.message&&"string"==typeof M.name&&!Ac(M)}function $A(M){if(!zc(M))return!1;var b=Xp(M);return b==m||b==R||"[object AsyncFunction]"==b||"[object Proxy]"==b}function Mc(M){return"number"==typeof M&&M==ic(M)}function bc(M){return"number"==typeof M&&M>-1&&M%1==0&&M<=r}function zc(M){var b=typeof M;return null!=M&&("object"==b||"function"==b)}function pc(M){return null!=M&&"object"==typeof M}var Oc=_b?Qb(_b):function(M){return pc(M)&&io(M)==B};function oc(M){return"number"==typeof M||pc(M)&&Xp(M)==X}function Ac(M){if(!pc(M)||Xp(M)!=h)return!1;var b=UM(M);if(null===b)return!0;var z=vM.call(b,"constructor")&&b.constructor;return"function"==typeof z&&z instanceof z&&kM.call(z)==jM}var cc=fb?Qb(fb):function(M){return pc(M)&&Xp(M)==y};var nc=mb?Qb(mb):function(M){return pc(M)&&io(M)==T};function ec(M){return"string"==typeof M||!VA(M)&&pc(M)&&Xp(M)==Y}function qc(M){return"symbol"==typeof M||pc(M)&&Xp(M)==H}var ac=Rb?Qb(Rb):function(M){return pc(M)&&bc(M.length)&&!!Ab[Xp(M)]};var dc=UO(Fp),tc=UO((function(M,b){return M<=b}));function rc(M){if(!M)return[];if(JA(M))return ec(M)?tz(M):TO(M);if(Mb&&M[Mb])return function(M){for(var b,z=[];!(b=M.next()).done;)z.push(b.value);return z}(M[Mb]());var b=io(M);return(b==B?cz:b==T?qz:xc)(M)}function Wc(M){return M?(M=uc(M))===t||M===-1/0?17976931348623157e292*(M<0?-1:1):M==M?M:0:0===M?M:0}function ic(M){var b=Wc(M),z=b%1;return b==b?z?b-z:b:0}function sc(M){return M?np(ic(M),0,i):0}function uc(M){if("number"==typeof M)return M;if(qc(M))return W;if(zc(M)){var b="function"==typeof M.valueOf?M.valueOf():M;M=zc(b)?b+"":b}if("string"!=typeof M)return 0===M?M:+M;M=Kb(M);var z=sM.test(M);return z||lM.test(M)?qb(M.slice(2),z?2:8):iM.test(M)?W:+M}function lc(M){return YO(M,Dc(M))}function Lc(M){return null==M?"":qO(M)}var _c=gO((function(M,b){if(Bo(b)||JA(b))YO(b,gc(b),M);else for(var z in b)vM.call(b,z)&&zp(M,z,b[z])})),fc=gO((function(M,b){YO(b,Dc(b),M)})),mc=gO((function(M,b,z,p){YO(b,Dc(b),M,p)})),Rc=gO((function(M,b,z,p){YO(b,gc(b),M,p)})),Bc=po(cp);var Xc=Qp((function(M,b){M=hM(M);var z=-1,p=b.length,o=p>2?b[2]:O;for(o&&_o(b[0],b[1],o)&&(p=1);++z1),b})),YO(M,oo(M),z),p&&(z=ep(z,7,bo));for(var O=b.length;O--;)dO(z,b[O]);return z}));var Sc=po((function(M,b){return null==M?{}:function(M,b){return Vp(M,b,(function(b,z){return yc(M,z)}))}(M,b)}));function Fc(M,b){if(null==M)return{};var z=gb(oo(M),(function(M){return[M]}));return b=eo(b),Vp(M,z,(function(M,z){return b(M,z[0])}))}var jc=QO(gc),Ec=QO(Dc);function xc(M){return null==M?[]:Zb(M,gc(M))}var Cc=wO((function(M,b,z){return b=b.toLowerCase(),M+(z?Pc(b):b)}));function Pc(M){return Zc(Lc(M).toLowerCase())}function Ic(M){return(M=Lc(M))&&M.replace(_M,pz).replace($M,"")}var Vc=wO((function(M,b,z){return M+(z?"-":"")+b.toLowerCase()})),Uc=wO((function(M,b,z){return M+(z?" ":"")+b.toLowerCase()})),Jc=vO("toLowerCase");var Gc=wO((function(M,b,z){return M+(z?"_":"")+b.toLowerCase()}));var Kc=wO((function(M,b,z){return M+(z?" ":"")+Zc(b)}));var Qc=wO((function(M,b,z){return M+(z?" ":"")+b.toUpperCase()})),Zc=vO("toUpperCase");function $c(M,b,z){return M=Lc(M),(b=z?O:b)===O?function(M){return pb.test(M)}(M)?function(M){return M.match(bb)||[]}(M):function(M){return M.match(aM)||[]}(M):M.match(b)||[]}var Mn=Qp((function(M,b){try{return Bb(M,O,b)}catch(M){return ZA(M)?M:new RM(M)}})),bn=po((function(M,b){return hb(b,(function(b){b=Fo(b),Ap(M,b,YA(M[b],M))})),M}));function zn(M){return function(){return M}}var pn=jO(),On=jO(!0);function on(M){return M}function An(M){return vp("function"==typeof M?M:ep(M,1))}var cn=Qp((function(M,b){return function(z){return Yp(z,M,b)}})),nn=Qp((function(M,b){return function(z){return Yp(M,z,b)}}));function en(M,b,z){var p=gc(b),O=mp(b,p);null!=z||zc(b)&&(O.length||!p.length)||(z=b,b=M,M=this,O=mp(b,gc(b)));var o=!(zc(z)&&"chain"in z&&!z.chain),A=$A(M);return hb(O,(function(z){var p=b[z];M[z]=p,A&&(M.prototype[z]=function(){var b=this.__chain__;if(o||b){var z=M(this.__wrapped__),O=z.__actions__=TO(this.__actions__);return O.push({func:p,args:arguments,thisArg:M}),z.__chain__=b,z}return p.apply(M,Db([this.value()],arguments))})})),M}function qn(){}var an=PO(gb),dn=PO(yb),tn=PO(wb);function rn(M){return fo(M)?Ib(Fo(M)):function(M){return function(b){return Rp(b,M)}}(M)}var Wn=VO(),sn=VO(!0);function un(){return[]}function ln(){return!1}var Ln=CO((function(M,b){return M+b}),0),_n=GO("ceil"),fn=CO((function(M,b){return M/b}),1),mn=GO("floor");var Rn,Bn=CO((function(M,b){return M*b}),1),Xn=GO("round"),hn=CO((function(M,b){return M-b}),0);return Ez.after=function(M,b){if("function"!=typeof b)throw new TM(o);return M=ic(M),function(){if(--M<1)return b.apply(this,arguments)}},Ez.ary=yA,Ez.assign=_c,Ez.assignIn=fc,Ez.assignInWith=mc,Ez.assignWith=Rc,Ez.at=Bc,Ez.before=TA,Ez.bind=YA,Ez.bindAll=bn,Ez.bindKey=HA,Ez.castArray=function(){if(!arguments.length)return[];var M=arguments[0];return VA(M)?M:[M]},Ez.chain=rA,Ez.chunk=function(M,b,z){b=(z?_o(M,b,z):b===O)?1:lz(ic(b),0);var o=null==M?0:M.length;if(!o||b<1)return[];for(var A=0,c=0,n=p(Wb(o/b));Ao?0:o+z),(p=p===O||p>o?o:ic(p))<0&&(p+=o),p=z>p?0:sc(p);z>>0)?(M=Lc(M))&&("string"==typeof b||null!=b&&!cc(b))&&!(b=qO(b))&&Az(M)?fO(tz(M),0,z):M.split(b,z):[]},Ez.spread=function(M,b){if("function"!=typeof M)throw new TM(o);return b=null==b?0:lz(ic(b),0),Qp((function(z){var p=z[b],O=fO(z,0,b);return p&&Db(O,p),Bb(M,this,O)}))},Ez.tail=function(M){var b=null==M?0:M.length;return b?OO(M,1,b):[]},Ez.take=function(M,b,z){return M&&M.length?OO(M,0,(b=z||b===O?1:ic(b))<0?0:b):[]},Ez.takeRight=function(M,b,z){var p=null==M?0:M.length;return p?OO(M,(b=p-(b=z||b===O?1:ic(b)))<0?0:b,p):[]},Ez.takeRightWhile=function(M,b){return M&&M.length?rO(M,eo(b,3),!1,!0):[]},Ez.takeWhile=function(M,b){return M&&M.length?rO(M,eo(b,3)):[]},Ez.tap=function(M,b){return b(M),M},Ez.throttle=function(M,b,z){var p=!0,O=!0;if("function"!=typeof M)throw new TM(o);return zc(z)&&(p="leading"in z?!!z.leading:p,O="trailing"in z?!!z.trailing:O),gA(M,b,{leading:p,maxWait:b,trailing:O})},Ez.thru=WA,Ez.toArray=rc,Ez.toPairs=jc,Ez.toPairsIn=Ec,Ez.toPath=function(M){return VA(M)?gb(M,Fo):qc(M)?[M]:TO(So(Lc(M)))},Ez.toPlainObject=lc,Ez.transform=function(M,b,z){var p=VA(M),O=p||KA(M)||ac(M);if(b=eo(b,4),null==z){var o=M&&M.constructor;z=O?p?new o:[]:zc(M)&&$A(o)?xz(UM(M)):{}}return(O?hb:_p)(M,(function(M,p,O){return b(z,M,p,O)})),z},Ez.unary=function(M){return yA(M,1)},Ez.union=pA,Ez.unionBy=OA,Ez.unionWith=oA,Ez.uniq=function(M){return M&&M.length?aO(M):[]},Ez.uniqBy=function(M,b){return M&&M.length?aO(M,eo(b,2)):[]},Ez.uniqWith=function(M,b){return b="function"==typeof b?b:O,M&&M.length?aO(M,O,b):[]},Ez.unset=function(M,b){return null==M||dO(M,b)},Ez.unzip=AA,Ez.unzipWith=cA,Ez.update=function(M,b,z){return null==M?M:tO(M,b,lO(z))},Ez.updateWith=function(M,b,z,p){return p="function"==typeof p?p:O,null==M?M:tO(M,b,lO(z),p)},Ez.values=xc,Ez.valuesIn=function(M){return null==M?[]:Zb(M,Dc(M))},Ez.without=nA,Ez.words=$c,Ez.wrap=function(M,b){return FA(lO(b),M)},Ez.xor=eA,Ez.xorBy=qA,Ez.xorWith=aA,Ez.zip=dA,Ez.zipObject=function(M,b){return sO(M||[],b||[],zp)},Ez.zipObjectDeep=function(M,b){return sO(M||[],b||[],MO)},Ez.zipWith=tA,Ez.entries=jc,Ez.entriesIn=Ec,Ez.extend=fc,Ez.extendWith=mc,en(Ez,Ez),Ez.add=Ln,Ez.attempt=Mn,Ez.camelCase=Cc,Ez.capitalize=Pc,Ez.ceil=_n,Ez.clamp=function(M,b,z){return z===O&&(z=b,b=O),z!==O&&(z=(z=uc(z))==z?z:0),b!==O&&(b=(b=uc(b))==b?b:0),np(uc(M),b,z)},Ez.clone=function(M){return ep(M,4)},Ez.cloneDeep=function(M){return ep(M,5)},Ez.cloneDeepWith=function(M,b){return ep(M,5,b="function"==typeof b?b:O)},Ez.cloneWith=function(M,b){return ep(M,4,b="function"==typeof b?b:O)},Ez.conformsTo=function(M,b){return null==b||qp(M,b,gc(b))},Ez.deburr=Ic,Ez.defaultTo=function(M,b){return null==M||M!=M?b:M},Ez.divide=fn,Ez.endsWith=function(M,b,z){M=Lc(M),b=qO(b);var p=M.length,o=z=z===O?p:np(ic(z),0,p);return(z-=b.length)>=0&&M.slice(z,o)==b},Ez.eq=xA,Ez.escape=function(M){return(M=Lc(M))&&Q.test(M)?M.replace(G,Oz):M},Ez.escapeRegExp=function(M){return(M=Lc(M))&&oM.test(M)?M.replace(OM,"\\$&"):M},Ez.every=function(M,b,z){var p=VA(M)?yb:Wp;return z&&_o(M,b,z)&&(b=O),p(M,eo(b,3))},Ez.find=uA,Ez.findIndex=Io,Ez.findKey=function(M,b){return Fb(M,eo(b,3),_p)},Ez.findLast=lA,Ez.findLastIndex=Vo,Ez.findLastKey=function(M,b){return Fb(M,eo(b,3),fp)},Ez.floor=mn,Ez.forEach=LA,Ez.forEachRight=_A,Ez.forIn=function(M,b){return null==M?M:lp(M,eo(b,3),Dc)},Ez.forInRight=function(M,b){return null==M?M:Lp(M,eo(b,3),Dc)},Ez.forOwn=function(M,b){return M&&_p(M,eo(b,3))},Ez.forOwnRight=function(M,b){return M&&fp(M,eo(b,3))},Ez.get=Nc,Ez.gt=CA,Ez.gte=PA,Ez.has=function(M,b){return null!=M&&so(M,b,Np)},Ez.hasIn=yc,Ez.head=Jo,Ez.identity=on,Ez.includes=function(M,b,z,p){M=JA(M)?M:xc(M),z=z&&!p?ic(z):0;var O=M.length;return z<0&&(z=lz(O+z,0)),ec(M)?z<=O&&M.indexOf(b,z)>-1:!!O&&Eb(M,b,z)>-1},Ez.indexOf=function(M,b,z){var p=null==M?0:M.length;if(!p)return-1;var O=null==z?0:ic(z);return O<0&&(O=lz(p+O,0)),Eb(M,b,O)},Ez.inRange=function(M,b,z){return b=Wc(b),z===O?(z=b,b=0):z=Wc(z),function(M,b,z){return M>=Lz(b,z)&&M=-9007199254740991&&M<=r},Ez.isSet=nc,Ez.isString=ec,Ez.isSymbol=qc,Ez.isTypedArray=ac,Ez.isUndefined=function(M){return M===O},Ez.isWeakMap=function(M){return pc(M)&&io(M)==g},Ez.isWeakSet=function(M){return pc(M)&&"[object WeakSet]"==Xp(M)},Ez.join=function(M,b){return null==M?"":sz.call(M,b)},Ez.kebabCase=Vc,Ez.last=Zo,Ez.lastIndexOf=function(M,b,z){var p=null==M?0:M.length;if(!p)return-1;var o=p;return z!==O&&(o=(o=ic(z))<0?lz(p+o,0):Lz(o,p-1)),b==b?function(M,b,z){for(var p=z+1;p--;)if(M[p]===b)return p;return p}(M,b,o):jb(M,Cb,o,!0)},Ez.lowerCase=Uc,Ez.lowerFirst=Jc,Ez.lt=dc,Ez.lte=tc,Ez.max=function(M){return M&&M.length?ip(M,on,hp):O},Ez.maxBy=function(M,b){return M&&M.length?ip(M,eo(b,2),hp):O},Ez.mean=function(M){return Pb(M,on)},Ez.meanBy=function(M,b){return Pb(M,eo(b,2))},Ez.min=function(M){return M&&M.length?ip(M,on,Fp):O},Ez.minBy=function(M,b){return M&&M.length?ip(M,eo(b,2),Fp):O},Ez.stubArray=un,Ez.stubFalse=ln,Ez.stubObject=function(){return{}},Ez.stubString=function(){return""},Ez.stubTrue=function(){return!0},Ez.multiply=Bn,Ez.nth=function(M,b){return M&&M.length?Pp(M,ic(b)):O},Ez.noConflict=function(){return tb._===this&&(tb._=EM),this},Ez.noop=qn,Ez.now=NA,Ez.pad=function(M,b,z){M=Lc(M);var p=(b=ic(b))?dz(M):0;if(!b||p>=b)return M;var O=(b-p)/2;return IO(sb(O),z)+M+IO(Wb(O),z)},Ez.padEnd=function(M,b,z){M=Lc(M);var p=(b=ic(b))?dz(M):0;return b&&pb){var p=M;M=b,b=p}if(z||M%1||b%1){var o=mz();return Lz(M+o*(b-M+eb("1e-"+((o+"").length-1))),b)}return Gp(M,b)},Ez.reduce=function(M,b,z){var p=VA(M)?kb:Ub,O=arguments.length<3;return p(M,eo(b,4),z,O,tp)},Ez.reduceRight=function(M,b,z){var p=VA(M)?vb:Ub,O=arguments.length<3;return p(M,eo(b,4),z,O,rp)},Ez.repeat=function(M,b,z){return b=(z?_o(M,b,z):b===O)?1:ic(b),Kp(Lc(M),b)},Ez.replace=function(){var M=arguments,b=Lc(M[0]);return M.length<3?b:b.replace(M[1],M[2])},Ez.result=function(M,b,z){var p=-1,o=(b=LO(b,M)).length;for(o||(o=1,M=O);++pr)return[];var z=i,p=Lz(M,i);b=eo(b),M-=i;for(var O=Gb(p,b);++z=A)return M;var n=z-dz(p);if(n<1)return p;var e=c?fO(c,0,n).join(""):M.slice(0,n);if(o===O)return e+p;if(c&&(n+=e.length-n),cc(o)){if(M.slice(n).search(o)){var q,a=e;for(o.global||(o=NM(o.source,Lc(WM.exec(o))+"g")),o.lastIndex=0;q=o.exec(a);)var d=q.index;e=e.slice(0,d===O?n:d)}}else if(M.indexOf(qO(o),n)!=n){var t=e.lastIndexOf(o);t>-1&&(e=e.slice(0,t))}return e+p},Ez.unescape=function(M){return(M=Lc(M))&&K.test(M)?M.replace(J,Wz):M},Ez.uniqueId=function(M){var b=++wM;return Lc(M)+b},Ez.upperCase=Qc,Ez.upperFirst=Zc,Ez.each=LA,Ez.eachRight=_A,Ez.first=Jo,en(Ez,(Rn={},_p(Ez,(function(M,b){vM.call(Ez.prototype,b)||(Rn[b]=M)})),Rn),{chain:!1}),Ez.VERSION="4.17.21",hb(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(M){Ez[M].placeholder=Ez})),hb(["drop","take"],(function(M,b){Iz.prototype[M]=function(z){z=z===O?1:lz(ic(z),0);var p=this.__filtered__&&!b?new Iz(this):this.clone();return p.__filtered__?p.__takeCount__=Lz(z,p.__takeCount__):p.__views__.push({size:Lz(z,i),type:M+(p.__dir__<0?"Right":"")}),p},Iz.prototype[M+"Right"]=function(b){return this.reverse()[M](b).reverse()}})),hb(["filter","map","takeWhile"],(function(M,b){var z=b+1,p=1==z||3==z;Iz.prototype[M]=function(M){var b=this.clone();return b.__iteratees__.push({iteratee:eo(M,3),type:z}),b.__filtered__=b.__filtered__||p,b}})),hb(["head","last"],(function(M,b){var z="take"+(b?"Right":"");Iz.prototype[M]=function(){return this[z](1).value()[0]}})),hb(["initial","tail"],(function(M,b){var z="drop"+(b?"":"Right");Iz.prototype[M]=function(){return this.__filtered__?new Iz(this):this[z](1)}})),Iz.prototype.compact=function(){return this.filter(on)},Iz.prototype.find=function(M){return this.filter(M).head()},Iz.prototype.findLast=function(M){return this.reverse().find(M)},Iz.prototype.invokeMap=Qp((function(M,b){return"function"==typeof M?new Iz(this):this.map((function(z){return Yp(z,M,b)}))})),Iz.prototype.reject=function(M){return this.filter(wA(eo(M)))},Iz.prototype.slice=function(M,b){M=ic(M);var z=this;return z.__filtered__&&(M>0||b<0)?new Iz(z):(M<0?z=z.takeRight(-M):M&&(z=z.drop(M)),b!==O&&(z=(b=ic(b))<0?z.dropRight(-b):z.take(b-M)),z)},Iz.prototype.takeRightWhile=function(M){return this.reverse().takeWhile(M).reverse()},Iz.prototype.toArray=function(){return this.take(i)},_p(Iz.prototype,(function(M,b){var z=/^(?:filter|find|map|reject)|While$/.test(b),p=/^(?:head|last)$/.test(b),o=Ez[p?"take"+("last"==b?"Right":""):b],A=p||/^find/.test(b);o&&(Ez.prototype[b]=function(){var b=this.__wrapped__,c=p?[1]:arguments,n=b instanceof Iz,e=c[0],q=n||VA(b),a=function(M){var b=o.apply(Ez,Db([M],c));return p&&d?b[0]:b};q&&z&&"function"==typeof e&&1!=e.length&&(n=q=!1);var d=this.__chain__,t=!!this.__actions__.length,r=A&&!d,W=n&&!t;if(!A&&q){b=W?b:new Iz(this);var i=M.apply(b,c);return i.__actions__.push({func:WA,args:[a],thisArg:O}),new Pz(i,d)}return r&&W?M.apply(this,c):(i=this.thru(a),r?p?i.value()[0]:i.value():i)})})),hb(["pop","push","shift","sort","splice","unshift"],(function(M){var b=YM[M],z=/^(?:push|sort|unshift)$/.test(M)?"tap":"thru",p=/^(?:pop|shift)$/.test(M);Ez.prototype[M]=function(){var M=arguments;if(p&&!this.__chain__){var O=this.value();return b.apply(VA(O)?O:[],M)}return this[z]((function(z){return b.apply(VA(z)?z:[],M)}))}})),_p(Iz.prototype,(function(M,b){var z=Ez[b];if(z){var p=z.name+"";vM.call(Hz,p)||(Hz[p]=[]),Hz[p].push({name:b,func:z})}})),Hz[EO(O,2).name]=[{name:"wrapper",func:O}],Iz.prototype.clone=function(){var M=new Iz(this.__wrapped__);return M.__actions__=TO(this.__actions__),M.__dir__=this.__dir__,M.__filtered__=this.__filtered__,M.__iteratees__=TO(this.__iteratees__),M.__takeCount__=this.__takeCount__,M.__views__=TO(this.__views__),M},Iz.prototype.reverse=function(){if(this.__filtered__){var M=new Iz(this);M.__dir__=-1,M.__filtered__=!0}else(M=this.clone()).__dir__*=-1;return M},Iz.prototype.value=function(){var M=this.__wrapped__.value(),b=this.__dir__,z=VA(M),p=b<0,O=z?M.length:0,o=function(M,b,z){var p=-1,O=z.length;for(;++p=this.__values__.length;return{done:M,value:M?O:this.__values__[this.__index__++]}},Ez.prototype.plant=function(M){for(var b,z=this;z instanceof Cz;){var p=Eo(z);p.__index__=0,p.__values__=O,b?o.__wrapped__=p:b=p;var o=p;z=z.__wrapped__}return o.__wrapped__=M,b},Ez.prototype.reverse=function(){var M=this.__wrapped__;if(M instanceof Iz){var b=M;return this.__actions__.length&&(b=new Iz(this)),(b=b.reverse()).__actions__.push({func:WA,args:[zA],thisArg:O}),new Pz(b,this.__chain__)}return this.thru(zA)},Ez.prototype.toJSON=Ez.prototype.valueOf=Ez.prototype.value=function(){return WO(this.__wrapped__,this.__actions__)},Ez.prototype.first=Ez.prototype.head,Mb&&(Ez.prototype[Mb]=function(){return this}),Ez}();tb._=iz,(p=function(){return iz}.call(b,z,b,M))===O||(M.exports=p)}.call(this)},8:(M,b,z)=>{(M.exports=z(5177)).tz.load(z(1128))},5177:function(M,b,z){var p,O,o;!function(A,c){"use strict";M.exports?M.exports=c(z(381)):(O=[z(381)],void 0===(o="function"==typeof(p=c)?p.apply(b,O):p)||(M.exports=o))}(0,(function(M){"use strict";var b,z={},p={},O={},o={};M&&"string"==typeof M.version||h("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var A=M.version.split("."),c=+A[0],n=+A[1];function e(M){return M>96?M-87:M>64?M-29:M-48}function q(M){var b=0,z=M.split("."),p=z[0],O=z[1]||"",o=1,A=0,c=1;for(45===M.charCodeAt(0)&&(b=1,c=-1);b3){var b=O[f(M)];if(b)return b;h("Moment Timezone found "+M+" from the Intl api, but did not have that data loaded.")}}catch(M){}var z,p,o,A=function(){var M,b,z,p=(new Date).getFullYear()-2,O=new W(new Date(p,0,1)),o=[O];for(z=1;z<48;z++)(b=new W(new Date(p,z,1))).offset!==O.offset&&(M=s(O,b),o.push(M),o.push(new W(new Date(M.at+6e4)))),O=b;for(z=0;z<4;z++)o.push(new W(new Date(p+z,0,1))),o.push(new W(new Date(p+z,6,1)));return o}(),c=A.length,n=L(A),e=[];for(p=0;p0?e[0].zone.name:void 0}function f(M){return(M||"").toLowerCase().replace(/\//g,"_")}function m(M){var b,p,o,A;for("string"==typeof M&&(M=[M]),b=0;b= 2.6.0. You are using Moment.js "+M.version+". See momentjs.com"),r.prototype={_set:function(M){this.name=M.name,this.abbrs=M.abbrs,this.untils=M.untils,this.offsets=M.offsets,this.population=M.population},_index:function(M){var b,z=+M,p=this.untils;for(b=0;bp&&N.moveInvalidForward&&(b=p),o= 2.9.0. You are using Moment.js "+M.version+"."),M.defaultZone=b?R(b):null,M};var H=M.momentProperties;return"[object Array]"===Object.prototype.toString.call(H)?(H.push("_z"),H.push("_a")):H&&(H._z=null),M}))},2786:function(M,b,z){!function(M){"use strict";M.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(M){return/^nm$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"vm":"VM":z?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},4130:function(M,b,z){!function(M){"use strict";var b=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},z={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},p=function(M){return function(p,O,o,A){var c=b(p),n=z[M][b(p)];return 2===c&&(n=n[O?0:1]),n.replace(/%d/i,p)}},O=["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-dz",{months:O,monthsShort:O,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:p("s"),ss:p("s"),m:p("m"),mm:p("m"),h:p("h"),hh:p("h"),d:p("d"),dd:p("d"),M:p("M"),MM:p("M"),y:p("y"),yy:p("y")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:0,doy:4}})}(z(381))},6135:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})}(z(381))},6440:function(M,b,z){!function(M){"use strict";var b={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},z=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},p={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},O=function(M){return function(b,O,o,A){var c=z(b),n=p[M][z(b)];return 2===c&&(n=n[O?0:1]),n.replace(/%d/i,b)}},o=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:O("s"),ss:O("s"),m:O("m"),mm:O("m"),h:O("h"),hh:O("h"),d:O("d"),dd:O("d"),M:O("M"),MM:O("M"),y:O("y"),yy:O("y")},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},7702:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(381))},6040:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};M.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:0,doy:6}})}(z(381))},7100:function(M,b,z){!function(M){"use strict";M.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(z(381))},867:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},O={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},o=function(M){return function(b,z,o,A){var c=p(b),n=O[M][p(b)];return 2===c&&(n=n[z?0:1]),n.replace(/%d/i,b)}},A=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];M.defineLocale("ar",{months:A,monthsShort:A,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(M){return"م"===M},meridiem:function(M,b,z){return M<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},1083:function(M,b,z){!function(M){"use strict";var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};M.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"bir neçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(M){return/^(gündüz|axşam)$/.test(M)},meridiem:function(M,b,z){return M<4?"gecə":M<12?"səhər":M<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(M){if(0===M)return M+"-ıncı";var z=M%10,p=M%100-z,O=M>=100?100:null;return M+(b[z]||b[p]||b[O])},week:{dow:1,doy:7}})}(z(381))},9808:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвіліна":"хвіліну":"h"===p?z?"гадзіна":"гадзіну":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:z?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"}[p],+M)}M.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:z,mm:z,h:z,hh:z,d:"дзень",dd:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(M){return/^(дня|вечара)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночы":M<12?"раніцы":M<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M%10!=2&&M%10!=3||M%100==12||M%100==13?M+"-ы":M+"-і";case"D":return M+"-га";default:return M}},week:{dow:1,doy:7}})}(z(381))},8338:function(M,b,z){!function(M){"use strict";M.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Миналата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Миналия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",w:"седмица",ww:"%d седмици",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(381))},7438:function(M,b,z){!function(M){"use strict";M.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},calendar:{sameDay:"[Bi lɛrɛ] LT",nextDay:"[Sini lɛrɛ] LT",nextWeek:"dddd [don lɛrɛ] LT",lastDay:"[Kunu lɛrɛ] LT",lastWeek:"dddd [tɛmɛnen lɛrɛ] LT",sameElse:"L"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(z(381))},6225:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn-bd",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b?M<4?M:M+12:"ভোর"===b||"সকাল"===b?M:"দুপুর"===b?M>=3?M:M+12:"বিকাল"===b||"সন্ধ্যা"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"রাত":M<6?"ভোর":M<12?"সকাল":M<15?"দুপুর":M<18?"বিকাল":M<20?"সন্ধ্যা":"রাত"},week:{dow:0,doy:6}})}(z(381))},8905:function(M,b,z){!function(M){"use strict";var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},z={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};M.defineLocale("bn",{months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(M){return M.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(M,b){return 12===M&&(M=0),"রাত"===b&&M>=4||"দুপুর"===b&&M<5||"বিকাল"===b?M+12:M},meridiem:function(M,b,z){return M<4?"রাত":M<10?"সকাল":M<17?"দুপুর":M<20?"বিকাল":"রাত"},week:{dow:0,doy:6}})}(z(381))},1560:function(M,b,z){!function(M){"use strict";var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},z={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};M.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12".split("_"),monthsShortRegex:/^(ཟླ་\d{1,2})/,monthsParseExact:!0,weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",ss:"%d སྐར་ཆ།",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(M){return M.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(M,b){return 12===M&&(M=0),"མཚན་མོ"===b&&M>=4||"ཉིན་གུང"===b&&M<5||"དགོང་དག"===b?M+12:M},meridiem:function(M,b,z){return M<4?"མཚན་མོ":M<10?"ཞོགས་ཀས":M<17?"ཉིན་གུང":M<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}(z(381))},1278:function(M,b,z){!function(M){"use strict";function b(M,b,z){return M+" "+O({mm:"munutenn",MM:"miz",dd:"devezh"}[z],M)}function z(M){switch(p(M)){case 1:case 3:case 4:case 5:case 9:return M+" bloaz";default:return M+" vloaz"}}function p(M){return M>9?p(M%10):M}function O(M,b){return 2===b?o(M):M}function o(M){var b={m:"v",b:"v",d:"z"};return void 0===b[M.charAt(0)]?M:b[M.charAt(0)]+M.substring(1)}var A=[/^gen/i,/^c[ʼ\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],c=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,n=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,e=/^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,q=[/^sul/i,/^lun/i,/^meurzh/i,/^merc[ʼ\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],a=[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],d=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];M.defineLocale("br",{months:"Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:d,fullWeekdaysParse:q,shortWeekdaysParse:a,minWeekdaysParse:d,monthsRegex:c,monthsShortRegex:c,monthsStrictRegex:n,monthsShortStrictRegex:e,monthsParse:A,longMonthsParse:A,shortMonthsParse:A,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warcʼhoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Decʼh da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s ʼzo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:z},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(M){return M+(1===M?"añ":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(M){return"g.m."===M},meridiem:function(M,b,z){return M<12?"a.m.":"g.m."}})}(z(381))},622:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},2468:function(M,b,z){!function(M){"use strict";M.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(381))},5822:function(M,b,z){!function(M){"use strict";var b={format:"leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),standalone:"ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince".split("_")},z="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),p=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],O=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;function o(M){return M>1&&M<5&&1!=~~(M/10)}function A(M,b,z,p){var O=M+" ";switch(z){case"s":return b||p?"pár sekund":"pár sekundami";case"ss":return b||p?O+(o(M)?"sekundy":"sekund"):O+"sekundami";case"m":return b?"minuta":p?"minutu":"minutou";case"mm":return b||p?O+(o(M)?"minuty":"minut"):O+"minutami";case"h":return b?"hodina":p?"hodinu":"hodinou";case"hh":return b||p?O+(o(M)?"hodiny":"hodin"):O+"hodinami";case"d":return b||p?"den":"dnem";case"dd":return b||p?O+(o(M)?"dny":"dní"):O+"dny";case"M":return b||p?"měsíc":"měsícem";case"MM":return b||p?O+(o(M)?"měsíce":"měsíců"):O+"měsíci";case"y":return b||p?"rok":"rokem";case"yy":return b||p?O+(o(M)?"roky":"let"):O+"lety"}}M.defineLocale("cs",{months:b,monthsShort:z,monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:A,ss:A,m:A,mm:A,h:A,hh:A,d:A,dd:A,M:A,MM:A,y:A,yy:A},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},877:function(M,b,z){!function(M){"use strict";M.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(M){return M+(/сехет$/i.exec(M)?"рен":/ҫул$/i.exec(M)?"тан":"ран")},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}})}(z(381))},7373:function(M,b,z){!function(M){"use strict";M.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(M){var b="";return M>20?b=40===M||50===M||60===M||80===M||100===M?"fed":"ain":M>0&&(b=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][M]),M+b},week:{dow:1,doy:4}})}(z(381))},4780:function(M,b,z){!function(M){"use strict";M.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},217:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?O[z][0]:O[z][1]}M.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},894:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?O[z][0]:O[z][1]}M.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9740:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[M+" Tage",M+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[M+" Monate",M+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[M+" Jahre",M+" Jahren"]};return b?O[z][0]:O[z][1]}M.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,w:b,ww:"%d Wochen",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},5300:function(M,b,z){!function(M){"use strict";var b=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],z=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];M.defineLocale("dv",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(M){return"މފ"===M},meridiem:function(M,b,z){return M<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:7,doy:12}})}(z(381))},837:function(M,b,z){!function(M){"use strict";function b(M){return"undefined"!=typeof Function&&M instanceof Function||"[object Function]"===Object.prototype.toString.call(M)}M.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(M,b){return M?"string"==typeof b&&/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[M.month()]:this._monthsNominativeEl[M.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(M,b,z){return M>11?z?"μμ":"ΜΜ":z?"πμ":"ΠΜ"},isPM:function(M){return"μ"===(M+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){return 6===this.day()?"[το προηγούμενο] dddd [{}] LT":"[την προηγούμενη] dddd [{}] LT"},sameElse:"L"},calendar:function(M,z){var p=this._calendarEl[M],O=z&&z.hours();return b(p)&&(p=p.apply(z)),p.replace("{}",O%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}(z(381))},8348:function(M,b,z){!function(M){"use strict";M.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:4}})}(z(381))},7925:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(381))},2243:function(M,b,z){!function(M){"use strict";M.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},6436:function(M,b,z){!function(M){"use strict";M.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},7207:function(M,b,z){!function(M){"use strict";M.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}})}(z(381))},4175:function(M,b,z){!function(M){"use strict";M.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:0,doy:6}})}(z(381))},6319:function(M,b,z){!function(M){"use strict";M.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},1662:function(M,b,z){!function(M){"use strict";M.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},2915:function(M,b,z){!function(M){"use strict";M.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(M){return"p"===M.charAt(0).toLowerCase()},meridiem:function(M,b,z){return M>11?z?"p.t.m.":"P.T.M.":z?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(z(381))},5251:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],O=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6112:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],O=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:4},invalidDate:"Fecha inválida"})}(z(381))},1146:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],O=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})}(z(381))},5655:function(M,b,z){!function(M){"use strict";var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),z="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),p=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],O=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4},invalidDate:"Fecha inválida"})}(z(381))},5603:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[M+"sekundi",M+"sekundit"],m:["ühe minuti","üks minut"],mm:[M+" minuti",M+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[M+" tunni",M+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[M+" kuu",M+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[M+" aasta",M+" aastat"]};return b?O[z][2]?O[z][2]:O[z][1]:p?O[z][0]:O[z][1]}M.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},7763:function(M,b,z){!function(M){"use strict";M.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},6959:function(M,b,z){!function(M){"use strict";var b={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},z={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};M.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(M){return/بعد از ظهر/.test(M)},meridiem:function(M,b,z){return M<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"%d ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(M){return M.replace(/[۰-۹]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})}(z(381))},1897:function(M,b,z){!function(M){"use strict";var b="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),z=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",b[7],b[8],b[9]];function p(M,b,z,p){var o="";switch(z){case"s":return p?"muutaman sekunnin":"muutama sekunti";case"ss":o=p?"sekunnin":"sekuntia";break;case"m":return p?"minuutin":"minuutti";case"mm":o=p?"minuutin":"minuuttia";break;case"h":return p?"tunnin":"tunti";case"hh":o=p?"tunnin":"tuntia";break;case"d":return p?"päivän":"päivä";case"dd":o=p?"päivän":"päivää";break;case"M":return p?"kuukauden":"kuukausi";case"MM":o=p?"kuukauden":"kuukautta";break;case"y":return p?"vuoden":"vuosi";case"yy":o=p?"vuoden":"vuotta"}return o=O(M,p)+" "+o}function O(M,p){return M<10?p?z[M]:b[M]:M}M.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2549:function(M,b,z){!function(M){"use strict";M.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},4694:function(M,b,z){!function(M){"use strict";M.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},3049:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}}})}(z(381))},2330:function(M,b,z){!function(M){"use strict";M.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(M,b){switch(b){default:case"M":case"Q":case"D":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(381))},4470:function(M,b,z){!function(M){"use strict";var b=/^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,z=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,p=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,O=[/^janv/i,/^févr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^août/i,/^sept/i,/^oct/i,/^nov/i,/^déc/i];M.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsRegex:p,monthsShortRegex:p,monthsStrictRegex:b,monthsShortStrictRegex:z,monthsParse:O,longMonthsParse:O,shortMonthsParse:O,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(M,b){switch(b){case"D":return M+(1===M?"er":"");default:case"M":case"Q":case"DDD":case"d":return M+(1===M?"er":"e");case"w":case"W":return M+(1===M?"re":"e")}},week:{dow:1,doy:4}})}(z(381))},5044:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),z="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");M.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},9295:function(M,b,z){!function(M){"use strict";var b=["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],z=["Ean","Feabh","Márt","Aib","Beal","Meith","Iúil","Lún","M.F.","D.F.","Samh","Noll"],p=["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],O=["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],o=["Do","Lu","Má","Cé","Dé","A","Sa"];M.defineLocale("ga",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:O,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Amárach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inné ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",ss:"%d soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d míonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(381))},2101:function(M,b,z){!function(M){"use strict";var b=["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],z=["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],p=["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],O=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],o=["Dò","Lu","Mà","Ci","Ar","Ha","Sa"];M.defineLocale("gd",{months:b,monthsShort:z,monthsParseExact:!0,weekdays:p,weekdaysShort:O,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(M){return M+(1===M?"d":M%10==2?"na":"mh")},week:{dow:1,doy:4}})}(z(381))},8794:function(M,b,z){!function(M){"use strict";M.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(M){return 0===M.indexOf("un")?"n"+M:"en "+M},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},7884:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={s:["थोडया सॅकंडांनी","थोडे सॅकंड"],ss:[M+" सॅकंडांनी",M+" सॅकंड"],m:["एका मिणटान","एक मिनूट"],mm:[M+" मिणटांनी",M+" मिणटां"],h:["एका वरान","एक वर"],hh:[M+" वरांनी",M+" वरां"],d:["एका दिसान","एक दीस"],dd:[M+" दिसांनी",M+" दीस"],M:["एका म्हयन्यान","एक म्हयनो"],MM:[M+" म्हयन्यानी",M+" म्हयने"],y:["एका वर्सान","एक वर्स"],yy:[M+" वर्सांनी",M+" वर्सां"]};return p?O[z][0]:O[z][1]}M.defineLocale("gom-deva",{months:{standalone:"जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),format:"जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार".split("_"),weekdaysShort:"आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.".split("_"),weekdaysMin:"आ_सो_मं_बु_ब्रे_सु_शे".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [वाजतां]",LTS:"A h:mm:ss [वाजतां]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [वाजतां]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [वाजतां]",llll:"ddd, D MMM YYYY, A h:mm [वाजतां]"},calendar:{sameDay:"[आयज] LT",nextDay:"[फाल्यां] LT",nextWeek:"[फुडलो] dddd[,] LT",lastDay:"[काल] LT",lastWeek:"[फाटलो] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s आदीं",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(वेर)/,ordinal:function(M,b){return"D"===b?M+"वेर":M},week:{dow:0,doy:3},meridiemParse:/राती|सकाळीं|दनपारां|सांजे/,meridiemHour:function(M,b){return 12===M&&(M=0),"राती"===b?M<4?M:M+12:"सकाळीं"===b?M:"दनपारां"===b?M>12?M:M+12:"सांजे"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"राती":M<12?"सकाळीं":M<16?"दनपारां":M<20?"सांजे":"राती"}})}(z(381))},3168:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={s:["thoddea sekondamni","thodde sekond"],ss:[M+" sekondamni",M+" sekond"],m:["eka mintan","ek minut"],mm:[M+" mintamni",M+" mintam"],h:["eka voran","ek vor"],hh:[M+" voramni",M+" voram"],d:["eka disan","ek dis"],dd:[M+" disamni",M+" dis"],M:["eka mhoinean","ek mhoino"],MM:[M+" mhoineamni",M+" mhoine"],y:["eka vorsan","ek voros"],yy:[M+" vorsamni",M+" vorsam"]};return p?O[z][0]:O[z][1]}M.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(M,b){return"D"===b?M+"er":M},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(M,b){return 12===M&&(M=0),"rati"===b?M<4?M:M+12:"sokallim"===b?M:"donparam"===b?M>12?M:M+12:"sanje"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"rati":M<12?"sokallim":M<16?"donparam":M<20?"sanje":"rati"}})}(z(381))},5349:function(M,b,z){!function(M){"use strict";var b={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},z={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};M.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),longDateFormat:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},calendar:{sameDay:"[આજ] LT",nextDay:"[કાલે] LT",nextWeek:"dddd, LT",lastDay:"[ગઇકાલે] LT",lastWeek:"[પાછલા] dddd, LT",sameElse:"L"},relativeTime:{future:"%s મા",past:"%s પહેલા",s:"અમુક પળો",ss:"%d સેકંડ",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"},preparse:function(M){return M.replace(/[૧૨૩૪૫૬૭૮૯૦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/રાત|બપોર|સવાર|સાંજ/,meridiemHour:function(M,b){return 12===M&&(M=0),"રાત"===b?M<4?M:M+12:"સવાર"===b?M:"બપોર"===b?M>=10?M:M+12:"સાંજ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"રાત":M<10?"સવાર":M<17?"બપોર":M<20?"સાંજ":"રાત"},week:{dow:0,doy:6}})}(z(381))},4206:function(M,b,z){!function(M){"use strict";M.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(M){return 2===M?"שעתיים":M+" שעות"},d:"יום",dd:function(M){return 2===M?"יומיים":M+" ימים"},M:"חודש",MM:function(M){return 2===M?"חודשיים":M+" חודשים"},y:"שנה",yy:function(M){return 2===M?"שנתיים":M%10==0&&10!==M?M+" שנה":M+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(M){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(M)},meridiem:function(M,b,z){return M<5?"לפנות בוקר":M<10?"בבוקר":M<12?z?'לפנה"צ':"לפני הצהריים":M<18?z?'אחה"צ':"אחרי הצהריים":"בערב"}})}(z(381))},94:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},p=[/^जन/i,/^फ़र|फर/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सितं|सित/i,/^अक्टू/i,/^नव|नवं/i,/^दिसं|दिस/i],O=[/^जन/i,/^फ़र/i,/^मार्च/i,/^अप्रै/i,/^मई/i,/^जून/i,/^जुल/i,/^अग/i,/^सित/i,/^अक्टू/i,/^नव/i,/^दिस/i];M.defineLocale("hi",{months:{format:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),standalone:"जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर".split("_")},monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},monthsParse:p,longMonthsParse:p,shortMonthsParse:O,monthsRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsShortRegex:/^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,monthsStrictRegex:/^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,monthsShortStrictRegex:/^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(M,b){return 12===M&&(M=0),"रात"===b?M<4?M:M+12:"सुबह"===b?M:"दोपहर"===b?M>=10?M:M+12:"शाम"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"रात":M<10?"सुबह":M<17?"दोपहर":M<20?"शाम":"रात"},week:{dow:0,doy:6}})}(z(381))},316:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=M+" ";switch(z){case"ss":return p+=1===M?"sekunda":2===M||3===M||4===M?"sekunde":"sekundi";case"m":return b?"jedna minuta":"jedne minute";case"mm":return p+=1===M?"minuta":2===M||3===M||4===M?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return p+=1===M?"sat":2===M||3===M||4===M?"sata":"sati";case"dd":return p+=1===M?"dan":"dana";case"MM":return p+=1===M?"mjesec":2===M||3===M||4===M?"mjeseca":"mjeseci";case"yy":return p+=1===M?"godina":2===M||3===M||4===M?"godine":"godina"}}M.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:return"[prošlu] [nedjelju] [u] LT";case 3:return"[prošlu] [srijedu] [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:b,m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},2138:function(M,b,z){!function(M){"use strict";var b="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function z(M,b,z,p){var O=M;switch(z){case"s":return p||b?"néhány másodperc":"néhány másodperce";case"ss":return O+(p||b)?" másodperc":" másodperce";case"m":return"egy"+(p||b?" perc":" perce");case"mm":return O+(p||b?" perc":" perce");case"h":return"egy"+(p||b?" óra":" órája");case"hh":return O+(p||b?" óra":" órája");case"d":return"egy"+(p||b?" nap":" napja");case"dd":return O+(p||b?" nap":" napja");case"M":return"egy"+(p||b?" hónap":" hónapja");case"MM":return O+(p||b?" hónap":" hónapja");case"y":return"egy"+(p||b?" év":" éve");case"yy":return O+(p||b?" év":" éve")}return""}function p(M){return(M?"":"[múlt] ")+"["+b[this.day()]+"] LT[-kor]"}M.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(M){return"u"===M.charAt(1).toLowerCase()},meridiem:function(M,b,z){return M<12?!0===z?"de":"DE":!0===z?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return p.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return p.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:z,ss:z,m:z,mm:z,h:z,hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},1423:function(M,b,z){!function(M){"use strict";M.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",ss:"%d վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(M){return/^(ցերեկվա|երեկոյան)$/.test(M)},meridiem:function(M){return M<4?"գիշերվա":M<12?"առավոտվա":M<17?"ցերեկվա":"երեկոյան"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(M,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===M?M+"-ին":M+"-րդ";default:return M}},week:{dow:1,doy:7}})}(z(381))},9218:function(M,b,z){!function(M){"use strict";M.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"siang"===b?M>=11?M:M+12:"sore"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"siang":M<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(z(381))},135:function(M,b,z){!function(M){"use strict";function b(M){return M%100==11||M%10!=1}function z(M,z,p,O){var o=M+" ";switch(p){case"s":return z||O?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return b(M)?o+(z||O?"sekúndur":"sekúndum"):o+"sekúnda";case"m":return z?"mínúta":"mínútu";case"mm":return b(M)?o+(z||O?"mínútur":"mínútum"):z?o+"mínúta":o+"mínútu";case"hh":return b(M)?o+(z||O?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return z?"dagur":O?"dag":"degi";case"dd":return b(M)?z?o+"dagar":o+(O?"daga":"dögum"):z?o+"dagur":o+(O?"dag":"degi");case"M":return z?"mánuður":O?"mánuð":"mánuði";case"MM":return b(M)?z?o+"mánuðir":o+(O?"mánuði":"mánuðum"):z?o+"mánuður":o+(O?"mánuð":"mánuði");case"y":return z||O?"ár":"ári";case"yy":return b(M)?o+(z||O?"ár":"árum"):o+(z||O?"ár":"ári")}}M.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:z,ss:z,m:z,mm:z,h:"klukkustund",hh:z,d:z,dd:z,M:z,MM:z,y:z,yy:z},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},150:function(M,b,z){!function(M){"use strict";M.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){return 0===this.day()?"[la scorsa] dddd [alle] LT":"[lo scorso] dddd [alle] LT"},sameElse:"L"},relativeTime:{future:function(M){return(/^[0-9].+$/.test(M)?"tra":"in")+" "+M},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},626:function(M,b,z){!function(M){"use strict";M.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){return 0===this.day()?"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT":"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},9183:function(M,b,z){!function(M){"use strict";M.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"令和",narrow:"㋿",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"平成",narrow:"㍻",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"昭和",narrow:"㍼",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"大正",narrow:"㍽",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"明治",narrow:"㍾",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"西暦",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"紀元前",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(元|\d+)年/,eraYearOrdinalParse:function(M,b){return"元"===b[1]?1:parseInt(b[1]||M,10)},months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(M){return"午後"===M},meridiem:function(M,b,z){return M<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(M){return M.week()!==this.week()?"[来週]dddd LT":"dddd LT"},lastDay:"[昨日] LT",lastWeek:function(M){return this.week()!==M.week()?"[先週]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}日/,ordinal:function(M,b){switch(b){case"y":return 1===M?"元年":M+"年";case"d":case"D":case"DDD":return M+"日";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",ss:"%d秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})}(z(381))},4286:function(M,b,z){!function(M){"use strict";M.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(M,b){return 12===M&&(M=0),"enjing"===b?M:"siyang"===b?M>=11?M:M+12:"sonten"===b||"ndalu"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"enjing":M<15?"siyang":M<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(z(381))},2105:function(M,b,z){!function(M){"use strict";M.defineLocale("ka",{months:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(M){return M.replace(/(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,(function(M,b,z){return"ი"===z?b+"ში":b+z+"ში"}))},past:function(M){return/(წამი|წუთი|საათი|დღე|თვე)/.test(M)?M.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(M)?M.replace(/წელი$/,"წლის წინ"):M},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(M){return 0===M?M:1===M?M+"-ლი":M<20||M<=100&&M%20==0||M%100==0?"მე-"+M:M+"-ე"},week:{dow:1,doy:7}})}(z(381))},7772:function(M,b,z){!function(M){"use strict";var b={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};M.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},8758:function(M,b,z){!function(M){"use strict";var b={1:"១",2:"២",3:"៣",4:"៤",5:"៥",6:"៦",7:"៧",8:"៨",9:"៩",0:"០"},z={"១":"1","២":"2","៣":"3","៤":"4","៥":"5","៦":"6","៧":"7","៨":"8","៩":"9","០":"0"};M.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ព្រឹក|ល្ងាច/,isPM:function(M){return"ល្ងាច"===M},meridiem:function(M,b,z){return M<12?"ព្រឹក":"ល្ងាច"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",ss:"%d វិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},dayOfMonthOrdinalParse:/ទី\d{1,2}/,ordinal:"ទី%d",preparse:function(M){return M.replace(/[១២៣៤៥៦៧៨៩០]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(381))},9282:function(M,b,z){!function(M){"use strict";var b={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},z={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"};M.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(M){return M.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ರಾತ್ರಿ"===b?M<4?M:M+12:"ಬೆಳಿಗ್ಗೆ"===b?M:"ಮಧ್ಯಾಹ್ನ"===b?M>=10?M:M+12:"ಸಂಜೆ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ರಾತ್ರಿ":M<10?"ಬೆಳಿಗ್ಗೆ":M<17?"ಮಧ್ಯಾಹ್ನ":M<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(M){return M+"ನೇ"},week:{dow:0,doy:6}})}(z(381))},3730:function(M,b,z){!function(M){"use strict";M.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"일";case"M":return M+"월";case"w":case"W":return M+"주";default:return M}},meridiemParse:/오전|오후/,isPM:function(M){return"오후"===M},meridiem:function(M,b,z){return M<12?"오전":"오후"}})}(z(381))},1408:function(M,b,z){!function(M){"use strict";var b={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},z={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},p=["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمموز","ئاب","ئەیلوول","تشرینی یەكەم","تشرینی دووەم","كانونی یەکەم"];M.defineLocale("ku",{months:p,monthsShort:p,weekdays:"یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌".split("_"),weekdaysShort:"یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌".split("_"),weekdaysMin:"ی_د_س_چ_پ_ه_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ئێواره‌|به‌یانی/,isPM:function(M){return/ئێواره‌/.test(M)},meridiem:function(M,b,z){return M<12?"به‌یانی":"ئێواره‌"},calendar:{sameDay:"[ئه‌مرۆ كاتژمێر] LT",nextDay:"[به‌یانی كاتژمێر] LT",nextWeek:"dddd [كاتژمێر] LT",lastDay:"[دوێنێ كاتژمێر] LT",lastWeek:"dddd [كاتژمێر] LT",sameElse:"L"},relativeTime:{future:"له‌ %s",past:"%s",s:"چه‌ند چركه‌یه‌ك",ss:"چركه‌ %d",m:"یه‌ك خوله‌ك",mm:"%d خوله‌ك",h:"یه‌ك كاتژمێر",hh:"%d كاتژمێر",d:"یه‌ك ڕۆژ",dd:"%d ڕۆژ",M:"یه‌ك مانگ",MM:"%d مانگ",y:"یه‌ك ساڵ",yy:"%d ساڵ"},preparse:function(M){return M.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(M){return z[M]})).replace(/،/g,",")},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]})).replace(/,/g,"،")},week:{dow:6,doy:12}})}(z(381))},3291:function(M,b,z){!function(M){"use strict";var b={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};M.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кечээ саат] LT",lastWeek:"[Өткөн аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",ss:"%d секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},6841:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?O[z][0]:O[z][1]}function z(M){return O(M.substr(0,M.indexOf(" ")))?"a "+M:"an "+M}function p(M){return O(M.substr(0,M.indexOf(" ")))?"viru "+M:"virun "+M}function O(M){if(M=parseInt(M,10),isNaN(M))return!1;if(M<0)return!0;if(M<10)return 4<=M&&M<=7;if(M<100){var b=M%10;return O(0===b?M/10:b)}if(M<1e4){for(;M>=10;)M/=10;return O(M)}return O(M/=1e3)}M.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:z,past:p,s:"e puer Sekonnen",ss:"%d Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},5466:function(M,b,z){!function(M){"use strict";M.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(M){return"ຕອນແລງ"===M},meridiem:function(M,b,z){return M<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",ss:"%d ວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},dayOfMonthOrdinalParse:/(ທີ່)\d{1,2}/,ordinal:function(M){return"ທີ່"+M}})}(z(381))},7010:function(M,b,z){!function(M){"use strict";var b={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function z(M,b,z,p){return b?"kelios sekundės":p?"kelių sekundžių":"kelias sekundes"}function p(M,b,z,p){return b?o(z)[0]:p?o(z)[1]:o(z)[2]}function O(M){return M%10==0||M>10&&M<20}function o(M){return b[M].split("_")}function A(M,b,z,A){var c=M+" ";return 1===M?c+p(M,b,z[0],A):b?c+(O(M)?o(z)[1]:o(z)[0]):A?c+o(z)[1]:c+(O(M)?o(z)[1]:o(z)[2])}M.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:z,ss:A,m:p,mm:A,h:p,hh:A,d:p,dd:A,M:p,MM:A,y:p,yy:A},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(M){return M+"-oji"},week:{dow:1,doy:4}})}(z(381))},7595:function(M,b,z){!function(M){"use strict";var b={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function z(M,b,z){return z?b%10==1&&b%100!=11?M[2]:M[3]:b%10==1&&b%100!=11?M[0]:M[1]}function p(M,p,O){return M+" "+z(b[O],M,p)}function O(M,p,O){return z(b[O],M,p)}function o(M,b){return b?"dažas sekundes":"dažām sekundēm"}M.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:o,ss:p,m:O,mm:p,h:O,hh:p,d:O,dd:p,M:O,MM:p,y:O,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9861:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(M,b){return 1===M?b[0]:M>=2&&M<=4?b[1]:b[2]},translate:function(M,z,p){var O=b.words[p];return 1===p.length?z?O[0]:O[1]:M+" "+b.correctGrammaticalCase(M,O)}};M.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mjesec",MM:b.translate,y:"godinu",yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},5493:function(M,b,z){!function(M){"use strict";M.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},5966:function(M,b,z){!function(M){"use strict";M.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"за %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"една минута",mm:"%d минути",h:"еден час",hh:"%d часа",d:"еден ден",dd:"%d дена",M:"еден месец",MM:"%d месеци",y:"една година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(M){var b=M%10,z=M%100;return 0===M?M+"-ев":0===z?M+"-ен":z>10&&z<20?M+"-ти":1===b?M+"-ви":2===b?M+"-ри":7===b||8===b?M+"-ми":M+"-ти"},week:{dow:1,doy:7}})}(z(381))},7341:function(M,b,z){!function(M){"use strict";M.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(M,b){return 12===M&&(M=0),"രാത്രി"===b&&M>=4||"ഉച്ച കഴിഞ്ഞ്"===b||"വൈകുന്നേരം"===b?M+12:M},meridiem:function(M,b,z){return M<4?"രാത്രി":M<12?"രാവിലെ":M<17?"ഉച്ച കഴിഞ്ഞ്":M<20?"വൈകുന്നേരം":"രാത്രി"}})}(z(381))},5115:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){switch(z){case"s":return b?"хэдхэн секунд":"хэдхэн секундын";case"ss":return M+(b?" секунд":" секундын");case"m":case"mm":return M+(b?" минут":" минутын");case"h":case"hh":return M+(b?" цаг":" цагийн");case"d":case"dd":return M+(b?" өдөр":" өдрийн");case"M":case"MM":return M+(b?" сар":" сарын");case"y":case"yy":return M+(b?" жил":" жилийн");default:return M}}M.defineLocale("mn",{months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),monthsParseExact:!0,weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},meridiemParse:/ҮӨ|ҮХ/i,isPM:function(M){return"ҮХ"===M},meridiem:function(M,b,z){return M<12?"ҮӨ":"ҮХ"},calendar:{sameDay:"[Өнөөдөр] LT",nextDay:"[Маргааш] LT",nextWeek:"[Ирэх] dddd LT",lastDay:"[Өчигдөр] LT",lastWeek:"[Өнгөрсөн] dddd LT",sameElse:"L"},relativeTime:{future:"%s дараа",past:"%s өмнө",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2} өдөр/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+" өдөр";default:return M}}})}(z(381))},370:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function p(M,b,z,p){var O="";if(b)switch(z){case"s":O="काही सेकंद";break;case"ss":O="%d सेकंद";break;case"m":O="एक मिनिट";break;case"mm":O="%d मिनिटे";break;case"h":O="एक तास";break;case"hh":O="%d तास";break;case"d":O="एक दिवस";break;case"dd":O="%d दिवस";break;case"M":O="एक महिना";break;case"MM":O="%d महिने";break;case"y":O="एक वर्ष";break;case"yy":O="%d वर्षे"}else switch(z){case"s":O="काही सेकंदां";break;case"ss":O="%d सेकंदां";break;case"m":O="एका मिनिटा";break;case"mm":O="%d मिनिटां";break;case"h":O="एका तासा";break;case"hh":O="%d तासां";break;case"d":O="एका दिवसा";break;case"dd":O="%d दिवसां";break;case"M":O="एका महिन्या";break;case"MM":O="%d महिन्यां";break;case"y":O="एका वर्षा";break;case"yy":O="%d वर्षां"}return O.replace(/%d/i,M)}M.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,meridiemHour:function(M,b){return 12===M&&(M=0),"पहाटे"===b||"सकाळी"===b?M:"दुपारी"===b||"सायंकाळी"===b||"रात्री"===b?M>=12?M:M+12:void 0},meridiem:function(M,b,z){return M>=0&&M<6?"पहाटे":M<12?"सकाळी":M<17?"दुपारी":M<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}(z(381))},1237:function(M,b,z){!function(M){"use strict";M.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(381))},9847:function(M,b,z){!function(M){"use strict";M.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(M,b){return 12===M&&(M=0),"pagi"===b?M:"tengahari"===b?M>=11?M:M+12:"petang"===b||"malam"===b?M+12:void 0},meridiem:function(M,b,z){return M<11?"pagi":M<15?"tengahari":M<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(z(381))},2126:function(M,b,z){!function(M){"use strict";M.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6165:function(M,b,z){!function(M){"use strict";var b={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},z={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};M.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(M){return M.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},week:{dow:1,doy:4}})}(z(381))},4924:function(M,b,z){!function(M){"use strict";M.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},6744:function(M,b,z){!function(M){"use strict";var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},z={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};M.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(M){return M.replace(/[१२३४५६७८९०]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(M,b){return 12===M&&(M=0),"राति"===b?M<4?M:M+12:"बिहान"===b?M:"दिउँसो"===b?M>=10?M:M+12:"साँझ"===b?M+12:void 0},meridiem:function(M,b,z){return M<3?"राति":M<12?"बिहान":M<16?"दिउँसो":M<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}})}(z(381))},9814:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],O=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},3901:function(M,b,z){!function(M){"use strict";var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),z="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),p=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],O=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(M,p){return M?/-MMM-/.test(p)?z[M.month()]:b[M.month()]:b},monthsRegex:O,monthsShortRegex:O,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",w:"één week",ww:"%d weken",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(M){return M+(1===M||8===M||M>=20?"ste":"de")},week:{dow:1,doy:4}})}(z(381))},3877:function(M,b,z){!function(M){"use strict";M.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._må._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_må_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2135:function(M,b,z){!function(M){"use strict";M.defineLocale("oc-lnc",{months:{standalone:"genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre".split("_"),format:"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[uèi a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[ièr a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(M,b){var z=1===M?"r":2===M?"n":3===M?"r":4===M?"t":"è";return"w"!==b&&"W"!==b||(z="a"),M+z},week:{dow:1,doy:4}})}(z(381))},5858:function(M,b,z){!function(M){"use strict";var b={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},z={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};M.defineLocale("pa-in",{months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"[ਅਗਲਾ] dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",ss:"%d ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(M){return M.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(M,b){return 12===M&&(M=0),"ਰਾਤ"===b?M<4?M:M+12:"ਸਵੇਰ"===b?M:"ਦੁਪਹਿਰ"===b?M>=10?M:M+12:"ਸ਼ਾਮ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"ਰਾਤ":M<10?"ਸਵੇਰ":M<17?"ਦੁਪਹਿਰ":M<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,doy:6}})}(z(381))},4495:function(M,b,z){!function(M){"use strict";var b="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),z="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),p=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^paź/i,/^lis/i,/^gru/i];function O(M){return M%10<5&&M%10>1&&~~(M/10)%10!=1}function o(M,b,z){var p=M+" ";switch(z){case"ss":return p+(O(M)?"sekundy":"sekund");case"m":return b?"minuta":"minutę";case"mm":return p+(O(M)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return p+(O(M)?"godziny":"godzin");case"ww":return p+(O(M)?"tygodnie":"tygodni");case"MM":return p+(O(M)?"miesiące":"miesięcy");case"yy":return p+(O(M)?"lata":"lat")}}M.defineLocale("pl",{months:function(M,p){return M?/D MMMM/.test(p)?z[M.month()]:b[M.month()]:b},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:o,m:o,mm:o,h:o,hh:o,d:"1 dzień",dd:"%d dni",w:"tydzień",ww:o,M:"miesiąc",MM:o,y:"rok",yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},7971:function(M,b,z){!function(M){"use strict";M.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"do_2ª_3ª_4ª_5ª_6ª_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",invalidDate:"Data inválida"})}(z(381))},9520:function(M,b,z){!function(M){"use strict";M.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(z(381))},6459:function(M,b,z){!function(M){"use strict";function b(M,b,z){var p=" ";return(M%100>=20||M>=100&&M%100==0)&&(p=" de "),M+p+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"săptămâni",MM:"luni",yy:"ani"}[z]}M.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:b,m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,w:"o săptămână",ww:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}(z(381))},1793:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"минута":"минуту":M+" "+b({ss:z?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:z?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",ww:"неделя_недели_недель",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[p],+M)}var p=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];M.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:p,longMonthsParse:p,shortMonthsParse:p,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(M){if(M.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:z,m:z,mm:z,h:"час",hh:z,d:"день",dd:z,w:"неделя",ww:z,M:"месяц",MM:z,y:"год",yy:z},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(M){return/^(дня|вечера)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночи":M<12?"утра":M<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":return M+"-й";case"D":return M+"-го";case"w":case"W":return M+"-я";default:return M}},week:{dow:1,doy:4}})}(z(381))},950:function(M,b,z){!function(M){"use strict";var b=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],z=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"];M.defineLocale("sd",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(381))},490:function(M,b,z){!function(M){"use strict";M.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},124:function(M,b,z){!function(M){"use strict";M.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",ss:"තත්පර %d",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},dayOfMonthOrdinalParse:/\d{1,2} වැනි/,ordinal:function(M){return M+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(M){return"ප.ව."===M||"පස් වරු"===M},meridiem:function(M,b,z){return M>11?z?"ප.ව.":"පස් වරු":z?"පෙ.ව.":"පෙර වරු"}})}(z(381))},4249:function(M,b,z){!function(M){"use strict";var b="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),z="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function p(M){return M>1&&M<5}function O(M,b,z,O){var o=M+" ";switch(z){case"s":return b||O?"pár sekúnd":"pár sekundami";case"ss":return b||O?o+(p(M)?"sekundy":"sekúnd"):o+"sekundami";case"m":return b?"minúta":O?"minútu":"minútou";case"mm":return b||O?o+(p(M)?"minúty":"minút"):o+"minútami";case"h":return b?"hodina":O?"hodinu":"hodinou";case"hh":return b||O?o+(p(M)?"hodiny":"hodín"):o+"hodinami";case"d":return b||O?"deň":"dňom";case"dd":return b||O?o+(p(M)?"dni":"dní"):o+"dňami";case"M":return b||O?"mesiac":"mesiacom";case"MM":return b||O?o+(p(M)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return b||O?"rok":"rokom";case"yy":return b||O?o+(p(M)?"roky":"rokov"):o+"rokmi"}}M.defineLocale("sk",{months:b,monthsShort:z,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:case 4:case 5:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:O,ss:O,m:O,mm:O,h:O,hh:O,d:O,dd:O,M:O,MM:O,y:O,yy:O},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},4985:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O=M+" ";switch(z){case"s":return b||p?"nekaj sekund":"nekaj sekundami";case"ss":return O+=1===M?b?"sekundo":"sekundi":2===M?b||p?"sekundi":"sekundah":M<5?b||p?"sekunde":"sekundah":"sekund";case"m":return b?"ena minuta":"eno minuto";case"mm":return O+=1===M?b?"minuta":"minuto":2===M?b||p?"minuti":"minutama":M<5?b||p?"minute":"minutami":b||p?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return O+=1===M?b?"ura":"uro":2===M?b||p?"uri":"urama":M<5?b||p?"ure":"urami":b||p?"ur":"urami";case"d":return b||p?"en dan":"enim dnem";case"dd":return O+=1===M?b||p?"dan":"dnem":2===M?b||p?"dni":"dnevoma":b||p?"dni":"dnevi";case"M":return b||p?"en mesec":"enim mesecem";case"MM":return O+=1===M?b||p?"mesec":"mesecem":2===M?b||p?"meseca":"mesecema":M<5?b||p?"mesece":"meseci":b||p?"mesecev":"meseci";case"y":return b||p?"eno leto":"enim letom";case"yy":return O+=1===M?b||p?"leto":"letom":2===M?b||p?"leti":"letoma":M<5?b||p?"leta":"leti":b||p?"let":"leti"}}M.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},1104:function(M,b,z){!function(M){"use strict";M.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(M){return"M"===M.charAt(0)},meridiem:function(M,b,z){return M<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},9915:function(M,b,z){!function(M){"use strict";var b={words:{ss:["секунда","секунде","секунди"],m:["један минут","једног минута"],mm:["минут","минута","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],d:["један дан","једног дана"],dd:["дан","дана","дана"],M:["један месец","једног месеца"],MM:["месец","месеца","месеци"],y:["једну годину","једне године"],yy:["годину","године","година"]},correctGrammaticalCase:function(M,b){return M%10>=1&&M%10<=4&&(M%100<10||M%100>=20)?M%10==1?b[0]:b[1]:b[2]},translate:function(M,z,p,O){var o,A=b.words[p];return 1===p.length?"y"===p&&z?"једна година":O||z?A[0]:A[1]:(o=b.correctGrammaticalCase(M,A),"yy"===p&&z&&"годину"===o?M+" година":M+" "+o)}};M.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:b.translate,dd:b.translate,M:b.translate,MM:b.translate,y:b.translate,yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},9131:function(M,b,z){!function(M){"use strict";var b={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(M,b){return M%10>=1&&M%10<=4&&(M%100<10||M%100>=20)?M%10==1?b[0]:b[1]:b[2]},translate:function(M,z,p,O){var o,A=b.words[p];return 1===p.length?"y"===p&&z?"jedna godina":O||z?A[0]:A[1]:(o=b.correctGrammaticalCase(M,A),"yy"===p&&z&&"godinu"===o?M+" godina":M+" "+o)}};M.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:b.translate,m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:b.translate,dd:b.translate,M:b.translate,MM:b.translate,y:b.translate,yy:b.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(z(381))},5893:function(M,b,z){!function(M){"use strict";M.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(M,b,z){return M<11?"ekuseni":M<15?"emini":M<19?"entsambama":"ebusuku"},meridiemHour:function(M,b){return 12===M&&(M=0),"ekuseni"===b?M:"emini"===b?M>=11?M:M+12:"entsambama"===b||"ebusuku"===b?0===M?0:M+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(z(381))},8760:function(M,b,z){!function(M){"use strict";M.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?":e":1===b||2===b?":a":":e")},week:{dow:1,doy:4}})}(z(381))},1172:function(M,b,z){!function(M){"use strict";M.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(z(381))},7333:function(M,b,z){!function(M){"use strict";var b={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},z={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};M.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(M){return M+"வது"},preparse:function(M){return M.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,(function(M){return z[M]}))},postformat:function(M){return M.replace(/\d/g,(function(M){return b[M]}))},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(M,b,z){return M<2?" யாமம்":M<6?" வைகறை":M<10?" காலை":M<14?" நண்பகல்":M<18?" எற்பாடு":M<22?" மாலை":" யாமம்"},meridiemHour:function(M,b){return 12===M&&(M=0),"யாமம்"===b?M<2?M:M+12:"வைகறை"===b||"காலை"===b||"நண்பகல்"===b&&M>=10?M:M+12},week:{dow:0,doy:6}})}(z(381))},3110:function(M,b,z){!function(M){"use strict";M.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(M,b){return 12===M&&(M=0),"రాత్రి"===b?M<4?M:M+12:"ఉదయం"===b?M:"మధ్యాహ్నం"===b?M>=10?M:M+12:"సాయంత్రం"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"రాత్రి":M<10?"ఉదయం":M<17?"మధ్యాహ్నం":M<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}})}(z(381))},2095:function(M,b,z){!function(M){"use strict";M.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},7321:function(M,b,z){!function(M){"use strict";var b={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};M.defineLocale("tg",{months:{format:"январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри".split("_"),standalone:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_")},monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Фардо соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(M,b){return 12===M&&(M=0),"шаб"===b?M<4?M:M+12:"субҳ"===b?M:"рӯз"===b?M>=11?M:M+12:"бегоҳ"===b?M+12:void 0},meridiem:function(M,b,z){return M<4?"шаб":M<11?"субҳ":M<16?"рӯз":M<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(M){var z=M%10,p=M>=100?100:null;return M+(b[M]||b[z]||b[p])},week:{dow:1,doy:7}})}(z(381))},9041:function(M,b,z){!function(M){"use strict";M.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(M){return"หลังเที่ยง"===M},meridiem:function(M,b,z){return M<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",w:"1 สัปดาห์",ww:"%d สัปดาห์",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}(z(381))},9005:function(M,b,z){!function(M){"use strict";var b={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'ünji",4:"'ünji",100:"'ünji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};M.defineLocale("tk",{months:"Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr".split("_"),monthsShort:"Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek".split("_"),weekdays:"Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe".split("_"),weekdaysShort:"Ýek_Duş_Siş_Çar_Pen_Ann_Şen".split("_"),weekdaysMin:"Ýk_Dş_Sş_Çr_Pn_An_Şn".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[düýn] LT",lastWeek:"[geçen] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s soň",past:"%s öň",s:"birnäçe sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir gün",dd:"%d gün",M:"bir aý",MM:"%d aý",y:"bir ýyl",yy:"%d ýyl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'unjy";var p=M%10,O=M%100-p,o=M>=100?100:null;return M+(b[p]||b[O]||b[o])}},week:{dow:1,doy:7}})}(z(381))},5768:function(M,b,z){!function(M){"use strict";M.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},9444:function(M,b,z){!function(M){"use strict";var b="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function z(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"leS":-1!==M.indexOf("jar")?b.slice(0,-3)+"waQ":-1!==M.indexOf("DIS")?b.slice(0,-3)+"nem":b+" pIq"}function p(M){var b=M;return b=-1!==M.indexOf("jaj")?b.slice(0,-3)+"Hu’":-1!==M.indexOf("jar")?b.slice(0,-3)+"wen":-1!==M.indexOf("DIS")?b.slice(0,-3)+"ben":b+" ret"}function O(M,b,z,p){var O=o(M);switch(z){case"ss":return O+" lup";case"mm":return O+" tup";case"hh":return O+" rep";case"dd":return O+" jaj";case"MM":return O+" jar";case"yy":return O+" DIS"}}function o(M){var z=Math.floor(M%1e3/100),p=Math.floor(M%100/10),O=M%10,o="";return z>0&&(o+=b[z]+"vatlh"),p>0&&(o+=(""!==o?" ":"")+b[p]+"maH"),O>0&&(o+=(""!==o?" ":"")+b[O]),""===o?"pagh":o}M.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:z,past:p,s:"puS lup",ss:O,m:"wa’ tup",mm:O,h:"wa’ rep",hh:O,d:"wa’ jaj",dd:O,M:"wa’ jar",MM:O,y:"wa’ DIS",yy:O},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},2397:function(M,b,z){!function(M){"use strict";var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};M.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_Çar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),meridiem:function(M,b,z){return M<12?z?"öö":"ÖÖ":z?"ös":"ÖS"},meridiemParse:/öö|ÖÖ|ös|ÖS/,isPM:function(M){return"ös"===M||"ÖS"===M},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(M,z){switch(z){case"d":case"D":case"Do":case"DD":return M;default:if(0===M)return M+"'ıncı";var p=M%10,O=M%100-p,o=M>=100?100:null;return M+(b[p]||b[O]||b[o])}},week:{dow:1,doy:7}})}(z(381))},8254:function(M,b,z){!function(M){"use strict";function b(M,b,z,p){var O={s:["viensas secunds","'iensas secunds"],ss:[M+" secunds",M+" secunds"],m:["'n míut","'iens míut"],mm:[M+" míuts",M+" míuts"],h:["'n þora","'iensa þora"],hh:[M+" þoras",M+" þoras"],d:["'n ziua","'iensa ziua"],dd:[M+" ziuas",M+" ziuas"],M:["'n mes","'iens mes"],MM:[M+" mesen",M+" mesen"],y:["'n ar","'iens ar"],yy:[M+" ars",M+" ars"]};return p||b?O[z][0]:O[z][1]}M.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(M){return"d'o"===M.toLowerCase()},meridiem:function(M,b,z){return M>11?z?"d'o":"D'O":z?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:b,ss:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(z(381))},699:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(z(381))},1106:function(M,b,z){!function(M){"use strict";M.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",ss:"%d ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}(z(381))},9288:function(M,b,z){!function(M){"use strict";M.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(M,b){return 12===M&&(M=0),"يېرىم كېچە"===b||"سەھەر"===b||"چۈشتىن بۇرۇن"===b?M:"چۈشتىن كېيىن"===b||"كەچ"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"يېرىم كېچە":p<900?"سەھەر":p<1130?"چۈشتىن بۇرۇن":p<1230?"چۈش":p<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"-كۈنى";case"w":case"W":return M+"-ھەپتە";default:return M}},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:7}})}(z(381))},7691:function(M,b,z){!function(M){"use strict";function b(M,b){var z=M.split("_");return b%10==1&&b%100!=11?z[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?z[1]:z[2]}function z(M,z,p){return"m"===p?z?"хвилина":"хвилину":"h"===p?z?"година":"годину":M+" "+b({ss:z?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:z?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:z?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"}[p],+M)}function p(M,b){var z={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};return!0===M?z.nominative.slice(1,7).concat(z.nominative.slice(0,1)):M?z[/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative"][M.day()]:z.nominative}function O(M){return function(){return M+"о"+(11===this.hours()?"б":"")+"] LT"}}M.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:p,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:O("[Сьогодні "),nextDay:O("[Завтра "),lastDay:O("[Вчора "),nextWeek:O("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return O("[Минулої] dddd [").call(this);case 1:case 2:case 4:return O("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:z,m:z,mm:z,h:"годину",hh:z,d:"день",dd:z,M:"місяць",MM:z,y:"рік",yy:z},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(M){return/^(дня|вечора)$/.test(M)},meridiem:function(M,b,z){return M<4?"ночі":M<12?"ранку":M<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(M,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return M+"-й";case"D":return M+"-го";default:return M}},week:{dow:1,doy:7}})}(z(381))},3795:function(M,b,z){!function(M){"use strict";var b=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],z=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];M.defineLocale("ur",{months:b,monthsShort:b,weekdays:z,weekdaysShort:z,weekdaysMin:z,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(M){return"شام"===M},meridiem:function(M,b,z){return M<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(M){return M.replace(/،/g,",")},postformat:function(M){return M.replace(/,/g,"،")},week:{dow:1,doy:4}})}(z(381))},588:function(M,b,z){!function(M){"use strict";M.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(z(381))},6791:function(M,b,z){!function(M){"use strict";M.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",ss:"%d фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}(z(381))},5666:function(M,b,z){!function(M){"use strict";M.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(M){return/^ch$/i.test(M)},meridiem:function(M,b,z){return M<12?z?"sa":"SA":z?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần trước lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",w:"một tuần",ww:"%d tuần",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(M){return M},week:{dow:1,doy:4}})}(z(381))},4378:function(M,b,z){!function(M){"use strict";M.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",ss:"%d s~écóñ~ds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1==~~(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")},week:{dow:1,doy:4}})}(z(381))},5805:function(M,b,z){!function(M){"use strict";M.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}})}(z(381))},3839:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"下午"===b||"晚上"===b?M+12:M>=11?M:M+12},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(M){return M.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(M){return this.week()!==M.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"周";default:return M}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})}(z(381))},5726:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1200?"上午":1200===p?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},9807:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-mo",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"D/M/YYYY",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},4152:function(M,b,z){!function(M){"use strict";M.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(M,b){return 12===M&&(M=0),"凌晨"===b||"早上"===b||"上午"===b?M:"中午"===b?M>=11?M:M+12:"下午"===b||"晚上"===b?M+12:void 0},meridiem:function(M,b,z){var p=100*M+b;return p<600?"凌晨":p<900?"早上":p<1130?"上午":p<1230?"中午":p<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(M,b){switch(b){case"d":case"D":case"DDD":return M+"日";case"M":return M+"月";case"w":case"W":return M+"週";default:return M}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(z(381))},6700:(M,b,z)=>{var p={"./af":2786,"./af.js":2786,"./ar":867,"./ar-dz":4130,"./ar-dz.js":4130,"./ar-kw":6135,"./ar-kw.js":6135,"./ar-ly":6440,"./ar-ly.js":6440,"./ar-ma":7702,"./ar-ma.js":7702,"./ar-sa":6040,"./ar-sa.js":6040,"./ar-tn":7100,"./ar-tn.js":7100,"./ar.js":867,"./az":1083,"./az.js":1083,"./be":9808,"./be.js":9808,"./bg":8338,"./bg.js":8338,"./bm":7438,"./bm.js":7438,"./bn":8905,"./bn-bd":6225,"./bn-bd.js":6225,"./bn.js":8905,"./bo":1560,"./bo.js":1560,"./br":1278,"./br.js":1278,"./bs":622,"./bs.js":622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":877,"./cv.js":877,"./cy":7373,"./cy.js":7373,"./da":4780,"./da.js":4780,"./de":9740,"./de-at":217,"./de-at.js":217,"./de-ch":894,"./de-ch.js":894,"./de.js":9740,"./dv":5300,"./dv.js":5300,"./el":837,"./el.js":837,"./en-au":8348,"./en-au.js":8348,"./en-ca":7925,"./en-ca.js":7925,"./en-gb":2243,"./en-gb.js":2243,"./en-ie":6436,"./en-ie.js":6436,"./en-il":7207,"./en-il.js":7207,"./en-in":4175,"./en-in.js":4175,"./en-nz":6319,"./en-nz.js":6319,"./en-sg":1662,"./en-sg.js":1662,"./eo":2915,"./eo.js":2915,"./es":5655,"./es-do":5251,"./es-do.js":5251,"./es-mx":6112,"./es-mx.js":6112,"./es-us":1146,"./es-us.js":1146,"./es.js":5655,"./et":5603,"./et.js":5603,"./eu":7763,"./eu.js":7763,"./fa":6959,"./fa.js":6959,"./fi":1897,"./fi.js":1897,"./fil":2549,"./fil.js":2549,"./fo":4694,"./fo.js":4694,"./fr":4470,"./fr-ca":3049,"./fr-ca.js":3049,"./fr-ch":2330,"./fr-ch.js":2330,"./fr.js":4470,"./fy":5044,"./fy.js":5044,"./ga":9295,"./ga.js":9295,"./gd":2101,"./gd.js":2101,"./gl":8794,"./gl.js":8794,"./gom-deva":7884,"./gom-deva.js":7884,"./gom-latn":3168,"./gom-latn.js":3168,"./gu":5349,"./gu.js":5349,"./he":4206,"./he.js":4206,"./hi":94,"./hi.js":94,"./hr":316,"./hr.js":316,"./hu":2138,"./hu.js":2138,"./hy-am":1423,"./hy-am.js":1423,"./id":9218,"./id.js":9218,"./is":135,"./is.js":135,"./it":626,"./it-ch":150,"./it-ch.js":150,"./it.js":626,"./ja":9183,"./ja.js":9183,"./jv":4286,"./jv.js":4286,"./ka":2105,"./ka.js":2105,"./kk":7772,"./kk.js":7772,"./km":8758,"./km.js":8758,"./kn":9282,"./kn.js":9282,"./ko":3730,"./ko.js":3730,"./ku":1408,"./ku.js":1408,"./ky":3291,"./ky.js":3291,"./lb":6841,"./lb.js":6841,"./lo":5466,"./lo.js":5466,"./lt":7010,"./lt.js":7010,"./lv":7595,"./lv.js":7595,"./me":9861,"./me.js":9861,"./mi":5493,"./mi.js":5493,"./mk":5966,"./mk.js":5966,"./ml":7341,"./ml.js":7341,"./mn":5115,"./mn.js":5115,"./mr":370,"./mr.js":370,"./ms":9847,"./ms-my":1237,"./ms-my.js":1237,"./ms.js":9847,"./mt":2126,"./mt.js":2126,"./my":6165,"./my.js":6165,"./nb":4924,"./nb.js":4924,"./ne":6744,"./ne.js":6744,"./nl":3901,"./nl-be":9814,"./nl-be.js":9814,"./nl.js":3901,"./nn":3877,"./nn.js":3877,"./oc-lnc":2135,"./oc-lnc.js":2135,"./pa-in":5858,"./pa-in.js":5858,"./pl":4495,"./pl.js":4495,"./pt":9520,"./pt-br":7971,"./pt-br.js":7971,"./pt.js":9520,"./ro":6459,"./ro.js":6459,"./ru":1793,"./ru.js":1793,"./sd":950,"./sd.js":950,"./se":490,"./se.js":490,"./si":124,"./si.js":124,"./sk":4249,"./sk.js":4249,"./sl":4985,"./sl.js":4985,"./sq":1104,"./sq.js":1104,"./sr":9131,"./sr-cyrl":9915,"./sr-cyrl.js":9915,"./sr.js":9131,"./ss":5893,"./ss.js":5893,"./sv":8760,"./sv.js":8760,"./sw":1172,"./sw.js":1172,"./ta":7333,"./ta.js":7333,"./te":3110,"./te.js":3110,"./tet":2095,"./tet.js":2095,"./tg":7321,"./tg.js":7321,"./th":9041,"./th.js":9041,"./tk":9005,"./tk.js":9005,"./tl-ph":5768,"./tl-ph.js":5768,"./tlh":9444,"./tlh.js":9444,"./tr":2397,"./tr.js":2397,"./tzl":8254,"./tzl.js":8254,"./tzm":1106,"./tzm-latn":699,"./tzm-latn.js":699,"./tzm.js":1106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":7691,"./uk.js":7691,"./ur":3795,"./ur.js":3795,"./uz":6791,"./uz-latn":588,"./uz-latn.js":588,"./uz.js":6791,"./vi":5666,"./vi.js":5666,"./x-pseudo":4378,"./x-pseudo.js":4378,"./yo":5805,"./yo.js":5805,"./zh-cn":3839,"./zh-cn.js":3839,"./zh-hk":5726,"./zh-hk.js":5726,"./zh-mo":9807,"./zh-mo.js":9807,"./zh-tw":4152,"./zh-tw.js":4152};function O(M){var b=o(M);return z(b)}function o(M){if(!z.o(p,M)){var b=new Error("Cannot find module '"+M+"'");throw b.code="MODULE_NOT_FOUND",b}return p[M]}O.keys=function(){return Object.keys(p)},O.resolve=o,M.exports=O,O.id=6700},381:function(M,b,z){(M=z.nmd(M)).exports=function(){"use strict";var b,p;function O(){return b.apply(null,arguments)}function o(M){b=M}function A(M){return M instanceof Array||"[object Array]"===Object.prototype.toString.call(M)}function c(M){return null!=M&&"[object Object]"===Object.prototype.toString.call(M)}function n(M,b){return Object.prototype.hasOwnProperty.call(M,b)}function e(M){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(M).length;var b;for(b in M)if(n(M,b))return!1;return!0}function q(M){return void 0===M}function a(M){return"number"==typeof M||"[object Number]"===Object.prototype.toString.call(M)}function d(M){return M instanceof Date||"[object Date]"===Object.prototype.toString.call(M)}function t(M,b){var z,p=[],O=M.length;for(z=0;z>>0;for(b=0;b0)for(z=0;z=0?z?"+":"":"-")+Math.pow(10,Math.max(0,O)).toString().substr(1)+p}var w=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,S=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,F={},j={};function E(M,b,z,p){var O=p;"string"==typeof p&&(O=function(){return this[p]()}),M&&(j[M]=O),b&&(j[b[0]]=function(){return v(O.apply(this,arguments),b[1],b[2])}),z&&(j[z]=function(){return this.localeData().ordinal(O.apply(this,arguments),M)})}function x(M){return M.match(/\[[\s\S]/)?M.replace(/^\[|\]$/g,""):M.replace(/\\/g,"")}function C(M){var b,z,p=M.match(w);for(b=0,z=p.length;b=0&&S.test(M);)M=M.replace(S,p),S.lastIndex=0,z-=1;return M}var V={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function U(M){var b=this._longDateFormat[M],z=this._longDateFormat[M.toUpperCase()];return b||!z?b:(this._longDateFormat[M]=z.match(w).map((function(M){return"MMMM"===M||"MM"===M||"DD"===M||"dddd"===M?M.slice(1):M})).join(""),this._longDateFormat[M])}var J="Invalid date";function G(){return this._invalidDate}var K="%d",Q=/\d{1,2}/;function Z(M){return this._ordinal.replace("%d",M)}var $={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function MM(M,b,z,p){var O=this._relativeTime[z];return T(O)?O(M,b,z,p):O.replace(/%d/i,M)}function bM(M,b){var z=this._relativeTime[M>0?"future":"past"];return T(z)?z(b):z.replace(/%s/i,b)}var zM={};function pM(M,b){var z=M.toLowerCase();zM[z]=zM[z+"s"]=zM[b]=M}function OM(M){return"string"==typeof M?zM[M]||zM[M.toLowerCase()]:void 0}function oM(M){var b,z,p={};for(z in M)n(M,z)&&(b=OM(z))&&(p[b]=M[z]);return p}var AM={};function cM(M,b){AM[M]=b}function nM(M){var b,z=[];for(b in M)n(M,b)&&z.push({unit:b,priority:AM[b]});return z.sort((function(M,b){return M.priority-b.priority})),z}function eM(M){return M%4==0&&M%100!=0||M%400==0}function qM(M){return M<0?Math.ceil(M)||0:Math.floor(M)}function aM(M){var b=+M,z=0;return 0!==b&&isFinite(b)&&(z=qM(b)),z}function dM(M,b){return function(z){return null!=z?(rM(this,M,z),O.updateOffset(this,b),this):tM(this,M)}}function tM(M,b){return M.isValid()?M._d["get"+(M._isUTC?"UTC":"")+b]():NaN}function rM(M,b,z){M.isValid()&&!isNaN(z)&&("FullYear"===b&&eM(M.year())&&1===M.month()&&29===M.date()?(z=aM(z),M._d["set"+(M._isUTC?"UTC":"")+b](z,M.month(),Mb(z,M.month()))):M._d["set"+(M._isUTC?"UTC":"")+b](z))}function WM(M){return T(this[M=OM(M)])?this[M]():this}function iM(M,b){if("object"==typeof M){var z,p=nM(M=oM(M)),O=p.length;for(z=0;z68?1900:2e3)};var sb=dM("FullYear",!0);function ub(){return eM(this.year())}function lb(M,b,z,p,O,o,A){var c;return M<100&&M>=0?(c=new Date(M+400,b,z,p,O,o,A),isFinite(c.getFullYear())&&c.setFullYear(M)):c=new Date(M,b,z,p,O,o,A),c}function Lb(M){var b,z;return M<100&&M>=0?((z=Array.prototype.slice.call(arguments))[0]=M+400,b=new Date(Date.UTC.apply(null,z)),isFinite(b.getUTCFullYear())&&b.setUTCFullYear(M)):b=new Date(Date.UTC.apply(null,arguments)),b}function _b(M,b,z){var p=7+b-z;return-(7+Lb(M,0,p).getUTCDay()-b)%7+p-1}function fb(M,b,z,p,O){var o,A,c=1+7*(b-1)+(7+z-p)%7+_b(M,p,O);return c<=0?A=ib(o=M-1)+c:c>ib(M)?(o=M+1,A=c-ib(M)):(o=M,A=c),{year:o,dayOfYear:A}}function mb(M,b,z){var p,O,o=_b(M.year(),b,z),A=Math.floor((M.dayOfYear()-o-1)/7)+1;return A<1?p=A+Rb(O=M.year()-1,b,z):A>Rb(M.year(),b,z)?(p=A-Rb(M.year(),b,z),O=M.year()+1):(O=M.year(),p=A),{week:p,year:O}}function Rb(M,b,z){var p=_b(M,b,z),O=_b(M+1,b,z);return(ib(M)-p+O)/7}function Bb(M){return mb(M,this._week.dow,this._week.doy).week}E("w",["ww",2],"wo","week"),E("W",["WW",2],"Wo","isoWeek"),pM("week","w"),pM("isoWeek","W"),cM("week",5),cM("isoWeek",5),kM("w",mM),kM("ww",mM,lM),kM("W",mM),kM("WW",mM,lM),EM(["w","ww","W","WW"],(function(M,b,z,p){b[p.substr(0,1)]=aM(M)}));var Xb={dow:0,doy:6};function hb(){return this._week.dow}function Nb(){return this._week.doy}function yb(M){var b=this.localeData().week(this);return null==M?b:this.add(7*(M-b),"d")}function Tb(M){var b=mb(this,1,4).week;return null==M?b:this.add(7*(M-b),"d")}function Yb(M,b){return"string"!=typeof M?M:isNaN(M)?"number"==typeof(M=b.weekdaysParse(M))?M:null:parseInt(M,10)}function Hb(M,b){return"string"==typeof M?b.weekdaysParse(M)%7||7:isNaN(M)?null:M}function gb(M,b){return M.slice(b,7).concat(M.slice(0,b))}E("d",0,"do","day"),E("dd",0,0,(function(M){return this.localeData().weekdaysMin(this,M)})),E("ddd",0,0,(function(M){return this.localeData().weekdaysShort(this,M)})),E("dddd",0,0,(function(M){return this.localeData().weekdays(this,M)})),E("e",0,0,"weekday"),E("E",0,0,"isoWeekday"),pM("day","d"),pM("weekday","e"),pM("isoWeekday","E"),cM("day",11),cM("weekday",11),cM("isoWeekday",11),kM("d",mM),kM("e",mM),kM("E",mM),kM("dd",(function(M,b){return b.weekdaysMinRegex(M)})),kM("ddd",(function(M,b){return b.weekdaysShortRegex(M)})),kM("dddd",(function(M,b){return b.weekdaysRegex(M)})),EM(["dd","ddd","dddd"],(function(M,b,z,p){var O=z._locale.weekdaysParse(M,p,z._strict);null!=O?b.d=O:s(z).invalidWeekday=M})),EM(["d","e","E"],(function(M,b,z,p){b[p]=aM(M)}));var Db="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),kb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),vb="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),wb=DM,Sb=DM,Fb=DM;function jb(M,b){var z=A(this._weekdays)?this._weekdays:this._weekdays[M&&!0!==M&&this._weekdays.isFormat.test(b)?"format":"standalone"];return!0===M?gb(z,this._week.dow):M?z[M.day()]:z}function Eb(M){return!0===M?gb(this._weekdaysShort,this._week.dow):M?this._weekdaysShort[M.day()]:this._weekdaysShort}function xb(M){return!0===M?gb(this._weekdaysMin,this._week.dow):M?this._weekdaysMin[M.day()]:this._weekdaysMin}function Cb(M,b,z){var p,O,o,A=M.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)o=W([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(o,"").toLocaleLowerCase();return z?"dddd"===b?-1!==(O=CM.call(this._weekdaysParse,A))?O:null:"ddd"===b?-1!==(O=CM.call(this._shortWeekdaysParse,A))?O:null:-1!==(O=CM.call(this._minWeekdaysParse,A))?O:null:"dddd"===b?-1!==(O=CM.call(this._weekdaysParse,A))||-1!==(O=CM.call(this._shortWeekdaysParse,A))||-1!==(O=CM.call(this._minWeekdaysParse,A))?O:null:"ddd"===b?-1!==(O=CM.call(this._shortWeekdaysParse,A))||-1!==(O=CM.call(this._weekdaysParse,A))||-1!==(O=CM.call(this._minWeekdaysParse,A))?O:null:-1!==(O=CM.call(this._minWeekdaysParse,A))||-1!==(O=CM.call(this._weekdaysParse,A))||-1!==(O=CM.call(this._shortWeekdaysParse,A))?O:null}function Pb(M,b,z){var p,O,o;if(this._weekdaysParseExact)return Cb.call(this,M,b,z);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(O=W([2e3,1]).day(p),z&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(O,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(O,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(O,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(o="^"+this.weekdays(O,"")+"|^"+this.weekdaysShort(O,"")+"|^"+this.weekdaysMin(O,""),this._weekdaysParse[p]=new RegExp(o.replace(".",""),"i")),z&&"dddd"===b&&this._fullWeekdaysParse[p].test(M))return p;if(z&&"ddd"===b&&this._shortWeekdaysParse[p].test(M))return p;if(z&&"dd"===b&&this._minWeekdaysParse[p].test(M))return p;if(!z&&this._weekdaysParse[p].test(M))return p}}function Ib(M){if(!this.isValid())return null!=M?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=M?(M=Yb(M,this.localeData()),this.add(M-b,"d")):b}function Vb(M){if(!this.isValid())return null!=M?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==M?b:this.add(M-b,"d")}function Ub(M){if(!this.isValid())return null!=M?this:NaN;if(null!=M){var b=Hb(M,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Jb(M){return this._weekdaysParseExact?(n(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysStrictRegex:this._weekdaysRegex):(n(this,"_weekdaysRegex")||(this._weekdaysRegex=wb),this._weekdaysStrictRegex&&M?this._weekdaysStrictRegex:this._weekdaysRegex)}function Gb(M){return this._weekdaysParseExact?(n(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(n(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Sb),this._weekdaysShortStrictRegex&&M?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Kb(M){return this._weekdaysParseExact?(n(this,"_weekdaysRegex")||Qb.call(this),M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(n(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Fb),this._weekdaysMinStrictRegex&&M?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qb(){function M(M,b){return b.length-M.length}var b,z,p,O,o,A=[],c=[],n=[],e=[];for(b=0;b<7;b++)z=W([2e3,1]).day(b),p=SM(this.weekdaysMin(z,"")),O=SM(this.weekdaysShort(z,"")),o=SM(this.weekdays(z,"")),A.push(p),c.push(O),n.push(o),e.push(p),e.push(O),e.push(o);A.sort(M),c.sort(M),n.sort(M),e.sort(M),this._weekdaysRegex=new RegExp("^("+e.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+c.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+A.join("|")+")","i")}function Zb(){return this.hours()%12||12}function $b(){return this.hours()||24}function Mz(M,b){E(M,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)}))}function bz(M,b){return b._meridiemParse}function zz(M){return"p"===(M+"").toLowerCase().charAt(0)}E("H",["HH",2],0,"hour"),E("h",["hh",2],0,Zb),E("k",["kk",2],0,$b),E("hmm",0,0,(function(){return""+Zb.apply(this)+v(this.minutes(),2)})),E("hmmss",0,0,(function(){return""+Zb.apply(this)+v(this.minutes(),2)+v(this.seconds(),2)})),E("Hmm",0,0,(function(){return""+this.hours()+v(this.minutes(),2)})),E("Hmmss",0,0,(function(){return""+this.hours()+v(this.minutes(),2)+v(this.seconds(),2)})),Mz("a",!0),Mz("A",!1),pM("hour","h"),cM("hour",13),kM("a",bz),kM("A",bz),kM("H",mM),kM("h",mM),kM("k",mM),kM("HH",mM,lM),kM("hh",mM,lM),kM("kk",mM,lM),kM("hmm",RM),kM("hmmss",BM),kM("Hmm",RM),kM("Hmmss",BM),jM(["H","HH"],UM),jM(["k","kk"],(function(M,b,z){var p=aM(M);b[UM]=24===p?0:p})),jM(["a","A"],(function(M,b,z){z._isPm=z._locale.isPM(M),z._meridiem=M})),jM(["h","hh"],(function(M,b,z){b[UM]=aM(M),s(z).bigHour=!0})),jM("hmm",(function(M,b,z){var p=M.length-2;b[UM]=aM(M.substr(0,p)),b[JM]=aM(M.substr(p)),s(z).bigHour=!0})),jM("hmmss",(function(M,b,z){var p=M.length-4,O=M.length-2;b[UM]=aM(M.substr(0,p)),b[JM]=aM(M.substr(p,2)),b[GM]=aM(M.substr(O)),s(z).bigHour=!0})),jM("Hmm",(function(M,b,z){var p=M.length-2;b[UM]=aM(M.substr(0,p)),b[JM]=aM(M.substr(p))})),jM("Hmmss",(function(M,b,z){var p=M.length-4,O=M.length-2;b[UM]=aM(M.substr(0,p)),b[JM]=aM(M.substr(p,2)),b[GM]=aM(M.substr(O))}));var pz=/[ap]\.?m?\.?/i,Oz=dM("Hours",!0);function oz(M,b,z){return M>11?z?"pm":"PM":z?"am":"AM"}var Az,cz={calendar:D,longDateFormat:V,invalidDate:J,ordinal:K,dayOfMonthOrdinalParse:Q,relativeTime:$,months:bb,monthsShort:zb,week:Xb,weekdays:Db,weekdaysMin:vb,weekdaysShort:kb,meridiemParse:pz},nz={},ez={};function qz(M,b){var z,p=Math.min(M.length,b.length);for(z=0;z0;){if(p=rz(O.slice(0,b).join("-")))return p;if(z&&z.length>=b&&qz(O,z)>=b-1)break;b--}o++}return Az}function tz(M){return null!=M.match("^[^/\\\\]*$")}function rz(b){var p=null;if(void 0===nz[b]&&M&&M.exports&&tz(b))try{p=Az._abbr,z(6700)("./"+b),Wz(p)}catch(M){nz[b]=null}return nz[b]}function Wz(M,b){var z;return M&&((z=q(b)?uz(M):iz(M,b))?Az=z:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+M+" not found. Did you forget to load it?")),Az._abbr}function iz(M,b){if(null!==b){var z,p=cz;if(b.abbr=M,null!=nz[M])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=nz[M]._config;else if(null!=b.parentLocale)if(null!=nz[b.parentLocale])p=nz[b.parentLocale]._config;else{if(null==(z=rz(b.parentLocale)))return ez[b.parentLocale]||(ez[b.parentLocale]=[]),ez[b.parentLocale].push({name:M,config:b}),null;p=z._config}return nz[M]=new g(H(p,b)),ez[M]&&ez[M].forEach((function(M){iz(M.name,M.config)})),Wz(M),nz[M]}return delete nz[M],null}function sz(M,b){if(null!=b){var z,p,O=cz;null!=nz[M]&&null!=nz[M].parentLocale?nz[M].set(H(nz[M]._config,b)):(null!=(p=rz(M))&&(O=p._config),b=H(O,b),null==p&&(b.abbr=M),(z=new g(b)).parentLocale=nz[M],nz[M]=z),Wz(M)}else null!=nz[M]&&(null!=nz[M].parentLocale?(nz[M]=nz[M].parentLocale,M===Wz()&&Wz(M)):null!=nz[M]&&delete nz[M]);return nz[M]}function uz(M){var b;if(M&&M._locale&&M._locale._abbr&&(M=M._locale._abbr),!M)return Az;if(!A(M)){if(b=rz(M))return b;M=[M]}return dz(M)}function lz(){return h(nz)}function Lz(M){var b,z=M._a;return z&&-2===s(M).overflow&&(b=z[IM]<0||z[IM]>11?IM:z[VM]<1||z[VM]>Mb(z[PM],z[IM])?VM:z[UM]<0||z[UM]>24||24===z[UM]&&(0!==z[JM]||0!==z[GM]||0!==z[KM])?UM:z[JM]<0||z[JM]>59?JM:z[GM]<0||z[GM]>59?GM:z[KM]<0||z[KM]>999?KM:-1,s(M)._overflowDayOfYear&&(bVM)&&(b=VM),s(M)._overflowWeeks&&-1===b&&(b=QM),s(M)._overflowWeekday&&-1===b&&(b=ZM),s(M).overflow=b),M}var _z=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,fz=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mz=/Z|[+-]\d\d(?::?\d\d)?/,Rz=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Bz=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Xz=/^\/?Date\((-?\d+)/i,hz=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Nz={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function yz(M){var b,z,p,O,o,A,c=M._i,n=_z.exec(c)||fz.exec(c),e=Rz.length,q=Bz.length;if(n){for(s(M).iso=!0,b=0,z=e;bib(o)||0===M._dayOfYear)&&(s(M)._overflowDayOfYear=!0),z=Lb(o,0,M._dayOfYear),M._a[IM]=z.getUTCMonth(),M._a[VM]=z.getUTCDate()),b=0;b<3&&null==M._a[b];++b)M._a[b]=A[b]=p[b];for(;b<7;b++)M._a[b]=A[b]=null==M._a[b]?2===b?1:0:M._a[b];24===M._a[UM]&&0===M._a[JM]&&0===M._a[GM]&&0===M._a[KM]&&(M._nextDay=!0,M._a[UM]=0),M._d=(M._useUTC?Lb:lb).apply(null,A),O=M._useUTC?M._d.getUTCDay():M._d.getDay(),null!=M._tzm&&M._d.setUTCMinutes(M._d.getUTCMinutes()-M._tzm),M._nextDay&&(M._a[UM]=24),M._w&&void 0!==M._w.d&&M._w.d!==O&&(s(M).weekdayMismatch=!0)}}function jz(M){var b,z,p,O,o,A,c,n,e;null!=(b=M._w).GG||null!=b.W||null!=b.E?(o=1,A=4,z=wz(b.GG,M._a[PM],mb(Gz(),1,4).year),p=wz(b.W,1),((O=wz(b.E,1))<1||O>7)&&(n=!0)):(o=M._locale._week.dow,A=M._locale._week.doy,e=mb(Gz(),o,A),z=wz(b.gg,M._a[PM],e.year),p=wz(b.w,e.week),null!=b.d?((O=b.d)<0||O>6)&&(n=!0):null!=b.e?(O=b.e+o,(b.e<0||b.e>6)&&(n=!0)):O=o),p<1||p>Rb(z,o,A)?s(M)._overflowWeeks=!0:null!=n?s(M)._overflowWeekday=!0:(c=fb(z,p,O,o,A),M._a[PM]=c.year,M._dayOfYear=c.dayOfYear)}function Ez(M){if(M._f!==O.ISO_8601)if(M._f!==O.RFC_2822){M._a=[],s(M).empty=!0;var b,z,p,o,A,c,n,e=""+M._i,q=e.length,a=0;for(n=(p=I(M._f,M._locale).match(w)||[]).length,b=0;b0&&s(M).unusedInput.push(A),e=e.slice(e.indexOf(z)+z.length),a+=z.length),j[o]?(z?s(M).empty=!1:s(M).unusedTokens.push(o),xM(o,z,M)):M._strict&&!z&&s(M).unusedTokens.push(o);s(M).charsLeftOver=q-a,e.length>0&&s(M).unusedInput.push(e),M._a[UM]<=12&&!0===s(M).bigHour&&M._a[UM]>0&&(s(M).bigHour=void 0),s(M).parsedDateParts=M._a.slice(0),s(M).meridiem=M._meridiem,M._a[UM]=xz(M._locale,M._a[UM],M._meridiem),null!==(c=s(M).era)&&(M._a[PM]=M._locale.erasConvertYear(c,M._a[PM])),Fz(M),Lz(M)}else kz(M);else yz(M)}function xz(M,b,z){var p;return null==z?b:null!=M.meridiemHour?M.meridiemHour(b,z):null!=M.isPM?((p=M.isPM(z))&&b<12&&(b+=12),p||12!==b||(b=0),b):b}function Cz(M){var b,z,p,O,o,A,c=!1,n=M._f.length;if(0===n)return s(M).invalidFormat=!0,void(M._d=new Date(NaN));for(O=0;Othis?this:M:l()}));function Zz(M,b){var z,p;if(1===b.length&&A(b[0])&&(b=b[0]),!b.length)return Gz();for(z=b[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function fp(){if(!q(this._isDSTShifted))return this._isDSTShifted;var M,b={};return f(b,this),(b=Vz(b))._a?(M=b._isUTC?W(b._a):Gz(b._a),this._isDSTShifted=this.isValid()&&ep(b._a,M.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function mp(){return!!this.isValid()&&!this._isUTC}function Rp(){return!!this.isValid()&&this._isUTC}function Bp(){return!!this.isValid()&&this._isUTC&&0===this._offset}O.updateOffset=function(){};var Xp=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,hp=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Np(M,b){var z,p,O,o=M,A=null;return cp(M)?o={ms:M._milliseconds,d:M._days,M:M._months}:a(M)||!isNaN(+M)?(o={},b?o[b]=+M:o.milliseconds=+M):(A=Xp.exec(M))?(z="-"===A[1]?-1:1,o={y:0,d:aM(A[VM])*z,h:aM(A[UM])*z,m:aM(A[JM])*z,s:aM(A[GM])*z,ms:aM(np(1e3*A[KM]))*z}):(A=hp.exec(M))?(z="-"===A[1]?-1:1,o={y:yp(A[2],z),M:yp(A[3],z),w:yp(A[4],z),d:yp(A[5],z),h:yp(A[6],z),m:yp(A[7],z),s:yp(A[8],z)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(O=Yp(Gz(o.from),Gz(o.to)),(o={}).ms=O.milliseconds,o.M=O.months),p=new Ap(o),cp(M)&&n(M,"_locale")&&(p._locale=M._locale),cp(M)&&n(M,"_isValid")&&(p._isValid=M._isValid),p}function yp(M,b){var z=M&&parseFloat(M.replace(",","."));return(isNaN(z)?0:z)*b}function Tp(M,b){var z={};return z.months=b.month()-M.month()+12*(b.year()-M.year()),M.clone().add(z.months,"M").isAfter(b)&&--z.months,z.milliseconds=+b-+M.clone().add(z.months,"M"),z}function Yp(M,b){var z;return M.isValid()&&b.isValid()?(b=tp(b,M),M.isBefore(b)?z=Tp(M,b):((z=Tp(b,M)).milliseconds=-z.milliseconds,z.months=-z.months),z):{milliseconds:0,months:0}}function Hp(M,b){return function(z,p){var O;return null===p||isNaN(+p)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),O=z,z=p,p=O),gp(this,Np(z,p),M),this}}function gp(M,b,z,p){var o=b._milliseconds,A=np(b._days),c=np(b._months);M.isValid()&&(p=null==p||p,c&&qb(M,tM(M,"Month")+c*z),A&&rM(M,"Date",tM(M,"Date")+A*z),o&&M._d.setTime(M._d.valueOf()+o*z),p&&O.updateOffset(M,A||c))}Np.fn=Ap.prototype,Np.invalid=op;var Dp=Hp(1,"add"),kp=Hp(-1,"subtract");function vp(M){return"string"==typeof M||M instanceof String}function wp(M){return R(M)||d(M)||vp(M)||a(M)||Fp(M)||Sp(M)||null==M}function Sp(M){var b,z,p=c(M)&&!e(M),O=!1,o=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],A=o.length;for(b=0;bz.valueOf():z.valueOf()9999?P(z,b?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?b?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",P(z,"Z")):P(z,b?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function MO(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var M,b,z,p,O="moment",o="";return this.isLocal()||(O=0===this.utcOffset()?"moment.utc":"moment.parseZone",o="Z"),M="["+O+'("]',b=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",z="-MM-DD[T]HH:mm:ss.SSS",p=o+'[")]',this.format(M+b+z+p)}function bO(M){M||(M=this.isUtc()?O.defaultFormatUtc:O.defaultFormat);var b=P(this,M);return this.localeData().postformat(b)}function zO(M,b){return this.isValid()&&(R(M)&&M.isValid()||Gz(M).isValid())?Np({to:this,from:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function pO(M){return this.from(Gz(),M)}function OO(M,b){return this.isValid()&&(R(M)&&M.isValid()||Gz(M).isValid())?Np({from:this,to:M}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function oO(M){return this.to(Gz(),M)}function AO(M){var b;return void 0===M?this._locale._abbr:(null!=(b=uz(M))&&(this._locale=b),this)}O.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",O.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var cO=X("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(M){return void 0===M?this.localeData():this.locale(M)}));function nO(){return this._locale}var eO=1e3,qO=60*eO,aO=60*qO,dO=3506328*aO;function tO(M,b){return(M%b+b)%b}function rO(M,b,z){return M<100&&M>=0?new Date(M+400,b,z)-dO:new Date(M,b,z).valueOf()}function WO(M,b,z){return M<100&&M>=0?Date.UTC(M+400,b,z)-dO:Date.UTC(M,b,z)}function iO(M){var b,z;if(void 0===(M=OM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?WO:rO,M){case"year":b=z(this.year(),0,1);break;case"quarter":b=z(this.year(),this.month()-this.month()%3,1);break;case"month":b=z(this.year(),this.month(),1);break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":b=z(this.year(),this.month(),this.date());break;case"hour":b=this._d.valueOf(),b-=tO(b+(this._isUTC?0:this.utcOffset()*qO),aO);break;case"minute":b=this._d.valueOf(),b-=tO(b,qO);break;case"second":b=this._d.valueOf(),b-=tO(b,eO)}return this._d.setTime(b),O.updateOffset(this,!0),this}function sO(M){var b,z;if(void 0===(M=OM(M))||"millisecond"===M||!this.isValid())return this;switch(z=this._isUTC?WO:rO,M){case"year":b=z(this.year()+1,0,1)-1;break;case"quarter":b=z(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":b=z(this.year(),this.month()+1,1)-1;break;case"week":b=z(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":b=z(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":b=z(this.year(),this.month(),this.date()+1)-1;break;case"hour":b=this._d.valueOf(),b+=aO-tO(b+(this._isUTC?0:this.utcOffset()*qO),aO)-1;break;case"minute":b=this._d.valueOf(),b+=qO-tO(b,qO)-1;break;case"second":b=this._d.valueOf(),b+=eO-tO(b,eO)-1}return this._d.setTime(b),O.updateOffset(this,!0),this}function uO(){return this._d.valueOf()-6e4*(this._offset||0)}function lO(){return Math.floor(this.valueOf()/1e3)}function LO(){return new Date(this.valueOf())}function _O(){var M=this;return[M.year(),M.month(),M.date(),M.hour(),M.minute(),M.second(),M.millisecond()]}function fO(){var M=this;return{years:M.year(),months:M.month(),date:M.date(),hours:M.hours(),minutes:M.minutes(),seconds:M.seconds(),milliseconds:M.milliseconds()}}function mO(){return this.isValid()?this.toISOString():null}function RO(){return u(this)}function BO(){return r({},s(this))}function XO(){return s(this).overflow}function hO(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function NO(M,b){var z,p,o,A=this._eras||uz("en")._eras;for(z=0,p=A.length;z=0)return n[p]}function TO(M,b){var z=M.since<=M.until?1:-1;return void 0===b?O(M.since).year():O(M.since).year()+(b-M.offset)*z}function YO(){var M,b,z,p=this.localeData().eras();for(M=0,b=p.length;M(o=Rb(M,p,O))&&(b=o),QO.call(this,M,b,z,p,O))}function QO(M,b,z,p,O){var o=fb(M,b,z,p,O),A=Lb(o.year,0,o.dayOfYear);return this.year(A.getUTCFullYear()),this.month(A.getUTCMonth()),this.date(A.getUTCDate()),this}function ZO(M){return null==M?Math.ceil((this.month()+1)/3):this.month(3*(M-1)+this.month()%3)}E("N",0,0,"eraAbbr"),E("NN",0,0,"eraAbbr"),E("NNN",0,0,"eraAbbr"),E("NNNN",0,0,"eraName"),E("NNNNN",0,0,"eraNarrow"),E("y",["y",1],"yo","eraYear"),E("y",["yy",2],0,"eraYear"),E("y",["yyy",3],0,"eraYear"),E("y",["yyyy",4],0,"eraYear"),kM("N",SO),kM("NN",SO),kM("NNN",SO),kM("NNNN",FO),kM("NNNNN",jO),jM(["N","NN","NNN","NNNN","NNNNN"],(function(M,b,z,p){var O=z._locale.erasParse(M,p,z._strict);O?s(z).era=O:s(z).invalidEra=M})),kM("y",yM),kM("yy",yM),kM("yyy",yM),kM("yyyy",yM),kM("yo",EO),jM(["y","yy","yyy","yyyy"],PM),jM(["yo"],(function(M,b,z,p){var O;z._locale._eraYearOrdinalRegex&&(O=M.match(z._locale._eraYearOrdinalRegex)),z._locale.eraYearOrdinalParse?b[PM]=z._locale.eraYearOrdinalParse(M,O):b[PM]=parseInt(M,10)})),E(0,["gg",2],0,(function(){return this.weekYear()%100})),E(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),CO("gggg","weekYear"),CO("ggggg","weekYear"),CO("GGGG","isoWeekYear"),CO("GGGGG","isoWeekYear"),pM("weekYear","gg"),pM("isoWeekYear","GG"),cM("weekYear",1),cM("isoWeekYear",1),kM("G",TM),kM("g",TM),kM("GG",mM,lM),kM("gg",mM,lM),kM("GGGG",hM,_M),kM("gggg",hM,_M),kM("GGGGG",NM,fM),kM("ggggg",NM,fM),EM(["gggg","ggggg","GGGG","GGGGG"],(function(M,b,z,p){b[p.substr(0,2)]=aM(M)})),EM(["gg","GG"],(function(M,b,z,p){b[p]=O.parseTwoDigitYear(M)})),E("Q",0,"Qo","quarter"),pM("quarter","Q"),cM("quarter",7),kM("Q",uM),jM("Q",(function(M,b){b[IM]=3*(aM(M)-1)})),E("D",["DD",2],"Do","date"),pM("date","D"),cM("date",9),kM("D",mM),kM("DD",mM,lM),kM("Do",(function(M,b){return M?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient})),jM(["D","DD"],VM),jM("Do",(function(M,b){b[VM]=aM(M.match(mM)[0])}));var $O=dM("Date",!0);function Mo(M){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==M?b:this.add(M-b,"d")}E("DDD",["DDDD",3],"DDDo","dayOfYear"),pM("dayOfYear","DDD"),cM("dayOfYear",4),kM("DDD",XM),kM("DDDD",LM),jM(["DDD","DDDD"],(function(M,b,z){z._dayOfYear=aM(M)})),E("m",["mm",2],0,"minute"),pM("minute","m"),cM("minute",14),kM("m",mM),kM("mm",mM,lM),jM(["m","mm"],JM);var bo=dM("Minutes",!1);E("s",["ss",2],0,"second"),pM("second","s"),cM("second",15),kM("s",mM),kM("ss",mM,lM),jM(["s","ss"],GM);var zo,po,Oo=dM("Seconds",!1);for(E("S",0,0,(function(){return~~(this.millisecond()/100)})),E(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),E(0,["SSS",3],0,"millisecond"),E(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),E(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),E(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),E(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),E(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),E(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),pM("millisecond","ms"),cM("millisecond",16),kM("S",XM,uM),kM("SS",XM,lM),kM("SSS",XM,LM),zo="SSSS";zo.length<=9;zo+="S")kM(zo,yM);function oo(M,b){b[KM]=aM(1e3*("0."+M))}for(zo="S";zo.length<=9;zo+="S")jM(zo,oo);function Ao(){return this._isUTC?"UTC":""}function co(){return this._isUTC?"Coordinated Universal Time":""}po=dM("Milliseconds",!1),E("z",0,0,"zoneAbbr"),E("zz",0,0,"zoneName");var no=m.prototype;function eo(M){return Gz(1e3*M)}function qo(){return Gz.apply(null,arguments).parseZone()}function ao(M){return M}no.add=Dp,no.calendar=xp,no.clone=Cp,no.diff=Kp,no.endOf=sO,no.format=bO,no.from=zO,no.fromNow=pO,no.to=OO,no.toNow=oO,no.get=WM,no.invalidAt=XO,no.isAfter=Pp,no.isBefore=Ip,no.isBetween=Vp,no.isSame=Up,no.isSameOrAfter=Jp,no.isSameOrBefore=Gp,no.isValid=RO,no.lang=cO,no.locale=AO,no.localeData=nO,no.max=Qz,no.min=Kz,no.parsingFlags=BO,no.set=iM,no.startOf=iO,no.subtract=kp,no.toArray=_O,no.toObject=fO,no.toDate=LO,no.toISOString=$p,no.inspect=MO,"undefined"!=typeof Symbol&&null!=Symbol.for&&(no[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),no.toJSON=mO,no.toString=Zp,no.unix=lO,no.valueOf=uO,no.creationData=hO,no.eraName=YO,no.eraNarrow=HO,no.eraAbbr=gO,no.eraYear=DO,no.year=sb,no.isLeapYear=ub,no.weekYear=PO,no.isoWeekYear=IO,no.quarter=no.quarters=ZO,no.month=ab,no.daysInMonth=db,no.week=no.weeks=yb,no.isoWeek=no.isoWeeks=Tb,no.weeksInYear=JO,no.weeksInWeekYear=GO,no.isoWeeksInYear=VO,no.isoWeeksInISOWeekYear=UO,no.date=$O,no.day=no.days=Ib,no.weekday=Vb,no.isoWeekday=Ub,no.dayOfYear=Mo,no.hour=no.hours=Oz,no.minute=no.minutes=bo,no.second=no.seconds=Oo,no.millisecond=no.milliseconds=po,no.utcOffset=Wp,no.utc=sp,no.local=up,no.parseZone=lp,no.hasAlignedHourOffset=Lp,no.isDST=_p,no.isLocal=mp,no.isUtcOffset=Rp,no.isUtc=Bp,no.isUTC=Bp,no.zoneAbbr=Ao,no.zoneName=co,no.dates=X("dates accessor is deprecated. Use date instead.",$O),no.months=X("months accessor is deprecated. Use month instead",ab),no.years=X("years accessor is deprecated. Use year instead",sb),no.zone=X("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",ip),no.isDSTShifted=X("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",fp);var to=g.prototype;function ro(M,b,z,p){var O=uz(),o=W().set(p,b);return O[z](o,M)}function Wo(M,b,z){if(a(M)&&(b=M,M=void 0),M=M||"",null!=b)return ro(M,b,z,"month");var p,O=[];for(p=0;p<12;p++)O[p]=ro(M,p,z,"month");return O}function io(M,b,z,p){"boolean"==typeof M?(a(b)&&(z=b,b=void 0),b=b||""):(z=b=M,M=!1,a(b)&&(z=b,b=void 0),b=b||"");var O,o=uz(),A=M?o._week.dow:0,c=[];if(null!=z)return ro(b,(z+A)%7,p,"day");for(O=0;O<7;O++)c[O]=ro(b,(O+A)%7,p,"day");return c}function so(M,b){return Wo(M,b,"months")}function uo(M,b){return Wo(M,b,"monthsShort")}function lo(M,b,z){return io(M,b,z,"weekdays")}function Lo(M,b,z){return io(M,b,z,"weekdaysShort")}function _o(M,b,z){return io(M,b,z,"weekdaysMin")}to.calendar=k,to.longDateFormat=U,to.invalidDate=G,to.ordinal=Z,to.preparse=ao,to.postformat=ao,to.relativeTime=MM,to.pastFuture=bM,to.set=Y,to.eras=NO,to.erasParse=yO,to.erasConvertYear=TO,to.erasAbbrRegex=vO,to.erasNameRegex=kO,to.erasNarrowRegex=wO,to.months=Ab,to.monthsShort=cb,to.monthsParse=eb,to.monthsRegex=rb,to.monthsShortRegex=tb,to.week=Bb,to.firstDayOfYear=Nb,to.firstDayOfWeek=hb,to.weekdays=jb,to.weekdaysMin=xb,to.weekdaysShort=Eb,to.weekdaysParse=Pb,to.weekdaysRegex=Jb,to.weekdaysShortRegex=Gb,to.weekdaysMinRegex=Kb,to.isPM=zz,to.meridiem=oz,Wz("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(M){var b=M%10;return M+(1===aM(M%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),O.lang=X("moment.lang is deprecated. Use moment.locale instead.",Wz),O.langData=X("moment.langData is deprecated. Use moment.localeData instead.",uz);var fo=Math.abs;function mo(){var M=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),M.milliseconds=fo(M.milliseconds),M.seconds=fo(M.seconds),M.minutes=fo(M.minutes),M.hours=fo(M.hours),M.months=fo(M.months),M.years=fo(M.years),this}function Ro(M,b,z,p){var O=Np(b,z);return M._milliseconds+=p*O._milliseconds,M._days+=p*O._days,M._months+=p*O._months,M._bubble()}function Bo(M,b){return Ro(this,M,b,1)}function Xo(M,b){return Ro(this,M,b,-1)}function ho(M){return M<0?Math.floor(M):Math.ceil(M)}function No(){var M,b,z,p,O,o=this._milliseconds,A=this._days,c=this._months,n=this._data;return o>=0&&A>=0&&c>=0||o<=0&&A<=0&&c<=0||(o+=864e5*ho(To(c)+A),A=0,c=0),n.milliseconds=o%1e3,M=qM(o/1e3),n.seconds=M%60,b=qM(M/60),n.minutes=b%60,z=qM(b/60),n.hours=z%24,A+=qM(z/24),c+=O=qM(yo(A)),A-=ho(To(O)),p=qM(c/12),c%=12,n.days=A,n.months=c,n.years=p,this}function yo(M){return 4800*M/146097}function To(M){return 146097*M/4800}function Yo(M){if(!this.isValid())return NaN;var b,z,p=this._milliseconds;if("month"===(M=OM(M))||"quarter"===M||"year"===M)switch(b=this._days+p/864e5,z=this._months+yo(b),M){case"month":return z;case"quarter":return z/3;case"year":return z/12}else switch(b=this._days+Math.round(To(this._months)),M){case"week":return b/7+p/6048e5;case"day":return b+p/864e5;case"hour":return 24*b+p/36e5;case"minute":return 1440*b+p/6e4;case"second":return 86400*b+p/1e3;case"millisecond":return Math.floor(864e5*b)+p;default:throw new Error("Unknown unit "+M)}}function Ho(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*aM(this._months/12):NaN}function go(M){return function(){return this.as(M)}}var Do=go("ms"),ko=go("s"),vo=go("m"),wo=go("h"),So=go("d"),Fo=go("w"),jo=go("M"),Eo=go("Q"),xo=go("y");function Co(){return Np(this)}function Po(M){return M=OM(M),this.isValid()?this[M+"s"]():NaN}function Io(M){return function(){return this.isValid()?this._data[M]:NaN}}var Vo=Io("milliseconds"),Uo=Io("seconds"),Jo=Io("minutes"),Go=Io("hours"),Ko=Io("days"),Qo=Io("months"),Zo=Io("years");function $o(){return qM(this.days()/7)}var MA=Math.round,bA={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function zA(M,b,z,p,O){return O.relativeTime(b||1,!!z,M,p)}function pA(M,b,z,p){var O=Np(M).abs(),o=MA(O.as("s")),A=MA(O.as("m")),c=MA(O.as("h")),n=MA(O.as("d")),e=MA(O.as("M")),q=MA(O.as("w")),a=MA(O.as("y")),d=o<=z.ss&&["s",o]||o0,d[4]=p,zA.apply(null,d)}function OA(M){return void 0===M?MA:"function"==typeof M&&(MA=M,!0)}function oA(M,b){return void 0!==bA[M]&&(void 0===b?bA[M]:(bA[M]=b,"s"===M&&(bA.ss=b-1),!0))}function AA(M,b){if(!this.isValid())return this.localeData().invalidDate();var z,p,O=!1,o=bA;return"object"==typeof M&&(b=M,M=!1),"boolean"==typeof M&&(O=M),"object"==typeof b&&(o=Object.assign({},bA,b),null!=b.s&&null==b.ss&&(o.ss=b.s-1)),p=pA(this,!O,o,z=this.localeData()),O&&(p=z.pastFuture(+this,p)),z.postformat(p)}var cA=Math.abs;function nA(M){return(M>0)-(M<0)||+M}function eA(){if(!this.isValid())return this.localeData().invalidDate();var M,b,z,p,O,o,A,c,n=cA(this._milliseconds)/1e3,e=cA(this._days),q=cA(this._months),a=this.asSeconds();return a?(M=qM(n/60),b=qM(M/60),n%=60,M%=60,z=qM(q/12),q%=12,p=n?n.toFixed(3).replace(/\.?0+$/,""):"",O=a<0?"-":"",o=nA(this._months)!==nA(a)?"-":"",A=nA(this._days)!==nA(a)?"-":"",c=nA(this._milliseconds)!==nA(a)?"-":"",O+"P"+(z?o+z+"Y":"")+(q?o+q+"M":"")+(e?A+e+"D":"")+(b||M||n?"T":"")+(b?c+b+"H":"")+(M?c+M+"M":"")+(n?c+p+"S":"")):"P0D"}var qA=Ap.prototype;return qA.isValid=Op,qA.abs=mo,qA.add=Bo,qA.subtract=Xo,qA.as=Yo,qA.asMilliseconds=Do,qA.asSeconds=ko,qA.asMinutes=vo,qA.asHours=wo,qA.asDays=So,qA.asWeeks=Fo,qA.asMonths=jo,qA.asQuarters=Eo,qA.asYears=xo,qA.valueOf=Ho,qA._bubble=No,qA.clone=Co,qA.get=Po,qA.milliseconds=Vo,qA.seconds=Uo,qA.minutes=Jo,qA.hours=Go,qA.days=Ko,qA.weeks=$o,qA.months=Qo,qA.years=Zo,qA.humanize=AA,qA.toISOString=eA,qA.toString=eA,qA.toJSON=eA,qA.locale=AO,qA.localeData=nO,qA.toIsoString=X("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",eA),qA.lang=cO,E("X",0,0,"unix"),E("x",0,0,"valueOf"),kM("x",TM),kM("X",gM),jM("X",(function(M,b,z){z._d=new Date(1e3*parseFloat(M))})),jM("x",(function(M,b,z){z._d=new Date(aM(M))})),O.version="2.29.4",o(Gz),O.fn=no,O.min=$z,O.max=Mp,O.now=bp,O.utc=W,O.unix=eo,O.months=so,O.isDate=d,O.locale=Wz,O.invalid=l,O.duration=Np,O.isMoment=R,O.weekdays=lo,O.parseZone=qo,O.localeData=uz,O.isDuration=cp,O.monthsShort=uo,O.weekdaysMin=_o,O.defineLocale=iz,O.updateLocale=sz,O.locales=lz,O.weekdaysShort=Lo,O.normalizeUnits=OM,O.relativeTimeRounding=OA,O.relativeTimeThreshold=oA,O.calendarFormat=Ep,O.prototype=no,O.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},O}()},1128:M=>{"use strict";M.exports=JSON.parse('{"version":"2018g","zones":["Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5","Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5","Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5","Africa/Algiers|LMT PMT WET WEST CET CEST|-c.c -9.l 0 -10 -10 -20|01232323232323232454542423234542324|-3bQob.c ME01.P cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5","Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6","Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4","Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5","Africa/Cairo|LMT EET EEST|-25.9 -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBC5.9 1AQM5.9 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6","Africa/Casablanca|LMT +00 +01|u.k 0 -10|0121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00|32e5","Africa/Ceuta|LMT WET WEST CET CEST|l.g 0 -10 -10 -20|0121212121212121212121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2M0M0 GdX0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|85e3","Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|01232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00|20e4","Africa/Johannesburg|LMT SAST SAST SAST|-1Q -1u -20 -30|0123232|-39EpQ qTcm 1Ajdu 1cL0 1cN0 1cL0|84e5","Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0","Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5","Africa/Monrovia|LMT MMT MMT GMT|H.8 H.8 I.u 0|0123|-3ygng.Q 1usM0 28G01.m|11e5","Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5","Africa/Sao_Tome|LMT LMT GMT WAT|-q.U A.J 0 -10|0123|-3tooq.U 18aoq.U 4i6N0","Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5","Africa/Tunis|LMT PMT CET CEST|-E.I -9.l -10 -20|01232323232323232323232323232323232|-3zO0E.I 1cBAv.n 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5","Africa/Windhoek|LMT +0130 SAST SAST CAT WAT|-18.o -1u -20 -30 -20 -10|012324545454545454545454545454545454545454545454545454|-39Ep8.o qTbC.o 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|LMT LMT NST NWT NPT BST BDT AHST HST HDT|-cd.m bK.C b0 a0 a0 b0 a0 a0 a0 90|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVzf.p 1EX1d.m 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|LMT LMT AST AWT APT AHST AHDT YST AKST AKDT|-e0.o 9X.A a0 90 90 a0 90 90 90 80|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVxs.n 1EX20.o 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3","America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4","America/Argentina/Buenos_Aires|LMT CMT -04 -03 -02|3R.M 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343434343|-331U6.c 125cn pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Catamarca|LMT CMT -04 -03 -02|4n.8 4g.M 40 30 20|012323232323232323232323232323232323232323234343434243432343|-331TA.Q 125bR.E pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Cordoba|LMT CMT -04 -03 -02|4g.M 4g.M 40 30 20|012323232323232323232323232323232323232323234343434243434343|-331TH.c 125c0 pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Jujuy|LMT CMT -04 -03 -02|4l.c 4g.M 40 30 20|0123232323232323232323232323232323232323232343434232434343|-331TC.M 125bT.A pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0","America/Argentina/La_Rioja|LMT CMT -04 -03 -02|4r.o 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342343432343|-331Tw.A 125bN.o pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Mendoza|LMT CMT -04 -03 -02|4z.g 4g.M 40 30 20|012323232323232323232323232323232323232323234343423232432343|-331To.I 125bF.w pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0","America/Argentina/Rio_Gallegos|LMT CMT -04 -03 -02|4A.Q 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343432343|-331Tn.8 125bD.U pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Salta|LMT CMT -04 -03 -02|4l.E 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342434343|-331TC.k 125bT.8 pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0","America/Argentina/San_Juan|LMT CMT -04 -03 -02|4y.4 4g.M 40 30 20|0123232323232323232323232323232323232323232343434342343432343|-331Tp.U 125bG.I pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0","America/Argentina/San_Luis|LMT CMT -04 -03 -02|4p.o 4g.M 40 30 20|0123232323232323232323232323232323232323232343434232323432323|-331Ty.A 125bP.o pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0","America/Argentina/Tucuman|LMT CMT -04 -03 -02|4k.Q 4g.M 40 30 20|01232323232323232323232323232323232323232323434343424343234343|-331TD.8 125bT.U pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0","America/Argentina/Ushuaia|LMT CMT -04 -03 -02|4x.c 4g.M 40 30 20|012323232323232323232323232323232323232323234343434343432343|-331Tq.M 125bH.A pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0","America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4","America/Asuncion|LMT AMT -04 -03|3O.E 3O.E 40 30|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-3eLw9.k 1FGo0 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0|28e5","America/Atikokan|LMT CST CDT CWT CPT EST|66.s 60 50 50 50 50|01212345|-32B5R.w UFdR.w 1in0 Rnb0 3je0 8x30 iw0|28e2","America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|84e3","America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5","America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4","America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5","America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3","America/Blanc-Sablon|LMT AST ADT AWT APT|3M.s 40 30 30 30|0121341|-3tokb.w 1nsqb.w 1in0 UGp0 8x50 iu0|11e2","America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2","America/Bogota|LMT BMT -05 -04|4U.g 4U.g 50 40|01232|-3sTv3.I 1eIo0 38yo3.I 2en0|90e5","America/Boise|LMT PST PDT MST MWT MPT MDT|7I.N 80 70 70 60 60 60|01212134536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-3tFE0 1nEe0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4","America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2","America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|77e4","America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|LMT CMT -0430 -04|4r.I 4r.E 4u 40|012323|-3eLvw.g ROnX.U 28KM2.k 1IwOu kqo0|29e5","America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3","America/Panama|LMT CMT EST|5i.8 5j.A 50|012|-3eLuF.Q Iy01.s|15e5","America/Chicago|LMT CST CDT EST CWT CPT|5O.A 60 50 50 50 50|012121212121212121212121212121212121213121212121214512121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|81e4","America/Costa_Rica|LMT SJMT CST CDT|5A.d 5A.d 60 50|01232323232|-3eLun.L 1fyo0 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5","America/Creston|LMT MST PST|7K.4 70 80|0121|-3togd.U 1jInd.U 43B0|53e2","America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|54e4","America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8","America/Dawson_Creek|LMT PST PDT PWT PPT MST|80.U 80 70 70 70 70|01213412121212121212121212121212121212121212121212121212125|-3tofX.4 1nspX.4 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3","America/Dawson|LMT YST YDT YWT YPT YDDT PST PDT|9h.E 90 80 80 80 70 80 70|01212134151676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-2MSeG.k GWpG.k 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2","America/Denver|LMT MST MDT MWT MPT|6X.U 70 60 60 60|012121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFF0 1nEe0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|012342525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 XQp0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5","America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5","America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3","America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5","America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5","America/Fort_Nelson|LMT PST PDT PWT PPT MST|8a.L 80 70 70 70 70|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121215|-3tofN.d 1nspN.d 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Fort_Wayne|LMT CST CDT CWT CPT EST EDT|5I.C 60 50 50 50 50 40|0121212134121212121212121212151565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5","America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e3","America/Goose_Bay|LMT NST NDT NST NDT NWT NPT AST ADT ADDT|41.E 3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|0121343434343434356343434343434343434343434343434343434343437878787878787878787878787878787878787878787879787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787|-3tojW.k 1nspt.c 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2","America/Grand_Turk|LMT KMT EST EDT AST|4I.w 57.a 50 40 40|012323232323232323232323232323232323232323232323232323232323232323232323232343232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLvf.s RK0m.C 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5","America/Guayaquil|LMT QMT -05 -04|5j.k 5e 50 40|01232|-3eLuE.E 1DNzS.E 2uILK rz0|27e5","America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4","America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Havana|LMT HMT CST CDT|5t.s 5t.A 50 40|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLuu.w 1qx00.8 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4","America/Indiana/Knox|LMT CST CDT CWT CPT EST|5K.u 60 50 50 50 50|01212134121212121212121212121212121212151212121212121212121212121212121212121212121212121252121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Marengo|LMT CST CDT CWT CPT EST EDT|5J.n 60 50 50 50 50 40|01212134121212121212121215656565656525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Petersburg|LMT CST CDT CWT CPT EST EDT|5N.7 60 50 50 50 50 40|012121341212121212121212121215121212121212121212121252125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Tell_City|LMT CST CDT CWT CPT EST EDT|5L.3 60 50 50 50 50 40|012121341212121212121212121212121565652121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vevay|LMT CST CDT CWT CPT EST EDT|5E.g 60 50 50 50 50 40|0121213415656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vincennes|LMT CST CDT CWT CPT EST EDT|5O.7 60 50 50 50 50 40|012121341212121212121212121212121565652125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Winamac|LMT CST CDT CWT CPT EST EDT|5K.p 60 50 50 50 50 40|012121341212121212121212121212121212121565652165656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2","America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2","America/Jamaica|LMT KMT EST EDT|57.a 57.a 50 40|01232323232323232323232|-3eLuQ.O RK00 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4","America/Juneau|LMT LMT PST PWT PPT PDT YDT YST AKST AKDT|-f2.j 8V.F 80 70 70 70 80 90 90 80|0123425252525252525252525252625252578989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVwq.s 1EX12.j 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3","America/Kentucky/Louisville|LMT CST CDT CWT CPT EST EDT|5H.2 60 50 50 50 50 40|01212121213412121212121212121212121212565656565656525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Kentucky/Monticello|LMT CST CDT CWT CPT EST EDT|5D.o 60 50 50 50 50 40|01212134121212121212121212121212121212121212121212121212121212121212121212565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFG0 1nEe0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/La_Paz|LMT CMT BST -04|4w.A 4w.A 3w.A 40|0123|-3eLvr.o 1FIo0 13b0|19e5","America/Lima|LMT LMT -05 -04|58.c 58.A 50 40|01232323232323232|-3eLuP.M JcM0.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6","America/Los_Angeles|LMT PST PDT PWT PPT|7Q.W 80 70 70 70|0121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFE0 1nEe0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4","America/Managua|LMT MMT CST EST CDT|5J.8 5J.c 60 50 50|01232424232324242|-3eLue.Q 1Mhc0.4 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5","America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5","America/Martinique|LMT FFMT AST ADT|44.k 44.k 40 30|01232|-3eLvT.E PTA0 2LPbT.E 19X0|39e4","America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4","America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|44e4","America/Menominee|LMT CST CDT CWT CPT EST|5O.r 60 50 50 50 50|012121341212152121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3pdG9.x 1jce9.x 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2","America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|11e5","America/Metlakatla|LMT LMT PST PWT PPT PDT AKST AKDT|-fd.G 8K.i 80 70 70 70 90 80|012342525252525252525252525252525252676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-48Pzs.L 1jVwf.5 1EX1d.G 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|20e6","America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Moncton|LMT EST AST ADT AWT APT|4j.8 50 40 30 30 30|0123232323232323232323245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3txvE.Q J4ME.Q CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3","America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|41e5","America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Toronto|LMT EST EDT EWT EPT|5h.w 50 40 40 40|012121212121212121212121212121212121212121212123412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B6G.s UFdG.s 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5","America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4","America/New_York|LMT EST EDT EWT EPT|4U.2 50 40 40 40|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tFH0 1nEe0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Nipigon|LMT EST EDT EWT EPT|5R.4 50 40 40 40|0121234121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B66.U UFd6.U 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2","America/Nome|LMT LMT NST NWT NPT BST BDT YST AKST AKDT|-cW.m b1.C b0 a0 a0 b0 a0 90 90 80|01234256565656565656565656565656565678989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898|-48Pzs.L 1jVyu.p 1EX1W.m 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2","America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2","America/North_Dakota/Beulah|LMT MST MDT MWT MPT CST CDT|6L.7 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/Center|LMT MST MDT MWT MPT CST CDT|6J.c 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212125656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/New_Salem|LMT MST MDT MWT MPT CST CDT|6J.D 70 60 60 60 60 50|0121213412121212121212121212121212121212121212121212121212121212121212121212121212565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4","America/Phoenix|LMT MST MDT MWT|7s.i 70 60 60|012121313121|-3tFF0 1nEe0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5","America/Port-au-Prince|LMT PPMT EST EDT|4N.k 4N 50 40|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLva.E 15RLX.E 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4","America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4","America/Puerto_Rico|LMT AST AWT APT|4o.p 40 30 30|01231|-2Qi7z.z 1IUbz.z 7XT0 iu0|24e5","America/Punta_Arenas|LMT SMT -05 -04 -03|4H.E 4G.K 50 40 30|01213132323232323232343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLvg.k MJbX.6 fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0","America/Rainy_River|LMT CST CDT CWT CPT|6i.g 60 50 50 50|0121234121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32B5F.I UFdF.I 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842","America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2","America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5","America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4","America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229","America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4","America/Santiago|LMT SMT -05 -04 -03|4G.K 4G.K 50 40 30|0121313232323232323432343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLvh.e MJc0 fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0|62e5","America/Santo_Domingo|LMT SDMT EST EDT -0430 AST|4D.A 4E 50 40 4u 40|012324242424242525|-3eLvk.o 1Jic0.o 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5","America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0|20e6","America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|452","America/Sitka|LMT LMT PST PWT PPT PDT YST AKST AKDT|-eW.L 91.d 80 70 70 70 90 90 80|0123425252525252525252525252525252567878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787|-48Pzs.L 1jVwu 1EX0W.L 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2","America/St_Johns|LMT NST NDT NST NDT NWT NPT NDDT|3u.Q 3u.Q 2u.Q 3u 2u 2u 2u 1u|012121212121212121212121212121212121213434343434343435634343434343434343434343434343434343434343434343434343434343434343434343434343434343437343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3tokt.8 1l020 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3","America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5","America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656","America/Thunder_Bay|LMT CST EST EWT EPT EDT|5V 60 50 40 40 40|01234252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-32B63 Avc3 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Vancouver|LMT PST PDT PWT PPT|8c.s 80 70 70 70|01213412121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3tofL.w 1nspL.w 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Whitehorse|LMT YST YDT YWT YPT YDDT PST PDT|90.c 90 80 80 80 70 80 70|01212134151676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-2MSeX.M GWpX.M 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Winnipeg|LMT CST CDT CWT CPT|6s.A 60 50 50 50|0121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3kLtv.o 1a3bv.o WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4","America/Yakutat|LMT LMT YST YWT YPT YDT AKST AKDT|-eF.5 9i.T 90 80 80 80 90 80|0123425252525252525252525252525252526767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-48Pzs.L 1jVwL.G 1EX1F.5 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642","America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10","Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70","Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80","Antarctica/Macquarie|-00 AEST AEDT +11|0 -a0 -b0 -b0|01210121212121212121212121212121212121212121212121212121212121212121212121212121212121212123|-2OPc0 Fb40 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1","Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60","Pacific/Auckland|LMT NZMT NZST NZST NZDT|-bD.4 -bu -cu -c0 -d0|012131313131313131313131313134343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-46jLD.4 2nEO9.4 Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5","Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","Antarctica/Rothera|-00 -03|0 30|01|gOo0|130","Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20","Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|40","Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25","Europe/Oslo|LMT CET CEST|-H -10 -20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-32BcH Q4oH Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|62e4","Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5","Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5","Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5","Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3","Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4","Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4","Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4","Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0","Asia/Baghdad|LMT BMT +03 +04|-2V.E -2V.A -30 -40|0123232323232323232323232323232323232323232323232323232|-3eLCV.E 18ao0.4 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5","Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4","Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|LMT BMT +07|-6G.4 -6G.4 -70|012|-3D8SG.4 1C000|15e6","Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0","Asia/Beirut|LMT EET EEST|-2m -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3D8Om 1BWom 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|22e5","Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4","Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4","Asia/Kolkata|LMT HMT MMT IST +0630|-5R.s -5R.k -5l.a -5u -6u|01234343|-4Fg5R.s BKo0.8 1rDcw.a 1r2LP.a 1un0 HB0 7zX0|15e6","Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4","Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3","Asia/Shanghai|LMT CST CDT|-85.H -80 -90|0121212121212121212121212121|-2M0U5.H 1zWo5.H Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6","Asia/Colombo|LMT MMT +0530 +06 +0630|-5j.o -5j.w -5u -60 -6u|012342432|-3D8Rj.o 13inX.Q 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5","Asia/Dhaka|LMT HMT +0630 +0530 +06 +07|-61.E -5R.k -6u -5u -60 -70|01232454|-3eLG1.E 26008.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6","Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5","Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4","Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5","Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4","Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Asia/Gaza|LMT EET EEST IST IDT|-2h.Q -20 -30 -20 -30|0121212121212121212121212121212123434343434343434343434343431212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBCh.Q 1Azch.Q 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|18e5","Asia/Hebron|LMT EET EEST IST IDT|-2k.n -20 -30 -20 -30|012121212121212121212121212121212343434343434343434343434343121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2MBCk.n 1Azck.n 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|25e4","Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5","Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5","Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|LMT IMT +07 +08 +09|-6V.5 -6V.5 -70 -80 -90|012343434343434343434343234343434343434343434343434343434343434343|-3D8SV.5 1Bxc0 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Europe/Istanbul|LMT IMT EET EEST +04 +03|-1T.Q -1U.U -20 -30 -40 -30|0123232323232323232323232323232323232323232323232323232345454545453232323232323232323232323232323232323232323232323232323232323235|-3D8NT.Q 1ePXW.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|LMT BMT +0720 +0730 +09 +08 WIB|-77.c -77.c -7k -7u -90 -80 -70|012343536|-49jH7.c 2hiLL.c luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6","Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4","Asia/Jerusalem|LMT JMT IST IDT IDDT|-2k.S -2k.E -20 -30 -40|012323232323243232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3D8Ok.S 1wvA0.e SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0|81e4","Asia/Kabul|LMT +04 +0430|-4A.M -40 -4u|012|-3eLEA.M 2dTcA.M|46e5","Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4","Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6","Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5","Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5","Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2","Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Asia/Kuala_Lumpur|LMT SMT +07 +0720 +0730 +09 +08|-6K.K -6T.p -70 -7k -7u -90 -80|01234546|-2M0SK.K aILP.l 17anT.p l5XE 17bO 8Fyu 1so1u|71e5","Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4","Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4","Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3","Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5","Asia/Manila|LMT LMT PST PDT JST|fU -84 -80 -90 -90|01232423232|-54m84 2clc0 1vfc4 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6","Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|32e4","Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4","Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5","Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5","Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4","Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4","Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5","Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4","Asia/Rangoon|LMT RMT +0630 +09|-6o.L -6o.L -6u -90|01232|-3D8So.L 1BnA0 SmnS.L 7j9u|48e5","Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4","Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4","Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6","Asia/Singapore|LMT SMT +07 +0720 +0730 +09 +08|-6T.p -6T.p -70 -7k -7u -90 -80|01234546|-2M0ST.p aIM0 17anT.p l5XE 17bO 8Fyu 1so1u|56e5","Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2","Asia/Taipei|LMT CST JST CDT|-86 -80 -90 -90|012131313131313131313131313131313131313131|-30bk6 1FDc6 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5","Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5","Asia/Tbilisi|LMT TBMT +03 +04 +05|-2X.b -2X.b -30 -40 -50|01234343434343434343434323232343434343434343434323|-3D8OX.b 1LUM0 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5","Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6","Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3","Asia/Tokyo|LMT JST JDT|-9i.X -90 -a0|0121212121|-3jE90 2qSo0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6","Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5","Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5","Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2","Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4","Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5","Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5","Atlantic/Azores|LMT HMT -02 -01 +00 WET|1G.E 1S.w 20 10 0 0|012323232323232323232323232323232323232323232343234323432343232323232323232323232323232323232323232343434343434343434343434343434345434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3tomh.k 18aoh.k aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|25e4","Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3","Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4","Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|49e3","Atlantic/Madeira|LMT FMT -01 +00 +01 WET WEST|17.A 17.A 10 0 -10 0 -10|012323232323232323232323232323232323232323232343234323432343232323232323232323232323232323232323232565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3tomQ.o 18anQ.o aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e4","Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4","Atlantic/South_Georgia|LMT -02|2q.8 20|01|-3eLxx.Q|30","Atlantic/Stanley|LMT SMT -04 -03 -02|3P.o 3P.o 40 30 20|0123232323232323434323232323232323232323232323232323232323232323232323|-3eLw8.A S200 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2","Australia/Sydney|LMT AEST AEDT|-a4.Q -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-32oW4.Q RlA5.Q xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|LMT ACST ACST ACDT|-9e.k -90 -9u -au|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-32oVe.k ak0e.k H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|LMT AEST AEDT|-ac.8 -a0 -b0|012121212121212121|-32Bmc.8 Ry0d.8 xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5","Australia/Broken_Hill|LMT AEST ACST ACST ACDT|-9p.M -a0 -90 -9u -au|0123434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-32oVp.M 3Lzp.M 6wp0 H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|18e3","Australia/Currie|LMT AEST AEDT|-9z.s -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-3109z.s Pk1z.s 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|746","Australia/Darwin|LMT ACST ACST ACDT|-8H.k -90 -9u -au|01232323232|-32oUH.k ajXH.k H1zv xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4","Australia/Eucla|LMT +0845 +0945|-8z.s -8J -9J|01212121212121212121|-30nIz.s PknP.s xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368","Australia/Hobart|LMT AEST AEDT|-9N.g -a0 -b0|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-3109N.g Pk1N.g 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|21e4","Australia/Lord_Howe|LMT AEST +1030 +1130 +11|-aA.k -a0 -au -bu -b0|01232323232424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424|-32oWA.k 3tzAA.k 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Lindeman|LMT AEST AEDT|-9T.U -a0 -b0|0121212121212121212121|-32BlT.U RxXU.U xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10","Australia/Melbourne|LMT AEST AEDT|-9D.Q -a0 -b0|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-32oVD.Q RlzE.Q xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|39e5","Australia/Perth|LMT AWST AWDT|-7H.o -80 -90|01212121212121212121|-30nHH.o PknI.o xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5","CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Pacific/Easter|LMT EMT -07 -06 -05|7h.s 7h.s 70 60 50|0123232323232323232323232323234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-3eLsG.w 1HRc0 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0|30e2","CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","Europe/Dublin|LMT DMT IST GMT BST IST|p p.l -y.D 0 -10 -10|012343434343435353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353|-3BHbz 1ra20.l Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","EST|EST|50|0|","EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Etc/GMT-0|GMT|0|0|","Etc/GMT-1|+01|-10|0|","Etc/GMT-10|+10|-a0|0|","Etc/GMT-11|+11|-b0|0|","Etc/GMT-12|+12|-c0|0|","Etc/GMT-13|+13|-d0|0|","Etc/GMT-14|+14|-e0|0|","Etc/GMT-2|+02|-20|0|","Etc/GMT-3|+03|-30|0|","Etc/GMT-4|+04|-40|0|","Etc/GMT-5|+05|-50|0|","Etc/GMT-6|+06|-60|0|","Etc/GMT-7|+07|-70|0|","Etc/GMT-8|+08|-80|0|","Etc/GMT-9|+09|-90|0|","Etc/GMT+1|-01|10|0|","Etc/GMT+10|-10|a0|0|","Etc/GMT+11|-11|b0|0|","Etc/GMT+12|-12|c0|0|","Etc/GMT+2|-02|20|0|","Etc/GMT+3|-03|30|0|","Etc/GMT+4|-04|40|0|","Etc/GMT+5|-05|50|0|","Etc/GMT+6|-06|60|0|","Etc/GMT+7|-07|70|0|","Etc/GMT+8|-08|80|0|","Etc/GMT+9|-09|90|0|","Etc/UCT|UCT|0|0|","Etc/UTC|UTC|0|0|","Europe/Amsterdam|LMT AMT NST +0120 +0020 CEST CET|-j.w -j.w -1j.w -1k -k -20 -10|0121212121212121212121212121212121212121212123434345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656|-5sHcj.w 3i200 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|16e5","Europe/Andorra|LMT WET CET CEST|-6.4 0 -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2M0M6.4 1Pnc6.4 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|79e3","Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5","Europe/Athens|LMT AMT EET EEST CEST CET|-1y.Q -1y.Q -20 -30 -20 -10|0123234545232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-30SNy.Q OMM1 CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|35e5","Europe/London|LMT GMT BST BDST|1.f 0 -10 -20|01212121212121212121212121212121212121212121212121232323232321212321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-4VgnW.J 2KHdW.J Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|10e6","Europe/Belgrade|LMT CET CEST|-1m -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3topm 2juLm 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Berlin|LMT CET CEST CEMT|-R.s -10 -20 -30|012121212121212321212321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-36RcR.s UbWR.s 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|41e5","Europe/Prague|LMT PMT CET CEST GMT|-V.I -V.I -10 -20 0|0123232323232323232423232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4QbAV.I 1FDc0 XPaV.I 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|13e5","Europe/Brussels|LMT BMT WET CET CEST WEST|-h.u -h.u 0 -10 -20 -10|012343434325252525252525252525252525252525252525252525434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3D8Mh.u u1M0 SNMh.u 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|21e5","Europe/Bucharest|LMT BMT EET EEST|-1I.o -1I.o -20 -30|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3awpI.o 1AU00 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|19e5","Europe/Budapest|LMT CET CEST|-1g.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-3cWpg.k 12hbg.k 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e5","Europe/Zurich|LMT BMT CET CEST|-y.8 -t.K -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4HyMy.8 1Dw04.m 1SfAt.K 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|38e4","Europe/Chisinau|LMT CMT BMT EET EEST CEST CET MSK MSD|-1T.k -1T -1I.o -20 -30 -20 -10 -30 -40|0123434343434343434345656578787878787878787878434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-3D8NT.k 1wNA0.k wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|67e4","Europe/Copenhagen|LMT CMT CET CEST|-O.k -O.k -10 -20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3eLAO.k 9Io0 SryO.k Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Gibraltar|LMT GMT BST BDST CET CEST|l.o 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123232323232121232121212121212121212145454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-3BHbC.A 1ra1C.A Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|30e3","Europe/Helsinki|LMT HMT EET EEST|-1D.N -1D.N -20 -30|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3H0ND.N 1Iu00 OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Kaliningrad|LMT CET CEST CET CEST MSK MSD EEST EET +03|-1m -10 -20 -20 -30 -30 -40 -30 -20 -30|01212121212121343565656565656565657878787878787878787878787878787878787878787898|-36Rdm UbXm 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4","Europe/Kiev|LMT KMT EET MSK CEST CET MSD EEST|-22.4 -22.4 -20 -30 -20 -10 -40 -30|01234545363636363636363636367272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-3D8O2.4 1LUM0 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|34e5","Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4","Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Europe/Madrid|LMT WET WEST WEMT CET CEST|e.I 0 -10 -20 -10 -20|0121212121212121212321454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2M0M0 G5z0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|62e5","Europe/Malta|LMT CET CEST|-W.4 -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-35rcW.4 SXzW.4 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|42e4","Europe/Minsk|LMT MMT EET MSK CEST CET MSD EEST +03|-1O.g -1O -20 -30 -20 -10 -40 -30 -30|012345454363636363636363636372727272727272727272727272727272727272728|-3D8NO.g 1LUM0.g eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5","Europe/Monaco|LMT PMT WET WEST WEMT CET CEST|-t.w -9.l 0 -10 -20 -10 -20|012323232323232323232323232323232323232323232323232343434343456565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3bQot.w ME0k.b cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|38e3","Europe/Moscow|LMT MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|01232434565756865656565656565656565698656565656565656565656565656565656565656a6|-3D8Ou.h 1sQM0 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6","Europe/Paris|LMT PMT WET WEST CEST CET WEMT|-9.l -9.l 0 -10 -20 -10 -20|01232323232323232323232323232323232323232323232323234545463654545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-3bQo8.l ME00 cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e6","Europe/Riga|LMT RMT LST EET MSK CEST CET MSD EEST|-1A.y -1A.y -2A.y -20 -30 -20 -10 -40 -30|0121213456565647474747474747474838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383|-3D8NA.y 1xde0 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|64e4","Europe/Rome|LMT RMT CET CEST|-N.U -N.U -10 -20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-4bsoN.U 160LN.U T000 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|39e5","Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5","Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810","Europe/Simferopol|LMT SMT EET MSK CEST CET MSD EEST MSK|-2g.o -2g -20 -30 -20 -10 -40 -30 -40|0123454543636363636363636363272727636363727272727272727272727272727272727283|-3D8Og.o 1LUM0.o eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Sofia|LMT IMT EET CET CEST EEST|-1x.g -1U.U -20 -10 -20 -30|0123434325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-3D8Nx.g AiLA.k 1UFeU.U WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Europe/Stockholm|LMT SET CET CEST|-1c.c -10.e -10 -20|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3FyNc.c P80b.W DPb0.e TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|15e5","Europe/Tallinn|LMT TMT CET CEST EET MSK MSD EEST|-1D -1D -10 -20 -20 -30 -40 -30|0123214532323565656565656565657474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474|-3D8ND 1wI00 teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|41e4","Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|42e4","Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5","Europe/Uzhgorod|LMT CET CEST MSK MSD EET EEST|-1t.c -10 -20 -30 -40 -20 -30|0121212134343434343434343431565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-3cWpt.c 20vCt.c 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e4","Europe/Vienna|LMT CET CEST|-15.l -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-36Rd5.l UbX5.l 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|18e5","Europe/Vilnius|LMT WMT KMT CET EET MSK CEST MSD EEST|-1F.g -1o -1z.A -10 -20 -30 -20 -40 -30|0123435636365757575757575757584848484848484848463648484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484|-3D8NF.g 1u5Ah.g 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|54e4","Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0|10e5","Europe/Warsaw|LMT WMT CET CEST EET EEST|-1o -1o -10 -20 -20 -30|0123232345423232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-3D8No 1qDA0 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e5","Europe/Zaporozhye|LMT +0220 EET MSK CEST CET MSD EEST|-2k.E -2k -20 -30 -20 -10 -40 -30|012345453636363636363636363637272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-3D8Ok.E 1LUM0.E eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|77e4","HST|HST|a0|0|","Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2","Indian/Christmas|LMT +07|-72.Q -70|01|-32oT2.Q|21e2","Indian/Cocos|LMT +0630|-6r.E -6u|01|-2OqSr.E|596","Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130","Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3","Indian/Maldives|LMT MMT +05|-4S -4S -50|012|-3D8QS 3eLA0|35e4","Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4","Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4","Pacific/Kwajalein|LMT +11 -12 +12|-b9.k -b0 c0 -c0|0123|-2M0X9.k 2Lo09.k W9X0|14e3","MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00","MST|MST|70|0|","MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Pacific/Chatham|LMT +1215 +1245 +1345|-cd.M -cf -cJ -dJ|0123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-46jMd.M 37RbW.M 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|LMT LMT -1130 -11 -10 +14 +13|-cx.4 bq.U bu b0 a0 -e0 -d0|012343456565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-38Fox.4 J1A0 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3","Pacific/Bougainville|LMT PMMT +10 +09 +11|-am.g -9M.w -a0 -90 -b0|012324|-3D8Wm.g AvAx.I 1TCLM.w 7CN0 2MQp0|18e4","Pacific/Chuuk|LMT +10|-a7.8 -a0|01|-2M0W7.8|49e3","Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3","Pacific/Enderbury|LMT -12 -11 +13|bo.k c0 b0 -d0|0123|-2M0Az.E 3bIMz.E B7X0|1","Pacific/Fakaofo|LMT -11 +13|bo.U b0 -d0|012|-2M0Az.4 4ufXz.4|483","Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0|88e4","Pacific/Funafuti|LMT +12|-bU.Q -c0|01|-2M0XU.Q|45e2","Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3","Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125","Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4","Pacific/Guam|LMT LMT GST ChST|el -9D -a0 -a0|0123|-54m9D 2glc0 43qnD|17e4","Pacific/Honolulu|LMT HST HDT HWT HPT HST|av.q au 9u 9u 9u a0|01213415|-3061s.y 1uMdW.y 8x0 lef0 8wWu iAu 46p0|37e4","Pacific/Kiritimati|LMT -1040 -10 +14|at.k aE a0 -e0|0123|-2M0Bu.E 3bIMa.E B7Xk|51e2","Pacific/Kosrae|LMT +11 +12|-aP.U -b0 -c0|0121|-2M0WP.U 2LnXP.U 1bdz0|66e2","Pacific/Majuro|LMT +11 +12|-bo.M -b0 -c0|012|-2M0Xo.M 2Lo0o.M|28e3","Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2","Pacific/Pago_Pago|LMT LMT SST|-cB.c bm.M b0|012|-38FoB.c J1A0|37e2","Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3","Pacific/Niue|LMT -1120 -1130 -11|bj.E bk bu b0|0123|-2M0AE.k 21IM0.k 17y0a|12e2","Pacific/Norfolk|LMT +1112 +1130 +1230 +11|-bb.Q -bc -bu -cu -b0|012324|-2M0Xb.Q 21ILX.Q W01G On0 1COp0|25e4","Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3","Pacific/Palau|LMT +09|-8V.U -90|01|-2M0UV.U|21e3","Pacific/Pitcairn|LMT -0830 -08|8E.k 8u 80|012|-2M0Dj.E 3UVXN.E|56","Pacific/Pohnpei|LMT +11|-aw.Q -b0|01|-2M0Ww.Q|34e3","Pacific/Port_Moresby|LMT PMMT +10|-9M.E -9M.w -a0|012|-3D8VM.E AvA0.8|25e4","Pacific/Rarotonga|LMT -1030 -0930 -10|aD.4 au 9u a0|0123232323232323232323232323|-2M0Bk.U 39zzO.U IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3","Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4","Pacific/Tarawa|LMT +12|-bw.4 -c0|01|-2M0Xw.4|29e3","Pacific/Tongatapu|LMT +1220 +13 +14|-cj.k -ck -d0 -e0|01232323232|-2M10j.k 1BnXX.k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3","Pacific/Wake|LMT +12|-b6.s -c0|01|-2M0X6.s|16e3","Pacific/Wallis|LMT +12|-cf.k -c0|01|-2M10f.k|94","PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00"],"links":["Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|Atlantic/St_Helena","Africa/Cairo|Egypt","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|US/Alaska","America/Argentina/Buenos_Aires|America/Buenos_Aires","America/Argentina/Catamarca|America/Argentina/ComodRivadavia","America/Argentina/Catamarca|America/Catamarca","America/Argentina/Cordoba|America/Cordoba","America/Argentina/Cordoba|America/Rosario","America/Argentina/Jujuy|America/Jujuy","America/Argentina/Mendoza|America/Mendoza","America/Atikokan|America/Coral_Harbour","America/Chicago|US/Central","America/Curacao|America/Aruba","America/Curacao|America/Kralendijk","America/Curacao|America/Lower_Princes","America/Denver|America/Shiprock","America/Denver|Navajo","America/Denver|US/Mountain","America/Detroit|US/Michigan","America/Edmonton|Canada/Mountain","America/Fort_Wayne|America/Indiana/Indianapolis","America/Fort_Wayne|America/Indianapolis","America/Fort_Wayne|US/East-Indiana","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Indiana/Knox|America/Knox_IN","America/Indiana/Knox|US/Indiana-Starke","America/Jamaica|Jamaica","America/Kentucky/Louisville|America/Louisville","America/Los_Angeles|US/Pacific","America/Los_Angeles|US/Pacific-New","America/Manaus|Brazil/West","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|Mexico/General","America/New_York|US/Eastern","America/Noronha|Brazil/DeNoronha","America/Panama|America/Cayman","America/Phoenix|US/Arizona","America/Port_of_Spain|America/Anguilla","America/Port_of_Spain|America/Antigua","America/Port_of_Spain|America/Dominica","America/Port_of_Spain|America/Grenada","America/Port_of_Spain|America/Guadeloupe","America/Port_of_Spain|America/Marigot","America/Port_of_Spain|America/Montserrat","America/Port_of_Spain|America/St_Barthelemy","America/Port_of_Spain|America/St_Kitts","America/Port_of_Spain|America/St_Lucia","America/Port_of_Spain|America/St_Thomas","America/Port_of_Spain|America/St_Vincent","America/Port_of_Spain|America/Tortola","America/Port_of_Spain|America/Virgin","America/Regina|Canada/Saskatchewan","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Tijuana|America/Ensenada","America/Tijuana|America/Santa_Isabel","America/Tijuana|Mexico/BajaNorte","America/Toronto|America/Montreal","America/Toronto|Canada/Eastern","America/Vancouver|Canada/Pacific","America/Whitehorse|Canada/Yukon","America/Winnipeg|Canada/Central","Asia/Ashgabat|Asia/Ashkhabad","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Vientiane","Asia/Dhaka|Asia/Dacca","Asia/Dubai|Asia/Muscat","Asia/Ho_Chi_Minh|Asia/Saigon","Asia/Hong_Kong|Hongkong","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Macau|Asia/Macao","Asia/Makassar|Asia/Ujung_Pandang","Asia/Nicosia|Europe/Nicosia","Asia/Qatar|Asia/Bahrain","Asia/Rangoon|Asia/Yangon","Asia/Riyadh|Asia/Aden","Asia/Riyadh|Asia/Kuwait","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|PRC","Asia/Singapore|Singapore","Asia/Taipei|ROC","Asia/Tehran|Iran","Asia/Thimphu|Asia/Thimbu","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Urumqi|Asia/Kashgar","Atlantic/Faroe|Atlantic/Faeroe","Atlantic/Reykjavik|Iceland","Australia/Adelaide|Australia/South","Australia/Brisbane|Australia/Queensland","Australia/Broken_Hill|Australia/Yancowinna","Australia/Darwin|Australia/North","Australia/Hobart|Australia/Tasmania","Australia/Lord_Howe|Australia/LHI","Australia/Melbourne|Australia/Victoria","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/NSW","Etc/GMT-0|Etc/GMT","Etc/GMT-0|Etc/GMT+0","Etc/GMT-0|Etc/GMT0","Etc/GMT-0|Etc/Greenwich","Etc/GMT-0|GMT","Etc/GMT-0|GMT+0","Etc/GMT-0|GMT-0","Etc/GMT-0|GMT0","Etc/GMT-0|Greenwich","Etc/UCT|UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Belgrade|Europe/Ljubljana","Europe/Belgrade|Europe/Podgorica","Europe/Belgrade|Europe/Sarajevo","Europe/Belgrade|Europe/Skopje","Europe/Belgrade|Europe/Zagreb","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Helsinki|Europe/Mariehamn","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Portugal","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Oslo|Arctic/Longyearbyen","Europe/Oslo|Atlantic/Jan_Mayen","Europe/Prague|Europe/Bratislava","Europe/Rome|Europe/San_Marino","Europe/Rome|Europe/Vatican","Europe/Warsaw|Poland","Europe/Zurich|Europe/Busingen","Europe/Zurich|Europe/Vaduz","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Chuuk|Pacific/Truk","Pacific/Chuuk|Pacific/Yap","Pacific/Easter|Chile/EasterIsland","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kwajalein|Kwajalein","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pohnpei|Pacific/Ponape"]}')}},b={};function z(p){var O=b[p];if(void 0!==O)return O.exports;var o=b[p]={id:p,loaded:!1,exports:{}};return M[p].call(o.exports,o,o.exports,z),o.loaded=!0,o.exports}z.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(M){if("object"==typeof window)return window}}(),z.o=(M,b)=>Object.prototype.hasOwnProperty.call(M,b),z.nmd=M=>(M.paths=[],M.children||(M.children=[]),M);var p=z(3477);freeaps_meal=p})(); \ No newline at end of file diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index d2fa3c7e11..28dfab832c 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -69,7 +69,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // Only use delay in first loop var firstIndex = true // New date for each carb equivalent - var useDate = entries.last?.createdAt ?? Date() + var useDate = entries.last?.actualDate ?? Date() // Group and Identify all FPUs together let fpuID = entries.last?.fpuID ?? "" // Create an array of all future carb equivalents. @@ -81,7 +81,8 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) } let eachCarbEntry = CarbsEntry( - id: UUID().uuidString, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil, + id: UUID().uuidString, createdAt: entries.last?.createdAt ?? Date(), actualDate: useDate, + carbs: equivalent, fat: 0, protein: 0, note: nil, enteredBy: CarbsEntry.manual, isFPU: true, fpuID: fpuID ) @@ -91,7 +92,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { // Save the array if carbEquivalents > 0 { self.storage.transaction { storage in - storage.append(futureCarbArray, to: file, uniqBy: \.createdAt) + storage.append(futureCarbArray, to: file, uniqBy: \.id) uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } .sorted { $0.createdAt > $1.createdAt } ?? [] @@ -105,6 +106,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { let onlyCarbs = CarbsEntry( id: entry.id ?? "", createdAt: entry.createdAt, + actualDate: entry.actualDate ?? entry.createdAt, carbs: entry.carbs, fat: nil, protein: nil, @@ -115,7 +117,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { ) self.storage.transaction { storage in - storage.append(onlyCarbs, to: file, uniqBy: \.createdAt) + storage.append(onlyCarbs, to: file, uniqBy: \.id) uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } .sorted { $0.createdAt > $1.createdAt } ?? [] @@ -129,7 +131,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { var carbDate = Date() if entries.isNotEmpty { cbs = entries[0].carbs - carbDate = entries[0].createdAt + carbDate = entries[0].actualDate ?? entries[0].createdAt } if cbs != 0 { self.coredataContext.perform { @@ -197,7 +199,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { absolute: nil, rate: nil, eventType: .nsCarbCorrection, - createdAt: $0.createdAt, + createdAt: $0.actualDate ?? $0.createdAt, enteredBy: CarbsEntry.manual, bolus: nil, insulin: nil, diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index 3c8f35cc76..e74643b519 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -3,6 +3,7 @@ import Foundation struct CarbsEntry: JSON, Equatable, Hashable { let id: String? let createdAt: Date + let actualDate: Date? let carbs: Decimal let fat: Decimal? let protein: Decimal? @@ -27,6 +28,7 @@ extension CarbsEntry { private enum CodingKeys: String, CodingKey { case id = "_id" case createdAt = "created_at" + case actualDate case carbs case fat case protein diff --git a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift index 80fc242a63..b9aa0b11a2 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift @@ -22,6 +22,8 @@ extension AddCarbs { @Published var summary: String = "" @Published var skipBolus: Bool = false + let now = Date.now + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext override func subscribe() { @@ -41,7 +43,8 @@ extension AddCarbs { let carbsToStore = [CarbsEntry( id: id_, - createdAt: Date.now, + createdAt: now, + actualDate: date, carbs: carbs, fat: fat, protein: protein, @@ -191,7 +194,8 @@ extension AddCarbs { coredataContext.performAndWait { let save = Meals(context: coredataContext) if let entry = stored.first { - save.createdAt = Date.now + save.createdAt = now + save.actualDate = entry.actualDate ?? Date.now save.id = entry.id ?? "" save.fpuID = entry.fpuID ?? "" save.carbs = Double(entry.carbs) diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index 4e36be7d4e..baa12570e6 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -82,19 +82,16 @@ extension AddCarbs { pushed = true } label: { Text("Now") }.buttonStyle(.borderless).foregroundColor(.secondary).padding(.trailing, 5) } else { - Button { state.date = state.date.addingTimeInterval(-10.minutes.timeInterval) } + Button { state.date = state.date.addingTimeInterval(-15.minutes.timeInterval) } label: { Image(systemName: "minus.circle") }.tint(.blue).buttonStyle(.borderless) DatePicker( "Time", selection: $state.date, - in: ...now, displayedComponents: [.hourAndMinute] ).controlSize(.mini) .labelsHidden() Button { - if state.date.addingTimeInterval(5.minutes.timeInterval) < now { - state.date = state.date.addingTimeInterval(10.minutes.timeInterval) - } + state.date = state.date.addingTimeInterval(15.minutes.timeInterval) } label: { Image(systemName: "plus.circle") }.tint(.blue).buttonStyle(.borderless) } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 752a8ec106..b76d833526 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -233,17 +233,25 @@ extension Bolus { return } + var date = Date() + + if let mealDate = meals.actualDate { + date = mealDate + } else if let mealdate = meals.createdAt { + date = mealdate + } + let mealArray = DataTable.Treatment( units: units, type: .carbs, - date: meals.createdAt ?? Date(), + date: date, id: meals.id ?? "", isFPU: deleteTwice ? true : false, fpuID: deleteTwice ? (meals.fpuID ?? "") : "" ) print( - "meals 2: ID: " + (mealArray.id ?? "").description + " FPU ID: " + (mealArray.fpuID ?? "") + "meals 2: ID: " + mealArray.id.description + " FPU ID: " + (mealArray.fpuID ?? "") .description ) diff --git a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift index 51de909215..490f7d3c9b 100644 --- a/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift +++ b/FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift @@ -36,7 +36,7 @@ extension DataTable { private func setupTreatments() { DispatchQueue.global().async { let units = self.settingsManager.settings.units - + var date = Date.now let carbs = self.provider.carbs() .filter { !($0.isFPU ?? false) } .map { @@ -44,14 +44,20 @@ extension DataTable { return Treatment( units: units, type: .carbs, - date: $0.createdAt, + date: $0.actualDate ?? $0.createdAt, amount: $0.carbs, id: id, fpuID: $0.fpuID, note: $0.note ) } else { - return Treatment(units: units, type: .carbs, date: $0.createdAt, amount: $0.carbs, note: $0.note) + return Treatment( + units: units, + type: .carbs, + date: $0.actualDate ?? $0.createdAt, + amount: $0.carbs, + note: $0.note + ) } } @@ -61,7 +67,7 @@ extension DataTable { Treatment( units: units, type: .fpus, - date: $0.createdAt, + date: $0.actualDate ?? $0.createdAt, amount: $0.carbs, id: $0.id, isFPU: $0.isFPU, diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index b71b6c83dd..e0c728c62f 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -710,7 +710,11 @@ extension MainChartView { calculationQueue.async { let realCarbs = carbs.filter { !($0.isFPU ?? false) } let dots = realCarbs.map { value -> DotInfo in - let center = timeToInterpolatedPoint(value.createdAt.timeIntervalSince1970, fullSize: fullSize) + let center = timeToInterpolatedPoint( + value.actualDate != nil ? (value.actualDate ?? Date()).timeIntervalSince1970 : value.createdAt + .timeIntervalSince1970, + fullSize: fullSize + ) let size = Config.carbsSize + CGFloat(value.carbs) * Config.carbsScale let rect = CGRect(x: center.x - size / 2, y: center.y - size / 2, width: size, height: size) return DotInfo(rect: rect, value: value.carbs) @@ -733,7 +737,11 @@ extension MainChartView { calculationQueue.async { let fpus = carbs.filter { $0.isFPU ?? false } let dots = fpus.map { value -> DotInfo in - let center = timeToInterpolatedPoint(value.createdAt.timeIntervalSince1970, fullSize: fullSize) + let center = timeToInterpolatedPoint( + value.actualDate != nil ? (value.actualDate ?? Date()).timeIntervalSince1970 : value.createdAt + .timeIntervalSince1970, + fullSize: fullSize + ) let size = Config.fpuSize + CGFloat(value.carbs) * Config.fpuScale let rect = CGRect(x: center.x - size / 2, y: center.y - size / 2, width: size, height: size) return DotInfo(rect: rect, value: value.carbs) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 97e651e4b3..6cf5018595 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -195,13 +195,13 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let sampleDates = samples.map(\.startDate) let samplesToSave = carbsWithId .filter { !sampleIDs.contains($0.id ?? "") } // id existing in AH - .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime + .filter { !sampleDates.contains($0.actualDate ?? $0.createdAt) } // not id but exaclty the same datetime .map { HKQuantitySample( type: sampleType, quantity: HKQuantity(unit: .gram(), doubleValue: Double($0.carbs)), - start: $0.createdAt, - end: $0.createdAt, + start: $0.actualDate ?? $0.createdAt, + end: $0.actualDate ?? $0.createdAt, metadata: [ HKMetadataKeySyncIdentifier: $0.id ?? "_id", HKMetadataKeySyncVersion: 1, diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 4dd8104922..1994583dea 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -148,7 +148,7 @@ extension NightscoutAPI { components.port = url.port components.path = Config.treatmentsPath - var arguments = "find[_id][$eq]" + var arguments = "find[id][$eq]" if treatement.isFPU ?? false { arguments = "find[fpuID][$eq]" } diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index d67a97e35a..1c2fce42d0 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -332,6 +332,7 @@ extension BaseWatchManager: WCSessionDelegate { [CarbsEntry( id: UUID().uuidString, createdAt: Date(), + actualDate: nil, carbs: Decimal(carbs), fat: Decimal(fat), protein: Decimal(protein), note: nil, diff --git a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift index e891f3012a..0b99c626a8 100644 --- a/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift +++ b/FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift @@ -13,6 +13,7 @@ import Foundation [CarbsEntry( id: UUID().uuidString, createdAt: dateAdded, + actualDate: dateAdded, carbs: carbs, fat: Decimal(quantityFat), protein: Decimal(quantityProtein), From deb82d736487d00b5740cc2fe911facede78f80b Mon Sep 17 00:00:00 2001 From: MikePlante1 <82073483+MikePlante1@users.noreply.github.com> Date: Sun, 19 Nov 2023 21:10:57 -0500 Subject: [PATCH 254/405] Add branch+commit to "What to Test" field in TestFlight. (#360) --- fastlane/Fastfile | 1 + 1 file changed, 1 insertion(+) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 295135f3bf..1982988fd0 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -126,6 +126,7 @@ platform :ios do skip_submission: false, ipa: "iAPS.ipa", skip_waiting_for_build_processing: true, + changelog: git_branch+" "+last_git_commit[:abbreviated_commit_hash], ) end From 1d0004459730f678ddd7483d685093ab664c227a Mon Sep 17 00:00:00 2001 From: bjornoleh <63544115+bjornoleh@users.noreply.github.com> Date: Mon, 20 Nov 2023 03:15:54 +0100 Subject: [PATCH 255/405] Fastlane/GH build improvements: Add sync action and keepalive action, align with Loop dev improvements (#46) * Add update.yml. Runs nightly to check for new commits. If new commits are found, the target branch on forks is synced with upstream, and build_iAPS.yml is launched. Updates will hence be made available in TestFlight within less than a day. Users will have to decide if they want to enable Automatic Updates in the TestFlight app or not. Scheduled workflows in GitHub actions will be cancelled in the event of 60 days of no repository activity. A "keep alive" action will generate empty commits on upstream if there is no activity after 50 days to avoid inactivation of the scheduled workflow. This commit will be picked up by update.yml on forks the next day, so that there is repository activity also on forks. The reason for running the keepalive action on upstream only, is that upstream and forks should then be on the same commit ref. This would not always be the case if the keepalive action ran on the forks instead. But then the scheduled workflow must be enabled in the upstream repo (Artificial-Pancreas/iAPS). Changes to build_iAPS.yml: - Added "on: workflow_call" to allow it to be launched by update.yml - Removed the "secrets" job", this can still be run from the identifiers and certificates workflows to validate repository secrets. - Removed checkout option "submodules: recursive" * Schedule build of iAPS at 04:30 UTC on the 1st every month The workflow will not run on schedule on forks until the workflow is activated. It can later easily be inactivated/re-activated without code changes to cancel scheduled runs by selecting "Disable workflow" / "Enable workflow" in Actions. * build_iAPS: add missing env: TARGET_BRANCH * update.yml and build_iAPS.yml: Use current branch name as TARGET_BRANCH and UPSTREAM_BRANCH * Run the keepalive action on all repositories This helps forks not to rely on the upstream repo to keep scheduled workflows running * validate_secrets.yml: Migrate validation improvements from Loop * create_certs.yml: Add branch name to workflow name, change job name * add_identifiers.yml: Add branch name to workflow name, change job name * build_iAPS.yml: Add validation as required job, migrate @bjornoleh build_IAPS.yml * update.yml: Add validation as required job, migrate @bjornoleh update.yml * Fastfile: Add matching to secrets validation lane to verify MATCH_PASSWORD * Add update.yml. Runs nightly to check for new commits. If new commits are found, the target branch on forks is synced with upstream, and build_iAPS.yml is launched. Updates will hence be made available in TestFlight within less than a day. Users will have to decide if they want to enable Automatic Updates in the TestFlight app or not. Scheduled workflows in GitHub actions will be cancelled in the event of 60 days of no repository activity. A "keep alive" action will generate empty commits on upstream if there is no activity after 50 days to avoid inactivation of the scheduled workflow. This commit will be picked up by update.yml on forks the next day, so that there is repository activity also on forks. The reason for running the keepalive action on upstream only, is that upstream and forks should then be on the same commit ref. This would not always be the case if the keepalive action ran on the forks instead. But then the scheduled workflow must be enabled in the upstream repo (Artificial-Pancreas/iAPS). Changes to build_iAPS.yml: - Added "on: workflow_call" to allow it to be launched by update.yml - Removed the "secrets" job", this can still be run from the identifiers and certificates workflows to validate repository secrets. - Removed checkout option "submodules: recursive" * Schedule build of iAPS at 04:30 UTC on the 1st every month The workflow will not run on schedule on forks until the workflow is activated. It can later easily be inactivated/re-activated without code changes to cancel scheduled runs by selecting "Disable workflow" / "Enable workflow" in Actions. * build_iAPS: add missing env: TARGET_BRANCH * update.yml and build_iAPS.yml: Use current branch name as TARGET_BRANCH and UPSTREAM_BRANCH * Run the keepalive action on all repositories This helps forks not to rely on the upstream repo to keep scheduled workflows running * Harmonise workflows with LoopKit/LoopWorkspace * Update Fastlane to 2.215.0 Among other improvements, this should fix the WWDR issue. Commands used to install bundler locally and update dependencies: sudo gem pristine ffi sudo gem install bundler sudo bundle install sudo bundle update fastlane * Automatically sync fork before building if vars.SCHEDULED_SYNC == 'true' Automated sync of fork before building requires setting a SCHEDULED_SYNC repository variable to 'true' Build job: change condition from vars.SCHEDULED_SYNC != 'false' to vars.SCHEDULED_SYNC == 'true' for the build job and following steps: - name: Checkout Repo for syncing - name: Sync upstream changes - name: New commits found - name: No new commits - name: Show value of 'has_new_commits' --------- Co-authored-by: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> --- .github/workflows/add_identifiers.yml | 13 +- .github/workflows/build_iAPS.yml | 217 +++++++++++++++++++++++-- .github/workflows/create_certs.yml | 18 +- .github/workflows/validate_secrets.yml | 200 ++++++++++++++++++----- Gemfile.lock | 140 ++++++++-------- fastlane/Fastfile | 6 + 6 files changed, 467 insertions(+), 127 deletions(-) diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index fbb23f45a0..e220ee4484 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -1,15 +1,16 @@ name: 2. Add Identifiers -run-name: Add Identifiers +run-name: Add Identifiers (${{ github.ref_name }}) on: workflow_dispatch: jobs: - secrets: + validate: + name: Validate uses: ./.github/workflows/validate_secrets.yml secrets: inherit identifiers: - needs: secrets + needs: validate runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed @@ -24,9 +25,13 @@ jobs: - name: Patch Match Tables run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d" + # Install project dependencies + - name: Install Project Dependencies + run: bundle install + # Create or update identifiers for app - name: Fastlane Provision - run: fastlane identifiers + run: bundle exec fastlane identifiers env: TEAMID: ${{ secrets.TEAMID }} GH_PAT: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/build_iAPS.yml b/.github/workflows/build_iAPS.yml index fd44274b13..4b6919a3ff 100644 --- a/.github/workflows/build_iAPS.yml +++ b/.github/workflows/build_iAPS.yml @@ -6,37 +6,232 @@ on: ## Remove the "#" sign from the beginning of the line below to get automated builds on push (code changes in your repository) #push: - ## Remove the "#" sign from the beginning of the two lines below to get automated builds every two months - #schedule: - #- cron: '0 17 1 */2 *' # Runs at 17:00 UTC on the 1st in Jan, Mar, May, Jul, Sep and Nov. + schedule: + #- cron: '30 04 1 * *' # Runs at 04:30 UTC on the 1st every month + - cron: '0 8 * * 3' # Checks for updates at 08:00 UTC every Wednesday + - cron: '0 6 1 * *' # Builds the app on the 1st of every month at 06:00 UTC +env: + UPSTREAM_REPO: Artificial-Pancreas/iAPS + UPSTREAM_BRANCH: ${{ github.ref_name }} # branch on upstream repository to sync from (replace with specific branch name if needed) + TARGET_BRANCH: ${{ github.ref_name }} # target branch on fork to be kept in sync, and target branch on upstream to be kept alive (replace with specific branch name if needed) + ALIVE_BRANCH: alive jobs: - secrets: + validate: + name: Validate uses: ./.github/workflows/validate_secrets.yml secrets: inherit + # Checks if GH_PAT holds workflow permissions + # Checks for existence of alive branch; if non-existent creates it + check_alive_and_permissions: + needs: validate + runs-on: ubuntu-latest + name: Check alive branch and permissions + permissions: + contents: write + outputs: + WORKFLOW_PERMISSION: ${{ steps.workflow-permission.outputs.has_permission }} + + steps: + - name: Check for workflow permissions + id: workflow-permission + env: + TOKEN_TO_CHECK: ${{ secrets.GH_PAT }} + run: | + PERMISSIONS=$(curl -sS -f -I -H "Authorization: token ${{ env.TOKEN_TO_CHECK }}" https://api.github.com | grep ^x-oauth-scopes: | cut -d' ' -f2-); + + if [[ $PERMISSIONS =~ "workflow" || $PERMISSIONS == "" ]]; then + echo "GH_PAT holds workflow permissions or is fine-grained PAT." + echo "has_permission=true" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false. + else + echo "GH_PAT lacks workflow permissions." + echo "Automated build features will be skipped!" + echo "has_permission=false" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false. + fi + + - name: Check for alive branch + if: steps.workflow-permission.outputs.has_permission == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if [[ "$(gh api -H "Accept: application/vnd.github+json" /repos/${{ github.repository_owner }}/iAPS/branches | jq --raw-output 'any(.name=="alive")')" == "true" ]]; then + echo "Branch 'alive' exists." + echo "ALIVE_BRANCH_EXISTS=true" >> $GITHUB_ENV # Set ALIVE_BRANCH_EXISTS to true + else + echo "Branch 'alive' does not exist." + echo "ALIVE_BRANCH_EXISTS=false" >> $GITHUB_ENV # Set ALIVE_BRANCH_EXISTS to false + fi + + - name: Create alive branch + if: env.ALIVE_BRANCH_EXISTS == 'false' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Get ref for Artificial-Pancreas/iAPS:dev + SHA=$(curl -sS https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs \ + | jq '.[] | select(.ref == "refs/heads/dev" ) | .object.sha' \ + | tr -d '"' + ); + + # Create alive branch based on Artificial-Pancreas/iAPS:dev + gh api \ + --method POST \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + /repos/${{ github.repository_owner }}/iAPS/git/refs \ + -f ref='refs/heads/alive' \ + -f sha=$SHA + + # Checks for changes in upstream repository; if changes exist prompts sync for build + # Performs keepalive to avoid stale fork + check_latest_from_upstream: + needs: [validate, check_alive_and_permissions] + runs-on: ubuntu-latest + name: Check upstream and keep alive + outputs: + NEW_COMMITS: ${{ steps.sync.outputs.has_new_commits }} + + steps: + - name: Checkout target repo + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false') + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_PAT }} + ref: alive + + - name: Sync upstream changes + if: | # do not run the upstream sync action on the upstream repository + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'Artificial-Pancreas' + id: sync + uses: aormsby/Fork-Sync-With-Upstream-action@v3.4 + with: + target_sync_branch: ${{ env.ALIVE_BRANCH }} + shallow_since: 6 months ago + target_repo_token: ${{ secrets.GH_PAT }} + upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }} + upstream_sync_repo: ${{ env.UPSTREAM_REPO }} + + # Display a sample message based on the sync output var 'has_new_commits' + - name: New commits found + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true' + run: echo "New commits were found to sync." + + - name: No new commits + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false' + run: echo "There were no new commits." + + - name: Show value of 'has_new_commits' + if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && vars.SCHEDULED_SYNC != 'false' + run: | + echo ${{ steps.sync.outputs.has_new_commits }} + echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT + + # Keep repository "alive": add empty commits to ALIVE_BRANCH after "time_elapsed" days of inactivity to avoid inactivation of scheduled workflows + - name: Keep alive + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false') + uses: gautamkrishnar/keepalive-workflow@v1 # using the workflow with default settings + with: + time_elapsed: 20 # Time elapsed from the previous commit to trigger a new automated commit (in days) + + - name: Show scheduled build configuration message + if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION != 'true' + run: | + echo "### :calendar: Scheduled Sync and Build Disabled :mobile_phone_off:" >> $GITHUB_STEP_SUMMARY + echo "You have not yet configured the scheduled sync and build for iAPS's browser build." >> $GITHUB_STEP_SUMMARY + echo "Synchronizing your fork of iAPS with the upstream repository Artificial-Pancreas/iAPS will be skipped." >> $GITHUB_STEP_SUMMARY + echo "If you want to enable automatic builds and updates for your iAPS, please follow the instructions \ + under the following path iAPS/fastlane/testflight.md." >> $GITHUB_STEP_SUMMARY + + + # Builds iAPS build: - needs: secrets + name: Build + needs: [validate, check_alive_and_permissions, check_latest_from_upstream] runs-on: macos-13 + permissions: + contents: write + if: | # runs if started manually, or if sync schedule is set and enabled and scheduled on the first Saturday each month, or if sync schedule is set and enabled and new commits were found + github.event_name == 'workflow_dispatch' || + (needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + (vars.SCHEDULED_BUILD != 'false' && github.event.schedule == '0 6 1 * *') || + (vars.SCHEDULED_SYNC == 'true' && needs.check_latest_from_upstream.outputs.NEW_COMMITS == 'true' ) + ) steps: - # Uncomment to manually select Xcode version if needed - name: Select Xcode version run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" + + - name: Checkout Repo for syncing + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC == 'true' + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_PAT }} + ref: ${{ env.TARGET_BRANCH }} + + - name: Sync upstream changes + if: | # do not run the upstream sync action on the upstream repository + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC == 'true' && github.repository_owner != 'Artificial-Pancreas' + id: sync + uses: aormsby/Fork-Sync-With-Upstream-action@v3.4 + with: + target_sync_branch: ${{ env.TARGET_BRANCH }} + shallow_since: 6 months ago + target_repo_token: ${{ secrets.GH_PAT }} + upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }} + upstream_sync_repo: ${{ env.UPSTREAM_REPO }} + + # Display a sample message based on the sync output var 'has_new_commits' + - name: New commits found + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC == 'true' && steps.sync.outputs.has_new_commits == 'true' + run: echo "New commits were found to sync." + + - name: No new commits + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && + vars.SCHEDULED_SYNC == 'true' && steps.sync.outputs.has_new_commits == 'false' + run: echo "There were no new commits." + + - name: Show value of 'has_new_commits' + if: | + needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' + && vars.SCHEDULED_SYNC == 'true' + run: | + echo ${{ steps.sync.outputs.has_new_commits }} + echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT - # Checks-out the repo - - name: Checkout Repo + - name: Checkout Repo for building uses: actions/checkout@v3 with: + token: ${{ secrets.GH_PAT }} submodules: recursive - + ref: ${{ env.TARGET_BRANCH }} + # Patch Fastlane Match to not print tables - name: Patch Match Tables run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d" + # Install project dependencies + - name: Install project dependencies + run: bundle install + # Build signed iAPS IPA file - name: Fastlane Build & Archive - run: fastlane build_iAPS + run: bundle exec fastlane build_iAPS env: TEAMID: ${{ secrets.TEAMID }} GH_PAT: ${{ secrets.GH_PAT }} @@ -47,7 +242,7 @@ jobs: # Upload to TestFlight - name: Fastlane upload to TestFlight - run: fastlane release + run: bundle exec fastlane release env: TEAMID: ${{ secrets.TEAMID }} GH_PAT: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index 77604177c1..948d42e4e9 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -1,15 +1,17 @@ name: 3. Create Certificates -run-name: Create Certificates +run-name: Create Certificates (${{ github.ref_name }}) on: workflow_dispatch: jobs: - secrets: + validate: + name: Validate uses: ./.github/workflows/validate_secrets.yml secrets: inherit - + certificates: - needs: secrets + name: Create Certificates + needs: validate runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed @@ -23,10 +25,14 @@ jobs: # Patch Fastlane Match to not print tables - name: Patch Match Tables run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d" - + + # Install project dependencies + - name: Install Project Dependencies + run: bundle install + # Create or update certificates for app - name: Create Certificates - run: fastlane certs + run: bundle exec fastlane certs env: TEAMID: ${{ secrets.TEAMID }} GH_PAT: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml index e7300d7a15..18a11aaf5e 100644 --- a/.github/workflows/validate_secrets.yml +++ b/.github/workflows/validate_secrets.yml @@ -1,70 +1,194 @@ name: 1. Validate Secrets -run-name: Validate Secrets +run-name: Validate Secrets (${{ github.ref_name }}) on: [workflow_call, workflow_dispatch] jobs: - validate: + validate-access-token: + name: Access runs-on: macos-13 + env: + GH_PAT: ${{ secrets.GH_PAT }} + GH_TOKEN: ${{ secrets.GH_PAT }} + outputs: + HAS_WORKFLOW_PERMISSION: ${{ steps.access-token.outputs.has_workflow_permission }} + steps: + - name: Validate Access Token + id: access-token + run: | + # Validate Access Token + + # Ensure that gh exit codes are handled when output is piped. + set -o pipefail + + # Define patterns to validate the access token (GH_PAT) and distinguish between classic and fine-grained tokens. + GH_PAT_CLASSIC_PATTERN='^ghp_[a-zA-Z0-9]{36}$' + GH_PAT_FINE_GRAINED_PATTERN='^github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}$' + + # Validate Access Token (GH_PAT) + if [ -z "$GH_PAT" ]; then + failed=true + echo "::error::The GH_PAT secret is unset or empty. Set it and try again." + else + if [[ $GH_PAT =~ $GH_PAT_CLASSIC_PATTERN ]]; then + provides_scopes=true + echo "The GH_PAT secret is a structurally valid classic token." + elif [[ $GH_PAT =~ $GH_PAT_FINE_GRAINED_PATTERN ]]; then + echo "The GH_PAT secret is a structurally valid fine-grained token." + else + unknown_format=true + echo "The GH_PAT secret does not have a known token format." + fi + + # Attempt to capture the x-oauth-scopes scopes of the token. + if ! scopes=$(curl -sS -f -I -H "Authorization: token $GH_PAT" https://api.github.com | { grep -i '^x-oauth-scopes:' || true; } | cut -d ' ' -f2- | tr -d '\r'); then + failed=true + if [ $unknown_format ]; then + echo "::error::Unable to connect to GitHub using the GH_PAT secret. Verify that it is set correctly (including the 'ghp_' or 'github_pat_' prefix) and try again." + else + echo "::error::Unable to connect to GitHub using the GH_PAT secret. Verify that the token exists and has not expired at https://github.com/settings/tokens. If necessary, regenerate or create a new token (and update the secret), then try again." + fi + elif [[ $scopes =~ workflow ]]; then + echo "The GH_PAT secret has repo and workflow permissions." + echo "has_workflow_permission=true" >> $GITHUB_OUTPUT + elif [[ $scopes =~ repo ]]; then + echo "The GH_PAT secret has repo (but not workflow) permissions." + elif [ $provides_scopes ]; then + failed=true + if [ -z "$scopes" ]; then + echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it does not provide any permission scopes." + else + echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it only provides the following permission scopes: $scopes" + fi + echo "::error::The GH_PAT secret is lacking at least the 'repo' permission scope required to access the Match-Secrets repository. Update the token permissions at https://github.com/settings/tokens (to include the 'repo' and 'workflow' scopes) and try again." + else + echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it does not provide inspectable scopes. Assuming that the 'repo' and 'workflow' permission scopes required to access the Match-Secrets repository and perform automations are present." + echo "has_workflow_permission=true" >> $GITHUB_OUTPUT + fi + fi + + # Exit unsuccessfully if secret validation failed. + if [ $failed ]; then + exit 2 + fi + + validate-match-secrets: + name: Match-Secrets + needs: validate-access-token + runs-on: macos-13 + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + steps: + - name: Validate Match-Secrets + run: | + # Validate Match-Secrets + + # Ensure that gh exit codes are handled when output is piped. + set -o pipefail + + # If a Match-Secrets repository does not exist, attempt to create one. + if ! visibility=$(gh repo view ${{ github.repository_owner }}/Match-Secrets --json visibility | jq --raw-output '.visibility | ascii_downcase'); then + echo "A '${{ github.repository_owner }}/Match-Secrets' repository could not be found using the GH_PAT secret. Attempting to create one..." + + # Create a private Match-Secrets repository and verify that it exists and that it is private. + if gh repo create ${{ github.repository_owner }}/Match-Secrets --private >/dev/null && [ "$(gh repo view ${{ github.repository_owner }}/Match-Secrets --json visibility | jq --raw-output '.visibility | ascii_downcase')" == "private" ]; then + echo "Created a private '${{ github.repository_owner }}/Match-Secrets' repository." + else + failed=true + echo "::error::Unable to create a private '${{ github.repository_owner }}/Match-Secrets' repository. Create a private 'Match-Secrets' repository manually and try again. If a private 'Match-Secrets' repository already exists, verify that the token permissions of the GH_PAT are set correctly (or update them) at https://github.com/settings/tokens and try again." + fi + # Otherwise, if a Match-Secrets repository exists, but it is public, cause validation to fail. + elif [[ "$visibility" == "public" ]]; then + failed=true + echo "::error::A '${{ github.repository_owner }}/Match-Secrets' repository was found, but it is public. Change the repository visibility to private (or delete it) and try again. If necessary, a private repository will be created for you." + else + echo "Found a private '${{ github.repository_owner }}/Match-Secrets' repository to use." + fi + + # Exit unsuccessfully if secret validation failed. + if [ $failed ]; then + exit 2 + fi + + validate-fastlane-secrets: + name: Fastlane + needs: [validate-access-token, validate-match-secrets] + runs-on: macos-13 + env: + GH_PAT: ${{ secrets.GH_PAT }} + GH_TOKEN: ${{ secrets.GH_PAT }} + FASTLANE_ISSUER_ID: ${{ secrets.FASTLANE_ISSUER_ID }} + FASTLANE_KEY_ID: ${{ secrets.FASTLANE_KEY_ID }} + FASTLANE_KEY: ${{ secrets.FASTLANE_KEY }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + TEAMID: ${{ secrets.TEAMID }} steps: - # Checks-out the repo - name: Checkout Repo uses: actions/checkout@v3 - # Validates the repo secrets - - name: Validate Secrets - run: | - # Validate Secrets - echo Validating Repository Secrets... + # Install project dependencies + - name: Install Project Dependencies + run: bundle install + - name: Validate Fastlane Secrets + run: | + # Validate Fastlane Secrets + # Validate TEAMID if [ -z "$TEAMID" ]; then failed=true - echo "::error::TEAMID secret is unset or empty. Set it and try again." + echo "::error::The TEAMID secret is unset or empty. Set it and try again." elif [ ${#TEAMID} -ne 10 ]; then failed=true - echo "::error::TEAMID secret is set but has wrong length. Verify that it is set correctly and try again." - fi - - # Validate GH_PAT - if [ -z "$GH_PAT" ]; then + echo "::error::The TEAMID secret is set but has wrong length. Verify that it is set correctly and try again." + elif ! [[ $TEAMID =~ ^[A-Z0-9]+$ ]]; then failed=true - echo "::error::GH_PAT secret is unset or empty. Set it and try again." - elif [ "$(gh api -H "Accept: application/vnd.github+json" /repos/${{ github.repository_owner }}/Match-Secrets | jq --raw-output '.permissions.push')" != "true" ]; then + echo "::error::The TEAMID secret is set but invalid. Verify that it is set correctly (only uppercase letters and numbers) and try again." + fi + + # Validate MATCH_PASSWORD + if [ -z "$MATCH_PASSWORD" ]; then failed=true - echo "::error::GH_PAT secret is set but invalid or lacking appropriate privileges on the ${{ github.repository_owner }}/Match-Secrets repository. Verify that it is set correctly and try again." + echo "::error::The MATCH_PASSWORD secret is unset or empty. Set it and try again." fi - + + # Ensure that fastlane exit codes are handled when output is piped. + set -o pipefail + # Validate FASTLANE_ISSUER_ID, FASTLANE_KEY_ID, and FASTLANE_KEY + FASTLANE_KEY_ID_PATTERN='^[A-Z0-9]+$' + FASTLANE_ISSUER_ID_PATTERN='^\{?[A-F0-9a-f]{8}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{12}\}?$' + if [ -z "$FASTLANE_ISSUER_ID" ] || [ -z "$FASTLANE_KEY_ID" ] || [ -z "$FASTLANE_KEY" ]; then failed=true [ -z "$FASTLANE_ISSUER_ID" ] && echo "::error::The FASTLANE_ISSUER_ID secret is unset or empty. Set it and try again." [ -z "$FASTLANE_KEY_ID" ] && echo "::error::The FASTLANE_KEY_ID secret is unset or empty. Set it and try again." [ -z "$FASTLANE_KEY" ] && echo "::error::The FASTLANE_KEY secret is unset or empty. Set it and try again." - elif ! echo "$FASTLANE_KEY" | openssl pkcs8 -nocrypt >/dev/null; then + elif [ ${#FASTLANE_KEY_ID} -ne 10 ]; then failed=true - echo "::error::The FASTLANE_KEY secret is set but invalid. Verify that it is set correctly and try again." - elif ! fastlane validate_secrets; then + echo "::error::The FASTLANE_KEY_ID secret is set but has wrong length. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again." + elif ! [[ $FASTLANE_KEY_ID =~ $FASTLANE_KEY_ID_PATTERN ]]; then failed=true - echo "::error::Unable to create a valid authorization token for the App Store Connect API.\ - Verify that the FASTLANE_ISSUER_ID, FASTLANE_KEY_ID, and FASTLANE_KEY secrets are set correctly and try again." - fi - - # Validate MATCH_PASSWORD - if [ -z "$MATCH_PASSWORD" ]; then + echo "::error::The FASTLANE_KEY_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again." + elif ! [[ $FASTLANE_ISSUER_ID =~ $FASTLANE_ISSUER_ID_PATTERN ]]; then failed=true - echo "::error::The MATCH_PASSWORD secret is unset or empty. Set it and try again." + echo "::error::The FASTLANE_ISSUER_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again." + elif ! echo "$FASTLANE_KEY" | openssl pkcs8 -nocrypt >/dev/null; then + failed=true + echo "::error::The FASTLANE_KEY secret is set but invalid. Verify that you copied it correctly from the API Key file (*.p8) you downloaded and try again." + elif ! bundle exec fastlane validate_secrets 2>&1 | tee fastlane.log; then + if grep -q "bad decrypt" fastlane.log; then + failed=true + echo "::error::Unable to decrypt the Match-Secrets repository using the MATCH_PASSWORD secret. Verify that it is set correctly and try again." + elif grep -q -e "required agreement" -e "license agreement" fastlane.log; then + failed=true + echo "::error::Unable to create a valid authorization token for the App Store Connect API. Verify that the latest developer program license agreement has been accepted at https://developer.apple.com/account (review and accept any updated agreement), then wait a few minutes for changes to propagate and try again." + elif ! grep -q -e "No code signing identity found" -e "Could not install WWDR certificate" fastlane.log; then + failed=true + echo "::error::Unable to create a valid authorization token for the App Store Connect API. Verify that the FASTLANE_ISSUER_ID, FASTLANE_KEY_ID, and FASTLANE_KEY secrets are set correctly and try again." + fi fi - + # Exit unsuccessfully if secret validation failed. if [ $failed ]; then exit 2 fi - shell: bash - env: - TEAMID: ${{ secrets.TEAMID }} - GH_PAT: ${{ secrets.GH_PAT }} - FASTLANE_ISSUER_ID: ${{ secrets.FASTLANE_ISSUER_ID }} - FASTLANE_KEY_ID: ${{ secrets.FASTLANE_KEY_ID }} - FASTLANE_KEY: ${{ secrets.FASTLANE_KEY }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - GH_TOKEN: ${{ secrets.GH_PAT }} \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 95b509e742..b7e7dc2310 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,52 +1,53 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.4) + CFPropertyList (3.0.6) rexml - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.516.0) - aws-sdk-core (3.121.2) + aws-partitions (1.824.0) + aws-sdk-core (3.181.1) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.71.0) + aws-sdk-core (~> 3, >= 3.177.0) aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.50.0) - aws-sdk-core (~> 3, >= 3.121.2) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.104.0) - aws-sdk-core (~> 3, >= 3.121.2) + aws-sdk-s3 (1.134.0) + aws-sdk-core (~> 3, >= 3.181.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.4.0) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - claide (1.0.3) + claide (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) + dotenv (2.8.1) emoji_regex (3.2.3) - excon (0.87.0) - faraday (1.8.0) + excon (0.103.0) + faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) + faraday-net_http_persistent (~> 1.0) faraday-patron (~> 1.0) faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) @@ -55,14 +56,17 @@ GEM faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) faraday-net_http (1.0.1) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) + faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.5) - fastlane (2.196.0) + fastimage (2.2.7) + fastlane (2.215.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -83,10 +87,11 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) @@ -94,7 +99,7 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) @@ -102,9 +107,9 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.12.0) - google-apis-core (>= 0.4, < 2.a) - google-apis-core (0.4.1) + google-apis-androidpublisher_v3 (0.49.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.1) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -113,74 +118,72 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.7.0) - google-apis-core (>= 0.4, < 2.a) - google-apis-playcustomapp_v1 (0.5.0) - google-apis-core (>= 0.4, < 2.a) - google-apis-storage_v1 (0.8.0) - google-apis-core (>= 0.4, < 2.a) + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.5.0) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.2.0) - google-cloud-storage (1.34.1) - addressable (~> 2.5) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) + addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.19.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.0.0) - faraday (>= 0.17.3, < 2.0) + googleauth (1.8.0) + faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.4) + http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - jmespath (1.4.0) - json (2.6.0) - jwt (2.3.0) - memoist (0.16.2) - mini_magick (4.11.0) - mini_mime (1.1.2) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) + mini_magick (4.12.0) + mini_mime (1.1.5) multi_json (1.15.0) - multipart-post (2.0.0) + multipart-post (2.3.0) nanaimo (0.3.0) naturally (2.2.1) optparse (0.1.1) - os (1.1.1) - plist (3.6.0) - public_suffix (4.0.6) + os (1.1.4) + plist (3.7.0) + public_suffix (5.0.3) rake (13.0.6) - representable (3.1.1) + representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) security (0.1.3) - signet (0.16.0) + signet (0.18.0) addressable (~> 2.8) - faraday (>= 0.17.3, < 2.0) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.8) + simctl (1.6.10) CFPropertyList naturally terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - trailblazer-option (0.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.1) tty-spinner (0.9.3) @@ -188,11 +191,11 @@ GEM uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8) - unicode-display_width (1.8.0) - webrick (1.7.0) + unf_ext (0.0.8.2) + unicode-display_width (2.4.2) + webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.21.0) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -206,10 +209,11 @@ GEM PLATFORMS arm64-darwin-21 + arm64-darwin-22 x86_64-darwin-19 DEPENDENCIES fastlane BUNDLED WITH - 2.3.26 + 2.4.19 \ No newline at end of file diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1982988fd0..72b74d5996 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -204,6 +204,12 @@ platform :ios do end find_bundle_id("ru.artpancreas.#{TEAMID}.FreeAPS") + + match( + type: "appstore", + git_basic_authorization: Base64.strict_encode64("#{GITHUB_REPOSITORY_OWNER}:#{GH_PAT}"), + app_identifier: [], + ) end desc "Nuke Certs" From 420dc4edd631740885327863074fd58138db29f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 20 Nov 2023 03:57:29 +0100 Subject: [PATCH 256/405] Crowdin (#362) --- .../de.lproj/Localizable.strings | 30 ++++++++-------- .../ru.lproj/Localizable.strings | 30 ++++++++-------- .../uk.lproj/Localizable.strings | 4 +-- .../Resources/de.lproj/Localizable.strings | 4 +-- .../Resources/ru.lproj/Localizable.strings | 4 +-- .../Resources/de.lproj/Localizable.strings | 28 +++++++-------- .../Resources/ru.lproj/Localizable.strings | 28 +++++++-------- .../Resources/uk.lproj/Localizable.strings | 4 +-- .../Main/ar.lproj/Localizable.strings | 21 +++++++++++ .../Main/da.lproj/Localizable.strings | 25 +++++++++++-- .../Main/de.lproj/Localizable.strings | 35 +++++++++++++++---- .../Main/es.lproj/Localizable.strings | 23 +++++++++++- .../Main/fi.lproj/Localizable.strings | 21 +++++++++++ .../Main/fr.lproj/Localizable.strings | 23 +++++++++++- .../Main/he.lproj/Localizable.strings | 21 +++++++++++ .../Main/it.lproj/Localizable.strings | 27 ++++++++++++-- .../Main/nb.lproj/Localizable.strings | 27 ++++++++++++-- .../Main/nl.lproj/Localizable.strings | 33 +++++++++++++---- .../Main/pl.lproj/Localizable.strings | 21 +++++++++++ .../Main/pt-BR.lproj/Localizable.strings | 23 +++++++++++- .../Main/pt-PT.lproj/Localizable.strings | 21 +++++++++++ .../Main/ru.lproj/Localizable.strings | 33 +++++++++++++---- .../Main/sk.lproj/Localizable.strings | 21 +++++++++++ .../Main/sv.lproj/Localizable.strings | 8 ++++- .../Main/tr.lproj/Localizable.strings | 25 +++++++++++-- .../Main/uk.lproj/Localizable.strings | 21 +++++++++++ .../Main/zh-Hans.lproj/Localizable.strings | 23 +++++++++++- 27 files changed, 484 insertions(+), 100 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 691a2a4eb5..9862b94e96 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Ersetze jetzt den Pod! Die Insulinabgabe wird in 8 Stunden unterbrochen, spätestens wenn die Gültigkeit abgelaufen ist oder kein Insulin mehr vorhanden ist."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Label text for temporary basal rate summary */ "Rate" = "BR"; @@ -787,36 +787,36 @@ "%@ ago" = "%@ vor"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Stille"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normaler Operationsmodus, in dem hörbare Pod Signale für alle Pod Alarme verwendet werden und wenn Vertrauenserinnerungen aktiviert sind."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod Alarme verwenden keine Signale und Bestätigungssignale werden unterdrückt. Der Pod springt nur bei tödlichen Pod-Fehlern und beim Abspielen von Testsignalen.\n\nWarnung: Warnung - Wann immer der Pod zum Schweigen gebracht wird, muss er innerhalb des Bluetooth-Bereichs dieses Geräts gehalten werden, um Benachrichtigungen für Pod-Benachrichtigungen zu erhalten."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Stille Pod Modus unterdrückt alle Pod Warnungen und Bestätigungs-Erinnerung."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Stille Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-Details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorherige Pod-Details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pump-Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pumpenmanager Details abrufen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pumpmanager Details aktualisieren"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose-Infos"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Pod-Status ablesen"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 0361e4f665..afd3e16fe2 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Замените Под. Подача инсулина будет остановлена спустя 8 часов после истечения срока действия Пода, либо когда резервуар будет пуст."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for temporary basal rate summary */ "Rate" = "Скорость"; @@ -787,36 +787,36 @@ "%@ ago" = "%@ назад"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Беззвучно"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Обычный режим работы, при котором звуковые сигналы используются для всех оповещений Пода и при включенных доверенных напоминаниях."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Все уведомления Пода не издают звуковых сигналов и напоминания о подтверждении подавлены. Под будет издавать звуковые сигналы только при критических сбоях Пода и когда проигрываются тестовые звуки.\n\n⚠️Предупреждение — Когда Под заглушен, он должен находиться в пределах Bluetooth-диапазона этого устройства, для получения сигналов уведомлений."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Беззвучный режим Пода отключает все звуковые сигналы и напоминания о подтверждении Пода."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Беззвучный Под"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Сведения о Поде"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Сведения о предыдущем Поде"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Сведения о помпе"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Получение сведений о помпе..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Обновить сведения о помпе"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Диагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Получить статус Пода"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 5947cf27ab..d68827c20d 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -816,7 +816,7 @@ "Refresh Pump Manager Details" = "Оновити відомості про керування помпами"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Діагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Отримати статус Pod'у"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings index aadf6cf134..8c7de48334 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/de.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Unbestätigter Befehl steht noch aus."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Kritischer Pod-Fehler"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings index 669cf193ae..5188e016fb 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/ru.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Проблема со связью: ожидается неподтвержденная команда."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Критическая ошибка пода"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 526bb72127..702fbf6a0d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Sicherheitserinnerung"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* The title of the configuration section in settings */ "Configuration" = "Konfiguration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Pumpe löschen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Entfernen Sie die Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ihr Pod gibt möglicherweise immer noch Insulin ab.\nEntfernen Sie ihn vom Körper und tippen dann auf „Weiter“."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Stille"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normaler Operationsmodus, in dem hörbare Pod Signale für alle Pod Alarme verwendet werden und wenn Vertrauenserinnerungen aktiviert sind."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod Alarme verwenden keine Signale und Bestätigungssignale werden unterdrückt. Der Pod springt nur bei tödlichen Pod-Fehlern und beim Abspielen von Testsignalen.\n\nWarnung: Warnung - Wann immer der Pod zum Schweigen gebracht wird, muss er innerhalb des Bluetooth-Bereichs dieses Geräts gehalten werden, um Benachrichtigungen für Pod-Benachrichtigungen zu erhalten."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Stille Pod"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-Details"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Vorherige Pod-Details"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Pump-Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Pumpenmanager Details abrufen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Pumpenmanager Details aktualisieren"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Fehler beim Aktualisieren der Stille Pod Einstellung."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose-Infos"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Pod-Status ablesen"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 361282afc1..ddc9d602c2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Напоминания об уверенности"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды, когда Под не заглушен."; /* The title of the configuration section in settings */ "Configuration" = "Конфигурация"; @@ -547,7 +547,7 @@ "Remove Pump" = "Удалите помпу"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Отломите защитную крышку канюли и проверьте состояние самой канюли. Далее снимите защитные стикеры с пластыря."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ваш под может по-прежнему доставлять инсулин.\n Удалите его с тела, затем нажмите «Продолжить»."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Беззвучно"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Обычный режим работы, при котором звуковые сигналы используются для всех оповещений Пода и при включенных доверенных напоминаниях."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Все уведомления Пода не издают звуковых сигналов и напоминания о подтверждении подавлены. Под будет издавать звуковые сигналы только при критических сбоях Пода и когда проигрываются тестовые звуки.\n\n⚠️Предупреждение — Когда Под заглушен, он должен находиться в пределах Bluetooth-диапазона этого устройства, для получения сигналов уведомлений."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Беззвучный Под"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Сведения о Поде"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Сведения о предыдущем Поде"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Сведения о помпе"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Получение сведений о помпе..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Обновить сведения о помпе"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Не удалось обновить настройку беззвучного режима Пода."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Диагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Получить статус Пода"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 67216a18ff..63ec6f256e 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -798,7 +798,7 @@ Silence Pod" = "Silence Pod"; "Failed to update silence pod preference." = "Не вдалося оновити налаштування сигналів підтвердження."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Діагностика"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Отримати статус Pod'у"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 88d4425739..2ef0efa18e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index c07f513b4c..8f799fbd8e 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige Mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Slet kulhydrater?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Slet insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 timer"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index d3551983d0..2c4796a934 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temporäre Ziele"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Kohlenhydrate löschen?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Insulin löschen?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlungen"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiken und Home-Ansicht"; /* Alert text */ -"Delete Carb Equivalents?" = "Kohlenhydratäquivalente löschen?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Mahlzeit Voreinstellungen"; @@ -1395,7 +1401,7 @@ Enact a temp Basal or a temp target */ "Predictions" = "Prognosen"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Zeige Eiweiß & Fett"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1480,7 +1486,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Pumpe Bestätigungstöne"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Speichern..."; @@ -1510,10 +1516,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Keine Erinnerungseinstellungen in Verwendung."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Standard Ablauf-Erinnerung"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Stunden X-Achse (6 Standard)"; +/* */ +"2 hours" = "2 Stunden"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Mittelwert"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index cd5d5fa82b..a7c0563fc7 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temp Targets"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "¿Eliminar carbohidratos?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 5a0ba58d82..7f17ced838 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 16e97e24d6..2cf149aeea 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Cibles temporaires"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Supprimer les glucides ?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 88d4425739..2ef0efa18e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 89d12c07f2..a7b0c150f9 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Obiettivi Temporanei"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Cancella carboidrati?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Cancella l'insulina?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Trattamenti"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiche e Vista Iniziale"; /* Alert text */ -"Delete Carb Equivalents?" = "Cancella i carb equivalenti?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Pasto Predefinito"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Ore X-Axis (6 predefinito)"; +/* */ +"2 hours" = "2 ore"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Media"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index bdc3b73ceb..aa9d70c980 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Slette karbohydrater?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Slette insulin?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistikk og startskjerm"; /* Alert text */ -"Delete Carb Equivalents?" = "Slette karboekvivalenter?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Forvalg av måltid"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Timer å vise (6 er standard)"; +/* */ +"2 hours" = "2 timer"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Gj.snitt"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 7869423e7e..f3a6b3c746 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -95,7 +95,7 @@ "Home" = "Hoofdmenu"; /* Looping in progress */ -"looping" = "Loopen"; +"looping" = "Updaten"; /* min ago since last loop */ "min ago" = "Min. terug"; @@ -471,7 +471,7 @@ Enact a temp Basal or a temp target */ "m" = "m"; /* */ -"Closed loop" = "Gesloten loop"; +"Closed loop" = "Actieve loop"; /* */ "Configuration" = "Instellingen"; @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Tijdelijk streefdoel"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Koolhydraten verwijderen?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Insuline verwijderen?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Behandelingen"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistieken en Home View"; /* Alert text */ -"Delete Carb Equivalents?" = "Verwijder koolhydraten?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Maaltijd voorinstellingen"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Uren X-as (standaard 6)"; +/* */ +"2 hours" = "2 uur"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Gemiddeld"; @@ -1880,7 +1901,7 @@ Enact a temp Basal or a temp target */ "Max IOB" = "Max IOB"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "De Max IOB is de maximale hoeveelheid insuline aan boord van alle bronnen - zowel basaal (of SMB correcties) en bolus insuline die door iAPS gegeven mag worden om alles hoger dan de streefwaarde te behandelen. Anders dan de andere twee veiligheid instelingen (max_daily_safety_multiplier and current_basal_safety_multiplier) wordt bij deze instelling een vaste aantal eenheden insuline opgegeven. Voorlopig worden handmatige bolussen NIET beperkt door deze instelling. \n\n Om je basaal waarden te testen gedurende de nacht kun je deze instelling op 0 zetten tijdens een gesloten Loop. Dit zorgt er voor dat stop voor laag geactiveerd worden wanneer je je instelling aan het testen bent. \n\n(Tip van https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "De Max IOB is de maximale hoeveelheid insuline aan boord van alle bronnen - zowel basaal (of SMB correcties) en bolus insuline die door iAPS gegeven mag worden om alles hoger dan de streefwaarde te behandelen. Anders dan de andere twee veiligheid instelingen (max_daily_safety_multiplier and current_basal_safety_multiplier) wordt bij deze instelling een vaste aantal eenheden insuline opgegeven. Voorlopig worden handmatige bolussen NIET beperkt door deze instelling. \n\n Om je basaal waarden te testen gedurende de nacht kun je deze instelling op 0 zetten tijdens een actieve Loop. Dit zorgt er voor dat stop voor laag geactiveerd worden wanneer je je instelling aan het testen bent. \n\n(Tip van https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ "Max Daily Safety Multiplier" = "Maximale dagelijkse veiligheidsvermenigvuldiger"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index a9407c6b7b..7eb2ed0404 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1372,6 +1372,12 @@ Połączono z Nightscout!"; /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1654,6 +1660,21 @@ Połączono z Nightscout!"; /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index bd3f2bf126..9a25f84900 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Alvos Temporários"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Deletar carboidratos?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 9d7a38ad12..549fce9b59 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index afb32bed03..abbe480dd6 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Временные цели"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Удалить углеводы?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Удалить инсулин?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "События"; @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Статистика и экран"; /* Alert text */ -"Delete Carb Equivalents?" = "Удалить эквиваленты углеводов?"; +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; /* */ "Meal Presets" = "Шаблоны"; @@ -1480,7 +1486,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Напоминания о верификации"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Доверенные звуковые сигналы от Пода, которые позволяют распознать выбранные команды, когда Под не заглушен."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Сохранение..."; @@ -1510,10 +1516,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Доверенные звуковые сигналы не используются."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Доверенные звуковые сигналы сработают для операций, которые Вы инициируете - Болюс, Отмена Болюса, Приостановка подачи, Возобновление подачи, Сохранение напоминаний и т. д. Когда петля автоматически меняет подачу инсулина - звуковые сигналы не используются."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Доверенные звуковые сигналы сработают даже тогда, когда петля автоматически изменит подачу инсулина, а также для команд, которые Вы инициируете."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Напоминание об истечении срока"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Ширина графика по оси X (6 по-умолчанию)"; +/* */ +"2 hours" = "2 часа"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Средний"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 8637bcd962..21bdc245b9 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 22cbc84875..2963b127cc 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1368,7 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistik och Diagram"; /* Alert text */ -"Delete Carb Equivalents?" = "Radera dessa poster?"; +"Delete Carb Equivalents?" = "Ta bort dessa fett/protein-poster?"; + +/* */ +"All FPUs of the meal will be deleted." = "Alla poster fett/protein-poster tillhörande denna måltid kommer att tas bort."; + +/* */ +"Delete Glucose?" = "Ta bort blodsockervärde?"; /* */ "Meal Presets" = "Förval"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 682a5bb755..778b4b165c 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Geçici Hedefler"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Karbonhidratları sil?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "İnsülin silinsin mi?"; +"Delete Insulin?" = "Delete Insulin?"; /* Treatments list */ "Treatments" = "Tedaviler"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 saat"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Ortalama"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 0c19c62790..32a6e7daec 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Видалити вуглеводні еквіваленти?"; +/* */ +"All FPUs of the meal will be deleted." = "Усі FPU страви буде видалено."; + +/* */ +"Delete Glucose?" = "Видалити глюкозу?"; + /* */ "Meal Presets" = "Попередні Налаштування Їжі"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Вісь Х годин (6 за замовчуванням)"; +/* */ +"2 hours" = "2 години"; + +/* */ +"4 hours" = "4 години"; + +/* */ +"6 hours" = "6 годин"; + +/* */ +"12 hours" = "12 годин"; + +/* */ +"24 hours" = "24 години"; + /* Average BG = */ "Average" = "Середній"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 82f87a29d4..b525731d44 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -576,7 +576,7 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "临时目标"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "删除碳水?"; +"Delete Carbs?" = "Delete Carbs?"; /* Delete insulin from pump history and Nightscout */ "Delete Insulin?" = "Delete Insulin?"; @@ -1370,6 +1370,12 @@ Enact a temp Basal or a temp target */ /* Alert text */ "Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + /* */ "Meal Presets" = "Meal Presets"; @@ -1652,6 +1658,21 @@ Enact a temp Basal or a temp target */ /* */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + /* Average BG = */ "Average" = "Average"; From 4d4c831abbacf8a8deb97ef9f791bd105a5eb1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 21 Nov 2023 03:55:35 +0100 Subject: [PATCH 257/405] Clean up (cherry picked from commit bcc9781072ca7d7761c244ad2b01c68758d5af44) --- .../Sources/Modules/Home/HomeStateModel.swift | 9 --- .../Modules/Home/View/HomeRootView.swift | 57 +++++-------------- 2 files changed, 14 insertions(+), 52 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index a86553bc12..3f32ab5680 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -217,15 +217,6 @@ extension Home { } } - func saveSettings() { - coredataContext.perform { - let settings = UXSettings(context: self.coredataContext) - settings.hours = self.hours - settings.date = Date.now - try? self.coredataContext.save() - } - } - private func setupGlucose() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index df6bbfaa83..3e76b39fd3 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -23,7 +23,7 @@ extension Home { @State var timeButtons: [Buttons] = [ Buttons(label: "2 hours", number: "2", active: false, hours: 2), Buttons(label: "4 hours", number: "4", active: false, hours: 4), - Buttons(label: "6 hours", number: "6", active: false, hours: 6), + Buttons(label: "6 hours", number: "6", active: true, hours: 6), Buttons(label: "12 hours", number: "12", active: false, hours: 12), Buttons(label: "24 hours", number: "24", active: false, hours: 24) ] @@ -55,11 +55,6 @@ extension Home { sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)] ) var enactedSliderTT: FetchedResults - @FetchRequest( - entity: UXSettings.entity(), - sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)] - ) var fetchedSettings: FetchedResults - private var numberFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -354,19 +349,15 @@ extension Home { } var timeInterval: some View { - HStack(alignment: .center) { - let saveButton = UXSettings(context: moc) + HStack { ForEach(timeButtons) { button in Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { let index = timeButtons.firstIndex(where: { $0.label == button.label }) ?? 0 - highlightButtons(index, onAppear: false) - saveButton.hours = button.hours - saveButton.date = Date.now - try? moc.save() + highlightButtons(index) state.hours = button.hours } .foregroundStyle(button.active ? .primary : .secondary) - .frame(maxHeight: 20).padding(.horizontal) + .frame(maxHeight: 20).padding(.horizontal, button.active ? 20 : 10) .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) } Image(systemName: "ellipsis.circle.fill") @@ -530,29 +521,16 @@ extension Home { return (name: profileString, isOn: display) } - func highlightButtons(_ int: Int?, onAppear: Bool) { + func highlightButtons(_ int: Int) { var index = 0 - if let integer = int, !onAppear { - repeat { - if index == integer { - timeButtons[index].active = true - } else { - timeButtons[index].active = false - } - index += 1 - } while index < timeButtons.count - } else if onAppear { - let i = timeButtons.firstIndex(where: { $0.hours == (fetchedSettings.first?.hours ?? 6) }) ?? 2 - index = 0 - repeat { - if index == i { - timeButtons[index].active = true - } else { - timeButtons[index].active = false - } - index += 1 - } while index < timeButtons.count - } + repeat { + if index == int { + timeButtons[index].active = true + } else { + timeButtons[index].active = false + } + index += 1 + } while index < timeButtons.count } @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { @@ -660,11 +638,7 @@ extension Home { } .edgesIgnoringSafeArea(.vertical) } - .onAppear { - configureView { - highlightButtons(nil, onAppear: true) - } - } + .onAppear(perform: configureView) .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) @@ -687,9 +661,6 @@ extension Home { } ) } - .onDisappear { - state.saveSettings() - } } private var popup: some View { From 9224b4330fed64eaa95a4564c918c88302ba4c01 Mon Sep 17 00:00:00 2001 From: Liroy van Hoewijk <4643445+LiroyvH@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:40:33 +0100 Subject: [PATCH 258/405] Update NightscoutConfigStateModel.swift Check for a trailing slash (/) at the end of the URL entered by the user and remove it to prevent 404's --- .../Modules/NightscoutConfig/NightscoutConfigStateModel.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index bbcc981c65..26743f8483 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -61,6 +61,10 @@ extension NightscoutConfig { } func connect() { + if let CheckURL = url.last, CheckURL == "/" { + let fixedURL = url.dropLast() + url = String(fixedURL) + } guard let url = URL(string: url) else { message = "Invalid URL" return From c541b1ffe18bb3b9716d05ff7d05590f659f69eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:07:32 +0100 Subject: [PATCH 259/405] Crowdin updates (#363) --- .../it.lproj/Localizable.strings | 30 +++++----- .../nl.lproj/Localizable.strings | 2 +- .../Resources/it.lproj/Localizable.strings | 4 +- .../Resources/it.lproj/Localizable.strings | 28 +++++----- .../Resources/nl.lproj/Localizable.strings | 4 +- .../Main/it.lproj/Localizable.strings | 26 ++++----- .../Main/nl.lproj/Localizable.strings | 56 +++++++++++-------- 7 files changed, 79 insertions(+), 71 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 0349d46d18..578e6f3b86 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Cambia il Pod ora. La somministrazione di insulina si fermerà 8 ore dopo la scadenza del Pod o quando non rimane più insulina."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando iAPS invece regolerà in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando iAPS regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* Label text for temporary basal rate summary */ "Rate" = "Valore"; @@ -787,36 +787,36 @@ "%@ ago" = "%@ fa"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Silenziato"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Modalità di funzionamento normale in cui vengono utilizzati segnali acustici del Pod per tutti gli avvisi Pod e quando i promemoria di fiducia sono abilitati."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tutti gli avvisi Pod non usano alcun segnale acustico e gli avvisi acustici di conferma vengono soppressi. Il Pod sarà solo beep per difetti di Pod fatali e durante la riproduzione di beep di prova.\n\n⚠️Attenzione - Ogni volta che il Pod viene silenziato, deve essere mantenuto entro la gamma Bluetooth di questo dispositivo per ricevere le notifiche per gli avvisi Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "La modalità Pod Silenziato sopprime tutti gli avvisi e promemoria di conferma del Pod."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Pod Silenziato"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Dettagli Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Dettagli Pod Precedente"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Dettagli Microinfusore"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Recupero Dettagli Microinfusore..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Recupero Dettagli Microinfusore"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostica"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Leggi stato microinfusore"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 0662a3a310..0116d26e99 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -369,7 +369,7 @@ "Suspend Delivery" = "Onderbreek toediening"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "De insulinetoediening wordt gestopt totdat u de toediening handmatig hervat. Wanneer wilt u dat Loop u eraan herinnert om de toediening te hervatten?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "De insulinetoediening wordt gestopt totdat je de toediening handmatig hervat. Wanneer wil je dat iAPS je eraan herinnert om de toediening te hervatten?"; /* Button text for 30 minute suspend duration */ "30 minutes" = "30 minuten"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings index 85ddffc181..d69dcecd64 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/it.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problema di comunicazione: comando di conferma in attesa."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando iAPS invece regolerà in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando iAPS regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Errore critico Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 32385cf6a5..a171c1ad24 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Promemoria di fiducia"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati quando il Pod non è silenziato."; /* The title of the configuration section in settings */ "Configuration" = "Configurazione"; @@ -547,7 +547,7 @@ "Remove Pump" = "Rimuovere microinfusore"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio trasparente dell'ago del Pod e controllare la cannula. Quindi rimuovere le due coperture di carta."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Il tuo Pod potrebbe ancora erogare insulina.\n Rimuovilo dal tuo corpo, e poi tocca \"Continua\"."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Silenziato"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Modalità di funzionamento normale in cui vengono utilizzati segnali acustici del Pod per tutti gli avvisi Pod e quando i promemoria di fiducia sono abilitati."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tutti gli avvisi Pod non usano alcun segnale acustico e gli avvisi acustici di conferma vengono soppressi. Il Pod sarà solo beep per difetti di Pod fatali e durante la riproduzione di beep di prova.\n\n⚠️Attenzione - Ogni volta che il Pod viene silenziato, deve essere mantenuto entro la gamma Bluetooth di questo dispositivo per ricevere le notifiche per gli avvisi Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Pod Silenziato"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Dettagli Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Dettagli Pod Precedente"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Dettagli Microinfusore"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Recupero Dettagli Microinfusore..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Recupero Dettagli Microinfusore"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Impossibile aggiornare la preferenza del Pod silenziato."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostica"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Leggi stato microinfusore"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index bed1732065..db8812a846 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -297,10 +297,10 @@ "If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Als je de Podinstallatie annuleert, wordt de huidige Pod gedeactiveerd en onbruikbaar."; /* Instructions when deactivating pod that has been paired, but not attached. */ -"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Een gedeeltelijk ingestelde pod moet eerst worden gedeactiveerd voordat er geprobeerd wordt een nieuwe pod te koppelen. Deactiveer pod en gooi weg."; +"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Een Pod die gedeeltelijk is ingesteld, moet eerst worden uitgeschakeld voordat je probeert een nieuwe pod te koppelen. Deactiveer de Pod uit en gooi hem weg."; /* Instructions when deactivating pod that has been paired and possibly attached. */ -"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Een gedeeltelijk ingestelde pod moet eerst worden gedeactiveerd voordat er geprobeerd wordt een nieuwe pod te koppelen. Deactiveer pod en gooi weg."; +"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Een niet compleet ingestelde Pod, moet eerst worden uitgeschakeld voordat je probeert een nieuwe pod te koppelen. Deactiveer de Pod uit en gooi hem weg."; /* Button title to insert cannula during setup */ "Insert Cannula" = "Canule inbrengen"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index a7b0c150f9..597fdcf72f 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Obiettivi Temporanei"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Cancella carboidrati?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Cancella l'insulina?"; /* Treatments list */ "Treatments" = "Trattamenti"; @@ -1368,13 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiche e Vista Iniziale"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Cancella i carb equivalenti?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Tutti gli indici insulinici del pasto verranno eliminati."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Cancella Glicemie?"; /* */ "Meal Presets" = "Pasto Predefinito"; @@ -1401,7 +1401,7 @@ Enact a temp Basal or a temp target */ "Predictions" = "Previsione"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Mostra Proteine & Grassi"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ @@ -1486,7 +1486,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Promemoria Di Sicurezza"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "I promemoria di fiducia sono segnali acustici emessi dal Pod che possono essere utilizzati per confermare i comandi selezionati quando il Pod non è silenziato."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sto salvando..."; @@ -1516,10 +1516,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Non vengono utilizzati promemoria di fiducia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "I promemoria di fiducia suoneranno per i comandi inoltrati, come boli, cancellazione boli, sospensioni, ripristini erogazione, salvataggi di promemoria, etc. Quando iAPS invece regolerà in automatico l'erogazione allora non userà alcun promemoria di fiducia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "I promemoria di fiducia suonano quando iAPS regola automaticamente l'erogazione e per i comandi avviati dall'utente."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Promemoria scadenza predefinito"; @@ -1662,16 +1662,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 ore"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 ore"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 ore"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 ore"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 ore"; /* Average BG = */ "Average" = "Media"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index f3a6b3c746..6b9ea178de 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Tijdelijk streefdoel"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Koolhydraten verwijderen?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Insuline verwijderen?"; /* Treatments list */ "Treatments" = "Behandelingen"; @@ -939,7 +939,7 @@ Enact a temp Basal or a temp target */ "Error" = "Fout"; /* */ -"Some ui element was incorrectly specified" = "Sommige ui-elementen zijn onjuist opgegeven"; +"Some ui element was incorrectly specified" = "Sommige UI-elementen zijn onjuist opgegeven"; /* */ "Success" = "Geslaagd"; @@ -1192,10 +1192,10 @@ Enact a temp Basal or a temp target */ "Connect to Apple Health" = "Verbinden met Apple Gezondheid"; /* Show when have not permissions for writing to Health */ -"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Als u gegevens wilt opslaan met Apple Gezondheid, moet u de juiste machtigingen verlenen in Instellingen > Gezondheid > Gegevenstoegang en apparaten"; +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Als je gegevens wilt opslaan met Apple Gezondheid, moet je de juiste machtigingen verlenen in Instellingen > Gezondheid > Gegevenstoegang en apparaten"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Hiermee kan iAPS lezen van en schrijven naar Apple Heath. U moet ook machtigingen geven in Instellingen > Gezondheid > Gegevenstoegang. Als u een glucosewaarde invoert in Apple Health, opent u iAPS om te bevestigen dat deze wordt weergegeven."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Hiermee kan iAPS lezen van en schrijven naar Apple Heath. Je moet ook machtigingen geven in Instellingen > Gezondheid > Gegevenstoegang. Als je een glucosewaarde invoert in Apple Health, open je iAPS om te bevestigen dat deze wordt weergegeven."; /* New ALerts ------------------------- */ /* Info title */ @@ -1249,7 +1249,7 @@ Enact a temp Basal or a temp target */ "Override With A Factor Of " = "Overschrijvingsfactor "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Maakt het mogelijk vet en eiwit om te zetten in toekomstige koolhydraten met behulp van de Warschau formule van kilocalorieën gedeeld door 10.\n\nDit spreidt de koolhydraten over een maximale tijdsduur die kan worden ingesteld van 5-12 uur.\n\nVertraging is de tijd tussen nu en de eerste toekomstige koolhydrateninvoer.\n\nInterval in minuten is het aantal minuten tussen de invoer. Hoe korter het interval, hoe gladder het resultaat. Redelijke keuzes zijn 10, 15, 20, 30 of 60.\n\nAanpassingsfactor is het effect van vet en eiwit op de waarden. 1,0 is volledig effect (originele methode van Warschau) en 0,5 is half effect. Merk op dat je misschien zult merken dat je normale koolhydratenratio moet stijgen tot een groter getal als je vet en eiwit gaat toevoegen. Daarom kun je het beste beginnen met een factor van ongeveer 0,5 om het jezelf gemakkelijk te maken.\n\nStandaardinstellingen: Tijdslimiet: 8 uur, Interval: 30 min, Factor: 0.5, Vertraging 60 min"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Dit laat je vet en eiwit omzetten in toekomstige koolhydraten met behulp van de Warschau-formule. Deze formule verdeelt de koolhydraten over een zelf in te stellen tijdsduur van 5-12 uur.\n\nDe vertraging is de tijd tussen nu en de eerste toekomstige koolhydrateninvoer. Het interval in minuten is het aantal minuten tussen elke invoer. Als je een korter interval kiest, wordt het resultaat gelijkmatiger. Goede keuzes zijn bijvoorbeeld 10, 15, 20, 30 of 60 minuten.\n\nDe aanpassingsfactor bepaalt het effect van vet en eiwit op de waarden. Een factor van 1,0 betekent volledig effect (de oorspronkelijke Warschau-methode), en 0,5 betekent half effect.\n\nLet op dat je mogelijk moet opmerken dat je normale koolhydratenverhouding moet verhogen tot een hoger getal wanneer je vet en eiwit toevoegt. Daarom is het het beste om te beginnen met een factor van ongeveer 0,5 om het jezelf makkelijk te maken.\n\nStandaardinstellingen zijn een tijdslimiet van 8 uur, een interval van 30 minuten, een factor van 0,5 en een vertraging van 60 minuten"; /* FPU Settings Title */ "Fat and Protein" = "Vetten & eiwitten"; @@ -1347,7 +1347,7 @@ Enact a temp Basal or a temp target */ "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Je basale insuline zal worden aangepast met het overschrijvingspercentage en uw ISF en CR profiel zullen direct worden aangepast aan het percentage."; /* */ -"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Door deze overschrijving te starten, verander je je profielen en/of je streefwaarde voor glucose die voor de looping gedurende de hele geselecteerde duur wordt gebruikt. Door op \"Start profiel\" te tikken, start je je nieuwe profiel of wijzig je huidige actieve profiel."; +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Als je deze instelling (overschrijving) start, pas je je profielen en/of je streefwaarde voor glucose aan die tijdens het hele gekozen tijdsduur wordt gebruikt. Door op \"Start profiel\" te tikken, begin je met je nieuwe instellingen of verander je je huidige actieve instellingen."; /* Change Target glucose in profile settings */ "Override Profile Target" = "Overschrijven doelprofiel"; @@ -1368,13 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistieken en Home View"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Koolhydraat equivalenten verwijderen?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Alle FPU's van de maaltijd worden verwijderd."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Glucosewaarde verwijderen?"; /* */ "Meal Presets" = "Maaltijd voorinstellingen"; @@ -1551,7 +1551,7 @@ Enact a temp Basal or a temp target */ "%1$@ for %2$@" = "%1$@ voor %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop zal niet automatisch jouw insuline toediening aanpassen tot de tijdelijke basaalstand is beëindigd of is geannuleerd."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "iAPS zal niet automatisch veranderingen aanbrengen in de hoeveelheid insuline die je krijgt, totdat de tijdelijke basaalstand is gestopt of geannuleerd."; /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Tijdelijke basaal instellen"; @@ -1662,16 +1662,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 uur"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 uur"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 uur"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 uur"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 uur"; /* Average BG = */ "Average" = "Gemiddeld"; @@ -1802,7 +1802,7 @@ Enact a temp Basal or a temp target */ "Low Temptarget Lowers Sensitivity" = "Laag tijdelijk streefdoel verlaagt gevoeligheid"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Is standaard uitgeschakeld. Indien ingeschakeld, kan de gevoeligheid (hogere gevoeligheidsratio) voor tijdelijke doelen worden verlaagd < = 5,5 mmol. Hoe lager je tijdelijke doel onder de 5,6 mmol ligt, hoe hoger de gevoeligheid zal zijn. Zo levert een tijdelijk koersdoel van 5,3 mmol een gevoeligheidsratio van 1,09 op, terwijl 4,7 mmol een waarde van 1,33 geeft."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Is standaard uitgeschakeld. Als je het inschakelt, kun je de gevoeligheid voor tijdelijke doelen verminderen tot ≤ 5,5 mmol. Als je tijdelijke doel lager is dan 5,6 mmol, wordt de gevoeligheid hoger. Bijvoorbeeld, als je tijdelijke doel 5,3 mmol is, wordt de gevoeligheidsratio 1,09, en bij 4,7 mmol wordt het 1,33."; /* Headline ”Sensitivity Raises Target" */ "Sensitivity Raises Target" = "Gevoeligheid verhoogt het doel"; @@ -1814,13 +1814,13 @@ Enact a temp Basal or a temp target */ "Resistance Lowers Target" = "Resistentie verlaagt het doel"; /* ”Resistance Lowers Target" */ -"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Standaard op onwaar. Wanneer waar, zal het BG doel verlagen als autosens minder gevoeligheid detecteert"; +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Is standaard uitgeschakeld. Wanneer ingeschakeld, zal het BG doel verlagen als autosens minder gevoeligheid detecteert"; /* Headline ”Advanced Target Adjustments" */ "Advanced Target Adjustments" = "Geavanceerde doelaanpassingen"; /* ”Advanced Target Adjustments" */ -"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Deze functie was in het verleden altijd geactiveerd, maar is nu standaard ingesteld op \"Uit\". Dit is niet langer nodig met oref 0.6.0. Deze functie verlaagt automatisch de bloedglucosedoelstelling van oref0 als de huidige BG of de verwachte BG hoog zijn. Dit helpt hoge BG te voorkomen en te beperken, maar schakelt automatisch over op lage gevoeligheid om ervoor te zorgen dat de BG zich soepel naar je eigenlijke doel beweegt. Als je dit gedrag te agressief vindt, kun je deze functie uitschakelen. Als je dat doet, laat het ons dan weten, zodat we beter kunnen begrijpen welke instellingen voor iedereen het beste werken."; +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "In het verleden stond deze functie altijd aan, maar nu staat deze standaard op \"Uit\". Met oref 0.6.0 is dit niet langer nodig. Deze functie past automatisch het bloedglucose-doel van oref0 aan als de huidige bloedsuiker of de verwachte bloedsuiker hoog is. Hierdoor worden hoge bloedsuikers voorkomen en beperkt, maar schakelt het automatisch naar een lage gevoeligheid om ervoor te zorgen dat de bloedsuiker soepel naar je eigenlijke doel beweegt. Als je dit te snel vindt gaan, kun je deze functie uitschakelen. "; /* Headline "Exercise Mode" */ "Exercise Mode" = "Beweging modus"; @@ -1850,7 +1850,7 @@ Enact a temp Basal or a temp target */ "Enable UAM" = "UAM inschakelen"; /* "Enable UAM" */ -"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Als deze optie is ingeschakeld, herkent het SMB-algoritme onaangekondigde maaltijden. Dit is nuttig, als je vergeet om koolhydraten in te voeren, je koolhydraten verkeerd inschat, de hoeveelheid ingevoerde koolhydraten verkeerd is of als een maaltijd met veel vet en eiwit een langere duur heeft dan verwacht. Zonder koolhydraten in te voeren, kan UAM snelle glucoseverhogingen veroorzaakt door koolhydraten, adrenaline, etc. herkennen en dit proberen op te lossen met SMB's. Dit werkt ook andersom: als er een snelle glucose daling is, kan het eerder stoppen met SMBs."; +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Als deze functie is ingeschakeld, kan het SMB-algoritme onverwachte maaltijden herkennen. Dit is handig als je vergeet om koolhydraten in te voeren, je de koolhydraten verkeerd inschat, de hoeveelheid ingevoerde koolhydraten onjuist is, of als een maaltijd met veel vet en eiwit langer duurt dan verwacht. Zonder koolhydraten in te voeren, kan deze functie snel stijgende bloedsuikersignalen veroorzaakt door koolhydraten, adrenaline, enzovoort herkennen en proberen te corrigeren met SMB's. Het werkt ook andersom: als er een snelle daling van de bloedsuiker is, kan het eerder stoppen met SMB's."; /* Headline "Enable SMB With COB" */ "Enable SMB With COB" = "Activeer SMB met COB"; @@ -1991,7 +1991,7 @@ Enact a temp Basal or a temp target */ "Bolus Increment" = "Bolusverhoging"; /* "Bolus Increment" */ -"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Kleinst vastgestelde SMB hoeveelheid. De minimale hoeveelheid voor Omnipod-pompen is 0,05 U, terwijl dit voor Medtronic-pompen voor verschillende modellen verschilt, van 0,025 U tot 0,10 U. Controleer de minimale bolushoeveelheid die door uw pomp kan worden toegediend. De standaardwaarde is 0,1."; +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Kleinst vastgestelde SMB hoeveelheid. De minimale hoeveelheid voor Omnipod-pompen is 0,05 U, terwijl dit voor Medtronic-pompen voor verschillende modellen verschilt, van 0,025 U tot 0,10 U. Controleer de minimale bolushoeveelheid die door je pomp kan worden toegediend. De standaardwaarde is 0,1."; /* Headline "Insulin Peak Time" */ "Insulin Peak Time" = "Insuline piektijd"; @@ -2032,19 +2032,27 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dynamische ISF inschakelen"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Bereken een nieuwe ISF bij elke loopcyclus. Nieuwe ISF wordt gebaseerd op de huidige BG, TDD van insuline (afgelopen 24 uur of een gewogen gemiddelde) en een aanpassingsfactor (standaard 1).\n\nDynamische ISF en CR ratio's worden beperkt door uw autosens.min/max grenzen.\n\nDynamische ratio vervangt de autosens.ratio: Nieuwe ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Bereken bij elke loopcyclus een nieuwe ISF (Insulin Sensitivity Factor). De nieuwe ISF wordt bepaald door de huidige bloedsuikerspiegel (BG), de totale dagelijkse dosis insuline (TDD) van de afgelopen 24 uur of een gemiddelde daarvan, en een aanpassingsfactor (standaard 1). De dynamische ISF en CR (Carb Ratio) worden beperkt door de minimum- en maximumwaarden die zijn ingesteld in uw autosens.min/max grenzen. De dynamische ratio vervangt de autosens.ratio:/n/n +Nieuwe ISF = Statische ISF / Dynamische ratio, +Dynamische ratio = profielgevoeligheid * aanpassingsfactor * TDD * Logaritme (BG/insulineFactor+1) / 1800, +InsulineFactor = 120 - Tijd tot insulinepiek in minuten./n/n +Eenvoudiger gezegd, het systeem past de insulinegevoeligheid aan op basis van je recente insulinegebruik en huidige bloedsuikerspiegel. De aanpassingen zijn beperkt binnen bepaalde grenzen die je hebt ingesteld"; /* Headline "Enable Dynamic CR" */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; /* Enable Dynamic CR */ -"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Dynamische CR gebruiken. De dynamische verhouding wordt gebruikt voor CR op de volgende manier:\n\n Wanneer verhouding > 1: dynCR = (newRatio - 1) / 2 + 1.\nWanneer verhouding < 1: dynCR = CR/dynCR.\n\nGebruik niet samen met een hoge insuline fractie (> 2)"; +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Gebruik de Dynamische Carb Ratio (CR). De dynamische verhouding wordt als volgt toegepast:\n\n +Als de verhouding > 1 is: dynCR = (nieuwe verhouding - 1) / 2 + 1. +Als de verhouding < 1 is: dynCR = CR/dynCR. +Gebruik dit niet samen met een hoge insuline fractie (> 2).\n\n +Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op basis van je recente verhoudingen. Het zorgt ervoor dat de aanpassingen niet te groot zijn en werkt niet goed als je een hoge insuline fractie hebt."; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Pas de dynamische verhoudingen aan met een constante. De standaardwaarde is 0,5. Hoe hoger de waarde, hoe groter de correctie van uw ISF zal zijn voor een hoge of een lage BG. De maximale correctie wordt bepaald door de Autosens min/max instellingen. Voor de Sigmoid functie wordt om te beginnen een correctiefactor van 0,4 - 0,5 aanbevolen. Voor de logaritmische formule is er minder consensus, maar voor de meeste gebruikers is 0,5 - 0,8 meer aangewezen"; +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Verander de dynamische verhoudingen met een vaste waarde, die standaard op 0,5 staat. Als je deze waarde verhoogt, zal de aanpassing van je ISF voor hoge of lage bloedsuikerwaarden groter zijn. De grootte van de correctie is beperkt door de instellingen voor Autosens min/max. Voor de Sigmoid-functie wordt een startwaarde van 0,4 tot 0,5 aanbevolen. Voor de logaritmische formule is er geen vastgestelde norm, maar voor de meeste gebruikers is een waarde tussen 0,5 en 0,8 passender."; /* Headline "Use Sigmoid Function" */ @@ -2058,7 +2066,7 @@ Enact a temp Basal or a temp target */ "Threshold Setting (mg/dl)" = "Drempelinstelling (mg/dl)"; /* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaarddrempelwaarde in iAPS is afhankelijk van je huidige minimale BG streefdoel: als volgt:\n\nAls uw minimum BG = 5,0 mmol/l -> drempel = 3,6 mmol/dl,\n\nals minimum BG doel = 5,5 mmol/l -> drempel = 3,8 mmol/l,\n\nminimum BG doel = 6,1 mmol/l -> drempel= 3,8 mmol/l,\n\nen als minimum BG doel = 7,2 mmol/l -> drempel= 4,7 mmol/l.\n\nMet deze instelling kunt u de standaard instelling wijzigen naar een hogere drempel voor het herhalen met dynISF. Geldige waarden zijn 3,6 mmol/l<= Drempel instelling <= 6,6 mmol/l."; +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; From ffe555ef1aeb643701c1398962d4493633107a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 23 Nov 2023 13:29:49 +0100 Subject: [PATCH 260/405] Refactor the highlightButtons() --- .../Modules/Home/View/HomeRootView.swift | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 3e76b39fd3..da21c8a69a 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -23,7 +23,7 @@ extension Home { @State var timeButtons: [Buttons] = [ Buttons(label: "2 hours", number: "2", active: false, hours: 2), Buttons(label: "4 hours", number: "4", active: false, hours: 4), - Buttons(label: "6 hours", number: "6", active: true, hours: 6), + Buttons(label: "6 hours", number: "6", active: false, hours: 6), Buttons(label: "12 hours", number: "12", active: false, hours: 12), Buttons(label: "24 hours", number: "24", active: false, hours: 24) ] @@ -352,12 +352,11 @@ extension Home { HStack { ForEach(timeButtons) { button in Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { - let index = timeButtons.firstIndex(where: { $0.label == button.label }) ?? 0 - highlightButtons(index) state.hours = button.hours + highlightButtons() } .foregroundStyle(button.active ? .primary : .secondary) - .frame(maxHeight: 20).padding(.horizontal, button.active ? 20 : 10) + .frame(maxHeight: 20).padding(.horizontal) .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) } Image(systemName: "ellipsis.circle.fill") @@ -521,16 +520,10 @@ extension Home { return (name: profileString, isOn: display) } - func highlightButtons(_ int: Int) { - var index = 0 - repeat { - if index == int { - timeButtons[index].active = true - } else { - timeButtons[index].active = false - } - index += 1 - } while index < timeButtons.count + func highlightButtons() { + for i in 0 ..< timeButtons.count { + timeButtons[i].active = timeButtons[i].hours == state.hours + } } @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { @@ -638,7 +631,11 @@ extension Home { } .edgesIgnoringSafeArea(.vertical) } - .onAppear(perform: configureView) + .onAppear { + configureView { + highlightButtons() + } + } .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) From fdf2d9c196ae40a5ff6f461454941412861dd4e8 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Fri, 24 Nov 2023 04:23:39 -0500 Subject: [PATCH 261/405] Fix upload and import functions (#379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix offset() function for importSettings so that it calculates second properly Fix uploadProfile so that it uploads seconds ( we store everything as minutes ) * If uploadProfile fails, output to the log file which retrieve call is failing, as that that should never happen, but points to a missing .json file that needs to be regenerated. This let's you know which one, and the 'fix' is to go into Settings and save the 'file' pointed to in the log file. * Refactor --------- Co-authored-by: Jon Mårtensson --- .../NightscoutConfigStateModel.swift | 10 ++--- .../Services/Network/NightscoutManager.swift | 41 ++++++++++++------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 26743f8483..56c3b5ede1 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -174,7 +174,7 @@ extension NightscoutConfig { } return CarbRatioEntry( start: carbratio.time, - offset: (carbratio.timeAsSeconds ?? self.offset(carbratio.time)) / 60, + offset: self.offset(carbratio.time) / 60, ratio: carbratio.value ) } let carbratiosProfile = CarbRatios(units: CarbUnit.grams, schedule: carbratios) @@ -195,7 +195,7 @@ extension NightscoutConfig { } return BasalProfileEntry( start: basal.time, - minutes: (basal.timeAsSeconds ?? self.offset(basal.time)) / 60, + minutes: self.offset(basal.time) / 60, rate: basal.value ) } // DASH pumps can have 0U/h basal rates but don't import if total basals (24 hours) amount to 0 U. @@ -213,7 +213,7 @@ extension NightscoutConfig { let sensitivities = fetchedProfile.sens.map { sensitivity -> InsulinSensitivityEntry in InsulinSensitivityEntry( sensitivity: self.units == .mmolL ? sensitivity.value : sensitivity.value.asMgdL, - offset: (sensitivity.timeAsSeconds ?? self.offset(sensitivity.time)) / 60, + offset: self.offset(sensitivity.time) / 60, start: sensitivity.time ) } @@ -236,7 +236,7 @@ extension NightscoutConfig { low: self.units == .mmolL ? target.value : target.value.asMgdL, high: self.units == .mmolL ? target.value : target.value.asMgdL, start: target.time, - offset: (target.timeAsSeconds ?? self.offset(target.time)) / 60 + offset: self.offset(target.time) / 60 ) } let targetsProfile = BGTargets( units: self.units, @@ -308,7 +308,7 @@ extension NightscoutConfig { func offset(_ string: String) -> Int { let hours = Int(string.prefix(2)) ?? 0 let minutes = Int(string.suffix(2)) ?? 0 - return hours * 60 + minutes * 60 + return ((hours * 60) + minutes) * 60 } func saveError(_ string: String) { diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 4f767561fb..c71d967bde 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -482,15 +482,28 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } func uploadProfileAndSettings(_ force: Bool) { - // These should be modified anyways and not the defaults - guard let sensitivities = storage.retrieve(OpenAPS.Settings.insulinSensitivities, as: InsulinSensitivities.self), - let basalProfile = storage.retrieve(OpenAPS.Settings.basalProfile, as: [BasalProfileEntry].self), - let carbRatios = storage.retrieve(OpenAPS.Settings.carbRatios, as: CarbRatios.self), - let targets = storage.retrieve(OpenAPS.Settings.bgTargets, as: BGTargets.self), - let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self), - let settings = storage.retrieve(OpenAPS.FreeAPS.settings, as: FreeAPSSettings.self) - else { - debug(.nightscout, "NightscoutManager uploadProfile Not all settings found to build profile!") + guard let sensitivities = storage.retrieve(OpenAPS.Settings.insulinSensitivities, as: InsulinSensitivities.self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading insulinSensitivities") + return + } + guard let settings = storage.retrieve(OpenAPS.FreeAPS.settings, as: FreeAPSSettings.self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading settings") + return + } + guard let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading preferences") + return + } + guard let targets = storage.retrieve(OpenAPS.Settings.bgTargets, as: BGTargets.self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading bgTargets") + return + } + guard let carbRatios = storage.retrieve(OpenAPS.Settings.carbRatios, as: CarbRatios.self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading carbRatios") + return + } + guard let basalProfile = storage.retrieve(OpenAPS.Settings.basalProfile, as: [BasalProfileEntry].self) else { + debug(.nightscout, "NightscoutManager uploadProfile: error loading basalProfile") return } @@ -498,32 +511,30 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { NightscoutTimevalue( time: String(item.start.prefix(5)), value: item.sensitivity, - timeAsSeconds: item.offset + timeAsSeconds: item.offset * 60 ) } - let target_low = targets.targets.map { item -> NightscoutTimevalue in NightscoutTimevalue( time: String(item.start.prefix(5)), value: item.low, - timeAsSeconds: item.offset + timeAsSeconds: item.offset * 60 ) } let target_high = targets.targets.map { item -> NightscoutTimevalue in NightscoutTimevalue( time: String(item.start.prefix(5)), value: item.high, - timeAsSeconds: item.offset + timeAsSeconds: item.offset * 60 ) } let cr = carbRatios.schedule.map { item -> NightscoutTimevalue in NightscoutTimevalue( time: String(item.start.prefix(5)), value: item.ratio, - timeAsSeconds: item.offset + timeAsSeconds: item.offset * 60 ) } - let basal = basalProfile.map { item -> NightscoutTimevalue in NightscoutTimevalue( time: String(item.start.prefix(5)), From 2f1154edac2e22bdb5a413b70a8822f36d324e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 25 Nov 2023 03:04:37 +0100 Subject: [PATCH 262/405] New Crowdin updates (#382) Dutch and Russian --- .../nl.lproj/Localizable.strings | 186 +++++++++--------- .../Main/nl.lproj/Localizable.strings | 8 +- .../Main/ru.lproj/Localizable.strings | 18 +- 3 files changed, 106 insertions(+), 106 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 0116d26e99..bb557e2f0a 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -15,7 +15,7 @@ "Pod Expired" = "Pod verlopen"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Laag reservoir niveau"; +"Low Reservoir" = "Reservoir bijna leeg"; /* Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Onderbreek in voortgang herinnering"; @@ -24,7 +24,7 @@ "Resume Insulin" = "Insuline hervatten"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod koppeling onvolledig"; +"Pod Pairing Incomplete" = "Koppeling Pod onvolledig"; /* Alert content title for timeOffsetChangeDetected pod alert */ "Time Change Detected" = "Wijziging in tijd gedetecteerd"; @@ -36,13 +36,13 @@ "Pod expires in %1$@." = "Pod verloopt in %1$@."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Vervang nu de Pod. Pod is actief geweest gedurende 72 uur."; +"Change Pod now. Pod has been active for 72 hours." = "Vervang Pod nu. Pod is 72 uur in gebruik geweest."; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Vervang Pod nu. De insuline levering stopt over 1 uur."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Vervang Pod nu. Insulinetoediening stopt over 1 uur."; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insuline of minder resterend in Pod. Vervang binnenkort Pod."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insuline of minder resterend in Pod. Vervang Pod binnenkort."; /* Alert content body for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Onderbreek in voortgang herinnering"; @@ -51,13 +51,13 @@ "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "De insuline opschortingsperiode is afgelopen.\n\nJe kunt de toediening hervatten via de banner op het beginscherm of via de pompinstellingen. Je wordt na 15 minuten opnieuw herinnerd."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Voltooi alstublieft de koppeling van je pod."; +"Please finish pairing your pod." = "Voltooi het koppelen van je Pod."; /* Alert content body for timeOffsetChangeDetected pod alert */ "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "De pomptijd verschilt van de huidige tijd. Je kunt de pomptijd bekijken en synchroniseren met de huidige tijd in instellingen."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Opschorting tijd is voorbij. Open iAPS en hervat."; +"Suspension time is up. Open the app and resume." = "Opschortingstijd is voorbij. Open iAPS en hervat."; /* Action button default text for PodAlerts */ "Ok" = "OK"; @@ -66,7 +66,7 @@ "Unfinished Activation" = "Onvoltooide activering"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod verloopt in"; +"Pod expires in" = "Pod verloopt over"; /* */ "Pod Expires" = "Pod verloopt"; @@ -78,10 +78,10 @@ "Notification Settings" = "Instellingen voor meldingen"; /* */ -"Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; +"Confidence Reminders" = "Bevestigingsmeldingen"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Onderbreken van insuline toediening"; +"Suspend Insulin Delivery" = "Onderbreken van insulinetoediening"; /* Label for pod life state when within pod expiration window */ "Pod expired" = "Pod verlopen"; @@ -132,7 +132,7 @@ "minutes" = "minuten"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insuline toediening"; +"Insulin Delivery" = "Insulinetoediening"; /* */ "Scheduled Basal" = "Gepland basaal"; @@ -144,7 +144,7 @@ "Activity" = "Activiteit"; /* title for device details page */ -"Device Details" = "Apparaat details"; +"Device Details" = "Apparaatdetails"; /* Section header for configuration section */ "Configuration" = "Instellingen"; @@ -162,7 +162,7 @@ "Unfinished Activation" = "Onvoltooide activering"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod verloopt in"; +"Pod expires in" = "Pod verloopt over"; /* Label for pod life state when within pod expiration window */ "Pod expired" = "Pod verlopen"; @@ -177,7 +177,7 @@ "Fault" = "Fout"; /* Label describing pod age view */ -"Pod Age" = "Pod leeftijd"; +"Pod Age" = "Podleeftijd"; /* Label describing time remaining view */ "Remaining" = "Resterend"; @@ -195,7 +195,7 @@ "Insulin type not configured" = "Insulinetype niet geconfigureerd"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is niet gereed voor canule plaatsing."; +"Pod is not in a state ready for cannula insertion." = "Pod is niet gereed voor canuleplaatsing."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ "Invalid Setting" = "Ongeldige instelling"; @@ -207,13 +207,13 @@ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Opdrachten probleem"; +"Comms Issue" = "Opdrachtenprobleem"; /* */ "Finish Pairing" = "Koppeling voltooien"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Voltooi de deactivering"; +"Finish Deactivation" = "Voltooi deactivering"; /* Status highlight that when no pod is paired. */ "No Pod" = "Geen Pod"; @@ -225,7 +225,7 @@ "Pod Expired" = "Pod verlopen"; /* Status highlight message for occlusion alarm. */ -"Pod Occlusion" = "Pod bezetting"; +"Pod Occlusion" = "Pod verstopping"; /* Status highlight message for other alarm. */ "Pod Error" = "Pod error"; @@ -237,7 +237,7 @@ "Insulin Suspended" = "Insuline tijdelijk uitgeschakeld"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signaal verlies"; +"Signal Loss" = "Signaalverlies"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Handmatige tijdelijke basaal"; @@ -255,22 +255,22 @@ "Checking..." = "Controleren..."; /* */ -"Check cannula insertion finished" = "Controleer of canule invoeging is voltooid"; +"Check cannula insertion finished" = "Controleer of canuleplaatsing is voltooid"; /* */ -"Get pod status" = "Pod status ophalen"; +"Get pod status" = "Podstatus ophalen"; /* */ -"Save Basal Profile" = "Bewaar basaal profiel"; +"Save Basal Profile" = "Bewaar basaalprofiel"; /* */ -"Save basal profile failed: %{public}@" = "Opslaan basaal profiel mislukt: %{public}@"; +"Save basal profile failed: %{public}@" = "Opslaan basaalprofiel mislukt: %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "De test geluiden worden overgeslagen omdat de bolus nog bezig is."; +"Skipping Play Test Beeps due to bolus still in progress." = "De testgeluiden worden overgeslagen omdat de bolus nog bezig is."; /* */ -"Play Test Beeps" = "Speel test piepjes af"; +"Play Test Beeps" = "Speel testpiepjes af"; /* */ "Skipping Read Pulse Log due to bolus still in progress." = "Overslaan 'Read Pulse Log' omdat bolus nog bezig is."; @@ -279,10 +279,10 @@ "Read Pulse Log" = "Pulslog uitlezen"; /* */ -"Set Confirmation Beeps to %s" = "Stel bevestiging geluiden in op %s"; +"Set Confirmation Beeps to %s" = "Stel bevestigingsgeluiden in op %s"; /* */ -"Set Confirmation Beeps Preference" = "Stel bevestiging geluiden voorkeur in"; +"Set Confirmation Beeps Preference" = "Stel voorkeuren bevestigingsgeluiden in"; /* */ "Suspend" = "Onderbreek"; @@ -300,7 +300,7 @@ "Cancel Bolus" = "Annuleer bolus"; /* Alert acknowledgment OK button */ -"OK" = "Ok"; +"OK" = "OK"; /* The title for Empty Reservoir alarm notification */ "Empty Reservoir" = "Reservoir leeg"; @@ -312,7 +312,7 @@ "Critical Pod Error" = "Kritieke Pod fout"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insuline toediening gestopt. Vervang Pod nu."; +"Insulin delivery stopped. Change Pod now." = "Insulinetoediening gestopt. Vervang Pod nu."; /* Header for insulin remaining on pod settings screen */ "Insulin Remaining" = "Resterende insuline"; @@ -330,16 +330,16 @@ "Previous Pod" = "Vorige Pod"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pomp tijd"; +"Pump Time" = "Pomptijd"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Pomp tijd aanpassen..."; +"Adjusting Pump Time..." = "Pomptijd aanpassen..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Zet naar huidige tijd"; +"Sync to Current Time" = "Synchroniseer met de huidige tijd"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Overschakelen naar ander apparaat van insuline"; +"Switch to other insulin delivery device" = "Schakel over op een ander insulinetoedieningsapparaat"; /* Title for pod sync time action sheet. */ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "De pomptijd is anders dan de huidige tijd. Wil je de tijd van je pomp updaten naar de huidige tijd?"; @@ -354,16 +354,16 @@ "Remove Pump" = "Verwijder Pod"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Weet je zeker dat je wilt stoppen met deze Omnipod Dash?"; +"Are you sure you want to stop using Omnipod DASH?" = "Weet je zeker dat je wilt stoppen met deze Omnipod DASH?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Verwijder Omnipod Dash"; +"Delete Omnipod DASH" = "Verwijder Omnipod DASH"; /* Text for confidence reminders navigation link" */ -"Insulin Type" = "Insuline soort"; +"Insulin Type" = "Insulinesoort"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Zet naar huidige tijd"; +"Sync to Current Time" = "Synchroniseer met de huidige tijd"; /* Title for suspend duration selection action sheet */ "Suspend Delivery" = "Onderbreek toediening"; @@ -382,19 +382,19 @@ "2 hours" = "2 uur"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Onderbreken van insuline toediening mislukt"; +"Failed to Suspend Insulin Delivery" = "Onderbreken van insulinetoediening mislukt"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Hervatten insuline levering mislukt"; +"Failed to Resume Insulin Delivery" = "Hervatten insulinelevering mislukt"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Instellen pomp tijd mislukt"; +"Failed to Set Pump Time" = "Instellen pomptijd mislukt"; /* Alert title for failing to cancel manual basal error */ "Failed to Cancel Manual Basal" = "Annuleren van handmatige basaal mislukt"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Deactiveer de pod. Wanneer de deactivering voltooid is, kun je hem verwijderen en een nieuwe Pod koppelen."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Deactiveer de Pod. Wanneer de deactivering voltooid is, kun je de Pod verwijderen en een nieuwe koppelen."; /* Instructions for deactivate pod when pod not on body */ "Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Deactiveer de Pod. Wanneer de deactivering voltooid is, kun je hem verwijderen en een nieuwe Pod koppelen."; @@ -403,7 +403,7 @@ "Deactivate Pod" = "Deactiveer Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactiveren"; +"Deactivating." = "Deactiveren."; /* Deactivate pod action button accessibility label when deactivation complete */ "Pod deactivated successfully. Continue." = "Pod met succes gedeactiveerd. Doorgaan."; @@ -415,25 +415,25 @@ "Continue" = "Vervolg"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Er was een communicatieprobleem met de Pod. Als dit probleem zich blijft voordoen, tik dan op 'weggooien'. Je kunt dan een nieuwe Pod activeren."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Er was een communicatieprobleem met de Pod. Als dit probleem zich blijft voordoen, tik dan op 'Pod verwijderen'. Je kunt dan een nieuwe Pod activeren."; /* Text for discard pod button */ "Discard Pod" = "Pod verwijderen"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Verwijder Pod uit het lichaam"; +"Remove Pod from Body" = "Verwijder Pod van lichaam"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Mogelijk levert je Pod nog steeds insuline.\nVerwijder deze uit je lichaam en tik op \"Doorgaan\""; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Mogelijk levert je Pod nog steeds insuline.\nVerwijder deze van je lichaam en tik op \"Doorgaan\""; /* Insulin Unit */ "U" = "E"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Vervang Pod nu. De insulinetoediening stopt 8 uur nadat de Pod is verlopen of wanneer er geen insuline meer over is."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline (laat de blauwe naaldop achter)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline. Verwijder de blauwe naalddop niet."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; @@ -445,10 +445,10 @@ "Cancel" = "Annuleer"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Weet u zeker dat u de Pod setup wilt annuleren?"; +"Are you sure you want to cancel Pod setup?" = "Weet je zeker dat je de Podinstallatie wilt annuleren?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Als u de Pod setup annuleert, wordt de huidige Pod gedeactiveerd en onbruikbaar."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Als je de Podinstallatie annuleert, wordt de huidige Pod gedeactiveerd en onbruikbaar."; /* Button title for confirm deactivation option */ "Yes, Deactivate Pod" = "Ja, deactiveer deze Pod"; @@ -457,13 +457,13 @@ "No, Continue With Pod" = "Nee, ga door met deze Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Bereid de plaats op je lichaam voor op de Pod."; +"Prepare site." = "Bereid de infusieplaats voor."; /* Label text for step two of attach pod instructions */ "Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Pod controleren, breng aan op de plek op je lichaam, dan Pod bevestigen."; +"Check Pod, apply to site, then confirm pod attachment." = "Controleer de Pod, breng aan op de infusieplaats en bevestig de plaatsing."; /* Action button title for attach pod view */ "Continue" = "Vervolg"; @@ -472,10 +472,10 @@ "Attach Pod" = "Bevestig Pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Bevestig Pod plaatsing"; +"Confirm Pod Attachment" = "Bevestig Podplaatsing"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Controleer of de Pod goed aan je lichaam is bevestigd.\n\nDe canule kan slechts eenmaal per Pod worden ingebracht. Tik op \"Bevestigen\" wanneer de Pod goed is aangebracht op je lichaam."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Bevestig dat de Pod goed op je lichaam is bevestigd.\n\nDe canule kan slechts eenmaal per Pod worden ingebracht. Tik op \"Bevestigen\" wanneer de Pod goed is aangebracht op je lichaam."; /* Button title for confirm attachment option */ "Confirm" = "Bevestig"; @@ -484,7 +484,7 @@ "Tap below to start cannula insertion." = "Tik hieronder om het inbrengen van de canule te starten."; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wacht tot het inbrengen voltooid is."; +"Wait until insertion is completed." = "Wacht tot het inbrengen is voltooid."; /* Label text indicating insertion finished. */ "Inserted" = "Ingebracht"; @@ -582,12 +582,12 @@ "No Reminder" = "Geen herinnering"; /* Label for low reservoir reminder row */ -"Low Reservoir Reminder" = "Laag reservoir herinnering"; +"Low Reservoir Reminder" = "Herinnering 'Reservoir bijna leeg'"; /* The action string on pod status page when pod data is stale */ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Zorg ervoor dat je iPhone en Pod dicht bij elkaar liggen. Als communicatieproblemen aanhouden, ga dan naar een nieuw gebied."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Verander Pod nu. Insuline levering stopt over %1$@ of wanneer er geen insuline meer over is."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Vervang Pod nu. De insulinetoediening stopt over %1$@ of wanneer er geen insuline meer over is."; /* Title string for BeepPreference.silent */ "Disabled" = "Uitgeschakeld"; @@ -596,16 +596,16 @@ "Enabled" = "Ingeschakeld"; /* Title string for BeepPreference.extended */ -"Extended" = "Verlengd"; +"Extended" = "Uitgebreid"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; +"No confidence reminders are used." = "Er worden geen bevestigingsmeldingen gebruikt."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Bevestigingsmeldingen zullen klinken voor opdrachten die je zelf geeft zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS de toediening automatisch wijzigt dan worden geen bevestigingsmeldingen gegeven."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Piepjes zullen klinken als iAPS de levering automatisch aanpast evenals voor commando's die je initieert."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Bevestigingsmeldingen zullen klinken als iAPS de levering automatisch aanpast en bij opdrachten die je zelf geeft."; /* Label text for temporary basal rate summary */ "Rate" = "Waarde"; @@ -617,12 +617,12 @@ "%1$@ for %2$@" = "%1$@ voor %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop zal niet automatisch jouw insuline toediening aanpassen tot de tijdelijke basaalstand is beëindigd of is geannuleerd."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "iAPS zal niet automatisch jouw insulinetoediening aanpassen tot de tijdelijke basaalstand is beëindigd of is geannuleerd."; /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Tijdelijke basaal instellen"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Tijdelijk basaal"; +"Temporary Basal" = "Tijdelijke basaal"; /* Alert title for a failure to set temporary basal */ "Temporary Basal Failed" = "Tijdelijke basaalstanden mislukt"; @@ -640,34 +640,34 @@ "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Deze pompmanager is niet geconfigureerd met een maximale basaalstand omdat het is toegevoegd voordat handmatig tijdelijke basaal een functie was. Ga naar therapie instellingen -> afleverlimieten en stel een nieuwe maximale basaalstand in."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Herinnering vervaldatum ingeschakeld"; +"Expiration Reminder Default" = "Standaard herinnering voor einde Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Vorige Pod informatie"; +"Previous Pod Information" = "Informatie vorige Pod"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ -"No\nDelivery" = "Geen levering"; +"No\nDelivery" = "Geen \nlevering"; /* description label for active time pod details row */ -"Active Time" = "Activatie tijd"; +"Active Time" = "Actieve duur"; /* description label for total delivery pod details row */ "Total Delivery" = "Totaal afgegeven"; /* description label for device name pod details row */ -"Device Name" = "Apparaat naam"; +"Device Name" = "Apparaatnaam"; /* description label for lot number pod details row */ -"Lot Number" = "Lot nummer"; +"Lot Number" = "Lotnummer"; /* description label for sequence number pod details row */ "Sequence Number" = "Volgnummer"; /* description label for firmware version pod details row */ -"Firmware Version" = "Firmware versie"; +"Firmware Version" = "Firmwareversie"; /* description label for ble firmware version pod details row */ -"BLE Firmware Version" = "BLE Firmware versie"; +"BLE Firmware Version" = "BLE Firmwareversie"; /* description label for activated at timne pod details row */ "Pod Activated" = "Pod geactiveerd"; @@ -679,13 +679,13 @@ "Last Status" = "Laatste status"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod fout details"; +"Pod Fault Details" = "Pod foutdetails"; /* Title for PodSetupView */ "Pod Setup" = "Pod setup"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Je zal nu beginnen met het configureren van je herinneringen, het vullen van je Pod met insuline, het koppelen van je apparaat en het plaatsen in je lichaam."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Je gaat nu beginnen met het configureren van je herinneringen, het vullen van je Pod met insuline, het koppelen van je apparaat en het plaatsen van de Pod op je lichaam."; /* Cancel button title */ "Cancel" = "Annuleer"; @@ -697,7 +697,7 @@ "Skip Omnipod Onboarding?" = "Omnipod onboarding overslaan?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS informeert je voordat de Pod vervalt.\n\nScroll om het aantal uren vooraf kennisgeving aan te geven dat je wilt hebben."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS informeert je voordat de Pod vervalt.\n\nScroll om in te stellen hoeveel uren, voordat de Pod verloopt, je een kennisgeving wilt hebben."; /* Text of continue button on ExpirationReminderSetupView" */ "Next" = "Volgende"; @@ -706,7 +706,7 @@ "Expiration Reminder" = "Let op je Pod vervalt"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS laat je weten wanneer de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om het aantal eenheden in te stellen waarop u wilt worden herinnerd."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS waarschuwt als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ "Low Reservoir" = "Laag reservoir niveau"; @@ -721,13 +721,13 @@ "Cancel Manual Basal" = "Annuleer handmatige basaal"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insuline tijdelijk uitgeschakeld"; +"Insulin\nSuspended" = "Insuline\nOnderbroken"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Hervatten van de insuline toediening"; +"Resume Insulin Delivery" = "Insulinetoediening hervatten"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Zorg dat je iPhone in de buurt is en probeer opnieuw."; +"Make sure your pod is nearby and try again." = "Zorg dat je Pod in de buurt is en probeer opnieuw."; /* Error message shown when the pod is not connected */ "Pod not connected" = "Pod is niet verbonden"; @@ -736,10 +736,10 @@ "Suspended At" = "Onderbroken op"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Hervatten van de insuline toediening"; +"Resuming insulin delivery..." = "Insulinetoediening hervatten..."; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Onderbreken van insuline toediening"; +"Suspending insulin delivery..." = "Onderbreken van insulinetoediening..."; /* Error message for PodCommsError.noPodsFound */ "No pods found" = "Geen pods gevonden"; @@ -772,16 +772,16 @@ "Crosstalk possible. Please move to a new location" = "Verstoring mogelijk. Ga naar een nieuwe locatie en probeer het opnieuw"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Zorg dat je iPhone in de buurt is en probeer opnieuw."; +"Make sure your pod is nearby and try again." = "Zorg dat je Pod in de buurt is en probeer opnieuw."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wacht op huidige bolus of maak bolus ongedaan"; +"Wait for existing bolus to finish, or cancel bolus" = "Wacht tot huidige bolus is voltooid, of annuleer bolus"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wacht op huidige bolus of maak bolus ongedaan"; +"Wait for existing bolus to finish, or cancel bolus" = "Wacht tot huidige bolus is voltooid, of annuleer bolus"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wacht op huidig tijdelijk basaal of onderbreek om te annuleren"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Wacht tot de huidige tijdelijke basaalsnelheid is voltooid, of onderbreek om te annuleren"; /* DASH Pod time ago since last status */ "%@ ago" = "%@ geleden"; @@ -790,33 +790,33 @@ "Silenced" = "Gedempt"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale bewerkingsmodus waarbij hoorbare puepjes worden gebruikt voor alle Pod waarschuwingen en wanneer meldingen zijn ingeschakeld."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale modus waarbij hoorbare piepjes worden gebruikt voor alle Podwaarschuwingen en wanneer bevestigingsmeldingen zijn ingeschakeld."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod alarmen gebruiken geen piepjes en herinneringen worden gedempt. De Pod zal alleen piepen bij fatale Pod fouten en bij testpiepen.\n\n⚠️Waarschuwing - Wanneer de Pod is gedempt, moet het binnen het Bluetooth-bereik van dit apparaat worden gehouden om meldingen voor Pod te ontvangen."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Podalarmen gebruiken geen piepjes en bevestigingsmeldingen worden gedempt. De Pod zal alleen piepen bij fatale Podfouten en bij testpiepjes.\n\n⚠️Waarschuwing - Als de Pod is gedempt, moet deze binnen het Bluetooth-bereik van dit apparaat zijn om meldingen voor Pod te ontvangen."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Pod modus dempt alle Pod alarmen en herinnering meldingen."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Stille Podmodus dempt alle Podalarmen en bevestigingsmeldingen."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Gedempt"; +"Silence Pod" = "Podgeluiden dempen"; /* title for pod details page */ -"Pod Details" = "Pod details"; +"Pod Details" = "Poddetails"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Vorige Pod details"; +"Previous Pod Details" = "Details vorige Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pomp manager details"; +"Pump Manager Details" = "Details pompmanager"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Pomp manager gegevens ophalen..."; +"Retrieving Pump Manager Details..." = "Gegevens pompmanager ophalen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Pomp manager details verversen"; +"Refresh Pump Manager Details" = "Verversen details pompmanager"; /* Section header for diagnostic section */ "Diagnostics" = "Diagnostische gegevens"; /* Text for read pod status navigation link */ -"Read Pod Status" = ""; +"Read Pod Status" = "Lees pompstatus"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 6b9ea178de..5874aecc98 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1484,9 +1484,9 @@ Enact a temp Basal or a temp target */ "Previous Pod Information" = "Vorige Pod informatie"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Meldingen met piepjes vanuit de Pod"; +"Confidence Reminders" = "Bevestigingsmeldingen"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn meldingen die met piepjes uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bevestigingsmeldingen zijn piepjes die uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten als de Pod niet gedempt is."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Opslaan..."; @@ -1510,10 +1510,10 @@ Enact a temp Basal or a temp target */ "Enabled" = "Ingeschakeld"; /* Title string for BeepPreference.extended */ -"Extended" = "Verlengd"; +"Extended" = "Uitgebreid"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; +"No confidence reminders are used." = "Er worden geen bevestigingsmeldingen gebruikt."; /* Description for BeepPreference.manualCommands */ "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index abbe480dd6..c172878722 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Временные цели"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Удалить углеводы?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Удалить инсулин?"; /* Treatments list */ "Treatments" = "События"; @@ -1368,13 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Статистика и экран"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Удалить эквиваленты углеводов?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Все пищевые единицы будут удалены."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Удалить глюкозу?"; /* */ "Meal Presets" = "Шаблоны"; @@ -1662,16 +1662,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 часа"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 часа"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 часов"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 часов"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 часа"; /* Average BG = */ "Average" = "Средний"; From da307bffaa6854afc99ff960fea6fffef70c1a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:05:39 +0100 Subject: [PATCH 263/405] Crowdin updates (#386) Dutch and German --- .../G7SensorKitUI/nl.lproj/Localizable.strings | 2 +- .../Localizations/nl.lproj/Localizable.strings | 14 +++++++------- .../Resources/nl.lproj/Localizable.strings | 14 +++++++------- .../Main/de.lproj/Localizable.strings | 18 +++++++++--------- .../Main/nl.lproj/Localizable.strings | 6 +++--- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings index f8f5607cde..05c99a6d7a 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings @@ -33,7 +33,7 @@ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Gereed"; +"Done" = "OK"; /* Field label */ "Glucose" = "Glucosewaarde"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index bb557e2f0a..096143cd95 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -78,7 +78,7 @@ "Notification Settings" = "Instellingen voor meldingen"; /* */ -"Confidence Reminders" = "Bevestigingsmeldingen"; +"Confidence Reminders" = "Bevestigingsmeldingen met piepjes vanuit de Pod"; /* Text for suspend resume button when insulin delivery active */ "Suspend Insulin Delivery" = "Onderbreken van insulinetoediening"; @@ -556,7 +556,7 @@ "Omnipod Reminders" = "Omnipod herinneringen"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "iAPS configureert een herinnering op de Pod om je vooraf op de hoogte te stellen van het verlopen van de Pod. Stel het aantal uren vooraf in dat je wilt instellen voor het koppelen van een nieuwe Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "iAPS configureert melding op de Pod om je op de hoogte te stellen wanneer de Pod verloopt. Stel het aantal uren vooraf in dat je standaard wilt instellen als je een nieuwe Pod koppelt."; /* Footer text for scheduled reminder area */ "This is a reminder that you scheduled when you paired your current Pod." = "Dit is een herinnering die je hebt gepland toen je je huidige Pod koppelde."; @@ -565,13 +565,13 @@ "Scheduled Reminder" = "Geplande herinnering"; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "iAPS meldt u wanneer de hoeveelheid insuline in de Pod dit niveau bereikt."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt."; /* Description text for critical alerts */ "Critical Alerts" = "Kritieke waarschuwingen"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "De bovenstaande meldingen waarschuwen zonder geluid als je apparaat in de modus 'Stil' of 'Niet storen' staat.\n\nEr zijn andere belangrijke Pod waarschuwingen en -alarmen die wel klinken, zelfs als je apparaat in de modus 'Stil' of 'Niet storen' staat."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Als je apparaat stil is of in de Niet storen-modus staat, hoor je de bovenstaande herinneringen niet in de app. Er zijn echter andere belangrijke waarschuwingen voor de Pod die nog steeds in de app verschijnen, zelfs als je apparaat stil is of in de Niet storen-modus staat. De Pod maakt ook geluid met piepjes voor alle herinneringen en waarschuwingen, behalve als de Pod is uitgeschakeld."; /* navigation title for notification settings */ "Notification Settings" = "Instellingen voor meldingen"; @@ -697,7 +697,7 @@ "Skip Omnipod Onboarding?" = "Omnipod onboarding overslaan?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS informeert je voordat de Pod vervalt.\n\nScroll om in te stellen hoeveel uren, voordat de Pod verloopt, je een kennisgeving wilt hebben."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS geeft een melding voordat de Pod vervalt.\n\nScroll om in te stellen hoeveel uren, voordat de Pod verloopt, je een kennisgeving wilt hebben."; /* Text of continue button on ExpirationReminderSetupView" */ "Next" = "Volgende"; @@ -706,7 +706,7 @@ "Expiration Reminder" = "Let op je Pod vervalt"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS waarschuwt als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ "Low Reservoir" = "Laag reservoir niveau"; @@ -813,7 +813,7 @@ /* button title when retrieving pump manager details */ "Retrieving Pump Manager Details..." = "Gegevens pompmanager ophalen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Verversen details pompmanager"; +"Refresh Pump Manager Details" = "Ververs details pompmanager"; /* Section header for diagnostic section */ "Diagnostics" = "Diagnostische gegevens"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index db8812a846..a8e3cc2dde 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -216,7 +216,7 @@ "Discard Pod" = "Gooi pod weg"; /* No comment provided by engineer. */ -"Done" = "Gereed"; +"Done" = "OK"; /* Title text for button to enable bolus beeps */ "Enable Bolus Beeps" = "Boluspiepjes inschakelen"; @@ -669,10 +669,10 @@ "Testing Commands…" = "Commando’s aan het testen..."; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "iAPS stelt een herinnering in op de pod om je van tevoren op de hoogte te stellen van het verlopen van de Pod. Stel het aantal uur in van de vooraankondiging die je wenst in te stellen bij het koppelen van een nieuwe Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "iAPS configureert melding op de Pod om je op de hoogte te stellen wanneer de Pod verloopt. Stel het aantal uren vooraf in dat je standaard wilt instellen als je een nieuwe Pod koppelt."; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS kondigt van tevoren aan wanneer de Pod verloopt.\n\nScroll om het aantal uren in te stellen voor de gewenste vooraankondiging."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "iAPS geeft een melding als de Pod verloopt.\n\nScroll om het aantal uren in te stellen voor de gewenste vooraankondiging."; /* Description text on LowReservoirReminderSetupView */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding wanneer de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om het aantal eenheden in te stellen waarbij je herinnerd wilt worden."; @@ -681,7 +681,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level." = "iAPS geeft een melding wanneer de hoeveelheid insuline in de Pod dit niveau bereikt."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Bovenstaande herinneringen zijn niet hoorbaar wanneer je apparaat in de modus 'Stil' of 'Niet storen' staat.\n\nAndere kritieke Podmeldingen en Podalarmen gaan wel af, zelfs als je apparaat op de modus 'Stil' of 'Niet storen' staat."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Als je apparaat stil is of in de Niet storen-modus staat, hoor je de bovenstaande herinneringen niet in de app. Er zijn echter andere belangrijke waarschuwingen voor de Pod die nog steeds in de app verschijnen, zelfs als je apparaat stil is of in de Niet storen-modus staat. De Pod maakt ook geluid met piepjes voor alle herinneringen en waarschuwingen, behalve als de Pod is uitgeschakeld."; /* Message for pod sync time action sheet */ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "De tijd op je pomp is anders dan de huidige tijd. Wil je de tijd op je pomp bijwerken naar de huidige tijd?"; @@ -769,7 +769,7 @@ "Silenced" = "Gedempt"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale bewerkingsmodus waarbij hoorbare puepjes worden gebruikt voor alle Pod waarschuwingen en wanneer meldingen zijn ingeschakeld."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normale bewerkingsmodus waarbij hoorbare piepjes worden gebruikt voor alle Pod waarschuwingen en wanneer meldingen zijn ingeschakeld."; /* Description for SilencePodPreference.enabled */ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Alle Pod alarmen gebruiken geen piepjes en herinneringen worden gedempt. De Pod zal alleen piepen bij fatale Pod fouten en bij testpiepen.\n\n⚠️Waarschuwing - Wanneer de Pod is gedempt, moet het binnen het Bluetooth-bereik van dit apparaat worden gehouden om meldingen voor Pod te ontvangen."; @@ -792,7 +792,7 @@ Silence Pod" = "Gedempt"; /* button title when retrieving pump manager details */ "Retrieving Pump Manager Details..." = "Pomp manager gegevens ophalen..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Pomp manager details verversen"; +"Refresh Pump Manager Details" = "Ververs details pompmanager"; /* Alert title for error when updating silence pod preference */ "Failed to update silence pod preference." = "Kon de voorkeur voor meldingen niet bijwerken."; @@ -801,4 +801,4 @@ Silence Pod" = "Gedempt"; "Diagnostics" = "Diagnostische gegevens"; /* Text for read pod status navigation link */ -"Read Pod Status" = ""; +"Read Pod Status" = "Lees pompstatus"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 2c4796a934..f406e8f1a5 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Temporäre Ziele"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Kohlenhydrate löschen?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Insulin löschen?"; /* Treatments list */ "Treatments" = "Behandlungen"; @@ -1368,13 +1368,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiken und Home-Ansicht"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Kohlenhydratäquivalente löschen?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Alle FPUs der Mahlzeit werden gelöscht."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Glukose löschen?"; /* */ "Meal Presets" = "Mahlzeit Voreinstellungen"; @@ -1662,16 +1662,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 Stunden"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 Stunden"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 Stunden"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 Stunden"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 Stunden"; /* Average BG = */ "Average" = "Mittelwert"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 5874aecc98..75d235d744 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -38,7 +38,7 @@ "Clear" = "Wissen"; /* Button */ -"Done" = "Gereed"; +"Done" = "OK"; /* */ "Wait please" = "Wachten"; @@ -1486,7 +1486,7 @@ Enact a temp Basal or a temp target */ /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bevestigingsmeldingen"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Bevestigingsmeldingen zijn piepjes die uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten als de Pod niet gedempt is."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Dit zijn bevestigingsmeldingen met piepjes die uit de Pod komen en kunnen worden gebruikt ter bevestiging van geselecteerde opdrachten als de Pod niet gedempt is."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Opslaan..."; @@ -1513,7 +1513,7 @@ Enact a temp Basal or a temp target */ "Extended" = "Uitgebreid"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "Er worden geen bevestigingsmeldingen gebruikt."; +"No confidence reminders are used." = "Er worden geen meldingen met piepjes gebruikt."; /* Description for BeepPreference.manualCommands */ "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Piepjes uit de Pod zullen klinken voor commando's die je hebt geïnitieerd, zoals bolus, annulering, geschorst, hervatten, opslaan van meldingen etc. Als iAPS automatisch de levering wijzigt, worden er geen piepjes gebruikt."; From fd741ad49b24c001d7da6f14726ed0917f6c9b14 Mon Sep 17 00:00:00 2001 From: 10nas <151583878+10nas@users.noreply.github.com> Date: Tue, 28 Nov 2023 06:53:42 -0800 Subject: [PATCH 264/405] live activity --- FreeAPS.xcodeproj/project.pbxproj | 194 +++++++++++++++++- FreeAPS/Resources/Info.plist | 2 + FreeAPS/Sources/Application/FreeAPSApp.swift | 4 + .../Sources/Assemblies/ServiceAssembly.swift | 6 + FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 + .../NotificationsConfigStateModel.swift | 2 + .../View/NotificationsConfigRootView.swift | 11 + .../LiveActivity/LiveActitiyShared.swift | 13 ++ .../LiveActivity/LiveActivityBridge.swift | 187 +++++++++++++++++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 ++ LiveActivity/Assets.xcassets/Contents.json | 6 + .../WidgetBackground.colorset/Contents.json | 11 + LiveActivity/Info.plist | 11 + LiveActivity/LiveActivity.swift | 109 ++++++++++ LiveActivity/LiveActivityBundle.swift | 8 + 16 files changed, 592 insertions(+), 1 deletion(-) create mode 100644 FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift create mode 100644 FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift create mode 100644 LiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 LiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 LiveActivity/Assets.xcassets/Contents.json create mode 100644 LiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 LiveActivity/Info.plist create mode 100644 LiveActivity/LiveActivity.swift create mode 100644 LiveActivity/LiveActivityBundle.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index aaac0746ad..2b07ece80c 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -277,8 +277,17 @@ 6632A0DC746872439A858B44 /* ISFEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BDA519C9B890FD9A5DFCF3 /* ISFEditorDataFlow.swift */; }; 69A31254F2451C20361D172F /* BolusStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */; }; 69B9A368029F7EB39F525422 /* CREditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA5E04A2761F6EEA6568E1 /* CREditorStateModel.swift */; }; + 6B1A8D192B14D91600E76752 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B1A8D182B14D91600E76752 /* WidgetKit.framework */; }; + 6B1A8D1B2B14D91600E76752 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B1A8D1A2B14D91600E76752 /* SwiftUI.framework */; }; + 6B1A8D1E2B14D91600E76752 /* LiveActivityBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B1A8D1D2B14D91600E76752 /* LiveActivityBundle.swift */; }; + 6B1A8D202B14D91600E76752 /* LiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B1A8D1F2B14D91600E76752 /* LiveActivity.swift */; }; + 6B1A8D242B14D91700E76752 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6B1A8D232B14D91700E76752 /* Assets.xcassets */; }; + 6B1A8D282B14D91700E76752 /* LiveActivityExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6B1A8D172B14D91600E76752 /* LiveActivityExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6B1A8D2E2B156EEF00E76752 /* LiveActivityBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B1A8D2D2B156EEF00E76752 /* LiveActivityBridge.swift */; }; 6B1F539F9FF75646D1606066 /* SnoozeDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36A708CDB546692C2230B385 /* SnoozeDataFlow.swift */; }; 6B9625766B697D1C98E455A2 /* PumpSettingsEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72778B68C3004F71F6E79BDC /* PumpSettingsEditorStateModel.swift */; }; + 6BCF84DD2B16843A003AD46E /* LiveActitiyShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BCF84DC2B16843A003AD46E /* LiveActitiyShared.swift */; }; + 6BCF84DE2B16843A003AD46E /* LiveActitiyShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BCF84DC2B16843A003AD46E /* LiveActitiyShared.swift */; }; 6EADD581738D64431902AC0A /* LibreConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2EBA7C03C26FCC67E16D798 /* LibreConfigProvider.swift */; }; 6FFAE524D1D9C262F2407CAE /* SnoozeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAE81192B118804DCD23034 /* SnoozeProvider.swift */; }; 711C0CB42CAABE788916BC9D /* ManualTempBasalDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96653287EDB276A111288305 /* ManualTempBasalDataFlow.swift */; }; @@ -439,6 +448,13 @@ remoteGlobalIDString = 388E595725AD948C0019842D; remoteInfo = FreeAPS; }; + 6B1A8D262B14D91700E76752 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 388E595025AD948C0019842D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6B1A8D162B14D91500E76752; + remoteInfo = LiveActivityExtension; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -496,6 +512,17 @@ name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; + 6B1A8D122B14D88E00E76752 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 6B1A8D282B14D91700E76752 /* LiveActivityExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -809,6 +836,16 @@ 66A5B83E7967C38F7CBD883C /* LibreConfigDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LibreConfigDataFlow.swift; sourceTree = ""; }; 67F94DD2853CF42BA4E30616 /* BasalProfileEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorDataFlow.swift; sourceTree = ""; }; 680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalProvider.swift; sourceTree = ""; }; + 6B1A8D012B14D88B00E76752 /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; }; + 6B1A8D172B14D91600E76752 /* LiveActivityExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = LiveActivityExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B1A8D182B14D91600E76752 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + 6B1A8D1A2B14D91600E76752 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; + 6B1A8D1D2B14D91600E76752 /* LiveActivityBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityBundle.swift; sourceTree = ""; }; + 6B1A8D1F2B14D91600E76752 /* LiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivity.swift; sourceTree = ""; }; + 6B1A8D232B14D91700E76752 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6B1A8D252B14D91700E76752 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6B1A8D2D2B156EEF00E76752 /* LiveActivityBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityBridge.swift; sourceTree = ""; }; + 6BCF84DC2B16843A003AD46E /* LiveActitiyShared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActitiyShared.swift; sourceTree = ""; }; 6F8BA8533F56BC55748CA877 /* PreferencesEditorProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PreferencesEditorProvider.swift; sourceTree = ""; }; 72778B68C3004F71F6E79BDC /* PumpSettingsEditorStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpSettingsEditorStateModel.swift; sourceTree = ""; }; 79BDA519C9B890FD9A5DFCF3 /* ISFEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ISFEditorDataFlow.swift; sourceTree = ""; }; @@ -987,6 +1024,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 6B1A8D142B14D91500E76752 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6B1A8D1B2B14D91600E76752 /* SwiftUI.framework in Frameworks */, + 6B1A8D192B14D91600E76752 /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1338,6 +1384,7 @@ 3811DE9125C9D88200A708ED /* Services */ = { isa = PBXGroup; children = ( + 6B1A8D2C2B156EC100E76752 /* LiveActivity */, CEB434E128B8F9BC00B70274 /* Bluetooth */, F90692A8274B7A980037068D /* HealthKit */, 38E8754D275556E100975559 /* WatchManager */, @@ -1505,6 +1552,9 @@ 3818AA56274C26A300843DB3 /* RileyLinkKit.framework */, 3818AA57274C26A300843DB3 /* RileyLinkKitUI.framework */, 3818AA49274C267000843DB3 /* CGMBLEKit.framework */, + 6B1A8D012B14D88B00E76752 /* UniformTypeIdentifiers.framework */, + 6B1A8D182B14D91600E76752 /* WidgetKit.framework */, + 6B1A8D1A2B14D91600E76752 /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; @@ -1585,6 +1635,7 @@ 3818AA44274C229000843DB3 /* Packages */, 38E8751D27554D5500975559 /* FreeAPSWatch */, 38E8752827554D5700975559 /* FreeAPSWatch WatchKit Extension */, + 6B1A8D1C2B14D91600E76752 /* LiveActivity */, 388E595925AD948C0019842D /* Products */, 3818AA48274C267000843DB3 /* Frameworks */, 192F0FF5276AC36D0085BE4D /* Recovered References */, @@ -1598,6 +1649,7 @@ 38FCF3ED25E9028E0078B0D1 /* FreeAPSTests.xctest */, 38E8751C27554D5500975559 /* FreeAPSWatch.app */, 38E8752427554D5700975559 /* FreeAPSWatch WatchKit Extension.appex */, + 6B1A8D172B14D91600E76752 /* LiveActivityExtension.appex */, ); name = Products; sourceTree = ""; @@ -2004,6 +2056,26 @@ path = AutotuneConfig; sourceTree = ""; }; + 6B1A8D1C2B14D91600E76752 /* LiveActivity */ = { + isa = PBXGroup; + children = ( + 6B1A8D1D2B14D91600E76752 /* LiveActivityBundle.swift */, + 6B1A8D1F2B14D91600E76752 /* LiveActivity.swift */, + 6B1A8D232B14D91700E76752 /* Assets.xcassets */, + 6B1A8D252B14D91700E76752 /* Info.plist */, + ); + path = LiveActivity; + sourceTree = ""; + }; + 6B1A8D2C2B156EC100E76752 /* LiveActivity */ = { + isa = PBXGroup; + children = ( + 6B1A8D2D2B156EEF00E76752 /* LiveActivityBridge.swift */, + 6BCF84DC2B16843A003AD46E /* LiveActitiyShared.swift */, + ); + path = LiveActivity; + sourceTree = ""; + }; 6DC5D590658EF8B8DF94F9F5 /* AddCarbs */ = { isa = PBXGroup; children = ( @@ -2361,11 +2433,13 @@ 388E595625AD948C0019842D /* Resources */, 3821ECD025DC703C00BC42AD /* Embed Frameworks */, 38E8753D27554D5900975559 /* Embed Watch Content */, + 6B1A8D122B14D88E00E76752 /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( 38E8753B27554D5900975559 /* PBXTargetDependency */, + 6B1A8D272B14D91700E76752 /* PBXTargetDependency */, ); name = FreeAPS; packageProductDependencies = ( @@ -2435,13 +2509,29 @@ productReference = 38FCF3ED25E9028E0078B0D1 /* FreeAPSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 6B1A8D162B14D91500E76752 /* LiveActivityExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6B1A8D292B14D91800E76752 /* Build configuration list for PBXNativeTarget "LiveActivityExtension" */; + buildPhases = ( + 6B1A8D132B14D91500E76752 /* Sources */, + 6B1A8D142B14D91500E76752 /* Frameworks */, + 6B1A8D152B14D91500E76752 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LiveActivityExtension; + productName = LiveActivityExtension; + productReference = 6B1A8D172B14D91600E76752 /* LiveActivityExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 388E595025AD948C0019842D /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1310; LastUpgradeCheck = 1240; TargetAttributes = { 388E595725AD948C0019842D = { @@ -2503,6 +2593,7 @@ 38FCF3EC25E9028E0078B0D1 /* FreeAPSTests */, 38E8751B27554D5500975559 /* FreeAPSWatch */, 38E8752327554D5700975559 /* FreeAPSWatch WatchKit Extension */, + 6B1A8D162B14D91500E76752 /* LiveActivityExtension */, ); }; /* End PBXProject section */ @@ -2549,6 +2640,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 6B1A8D152B14D91500E76752 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6B1A8D242B14D91700E76752 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -2737,6 +2836,7 @@ 38FE826A25CC82DB001FF17A /* NetworkService.swift in Sources */, FE66D16B291F74F8005D6F77 /* Bundle+Extensions.swift in Sources */, 3883581C25EE79BB00E024B2 /* DecimalTextField.swift in Sources */, + 6B1A8D2E2B156EEF00E76752 /* LiveActivityBridge.swift in Sources */, 38DAB28A260D349500F74C1A /* FetchGlucoseManager.swift in Sources */, 38F37828261260DC009DB701 /* Color+Extensions.swift in Sources */, 3811DE3F25C9D4A100A708ED /* SettingsStateModel.swift in Sources */, @@ -2891,6 +2991,7 @@ 1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */, 19F95FFA29F1102A00314DDC /* StatRootView.swift in Sources */, 0D9A5E34A899219C5C4CDFAF /* DataTableStateModel.swift in Sources */, + 6BCF84DD2B16843A003AD46E /* LiveActitiyShared.swift in Sources */, 195D80B92AF697F700D25097 /* DynamicProvider.swift in Sources */, D6D02515BBFBE64FEBE89856 /* DataTableRootView.swift in Sources */, 38569349270B5DFB0002C50D /* AppGroupSource.swift in Sources */, @@ -2951,6 +3052,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 6B1A8D132B14D91500E76752 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6BCF84DE2B16843A003AD46E /* LiveActitiyShared.swift in Sources */, + 6B1A8D1E2B14D91600E76752 /* LiveActivityBundle.swift in Sources */, + 6B1A8D202B14D91600E76752 /* LiveActivity.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -2969,6 +3080,11 @@ target = 388E595725AD948C0019842D /* FreeAPS */; targetProxy = 38FCF3F225E9028E0078B0D1 /* PBXContainerItemProxy */; }; + 6B1A8D272B14D91700E76752 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6B1A8D162B14D91500E76752 /* LiveActivityExtension */; + targetProxy = 6B1A8D262B14D91700E76752 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -3431,6 +3547,73 @@ }; name = Release; }; + 6B1A8D2A2B14D91800E76752 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = "$(DEVELOPER_TEAM)"; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LiveActivity/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = LiveActivity; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).LiveActivity"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 6B1A8D2B2B14D91800E76752 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = "$(DEVELOPER_TEAM)"; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LiveActivity/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = LiveActivity; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).LiveActivity"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -3479,6 +3662,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 6B1A8D292B14D91800E76752 /* Build configuration list for PBXNativeTarget "LiveActivityExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6B1A8D2A2B14D91800E76752 /* Debug */, + 6B1A8D2B2B14D91800E76752 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index e999a6a920..1a9865d4ef 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -80,6 +80,8 @@ Health App is used to store blood glucose, carbs and insulin NSHumanReadableCopyright $(COPYRIGHT_NOTICE) + NSSupportsLiveActivities + UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/FreeAPS/Sources/Application/FreeAPSApp.swift b/FreeAPS/Sources/Application/FreeAPSApp.swift index 5b44bd5b46..9ee16aeab7 100644 --- a/FreeAPS/Sources/Application/FreeAPSApp.swift +++ b/FreeAPS/Sources/Application/FreeAPSApp.swift @@ -1,3 +1,4 @@ +import ActivityKit import CoreData import SwiftUI import Swinject @@ -44,6 +45,9 @@ import Swinject _ = resolver.resolve(WatchManager.self)! _ = resolver.resolve(HealthKitManager.self)! _ = resolver.resolve(BluetoothStateManager.self)! + if #available(iOS 16.2, *) { + _ = resolver.resolve(LiveActivityBridge.self)! + } } init() { diff --git a/FreeAPS/Sources/Assemblies/ServiceAssembly.swift b/FreeAPS/Sources/Assemblies/ServiceAssembly.swift index 7782927318..f5a49697b2 100644 --- a/FreeAPS/Sources/Assemblies/ServiceAssembly.swift +++ b/FreeAPS/Sources/Assemblies/ServiceAssembly.swift @@ -20,5 +20,11 @@ final class ServiceAssembly: Assembly { container.register(UserNotificationsManager.self) { r in BaseUserNotificationsManager(resolver: r) } container.register(WatchManager.self) { r in BaseWatchManager(resolver: r) } container.register(GarminManager.self) { r in BaseGarminManager(resolver: r) } + + if #available(iOS 16.2, *) { + container.register(LiveActivityBridge.self) { r in + LiveActivityBridge(resolver: r) + } + } } } diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 9c35e4fb33..b8d1def41b 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -50,6 +50,7 @@ struct FreeAPSSettings: JSON, Equatable { var fattyMeals: Bool = false var fattyMealFactor: Decimal = 0.7 var displayPredictions: Bool = true + var useLiveActivity: Bool = true } extension FreeAPSSettings: Decodable { @@ -259,6 +260,10 @@ extension FreeAPSSettings: Decodable { settings.displayPredictions = displayPredictions } + if let useLiveActivity = try? container.decode(Bool.self, forKey: .useLiveActivity) { + settings.useLiveActivity = useLiveActivity + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift b/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift index abf82c5fef..13b76dd218 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift @@ -9,6 +9,7 @@ extension NotificationsConfig { @Published var lowGlucose: Decimal = 0 @Published var highGlucose: Decimal = 0 @Published var carbsRequiredThreshold: Decimal = 0 + @Published var useLiveActivity = true var units: GlucoseUnits = .mmolL override func subscribe() { @@ -20,6 +21,7 @@ extension NotificationsConfig { subscribeSetting(\.useAlarmSound, on: $useAlarmSound) { useAlarmSound = $0 } subscribeSetting(\.addSourceInfoToGlucoseNotifications, on: $addSourceInfoToGlucoseNotifications) { addSourceInfoToGlucoseNotifications = $0 } + subscribeSetting(\.useLiveActivity, on: $useLiveActivity) { useLiveActivity = $0 } subscribeSetting(\.lowGlucose, on: $lowGlucose, initial: { let value = max(min($0, 400), 40) diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift index 8e2717c721..9405311df3 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift @@ -55,6 +55,17 @@ extension NotificationsConfig { Text("g").foregroundColor(.secondary) } } + + if #available(iOS 16.2, *) { + Section( + header: Text("Live Activity"), + footer: Text( + "Live activity displays blood gluocse live on the lock screen and on the dynamic island (if available)" + ) + ) { + Toggle("Show live activity", isOn: $state.useLiveActivity) + } + } } .onAppear(perform: configureView) .navigationBarTitle("Notifications") diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift new file mode 100644 index 0000000000..749dbfca54 --- /dev/null +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift @@ -0,0 +1,13 @@ +import ActivityKit +import Foundation + +struct LiveActivityAttributes: ActivityAttributes { + public struct ContentState: Codable, Hashable { + let bg: String + let trendSystemImage: String? + let change: Int? + let date: Date + } + + let startDate: Date +} diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift new file mode 100644 index 0000000000..88347571cc --- /dev/null +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift @@ -0,0 +1,187 @@ +import ActivityKit +import Foundation +import Swinject +import UIKit + +extension LiveActivityAttributes.ContentState { + static func formatGlucose(_ value: Int, mmol: Bool) -> String { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + if mmol { + formatter.minimumFractionDigits = 1 + formatter.maximumFractionDigits = 1 + } + formatter.roundingMode = .halfUp + + return formatter + .string(from: mmol ? value.asMmolL as NSNumber : NSNumber(value: value))! + } + + init?(new bg: BloodGlucose, prev: BloodGlucose?, mmol: Bool) { + guard let glucose = bg.glucose, + bg.dateString.timeIntervalSinceNow > -TimeInterval(minutes: 6) + else { + return nil + } + + let formattedBG = Self.formatGlucose(glucose, mmol: mmol) + + let trentString: String? + switch bg.direction { + case .doubleUp, + .singleUp, + .tripleUp: + trentString = "arrow.up" + + case .fortyFiveUp: + trentString = "arrow.up.right" + + case .flat: + trentString = "arrow.right" + + case .fortyFiveDown: + trentString = "arrow.down.right" + + case .doubleDown, + .singleDown, + .tripleDown: + trentString = "arrow.down" + + case .notComputable, + Optional.none, + .rateOutOfRange, + .some(.none): + trentString = nil + } + + let change = prev?.glucose.map({ glucose - $0 }) + + self.init(bg: formattedBG, trendSystemImage: trentString, change: change, date: bg.dateString) + } +} + +@available(iOS 16.2, *) private struct ActiveActivity { + let activity: Activity + let startDate: Date +} + +@available(iOS 16.2, *) final class LiveActivityBridge: Injectable { + @Injected() private var settingsManager: SettingsManager! + @Injected() private var glucoseStorage: GlucoseStorage! + @Injected() private var broadcaster: Broadcaster! + + private var settings: FreeAPSSettings { + settingsManager.settings + } + + private var currentActivity: ActiveActivity? + private var latestGlucose: BloodGlucose? + + init(resolver: Resolver) { + injectServices(resolver) + broadcaster.register(GlucoseObserver.self, observer: self) + + Foundation.NotificationCenter.default.addObserver( + forName: UIApplication.didEnterBackgroundNotification, + object: nil, + queue: nil + ) { _ in + // just before app resigns active, show a new activity + // only do this if there is no current activity or the current activity is older than 1h + if self.settings.useLiveActivity { + if (self.currentActivity?.startDate).map({ -$0.timeIntervalSinceNow > + TimeInterval(60 * 60) }) ?? true + { + self.forceActivityUpdate() + } + } else { + Task { + await self.endActivity() + } + } + } + } + + /// creates and tries to present a new activity update from the current GlucoseStorage values + private func forceActivityUpdate() { + glucoseDidUpdate(glucoseStorage.recent()) + } + + /// attempts to present this live activity state, creating a new activity if none exists yet + private func pushUpdate(_ state: LiveActivityAttributes.ContentState) async { + // hide duplicate/unknown activities + for unknownActivity in Activity.activities + .filter({ self.currentActivity?.activity.id != $0.id }) + { + await unknownActivity.end(nil, dismissalPolicy: .immediate) + } + + let content = ActivityContent(state: state, staleDate: state.date.addingTimeInterval(TimeInterval(6 * 60))) + + if let currentActivity { + switch currentActivity.activity.activityState { + case .dismissed, + .ended: + // activity is no longer visible. End it and try to push the update again + await endActivity() + await pushUpdate(state) + case .active, + .stale: await currentActivity.activity.update(content) + @unknown default: + await currentActivity.activity.update(content) + } + + } else { + do { + let activity = try Activity.request( + attributes: LiveActivityAttributes(startDate: Date.now), + content: content, + pushType: nil + ) + currentActivity = ActiveActivity(activity: activity, startDate: Date.now) + } catch { + print("activity creation error: \(error)") + } + } + } + + /// ends all live activities immediateny + private func endActivity() async { + if let currentActivity { + await currentActivity.activity.end(nil, dismissalPolicy: ActivityUIDismissalPolicy.immediate) + self.currentActivity = nil + } + + // end any other activities + for unknownActivity in Activity.activities { + await unknownActivity.end(nil, dismissalPolicy: .immediate) + } + } +} + +@available(iOS 16.2, *) +extension LiveActivityBridge: GlucoseObserver { + func glucoseDidUpdate(_ glucose: [BloodGlucose]) { + // backfill latest glucose if contained in this update + if glucose.count > 1 { + latestGlucose = glucose[glucose.count - 2] + } + defer { + self.latestGlucose = glucose.last + } + + guard let bg = glucose.last, let content = LiveActivityAttributes.ContentState( + new: bg, + prev: latestGlucose, + mmol: settings.units == .mmolL + ) else { + // no bg or value stale. Don't update the activity if there already is one, just let it turn stale so that it can still be used once current bg is available again + return + } + + Task { + await self.pushUpdate(content) + } + } +} diff --git a/LiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json b/LiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/LiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json b/LiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..13613e3ee1 --- /dev/null +++ b/LiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LiveActivity/Assets.xcassets/Contents.json b/LiveActivity/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/LiveActivity/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json b/LiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/LiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LiveActivity/Info.plist b/LiveActivity/Info.plist new file mode 100644 index 0000000000..0f118fb75e --- /dev/null +++ b/LiveActivity/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/LiveActivity/LiveActivity.swift b/LiveActivity/LiveActivity.swift new file mode 100644 index 0000000000..7efff2b26c --- /dev/null +++ b/LiveActivity/LiveActivity.swift @@ -0,0 +1,109 @@ +import ActivityKit +import SwiftUI +import WidgetKit + +struct LiveActivity: Widget { + let dateFormatter: DateFormatter = { + var f = DateFormatter() + f.dateStyle = .none + f.timeStyle = .short + return f + }() + + func changeLabel(context: ActivityViewContext) -> Text { + if let change = context.state.change { + Text("\(change > 0 ? "+" : "")\(change)") + } else { + Text("--") + } + } + + func updatedLabel(context: ActivityViewContext) -> Text { + Text("Updated: \(dateFormatter.string(from: context.state.date))") + } + + func bgLabel(context: ActivityViewContext) -> Text { + if context.isStale { + Text("--") + } else { + Text("\(context.state.bg)") + } + } + + @ViewBuilder func bgAndTrend(context: ActivityViewContext) -> some View { + if context.isStale { + Text("--") + } else { + Text("\(context.state.bg)") + if let trendSystemImage = context.state.trendSystemImage { + Image(systemName: trendSystemImage) + } + } + } + + var body: some WidgetConfiguration { + ActivityConfiguration(for: LiveActivityAttributes.self) { context in + // Lock screen/banner UI goes here + VStack(alignment: .trailing, spacing: 0) { + HStack(alignment: .top) { + HStack(alignment: .center, spacing: 3) { + bgAndTrend(context: context).font(.title) + } + Spacer() + changeLabel(context: context).font(.title3) + } + .imageScale(.small) + updatedLabel(context: context).font(.caption).offset(y: -3) + } + .padding(.horizontal, 20) + .padding(.vertical, 10) + .activityBackgroundTint(Color.cyan.opacity(0.2)) + .activitySystemActionForegroundColor(Color.white) + + } dynamicIsland: { context in + DynamicIsland { + // Expanded UI goes here. Compose the expanded UI through + // various regions, like leading/trailing/center/bottom + DynamicIslandExpandedRegion(.leading) { + HStack(spacing: 3) { + bgAndTrend(context: context) + }.imageScale(.small).font(.title).padding(.leading, 5) + } + DynamicIslandExpandedRegion(.trailing) { + changeLabel(context: context).font(.title).padding(.trailing, 5) + } + DynamicIslandExpandedRegion(.bottom) { + updatedLabel(context: context).font(.caption) + } + } compactLeading: { + HStack(spacing: 1) { + bgAndTrend(context: context) + }.bold().imageScale(.small) + } compactTrailing: { + changeLabel(context: context) + } minimal: { + bgLabel(context: context).bold() + } + .widgetURL(URL(string: "freeaps-x://")) + .keylineTint(Color.cyan.opacity(0.5)) + } + } +} + +private extension LiveActivityAttributes { + static var preview: LiveActivityAttributes { + LiveActivityAttributes(startDate: Date()) + } +} + +private extension LiveActivityAttributes.ContentState { + static var test: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "100", trendSystemImage: "arrow.right", change: 2, date: Date()) + } +} + +#Preview("Notification", as: .content, using: LiveActivityAttributes.preview) { + LiveActivity() +} contentStates: { + LiveActivityAttributes.ContentState.test +} diff --git a/LiveActivity/LiveActivityBundle.swift b/LiveActivity/LiveActivityBundle.swift new file mode 100644 index 0000000000..3a9ae4b644 --- /dev/null +++ b/LiveActivity/LiveActivityBundle.swift @@ -0,0 +1,8 @@ +import SwiftUI +import WidgetKit + +@main struct LiveActivityBundle: WidgetBundle { + var body: some Widget { + LiveActivity() + } +} From e1bcd94e4ed3dca3c7c7be6a1023f0b938b00a97 Mon Sep 17 00:00:00 2001 From: 10nas <151583878+10nas@users.noreply.github.com> Date: Wed, 29 Nov 2023 04:51:32 -0800 Subject: [PATCH 265/405] Faster hour change (#394) --- .../Home/View/Chart/MainChartView.swift | 278 ++++++++++-------- .../Modules/Home/View/HomeRootView.swift | 6 +- 2 files changed, 159 insertions(+), 125 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index e0c728c62f..d574d535d6 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -86,20 +86,23 @@ struct MainChartView: View { @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @State private var bolusDots: [DotInfo] = [] - @State private var bolusPath = Path() @State private var tempBasalPath = Path() @State private var regularBasalPath = Path() @State private var tempTargetsPath = Path() @State private var suspensionsPath = Path() @State private var carbsDots: [DotInfo] = [] - @State private var carbsPath = Path() @State private var fpuDots: [DotInfo] = [] - @State private var fpuPath = Path() @State private var glucoseYRange: GlucoseYRange = (0, 0, 0, 0) - @State private var offset: CGFloat = 0 @State private var cachedMaxBasalRate: Decimal? + private var zoomScale: Double { + 1.0 / Double(screenHours) + } - private let calculationQueue = DispatchQueue(label: "MainChartView.calculationQueue") + private let calculationQueue = DispatchQueue( + label: "MainChartView.calculationQueue", + qos: .userInteractive, + attributes: .concurrent + ) private var dateFormatter: DateFormatter { let formatter = DateFormatter() @@ -164,10 +167,6 @@ struct MainChartView: View { .onChange(of: vSizeClass) { _ in update(fullSize: geo.size) } - .onChange(of: screenHours) { _ in - update(fullSize: geo.size) - // scroll.scrollTo(Config.endID, anchor: .trailing) - } .onReceive( Foundation.NotificationCenter.default .publisher(for: UIDevice.orientationDidChangeNotification) @@ -178,34 +177,32 @@ struct MainChartView: View { } private func mainScrollView(fullSize: CGSize) -> some View { - ScrollView(.horizontal, showsIndicators: false) { - ScrollViewReader { scroll in + ScrollViewReader { scroll in + ScrollView(.horizontal, showsIndicators: false) { ZStack(alignment: .top) { tempTargetsView(fullSize: fullSize).drawingGroup() basalView(fullSize: fullSize).drawingGroup() - mainView(fullSize: fullSize).id(Config.endID) .drawingGroup() - .onChange(of: glucose) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: suggestion) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: tempBasals) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: screenHours) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - - .onAppear { - // add trigger to the end of main queue - DispatchQueue.main.async { - scroll.scrollTo(Config.endID, anchor: .trailing) - didAppearTrigger = true - } - } + } + } + .onChange(of: glucose) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: suggestion) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: tempBasals) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: screenHours) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onAppear { + // add trigger to the end of main queue + DispatchQueue.main.async { + scroll.scrollTo(Config.endID, anchor: .trailing) + didAppearTrigger = true } } } @@ -264,14 +261,16 @@ struct MainChartView: View { private func basalView(fullSize: CGSize) -> some View { ZStack { - tempBasalPath.fill(Color.basal.opacity(0.5)) - tempBasalPath.stroke(Color.insulin, lineWidth: 1) - regularBasalPath.stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) - suspensionsPath.stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) - suspensionsPath.fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) + tempBasalPath.scale(x: zoomScale, anchor: .zero).fill(Color.basal.opacity(0.5)) + tempBasalPath.scale(x: zoomScale, anchor: .zero).stroke(Color.insulin, lineWidth: 1) + regularBasalPath.scale(x: zoomScale, anchor: .zero) + .stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) + suspensionsPath.scale(x: zoomScale, anchor: .zero) + .stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) + suspensionsPath.scale(x: zoomScale, anchor: .zero).fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) } .scaleEffect(x: 1, y: -1) - .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) + .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) .frame(maxHeight: Config.basalHeight) .background(Color.secondary.opacity(0.1)) .onChange(of: tempBasals) { _ in @@ -292,24 +291,51 @@ struct MainChartView: View { } private func mainView(fullSize: CGSize) -> some View { - Group { - VStack { - ZStack { - xGridView(fullSize: fullSize) - carbsView(fullSize: fullSize) - fpuView(fullSize: fullSize) - bolusView(fullSize: fullSize) - if smooth { unSmoothedGlucoseView(fullSize: fullSize) } - glucoseView(fullSize: fullSize) - manualGlucoseView(fullSize: fullSize) - manualGlucoseCenterView(fullSize: fullSize) - announcementView(fullSize: fullSize) - predictionsView(fullSize: fullSize) - } - timeLabelsView(fullSize: fullSize) + VStack { + ZStack { + xGridView(fullSize: fullSize) + carbsView(fullSize: fullSize) + fpuView(fullSize: fullSize) + bolusView(fullSize: fullSize) + if smooth { unSmoothedGlucoseView(fullSize: fullSize) } + glucoseView(fullSize: fullSize) + manualGlucoseView(fullSize: fullSize) + manualGlucoseCenterView(fullSize: fullSize) + announcementView(fullSize: fullSize) + predictionsView(fullSize: fullSize) } + timeLabelsView(fullSize: fullSize) + } + .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) + } + + /// returns the width of the full chart view including predictions for the current `screenHours` + private func glucoseAndAdditionalWidth(fullSize: CGSize) -> CGFloat { + // fullGlucoseWidth returns the width scaled to 1h screen hours. Scale it down to screenHours + fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(screenHours) + + additionalWidthScaled(viewWidth: fullSize.width) + } + + /// returns the additional width for predictions, scaled to `screenHours` + private func additionalWidthScaled(viewWidth: CGFloat) -> CGFloat { + guard let predictions = suggestion?.predictions, + let deliveredAt = suggestion?.deliverAt, + let last = glucose.last + else { + return Config.minAdditionalWidth } - .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) + + let iob = predictions.iob?.count ?? 0 + let zt = predictions.zt?.count ?? 0 + let cob = predictions.cob?.count ?? 0 + let uam = predictions.uam?.count ?? 0 + let max = [iob, zt, cob, uam].max() ?? 0 + + let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) + let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) + let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) / CGFloat(screenHours) + + return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) } @Environment(\.colorScheme) var colorScheme @@ -319,9 +345,11 @@ struct MainChartView: View { return ZStack { Path { path in for hour in 0 ..< hours + hours { - let x = firstHourPosition(viewWidth: fullSize.width) + - oneSecondStep(viewWidth: fullSize.width) * - CGFloat(hour) * CGFloat(1.hours.timeInterval) + let x = ( + firstHourPosition(viewWidth: fullSize.width) + + oneSecondStep(viewWidth: fullSize.width) * + CGFloat(hour) * CGFloat(1.hours.timeInterval) + ) * zoomScale path.move(to: CGPoint(x: x, y: 0)) path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) } @@ -329,7 +357,7 @@ struct MainChartView: View { .stroke(useColour, lineWidth: 0.15) Path { path in // vertical timeline - let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) + let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) * zoomScale path.move(to: CGPoint(x: x, y: 0)) path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) } @@ -344,13 +372,15 @@ struct MainChartView: View { let format = screenHours > 6 ? date24Formatter : dateFormatter return ZStack { // X time labels - ForEach(0 ..< hours + hours) { hour in + ForEach(0 ..< hours + hours, id: \.self) { hour in Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) .font(.caption) .position( - x: firstHourPosition(viewWidth: fullSize.width) + - oneSecondStep(viewWidth: fullSize.width) * - CGFloat(hour) * CGFloat(1.hours.timeInterval), + x: ( + firstHourPosition(viewWidth: fullSize.width) + + oneSecondStep(viewWidth: fullSize.width) * + CGFloat(hour) * CGFloat(1.hours.timeInterval) + ) * zoomScale, y: 10.0 ) .foregroundColor(.secondary) @@ -361,7 +391,7 @@ struct MainChartView: View { private func glucoseView(fullSize: CGSize) -> some View { Path { path in for rect in glucoseDots { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } } .fill(Color.loopGreen) @@ -379,7 +409,7 @@ struct MainChartView: View { private func manualGlucoseView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDots { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } } .fill(Color.gray) @@ -397,7 +427,9 @@ struct MainChartView: View { private func announcementView(fullSize: CGSize) -> some View { ZStack { ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in - let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) + let scaledRect = scaleCenter(rect: info.rect) + + let position = CGPoint(x: scaledRect.midX + 5, y: scaledRect.maxY - Config.owlOffset) let type: String = info.note.contains("true") ? Command.open : @@ -426,7 +458,7 @@ struct MainChartView: View { private func manualGlucoseCenterView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDotsCenter { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } } .fill(Color.red) @@ -449,8 +481,9 @@ struct MainChartView: View { Path { path in var lines: [CGPoint] = [] for rect in unSmoothedGlucoseDots { - lines.append(CGPoint(x: rect.midX, y: rect.midY)) - path.addEllipse(in: rect) + let scaled = scaleCenter(rect: rect) + lines.append(CGPoint(x: scaled.midX, y: scaled.midY)) + path.addEllipse(in: scaled) } path.addLines(lines) } @@ -468,13 +501,21 @@ struct MainChartView: View { private func bolusView(fullSize: CGSize) -> some View { ZStack { + let bolusPath = Path { path in + for dot in bolusDots { + path.addEllipse(in: scaleCenter(rect: dot.rect)) + } + } + bolusPath .fill(Color.insulin) bolusPath .stroke(Color.primary, lineWidth: 0.5) ForEach(bolusDots, id: \.rect.minX) { info -> AnyView in - let position = CGPoint(x: info.rect.midX, y: info.rect.maxY + 8) + let rect = scaleCenter(rect: info.rect) + + let position = CGPoint(x: rect.midX, y: rect.maxY + 8) return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -490,13 +531,21 @@ struct MainChartView: View { private func carbsView(fullSize: CGSize) -> some View { ZStack { + let carbsPath = Path { path in + for dot in carbsDots { + path.addEllipse(in: scaleCenter(rect: dot.rect)) + } + } + carbsPath .fill(Color.loopYellow) carbsPath .stroke(Color.primary, lineWidth: 0.5) ForEach(carbsDots, id: \.rect.minX) { info -> AnyView in - let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) + let rect = scaleCenter(rect: info.rect) + + let position = CGPoint(x: rect.midX, y: rect.minY - 8) return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -512,6 +561,12 @@ struct MainChartView: View { private func fpuView(fullSize: CGSize) -> some View { ZStack { + let fpuPath = Path { path in + for dot in fpuDots { + path.addEllipse(in: scaleCenter(rect: dot.rect)) + } + } + fpuPath .fill(.orange.opacity(0.5)) fpuPath @@ -528,8 +583,10 @@ struct MainChartView: View { private func tempTargetsView(fullSize: CGSize) -> some View { ZStack { tempTargetsPath + .scale(x: zoomScale, anchor: .zero) .fill(Color.tempBasal.opacity(0.5)) tempTargetsPath + .scale(x: zoomScale, anchor: .zero) .stroke(Color.basal.opacity(0.5), lineWidth: 1) } .onChange(of: glucose) { _ in @@ -543,29 +600,37 @@ struct MainChartView: View { } } + private func scale(rect: CGRect) -> CGRect { + CGRect(origin: CGPoint(x: rect.origin.x * zoomScale, y: rect.origin.y), size: rect.size) + } + + private func scaleCenter(rect: CGRect) -> CGRect { + CGRect(origin: CGPoint(x: rect.midX * zoomScale - rect.width / 2, y: rect.origin.y), size: rect.size) + } + private func predictionsView(fullSize: CGSize) -> some View { Group { Path { path in for rect in predictionDots[.iob] ?? [] { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } }.fill(Color.insulin) Path { path in for rect in predictionDots[.cob] ?? [] { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } }.fill(Color.loopYellow) Path { path in for rect in predictionDots[.zt] ?? [] { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } }.fill(Color.zt) Path { path in for rect in predictionDots[.uam] ?? [] { - path.addEllipse(in: rect) + path.addEllipse(in: scaleCenter(rect: rect)) } }.fill(Color.uam) } @@ -577,6 +642,8 @@ struct MainChartView: View { // MARK: - Calculations +/// some of the calculations done here can take quite long (100ms+) and are not able to update data at a fast rate +/// therefore we stick to the 1h screen window for these calculations and scale the results as needed to `screenHours` which has little extra overhead and enables changing the screen hours with no lag extension MainChartView { private func update(fullSize: CGSize) { calculatePredictionDots(fullSize: fullSize, type: .iob) @@ -693,15 +760,8 @@ extension MainChartView { return DotInfo(rect: rect, value: value.amount ?? 0) } - let path = Path { path in - for dot in dots { - path.addEllipse(in: dot.rect) - } - } - DispatchQueue.main.async { bolusDots = dots - bolusPath = path } } } @@ -720,15 +780,8 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } - let path = Path { path in - for dot in dots { - path.addEllipse(in: dot.rect) - } - } - DispatchQueue.main.async { carbsDots = dots - carbsPath = path } } } @@ -747,15 +800,8 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } - let path = Path { path in - for dot in dots { - path.addEllipse(in: dot.rect) - } - } - DispatchQueue.main.async { fpuDots = dots - fpuPath = path } } } @@ -830,9 +876,8 @@ extension MainChartView { path.addLine(to: CGPoint(x: lastPoint.x, y: Config.basalHeight)) path.addLine(to: CGPoint(x: 0, y: Config.basalHeight)) } - let adjustForOptionalExtraHours = screenHours > 12 ? screenHours - 12 : 0 - let endDateTime = dayAgoTime + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours - .timeInterval + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours + let endDateTime = dayAgoTime + 12.hours + .timeInterval + 12.hours .timeInterval let autotunedBasalPoints = findRegularBasalPoints( timeBegin: dayAgoTime, @@ -892,8 +937,7 @@ extension MainChartView { .map { self.timeToXCoordinate($0.timestamp.timeIntervalSince1970, fullSize: fullSize) } let x0 = self.timeToXCoordinate(event.timestamp.timeIntervalSince1970, fullSize: fullSize) - let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + self - .additionalWidth(viewWidth: fullSize.width) + let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + 275 return CGRect(x: x0, y: 0, width: x1 - x0, height: Config.basalHeight * 0.7) } @@ -1039,32 +1083,11 @@ extension MainChartView { } private func fullGlucoseWidth(viewWidth: CGFloat) -> CGFloat { - viewWidth * CGFloat(hours) / CGFloat(min(max(screenHours, 2), 24)) - } - - private func additionalWidth(viewWidth: CGFloat) -> CGFloat { - guard let predictions = suggestion?.predictions, - let deliveredAt = suggestion?.deliverAt, - let last = glucose.last - else { - return Config.minAdditionalWidth - } - - let iob = predictions.iob?.count ?? 0 - let zt = predictions.zt?.count ?? 0 - let cob = predictions.cob?.count ?? 0 - let uam = predictions.uam?.count ?? 0 - let max = [iob, zt, cob, uam].max() ?? 0 - - let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) - let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) - let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) - - return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) + viewWidth * CGFloat(hours) } private func oneSecondStep(viewWidth: CGFloat) -> CGFloat { - viewWidth / (CGFloat(min(max(screenHours, 2), 24)) * CGFloat(1.hours.timeInterval)) + viewWidth / CGFloat(1.hours.timeInterval) } private func maxPredValue() -> Int? { @@ -1131,6 +1154,15 @@ extension MainChartView { return x } + /// inverse of `timeToXCoordinate` + private func xCoordinateToTime(x: CGFloat, fullSize: CGSize) -> TimeInterval { + let stepXFraction = fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(hours.hours.timeInterval) + let xx = x / stepXFraction + let xOffset = -Date().addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970 + let time = xx - xOffset + return time + } + private func glucoseToYCoordinate(_ glucoseValue: Int, fullSize: CGSize) -> CGFloat { let topYPaddint = Config.topYPadding + Config.basalHeight let bottomYPadding = Config.bottomYPadding diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index da21c8a69a..5802528dac 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -349,11 +349,10 @@ extension Home { } var timeInterval: some View { - HStack { + HStack(alignment: .center) { ForEach(timeButtons) { button in Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { state.hours = button.hours - highlightButtons() } .foregroundStyle(button.active ? .primary : .secondary) .frame(maxHeight: 20).padding(.horizontal) @@ -631,6 +630,9 @@ extension Home { } .edgesIgnoringSafeArea(.vertical) } + .onChange(of: state.hours) { _ in + highlightButtons() + } .onAppear { configureView { highlightButtons() From 00adc7f38e2630ea132a0bec3ac7b8c0211d42a1 Mon Sep 17 00:00:00 2001 From: sethgagnon <597958+sethgagnon@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:11:02 -0500 Subject: [PATCH 266/405] Fastfile changes to support Live Activity (#396) adding in liveactivity identifier forcing xcode 15.0.1 for creating certs --- .github/workflows/add_identifiers.yml | 4 ++-- .github/workflows/create_certs.yml | 4 ++-- fastlane/Fastfile | 14 +++++++++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index e220ee4484..c84dba30aa 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -14,8 +14,8 @@ jobs: runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed - #- name: Select Xcode version - # run: "sudo xcode-select --switch /Applications/Xcode_14.1.app/Contents/Developer" + - name: Select Xcode version + run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" # Checks-out the repo - name: Checkout Repo diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index 948d42e4e9..67db9a2d91 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -15,8 +15,8 @@ jobs: runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed - #- name: Select Xcode version - # run: "sudo xcode-select --switch /Applications/Xcode_14.1.app/Contents/Developer" + - name: Select Xcode version + run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" # Checks-out the repo - name: Checkout Repo diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 72b74d5996..275e90f0de 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -57,7 +57,8 @@ platform :ios do app_identifier: [ "ru.artpancreas.#{TEAMID}.FreeAPS", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", - "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension" + "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension", + "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity" ] ) @@ -97,6 +98,12 @@ platform :ios do code_sign_identity: "iPhone Distribution", targets: ["FreeAPSWatch"] ) + update_code_signing_settings( + path: "#{GITHUB_WORKSPACE}/FreeAPS.xcodeproj", + profile_name: mapping["ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity"], + code_sign_identity: "iPhone Distribution", + targets: ["LiveActivityExtension"] + ) gym( export_method: "app-store", @@ -162,6 +169,10 @@ platform :ios do configure_bundle_id("FreeAPSWatch", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", [ Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS ]) + + configure_bundle_id("LiveActivityExtension", "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity", [ + Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS + ]) end @@ -184,6 +195,7 @@ platform :ios do "ru.artpancreas.#{TEAMID}.FreeAPS", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", + "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity" ] ) end From 088dbe021dba72984f82c5b170e266d6c0a054f4 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Thu, 30 Nov 2023 01:25:17 -0800 Subject: [PATCH 267/405] New and updated Pod Diagnostics & miscellaneous fixes (#395) + New submenu for all the pod diagnostics + New Pulse Log Plus, Activation Time & Triggered Alerts commands + Renamed & reworked ReadPulseLogView to a new common ReadPodInfoView + Add PumpManager & ViewModel funcs for new PodInfo commands + Rename PodInfoConfiguredAlerts to PodInfoTriggeredAlerts + Correct PodInfoActivationTime & PodInfoTriggeredAlerts defs + Update PodInfoPulseLog & PodInfoPulseLogPlus output + Update TimeIntervalStr to only include minutes when non-zero + PumpManager fixes needed to handle repeated PumpManagerAlerts + Two Bluetooth fixes needed to handle payloads > 255 bytes --- .../OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 20 +-- .../OmniBLE/Bluetooth/Packet/BLEPacket.swift | 2 +- .../StringLengthPrefixEncoding.swift | 7 +- .../MessageBlocks/DetailedStatus.swift | 2 +- .../OmnipodCommon/MessageBlocks/PodInfo.swift | 10 +- .../MessageBlocks/PodInfoActivationTime.swift | 45 +++--- .../PodInfoConfiguredAlerts.swift | 56 -------- .../MessageBlocks/PodInfoPulseLog.swift | 6 +- .../MessageBlocks/PodInfoPulseLogPlus.swift | 13 ++ .../PodInfoTriggeredAlerts.swift | 92 ++++++++++++ .../PumpManager/OmniBLEPumpManager.swift | 93 +++++++++++- .../ViewModels/OmniBLESettingsViewModel.swift | 24 ++++ .../Views/OmniBLESettingsView.swift | 34 ++--- .../Views/PlayTestBeepsView.swift | 21 ++- .../PumpManagerUI/Views/PodDiagnostics.swift | 89 ++++++++++++ .../Views/PumpManagerDetailsView.swift | 12 +- ...lseLogView.swift => ReadPodInfoView.swift} | 72 +++++----- .../Views/ReadPodStatusView.swift | 135 +++++++++--------- .../OmniKit/OmniKit.xcodeproj/project.pbxproj | 56 ++++---- .../MessageBlocks/DetailedStatus.swift | 2 +- .../OmnipodCommon/MessageBlocks/PodInfo.swift | 10 +- .../MessageBlocks/PodInfoActivationTime.swift | 45 +++--- .../PodInfoConfiguredAlerts.swift | 55 ------- .../MessageBlocks/PodInfoPulseLog.swift | 6 +- .../MessageBlocks/PodInfoPulseLogPlus.swift | 13 ++ .../PodInfoTriggeredAlerts.swift | 91 ++++++++++++ .../PumpManager/OmnipodPumpManager.swift | 96 ++++++++++++- .../ViewModels/OmnipodSettingsViewModel.swift | 28 +++- .../OmniKitUI/Views/OmnipodSettingsView.swift | 34 ++--- .../OmniKitUI/Views/PlayTestBeepsView.swift | 20 +-- .../OmniKitUI/Views/PodDiagnostics.swift | 90 ++++++++++++ .../Views/PumpManagerDetailsView.swift | 12 +- ...lseLogView.swift => ReadPodInfoView.swift} | 73 +++++----- .../OmniKitUI/Views/ReadPodStatusView.swift | 135 +++++++++--------- 34 files changed, 1014 insertions(+), 485 deletions(-) delete mode 100644 Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift create mode 100644 Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDiagnostics.swift rename Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/{ReadPulseLogView.swift => ReadPodInfoView.swift} (50%) delete mode 100644 Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift create mode 100644 Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift create mode 100644 Dependencies/OmniKit/OmniKitUI/Views/PodDiagnostics.swift rename Dependencies/OmniKit/OmniKitUI/Views/{ReadPulseLogView.swift => ReadPodInfoView.swift} (50%) diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index 65dc794234..af3c52754c 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -45,7 +45,7 @@ 10389A2626FF7841002115E9 /* TempBasalExtraCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0726FF7841002115E9 /* TempBasalExtraCommand.swift */; }; 10389A2726FF7841002115E9 /* DeactivatePodCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0826FF7841002115E9 /* DeactivatePodCommand.swift */; }; 10389A2826FF7841002115E9 /* AcknowledgeAlertCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0926FF7841002115E9 /* AcknowledgeAlertCommand.swift */; }; - 10389A2926FF7841002115E9 /* PodInfoConfiguredAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0A26FF7841002115E9 /* PodInfoConfiguredAlerts.swift */; }; + 10389A2926FF7841002115E9 /* PodInfoTriggeredAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0A26FF7841002115E9 /* PodInfoTriggeredAlerts.swift */; }; 10389A2A26FF7841002115E9 /* MessageBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0B26FF7841002115E9 /* MessageBlock.swift */; }; 10389A2B26FF7841002115E9 /* PlaceholderMessageBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0C26FF7841002115E9 /* PlaceholderMessageBlock.swift */; }; 10389A2C26FF7841002115E9 /* PodInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10389A0D26FF7841002115E9 /* PodInfo.swift */; }; @@ -173,9 +173,10 @@ D845A1392AF89F6300EA0853 /* FirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1382AF89F6300EA0853 /* FirstAppear.swift */; }; D845A13B2AF89F7100EA0853 /* PlayTestBeepsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */; }; D845A13F2AF89F8400EA0853 /* ReadPodStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */; }; - D845A1402AF89F8400EA0853 /* ReadPulseLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */; }; D845A1412AF89F8400EA0853 /* PumpManagerDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */; }; D845A1432AF89F9200EA0853 /* SilencePodSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */; }; + D85AEABC2B12D76F00081044 /* PodDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEABB2B12D76F00081044 /* PodDiagnostics.swift */; }; + D85AEAC42B13083F00081044 /* ReadPodInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEAC32B13083F00081044 /* ReadPodInfoView.swift */; }; D8896C6227890E6B00E09A96 /* DetailedStatus+OmniBLE.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8896C6127890E6B00E09A96 /* DetailedStatus+OmniBLE.swift */; }; D895BF5B275DE64000D51FC7 /* StringLengthPrefixEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D895BF5A275DE64000D51FC7 /* StringLengthPrefixEncoding.swift */; }; D897B06B29347ED500FDB009 /* BolusDeliveryTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D897B06A29347ED500FDB009 /* BolusDeliveryTable.swift */; }; @@ -251,7 +252,7 @@ 10389A0726FF7841002115E9 /* TempBasalExtraCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempBasalExtraCommand.swift; sourceTree = ""; }; 10389A0826FF7841002115E9 /* DeactivatePodCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeactivatePodCommand.swift; sourceTree = ""; }; 10389A0926FF7841002115E9 /* AcknowledgeAlertCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgeAlertCommand.swift; sourceTree = ""; }; - 10389A0A26FF7841002115E9 /* PodInfoConfiguredAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfoConfiguredAlerts.swift; sourceTree = ""; }; + 10389A0A26FF7841002115E9 /* PodInfoTriggeredAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfoTriggeredAlerts.swift; sourceTree = ""; }; 10389A0B26FF7841002115E9 /* MessageBlock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageBlock.swift; sourceTree = ""; }; 10389A0C26FF7841002115E9 /* PlaceholderMessageBlock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaceholderMessageBlock.swift; sourceTree = ""; }; 10389A0D26FF7841002115E9 /* PodInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfo.swift; sourceTree = ""; }; @@ -433,9 +434,10 @@ D845A1382AF89F6300EA0853 /* FirstAppear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstAppear.swift; sourceTree = ""; }; D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayTestBeepsView.swift; sourceTree = ""; }; D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodStatusView.swift; sourceTree = ""; }; - D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPulseLogView.swift; sourceTree = ""; }; D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PumpManagerDetailsView.swift; sourceTree = ""; }; D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodSelectionView.swift; sourceTree = ""; }; + D85AEABB2B12D76F00081044 /* PodDiagnostics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodDiagnostics.swift; sourceTree = ""; }; + D85AEAC32B13083F00081044 /* ReadPodInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodInfoView.swift; sourceTree = ""; }; D8896C6127890E6B00E09A96 /* DetailedStatus+OmniBLE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DetailedStatus+OmniBLE.swift"; sourceTree = ""; }; D895BF5A275DE64000D51FC7 /* StringLengthPrefixEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringLengthPrefixEncoding.swift; sourceTree = ""; }; D897B06A29347ED500FDB009 /* BolusDeliveryTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusDeliveryTable.swift; sourceTree = ""; }; @@ -540,10 +542,10 @@ 10389A0C26FF7841002115E9 /* PlaceholderMessageBlock.swift */, 10389A0D26FF7841002115E9 /* PodInfo.swift */, 10389A0626FF7841002115E9 /* PodInfoActivationTime.swift */, - 10389A0A26FF7841002115E9 /* PodInfoConfiguredAlerts.swift */, 10389A0426FF7841002115E9 /* PodInfoPulseLog.swift */, 10389A1026FF7841002115E9 /* PodInfoPulseLogPlus.swift */, 10389A1A26FF7841002115E9 /* PodInfoResponse.swift */, + 10389A0A26FF7841002115E9 /* PodInfoTriggeredAlerts.swift */, 10389A1B26FF7841002115E9 /* SetInsulinScheduleCommand.swift */, 10389A1826FF7841002115E9 /* SetupPodCommand.swift */, 10389A1126FF7841002115E9 /* StatusResponse.swift */, @@ -759,12 +761,13 @@ C1F67E7F27975B830017487F /* PairPodView.swift */, D845A13A2AF89F7100EA0853 /* PlayTestBeepsView.swift */, C1F67E8A27975B830017487F /* PodDetailsView.swift */, + D85AEABB2B12D76F00081044 /* PodDiagnostics.swift */, 8475311F26ED838A009FD801 /* PodLifeHUDView.swift */, 8475312426ED838A009FD801 /* PodLifeHUDView.xib */, C1F67E8827975B830017487F /* PodSetupView.swift */, D845A13E2AF89F8400EA0853 /* PumpManagerDetailsView.swift */, + D85AEAC32B13083F00081044 /* ReadPodInfoView.swift */, D845A13C2AF89F8400EA0853 /* ReadPodStatusView.swift */, - D845A13D2AF89F8400EA0853 /* ReadPulseLogView.swift */, C1F67E7427975B830017487F /* ScheduledExpirationReminderEditView.swift */, C1F67E8727975B830017487F /* SetupCompleteView.swift */, D845A1422AF89F9200EA0853 /* SilencePodSelectionView.swift */, @@ -1085,6 +1088,7 @@ 10389A3A26FF7841002115E9 /* SetInsulinScheduleCommand.swift in Sources */, D845A13B2AF89F7100EA0853 /* PlayTestBeepsView.swift in Sources */, 10389A3826FF7841002115E9 /* DetailedStatus.swift in Sources */, + D85AEABC2B12D76F00081044 /* PodDiagnostics.swift in Sources */, C1F67E9927975B830017487F /* NotificationSettingsView.swift in Sources */, 10389A2B26FF7841002115E9 /* PlaceholderMessageBlock.swift in Sources */, 10389A3026FF7841002115E9 /* StatusResponse.swift in Sources */, @@ -1099,7 +1103,7 @@ C1F67EDA27979E400017487F /* PumpManagerAlert.swift in Sources */, 10389A2D26FF7841002115E9 /* BolusExtraCommand.swift in Sources */, 8475315926EDA193009FD801 /* UIColor.swift in Sources */, - 10389A2926FF7841002115E9 /* PodInfoConfiguredAlerts.swift in Sources */, + 10389A2926FF7841002115E9 /* PodInfoTriggeredAlerts.swift in Sources */, C1F67EB727975E710017487F /* LeadingImage.swift in Sources */, C1F67ECB27975F360017487F /* PodLifeState.swift in Sources */, 8475315B26EDA193009FD801 /* NibLoadable.swift in Sources */, @@ -1107,6 +1111,7 @@ 8475313226ED838B009FD801 /* PodLifeHUDView.swift in Sources */, C1C001BF27A2337B00533D35 /* PeripheralManager+OmniBLE.swift in Sources */, 10389A3F26FF7841002115E9 /* CRC16.swift in Sources */, + D85AEAC42B13083F00081044 /* ReadPodInfoView.swift in Sources */, 10289E68271B2A08000339E6 /* NumberFormatter.swift in Sources */, 1016325927185EE4007A3BC2 /* BeepType.swift in Sources */, C1F67E9E27975B830017487F /* LowReservoirReminderEditView.swift in Sources */, @@ -1146,7 +1151,6 @@ C1F67EC927975F360017487F /* DeliveryUncertaintyRecoveryViewModel.swift in Sources */, 1016325C27185EE5007A3BC2 /* BasalDeliveryTable.swift in Sources */, 84752EE326ED13F5009FD801 /* BLEPacket.swift in Sources */, - D845A1402AF89F8400EA0853 /* ReadPulseLogView.swift in Sources */, 102111472709462300784F13 /* PodState.swift in Sources */, 196A6F232AFFFD1700E3C089 /* SilencePodPreference.swift in Sources */, 1021114B2709462300784F13 /* BasalSchedule+LoopKit.swift in Sources */, diff --git a/Dependencies/OmniBLE/OmniBLE/Bluetooth/Packet/BLEPacket.swift b/Dependencies/OmniBLE/OmniBLE/Bluetooth/Packet/BLEPacket.swift index 332fe1ad29..2390b654dc 100644 --- a/Dependencies/OmniBLE/OmniBLE/Bluetooth/Packet/BLEPacket.swift +++ b/Dependencies/OmniBLE/OmniBLE/Bluetooth/Packet/BLEPacket.swift @@ -60,7 +60,7 @@ struct FirstBlePacket: BlePacket { } let fullFragments = Int(payload[1]) - guard (fullFragments < MAX_FRAGMENTS) else { + guard (fullFragments <= MAX_FRAGMENTS) else { throw PodProtocolError.messageIOException(String(format: "Received more than %d fragments", MAX_FRAGMENTS)) } guard (fullFragments > 0) else { diff --git a/Dependencies/OmniBLE/OmniBLE/Bluetooth/StringLengthPrefixEncoding.swift b/Dependencies/OmniBLE/OmniBLE/Bluetooth/StringLengthPrefixEncoding.swift index 8f5218195a..56c0050db4 100644 --- a/Dependencies/OmniBLE/OmniBLE/Bluetooth/StringLengthPrefixEncoding.swift +++ b/Dependencies/OmniBLE/OmniBLE/Bluetooth/StringLengthPrefixEncoding.swift @@ -30,12 +30,7 @@ final class StringLengthPrefixEncoding { throw PodProtocolError.messageIOException("Payload too short: \(payload)") } remaining = remaining.subdata(in: key.count..= length else { throw PodProtocolError.messageIOException("Payload too short: \(payload)") } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift index 009b927186..d86459a6e3 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/DetailedStatus.swift @@ -169,7 +169,7 @@ extension TimeInterval { if hours != 0 { str += String(format: "%uh", hours) } - if minutes != 0 || hours != 0 { + if minutes != 0 { str += String(format: "%um", minutes) } if seconds != 0 || str.isEmpty { diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfo.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfo.swift index 37915debbc..6da1c7893d 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfo.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfo.swift @@ -18,10 +18,10 @@ public protocol PodInfo { public enum PodInfoResponseSubType: UInt8, Equatable { case normal = 0x00 - case configuredAlerts = 0x01 // Returns information on configured alerts - case detailedStatus = 0x02 // Returned on any pod fault + case triggeredAlerts = 0x01 // Returns values for any unacknowledged triggered alerts + case detailedStatus = 0x02 // Returns detailed pod status, returned for most calls after a pod fault case pulseLogPlus = 0x03 // Returns up to the last 60 pulse log entries plus additional info - case activationTime = 0x05 // Returns activation date, elapsed time, and fault code + case activationTime = 0x05 // Returns pod activation time and possible fault code & fault time case pulseLogRecent = 0x50 // Returns the last 50 pulse log entries case pulseLogPrevious = 0x51 // Like 0x50, but returns up to the previous 50 entries before the last 50 @@ -29,8 +29,8 @@ public enum PodInfoResponseSubType: UInt8, Equatable { switch self { case .normal: return StatusResponse.self as! PodInfo.Type - case .configuredAlerts: - return PodInfoConfiguredAlerts.self + case .triggeredAlerts: + return PodInfoTriggeredAlerts.self case .detailedStatus: return DetailedStatus.self case .pulseLogPlus: diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift index 83156e48a7..d34a2c04d0 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift @@ -9,7 +9,7 @@ import Foundation -// Type 5 PodInfo returns the pod activation time, time pod alive, and the possible fault code +// Type 5 PodInfo returns the pod activation time and possible fault code & fault time public struct PodInfoActivationTime : PodInfo { // OFF 1 2 3 4 5 6 7 8 9 10111213 1415161718 // DATA 0 1 2 3 4 5 6 7 8 9 1011 1213141516 @@ -17,8 +17,12 @@ public struct PodInfoActivationTime : PodInfo { public let podInfoType: PodInfoResponseSubType = .activationTime public let faultEventCode: FaultEventCode - public let timeActivation: TimeInterval - public let dateTime: DateComponents + public let faultTime: TimeInterval + public let year: Int + public let month: Int + public let day: Int + public let hour: Int + public let minute: Int public let data: Data public init(encodedData: Data) throws { @@ -26,22 +30,29 @@ public struct PodInfoActivationTime : PodInfo { throw MessageBlockError.notEnoughData } self.faultEventCode = FaultEventCode(rawValue: encodedData[1]) - self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[2] & 0b1) << 8) + Int(encodedData[3]))) - self.dateTime = DateComponents(encodedDateTime: encodedData.subdata(in: 12..<17)) + self.faultTime = TimeInterval(minutes: Double((Int(encodedData[2]) << 8) + Int(encodedData[3]))) + self.year = Int(encodedData[14]) + self.month = Int(encodedData[12]) + self.day = Int(encodedData[13]) + self.hour = Int(encodedData[15]) + self.minute = Int(encodedData[16]) self.data = Data(encodedData) } } -extension DateComponents { - init(encodedDateTime: Data) { - self.init() - - year = Int(encodedDateTime[2]) + 2000 - month = Int(encodedDateTime[0]) - day = Int(encodedDateTime[1]) - hour = Int(encodedDateTime[3]) - minute = Int(encodedDateTime[4]) - - calendar = Calendar(identifier: .gregorian) - } +func activationTimeString(podInfoActivationTime: PodInfoActivationTime) -> String { + var result: [String] = [] + + // activation time info + result.append(String(format: "Year: %u", podInfoActivationTime.year)) + result.append(String(format: "Month: %u", podInfoActivationTime.month)) + result.append(String(format: "Day: %u", podInfoActivationTime.day)) + result.append(String(format: "Hour: %u", podInfoActivationTime.hour)) + result.append(String(format: "Minute: %u", podInfoActivationTime.minute)) + + // pod fault info + result.append(String(format: "\n%@", String(describing: podInfoActivationTime.faultEventCode))) + result.append(String(format: "Fault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + + return result.joined(separator: "\n") } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift deleted file mode 100644 index e9989afa04..0000000000 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// PodInfoConfiguredAlerts.swift -// OmniBLE -// -// From OmniKit/MessageTransport/MessageBlocks/PodInfoConfiguredAlerts.swift -// Created by Eelke Jager on 16/09/2018. -// Copyright © 2018 Pete Schwamb. All rights reserved. -// - -import Foundation - -// Type 1 Pod Info returns information about the currently configured alerts -public struct PodInfoConfiguredAlerts : PodInfo { - // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 - // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 - // 02 13 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV - - public let podInfoType : PodInfoResponseSubType = .configuredAlerts - public let word_278 : Data - public let alertsActivations : [AlertActivation] - public let data : Data - - public struct AlertActivation { - let beepType: BeepType - let unitsLeft: Double - let timeFromPodStart: UInt8 - - public init(beepType: BeepType, timeFromPodStart: UInt8, unitsLeft: Double) { - self.beepType = beepType - self.timeFromPodStart = timeFromPodStart - self.unitsLeft = unitsLeft - } - } - - public init(encodedData: Data) throws { - guard encodedData.count >= 11 else { - throw MessageBlockError.notEnoughData - } - - self.word_278 = encodedData[1...2] - - let numAlertTypes = 8 - let beepType = BeepType.self - - var activations = [AlertActivation]() - - for alarmType in (0.. String { - var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg" + var result: [String] = ["Pulse eeeeee0a pppliiib cccccccc dfgggggg"] var index = pulseLogEntries.count - 1 var pulseNumber = lastPulseNumber while index >= 0 { - str += String(format: "\n%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription + result.append(String(format: "%04d:%@", pulseNumber, UInt32(pulseLogEntries[index]).binaryDescription)) index -= 1 pulseNumber -= 1 } - return str + return result.joined(separator: "\n") } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift index f73a365791..db8c059450 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift @@ -50,3 +50,16 @@ public struct PodInfoPulseLogPlus : PodInfo { self.data = encodedData } } + +func pulseLogPlusString(podInfoPulseLogPlus: PodInfoPulseLogPlus) -> String { + var result: [String] = [] + + result.append(String(format: "Pod Active: %@", podInfoPulseLogPlus.timeActivation.timeIntervalStr)) + result.append(String(format: "Fault Time: %@", podInfoPulseLogPlus.timeFaultEvent.timeIntervalStr)) + result.append(String(format: "%@\n", String(describing: podInfoPulseLogPlus.faultEventCode))) + + let lastPulseNumber = Int(podInfoPulseLogPlus.nEntries) + result.append(pulseLogString(pulseLogEntries: podInfoPulseLogPlus.pulseLog, lastPulseNumber: lastPulseNumber)) + + return result.joined(separator: "\n") +} diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift new file mode 100644 index 0000000000..0b470a03b9 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift @@ -0,0 +1,92 @@ +// +// PodInfoTriggeredAlerts.swift +// OmniBLE +// +// From OmniKit/MessageTransport/MessageBlocks/PodInfoTriggeredAlerts.swift +// Created by Eelke Jager on 16/09/2018. +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + +// Type 1 Pod Info returns information about the currently unacknowledged triggered alert values +public struct PodInfoTriggeredAlerts: PodInfo { + // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 + // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 + // 02 13 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV + + public let podInfoType: PodInfoResponseSubType = .triggeredAlerts + public let unknown_word: UInt16 + public let alertsActivations: [AlertActivation] + public let data: Data + + public struct AlertActivation { + let triggeredAlertValue: TriggeredAlertValue + + public init(triggeredAlertValue: TriggeredAlertValue) { + self.triggeredAlertValue = triggeredAlertValue + } + } + + public init(encodedData: Data) throws { + guard encodedData.count >= 11 else { + throw MessageBlockError.notEnoughData + } + + let numAlerts = 8 + var activations = [AlertActivation]() + var i = 3 // starting data index for first VVVV value + for alertNum in (0.. String { + var result: [String] = [] + + for index in podInfoTriggeredAlerts.alertsActivations.indices { + // extract the alert slot debug description for a more helpful display + let description = AlertSlot(rawValue: UInt8(index)).debugDescription + let start = description.index(description.startIndex, offsetBy: 27) + let end = description.index(description.endIndex, offsetBy: -1) + let range = start..) -> Void) { - // use hasSetupPod to be able to read pulse log from a faulted Pod + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod guard self.hasSetupPod else { completion(.failure(OmniBLEPumpManagerError.noPodPaired)) return @@ -1266,6 +1266,87 @@ extension OmniBLEPumpManager { } } + public func readPulseLogPlus(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmniBLEPumpManagerError.noPodPaired)) + return + } + guard state.podState?.isFaulted == true || state.podState?.unfinalizedBolus?.scheduledCertainty == .uncertain || state.podState?.unfinalizedBolus?.isFinished() != false else + { + self.log.info("Skipping Read Pulse Log Plus due to bolus still in progress.") + completion(.failure(PodCommsError.unfinalizedBolus)) + return + } + + podComms.runSession(withName: "Read Pulse Log Plus") { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .bipBeeeeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .pulseLogPlus, beepBlock: beepBlock) + let podInfoPulseLogPlus = podInfoResponse.podInfo as! PodInfoPulseLogPlus + let str = pulseLogPlusString(podInfoPulseLogPlus: podInfoPulseLogPlus) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + + public func readActivationTime(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmniBLEPumpManagerError.noPodPaired)) + return + } + + podComms.runSession(withName: "Read Activation Time") { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .beepBeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .activationTime, beepBlock: beepBlock) + let podInfoActivationTime = podInfoResponse.podInfo as! PodInfoActivationTime + let str = activationTimeString(podInfoActivationTime: podInfoActivationTime) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + + public func readTriggeredAlerts(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmniBLEPumpManagerError.noPodPaired)) + return + } + + podComms.runSession(withName: "Read Triggered Alerts") { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .beepBeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .triggeredAlerts, beepBlock: beepBlock) + let podInfoTriggeredAlerts = podInfoResponse.podInfo as! PodInfoTriggeredAlerts + let str = triggeredAlertsString(podInfoTriggeredAlerts: podInfoTriggeredAlerts) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + public func setConfirmationBeeps(newPreference: BeepPreference, completion: @escaping (OmniBLEPumpManagerError?) -> Void) { // If there isn't an active pod or the pod is currently silenced, @@ -1361,10 +1442,10 @@ extension OmniBLEPumpManager { let podAlerts = regeneratePodAlerts(silent: silencePod, configuredAlerts: configuredAlerts, activeAlertSlots: activeAlertSlots, currentPodTime: self.podTime, currentReservoirLevel: reservoirLevel) do { // Since non-responsive pod comms are currently only resolved for insulin related commands, - // it's possible that a previous pod alert was successfully configured will lose its response - // and thus the alert won't get reset when reconfiguring pod alerts with a new silence pod state. - // So acknowledge all alerts now to be absolutely sure that no triggered alert will be forgotten. - try session.configureAlerts(podAlerts, acknowledgeAll: true, beepBlock: beepBlock) + // it's possible that a response from a previous successful pod alert configuration can be lost + // and thus the alert won't get reset here when reconfiguring pod alerts with a new silence pod state. + let acknowledgeAll = true // protect against lost alert configuration response related issues + try session.configureAlerts(podAlerts, acknowledgeAll: acknowledgeAll, beepBlock: beepBlock) self.setState { (state) in state.silencePod = silencePod } @@ -2326,7 +2407,7 @@ extension OmniBLEPumpManager { } for alert in state.activeAlerts { - if alert.alertIdentifier == alertIdentifier { + if alert.alertIdentifier == alertIdentifier || alert.repeatingAlertIdentifier == alertIdentifier { // If this alert was triggered by the pod find the slot to clear it. if let slot = alert.triggeringSlot { if case .some(.suspended) = self.state.podState?.suspendState, slot == .slot6SuspendTimeExpired { diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift index 8904dcb26d..9b644f614b 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/OmniBLESettingsViewModel.swift @@ -340,6 +340,30 @@ class OmniBLESettingsViewModel: ObservableObject { } } + func readPulseLogPlus(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readPulseLogPlus() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readActivationTime(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readActivationTime() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readTriggeredAlerts(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readTriggeredAlerts() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + func playTestBeeps(_ completion: @escaping (Error?) -> Void) { pumpManager.playTestBeeps(completion: completion) } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift index 976334b28c..e475674bc3 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/OmniBLESettingsView.swift @@ -366,7 +366,8 @@ struct OmniBLESettingsView: View { if let podDetails = self.viewModel.podDetails { NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Pod Details", comment: "title for pod details page"))) { - FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row").foregroundColor(Color.primary) + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row") + .foregroundColor(Color.primary) } } else { HStack { @@ -379,7 +380,8 @@ struct OmniBLESettingsView: View { if let previousPodDetails = viewModel.previousPodDetails { NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { - FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row").foregroundColor(Color.primary) + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row") + .foregroundColor(Color.primary) } } else { HStack { @@ -416,7 +418,8 @@ struct OmniBLESettingsView: View { } NavigationLink(destination: BeepPreferenceSelectionView(initialValue: viewModel.beepPreference, onSave: viewModel.setConfirmationBeeps)) { HStack { - FrameworkLocalText("Confidence Reminders", comment: "Text for confidence reminders navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Confidence Reminders", comment: "Text for confidence reminders navigation link") + .foregroundColor(Color.primary) Spacer() Text(viewModel.beepPreference.title) .foregroundColor(.secondary) @@ -424,7 +427,8 @@ struct OmniBLESettingsView: View { } NavigationLink(destination: SilencePodSelectionView(initialValue: viewModel.silencePodPreference, onSave: viewModel.setSilencePod)) { HStack { - FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link") + .foregroundColor(Color.primary) Spacer() Text(viewModel.silencePodPreference.title) .foregroundColor(.secondary) @@ -472,21 +476,13 @@ struct OmniBLESettingsView: View { } } - Section(header: SectionHeader(label: LocalizedString("Diagnostics", comment: "Section header for diagnostic section"))) { - NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { - FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link").foregroundColor(Color.primary) - } - .disabled(self.viewModel.noPod) - NavigationLink(destination: ReadPulseLogView(toRun: viewModel.readPulseLog)) { - FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link").foregroundColor(Color.primary) - } - .disabled(self.viewModel.noPod) - NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { - FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link").foregroundColor(Color.primary) - } - .disabled(!self.viewModel.podOk) - NavigationLink(destination: PumpManagerDetailsView(toRun: viewModel.pumpManagerDetails)) { - FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link").foregroundColor(Color.primary) + Section() { + NavigationLink(destination: PodDiagnosticsView( + title: LocalizedString("Pod Diagnostics", comment: "Title for the pod diagnostic view"), + viewModel: viewModel)) + { + FrameworkLocalText("Pod Diagnostics", comment: "Text for pod diagnostics row") + .foregroundColor(Color.primary) } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift index e004ee2595..16b844f528 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PlayTestBeepsView.swift @@ -14,7 +14,11 @@ struct PlayTestBeepsView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + + private let title = LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps") + private let actionString = LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + private let failedString: String = LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps") @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -23,10 +27,6 @@ struct PlayTestBeepsView: View { @State private var executing: Bool = false @State private var showActivityView = false - init(toRun: @escaping (_ completion: @escaping (_ result: Error?) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -48,7 +48,7 @@ struct PlayTestBeepsView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -61,6 +61,7 @@ struct PlayTestBeepsView: View { executing = true self.displayString = "" toRun?() { (error) in + executing = false if let error = error { self.displayString = "" self.error = error @@ -68,26 +69,24 @@ struct PlayTestBeepsView: View { } else { self.displayString = successMessage } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + return actionString } else { - return LocalizedString("Play Test Beeps", comment: "button title to play test beeps") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } - } struct PlayTestBeepsView_Previews: PreviewProvider { diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDiagnostics.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDiagnostics.swift new file mode 100644 index 0000000000..7bb036cf6e --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PodDiagnostics.swift @@ -0,0 +1,89 @@ +// +// PodDiagnotics.swift +// OmniBLE +// +// Created by Joseph Moran on 11/25/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI +import HealthKit + + +struct PodDiagnosticsView: View { + + var title: String + + @ObservedObject var viewModel: OmniBLESettingsViewModel + + var body: some View { + List { + NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { + FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { + FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link") + .foregroundColor(Color.primary) + } + .disabled(!self.viewModel.podOk) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Pulse Log", comment: "Text for read pulse log title"), + actionString: LocalizedString("Reading Pulse Log...", comment: "Text for read pulse log action"), + failedString: LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log"), + toRun: viewModel.readPulseLog)) + { + FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Pulse Log Plus", comment: "Text for read pulse log plus title"), + actionString: LocalizedString("Reading Pulse Log Plus...", comment: "Text for read pulse log plus action"), + failedString: LocalizedString("Failed to read pulse log plus.", comment: "Alert title for error when reading pulse log plus"), + toRun: viewModel.readPulseLogPlus)) + { + FrameworkLocalText("Read Pulse Log Plus", comment: "Text for read pulse log plus navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Activation Time", comment: "Text for read activation time title"), + actionString: LocalizedString("Reading Activation Time...", comment: "Text for read activation time action"), + failedString: LocalizedString("Failed to read activation time.", comment: "Alert title for error when reading activation time"), + toRun: self.viewModel.readActivationTime)) + { + FrameworkLocalText("Read Activation Time", comment: "Text for read activation time navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Triggered Alerts", comment: "Text for read triggered alerts title"), + actionString: LocalizedString("Reading Triggered Alerts...", comment: "Text for read triggered alerts action"), + failedString: LocalizedString("Failed to read triggered alerts.", comment: "Alert title for error when reading triggered alerts"), + toRun: self.viewModel.readTriggeredAlerts)) + { + FrameworkLocalText("Read Triggered Alerts", comment: "Text for read triggered alerts navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: PumpManagerDetailsView( + toRun: self.viewModel.pumpManagerDetails)) + { + FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link") + .foregroundColor(Color.primary) + } + } + .insetGroupedListStyle() + .navigationBarTitle(title) + } +} diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift index 14b8281ab5..af9b658785 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/PumpManagerDetailsView.swift @@ -14,7 +14,11 @@ struct PumpManagerDetailsView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + + private let title = LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details") + private let actionString = LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + private let buttonTitle = LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") @State private var displayString: String = "" @State private var error: Error? = nil @@ -61,7 +65,7 @@ struct PumpManagerDetailsView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .onFirstAppear { asyncAction() @@ -81,9 +85,9 @@ struct PumpManagerDetailsView: View { private var buttonText: String { if executing { - return LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + return actionString } else { - return LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") + return buttonTitle } } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodInfoView.swift similarity index 50% rename from Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift rename to Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodInfoView.swift index a1220b3766..22e5493153 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPulseLogView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodInfoView.swift @@ -1,8 +1,8 @@ // -// ReadPulseLogView.swift +// ReadPodInfoView.swift // OmniBLE // -// Created by Joe Moran on 9/1/23. +// Created by Joe Moran on 11/25/23. // Copyright © 2023 LoopKit Authors. All rights reserved. // @@ -10,11 +10,15 @@ import SwiftUI import LoopKit -struct ReadPulseLogView: View { +struct ReadPodInfoView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? + var title: String // e.g., "Read Pulse Log" + var actionString: String // e.g., "Reading Pulse Log..." + var failedString: String // e.g., "Failed to read pulse log." + + var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -22,10 +26,6 @@ struct ReadPulseLogView: View { @State private var executing: Bool = false @State private var showActivityView: Bool = false - init(toRun: @escaping (_ completion: @escaping (_ result: Result) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -62,7 +62,7 @@ struct ReadPulseLogView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Read Pulse Log", comment: "navigation title for read pulse log")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -75,54 +75,60 @@ struct ReadPulseLogView: View { executing = true self.displayString = "" toRun?() { (result) in + executing = false switch result { - case .success(let pulseLogString): - self.displayString = pulseLogString + case .success(let resultString): + self.displayString = resultString case .failure(let error): self.displayString = "" self.error = error self.alertIsPresented = true } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Reading Pulse Log...", comment: "button title when executing read pulse log") + return actionString } else { - return LocalizedString("Read Pulse Log", comment: "button title to read pulse log") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } } -struct ReadPulsePodLogView_Previews: PreviewProvider { +struct ReadPodInfoView_Previews: PreviewProvider { static var previews: some View { - ReadPulseLogView() { completion in - let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, - 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, - 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, - 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, - 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, - 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, - 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, - 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, - 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, - 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, - 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, - 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, - 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, - 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) - let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) - completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + NavigationView { + ReadPodInfoView( + title: "Read Pulse Log", + actionString: "Reading Pulse Log...", + failedString: "Failed to read pulse log" + ) { completion in + let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, + 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, + 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, + 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, + 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, + 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, + 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, + 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, + 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, + 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, + 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, + 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, + 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, + 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) + let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) + completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + } } } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift index 255b638f27..3a76a904d7 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/ReadPodStatusView.swift @@ -9,68 +9,16 @@ import SwiftUI import LoopKit -private func podStatusString(status: DetailedStatus) -> String { - var result, str: String - - let formatter = DateComponentsFormatter() - formatter.unitsStyle = .full - formatter.allowedUnits = [.hour, .minute] - formatter.unitsStyle = .short - if let timeStr = formatter.string(from: status.timeActive) { - str = timeStr - } else { - str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) - } - result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) - - result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) - - result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) - - result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) - - result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) - - result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) - - result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) - - result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) - - if status.radioRSSI != 0 { - result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) - result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) - } - - if status.faultEventCode.faultType != .noFaults { - // report the additional fault related information in a separate section - result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) - result += String(format: "\n%1$@", status.faultEventCode.faultDescription) - if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, - let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) - { - result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) - } - if let errorEventInfo = status.errorEventInfo { - result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) - result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) - result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) - result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) - result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) - } - if let pdmRef = status.pdmRef { - result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) - } - } - - return result -} struct ReadPodStatusView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + + private let title = LocalizedString("Read Pod Status", comment: "navigation title for read pod status") + private let actionString = LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + private let failedString = LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status") @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -78,10 +26,6 @@ struct ReadPodStatusView: View { @State private var executing: Bool = false @State private var showActivityView: Bool = false - init(toRun: @escaping (_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -114,7 +58,7 @@ struct ReadPodStatusView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Read Pod Status", comment: "navigation title for read pod status")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -127,6 +71,7 @@ struct ReadPodStatusView: View { executing = true self.displayString = "" toRun?() { (result) in + executing = false switch result { case .success(let detailedStatus): self.displayString = podStatusString(status: detailedStatus) @@ -134,27 +79,83 @@ struct ReadPodStatusView: View { self.error = error self.alertIsPresented = true } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + return actionString } else { - return LocalizedString("Read Pod Status", comment: "button title to read pod status") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } } +private func podStatusString(status: DetailedStatus) -> String { + var result, str: String + + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .full + formatter.allowedUnits = [.hour, .minute] + formatter.unitsStyle = .short + if let timeStr = formatter.string(from: status.timeActive) { + str = timeStr + } else { + str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) + } + result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) + + result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) + + result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) + + result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) + + result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) + + result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) + + result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) + + result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) + + if status.radioRSSI != 0 { + result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) + result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) + } + + if status.faultEventCode.faultType != .noFaults { + // report the additional fault related information in a separate section + result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) + result += String(format: "\n%1$@", status.faultEventCode.faultDescription) + if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, + let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) + { + result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) + } + if let errorEventInfo = status.errorEventInfo { + result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) + result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) + result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) + result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) + result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) + } + if let pdmRef = status.pdmRef { + result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) + } + } + + return result +} + struct ReadPodStatusView_Previews: PreviewProvider { static var previews: some View { NavigationView { @@ -164,4 +165,4 @@ struct ReadPodStatusView_Previews: PreviewProvider { } } } - } +} diff --git a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj index 62051ea904..28d9018c3a 100644 --- a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj +++ b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj @@ -25,7 +25,7 @@ C12401BB29C7D8E900B32844 /* TempBasalExtraCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018129C7D8E900B32844 /* TempBasalExtraCommand.swift */; }; C12401BC29C7D8E900B32844 /* DeactivatePodCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018229C7D8E900B32844 /* DeactivatePodCommand.swift */; }; C12401BD29C7D8E900B32844 /* AcknowledgeAlertCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018329C7D8E900B32844 /* AcknowledgeAlertCommand.swift */; }; - C12401BE29C7D8E900B32844 /* PodInfoConfiguredAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018429C7D8E900B32844 /* PodInfoConfiguredAlerts.swift */; }; + C12401BE29C7D8E900B32844 /* PodInfoTriggeredAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018429C7D8E900B32844 /* PodInfoTriggeredAlerts.swift */; }; C12401BF29C7D8E900B32844 /* MessageBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018529C7D8E900B32844 /* MessageBlock.swift */; }; C12401C029C7D8E900B32844 /* PlaceholderMessageBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018629C7D8E900B32844 /* PlaceholderMessageBlock.swift */; }; C12401C129C7D8E900B32844 /* PodInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C124018729C7D8E900B32844 /* PodInfo.swift */; }; @@ -162,9 +162,10 @@ D845A1482AF8A4E400EA0853 /* FirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1472AF8A4E400EA0853 /* FirstAppear.swift */; }; D845A14A2AF8A4EF00EA0853 /* PlayTestBeepsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */; }; D845A14E2AF8A4FB00EA0853 /* ReadPodStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */; }; - D845A14F2AF8A4FB00EA0853 /* ReadPulseLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */; }; D845A1502AF8A4FB00EA0853 /* PumpManagerDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */; }; D845A1522AF8A51000EA0853 /* SilencePodSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */; }; + D85AEAC82B1403C000081044 /* PodDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEAC72B1403C000081044 /* PodDiagnostics.swift */; }; + D85AEACA2B1403CB00081044 /* ReadPodInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEAC92B1403CB00081044 /* ReadPodInfoView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -236,7 +237,7 @@ C124018129C7D8E900B32844 /* TempBasalExtraCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempBasalExtraCommand.swift; sourceTree = ""; }; C124018229C7D8E900B32844 /* DeactivatePodCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeactivatePodCommand.swift; sourceTree = ""; }; C124018329C7D8E900B32844 /* AcknowledgeAlertCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgeAlertCommand.swift; sourceTree = ""; }; - C124018429C7D8E900B32844 /* PodInfoConfiguredAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfoConfiguredAlerts.swift; sourceTree = ""; }; + C124018429C7D8E900B32844 /* PodInfoTriggeredAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfoTriggeredAlerts.swift; sourceTree = ""; }; C124018529C7D8E900B32844 /* MessageBlock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageBlock.swift; sourceTree = ""; }; C124018629C7D8E900B32844 /* PlaceholderMessageBlock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaceholderMessageBlock.swift; sourceTree = ""; }; C124018729C7D8E900B32844 /* PodInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodInfo.swift; sourceTree = ""; }; @@ -415,9 +416,10 @@ D845A1472AF8A4E400EA0853 /* FirstAppear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstAppear.swift; sourceTree = ""; }; D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayTestBeepsView.swift; sourceTree = ""; }; D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodStatusView.swift; sourceTree = ""; }; - D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPulseLogView.swift; sourceTree = ""; }; D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PumpManagerDetailsView.swift; sourceTree = ""; }; D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodSelectionView.swift; sourceTree = ""; }; + D85AEAC72B1403C000081044 /* PodDiagnostics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PodDiagnostics.swift; sourceTree = ""; }; + D85AEAC92B1403CB00081044 /* ReadPodInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadPodInfoView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -564,31 +566,31 @@ C124017D29C7D8E900B32844 /* MessageBlocks */ = { isa = PBXGroup; children = ( - C124017E29C7D8E900B32844 /* PodInfoPulseLog.swift */, - C124017F29C7D8E900B32844 /* VersionResponse.swift */, - C124018029C7D8E900B32844 /* PodInfoActivationTime.swift */, - C124018129C7D8E900B32844 /* TempBasalExtraCommand.swift */, - C124018229C7D8E900B32844 /* DeactivatePodCommand.swift */, C124018329C7D8E900B32844 /* AcknowledgeAlertCommand.swift */, - C124018429C7D8E900B32844 /* PodInfoConfiguredAlerts.swift */, - C124018529C7D8E900B32844 /* MessageBlock.swift */, - C124018629C7D8E900B32844 /* PlaceholderMessageBlock.swift */, - C124018729C7D8E900B32844 /* PodInfo.swift */, - C124018829C7D8E900B32844 /* BolusExtraCommand.swift */, - C124018929C7D8E900B32844 /* FaultConfigCommand.swift */, - C124018A29C7D8E900B32844 /* PodInfoPulseLogPlus.swift */, - C124018B29C7D8E900B32844 /* StatusResponse.swift */, - C124018C29C7D8E900B32844 /* GetStatusCommand.swift */, - C124018D29C7D8E900B32844 /* BasalScheduleExtraCommand.swift */, - C124018E29C7D8E900B32844 /* CancelDeliveryCommand.swift */, C124018F29C7D8E900B32844 /* AssignAddressCommand.swift */, + C124018D29C7D8E900B32844 /* BasalScheduleExtraCommand.swift */, C124019029C7D8E900B32844 /* BeepConfigCommand.swift */, - C124019129C7D8E900B32844 /* ErrorResponse.swift */, - C124019229C7D8E900B32844 /* SetupPodCommand.swift */, + C124018829C7D8E900B32844 /* BolusExtraCommand.swift */, + C124018E29C7D8E900B32844 /* CancelDeliveryCommand.swift */, + C124019629C7D8E900B32844 /* ConfigureAlertsCommand.swift */, + C124018229C7D8E900B32844 /* DeactivatePodCommand.swift */, C124019329C7D8E900B32844 /* DetailedStatus.swift */, + C124019129C7D8E900B32844 /* ErrorResponse.swift */, + C124018929C7D8E900B32844 /* FaultConfigCommand.swift */, + C124018C29C7D8E900B32844 /* GetStatusCommand.swift */, + C124018629C7D8E900B32844 /* PlaceholderMessageBlock.swift */, + C124018529C7D8E900B32844 /* MessageBlock.swift */, + C124018729C7D8E900B32844 /* PodInfo.swift */, + C124018029C7D8E900B32844 /* PodInfoActivationTime.swift */, + C124017E29C7D8E900B32844 /* PodInfoPulseLog.swift */, + C124018A29C7D8E900B32844 /* PodInfoPulseLogPlus.swift */, C124019429C7D8E900B32844 /* PodInfoResponse.swift */, + C124018429C7D8E900B32844 /* PodInfoTriggeredAlerts.swift */, C124019529C7D8E900B32844 /* SetInsulinScheduleCommand.swift */, - C124019629C7D8E900B32844 /* ConfigureAlertsCommand.swift */, + C124019229C7D8E900B32844 /* SetupPodCommand.swift */, + C124018B29C7D8E900B32844 /* StatusResponse.swift */, + C124018129C7D8E900B32844 /* TempBasalExtraCommand.swift */, + C124017F29C7D8E900B32844 /* VersionResponse.swift */, ); path = MessageBlocks; sourceTree = ""; @@ -722,11 +724,12 @@ C124024329C7DA9700B32844 /* PairPodView.swift */, D845A1492AF8A4EF00EA0853 /* PlayTestBeepsView.swift */, C124024829C7DA9700B32844 /* PodDetailsView.swift */, + D85AEAC72B1403C000081044 /* PodDiagnostics.swift */, C124022E29C7DA9700B32844 /* PodLifeHUDView.swift */, C124024129C7DA9700B32844 /* PodSetupView.swift */, D845A14D2AF8A4FB00EA0853 /* PumpManagerDetailsView.swift */, + D85AEAC92B1403CB00081044 /* ReadPodInfoView.swift */, D845A14B2AF8A4FB00EA0853 /* ReadPodStatusView.swift */, - D845A14C2AF8A4FB00EA0853 /* ReadPulseLogView.swift */, C124023729C7DA9700B32844 /* RileyLinkSetupView.swift */, C124024729C7DA9700B32844 /* ScheduledExpirationReminderEditView.swift */, C124023829C7DA9700B32844 /* SetupCompleteView.swift */, @@ -1081,7 +1084,7 @@ C12401D429C7D8E900B32844 /* BeepPreference.swift in Sources */, C12401B829C7D8E900B32844 /* PodInfoPulseLog.swift in Sources */, D845A1352AF89DEC00EA0853 /* SilencePodPreference.swift in Sources */, - C12401BE29C7D8E900B32844 /* PodInfoConfiguredAlerts.swift in Sources */, + C12401BE29C7D8E900B32844 /* PodInfoTriggeredAlerts.swift in Sources */, C12401E529C7D8E900B32844 /* PodCommsSession.swift in Sources */, C12401DE29C7D8E900B32844 /* CRC16.swift in Sources */, C12401C729C7D8E900B32844 /* BasalScheduleExtraCommand.swift in Sources */, @@ -1127,7 +1130,6 @@ C124028B29C7DA9700B32844 /* BeepPreferenceSelectionView.swift in Sources */, C12EDA1429C7DFBF00435701 /* TimeInterval.swift in Sources */, C124028D29C7DA9700B32844 /* AttachPodView.swift in Sources */, - D845A14F2AF8A4FB00EA0853 /* ReadPulseLogView.swift in Sources */, C124027229C7DA9700B32844 /* DeactivatePodViewModel.swift in Sources */, C124028C29C7DA9700B32844 /* ExpirationReminderSetupView.swift in Sources */, D845A1462AF8A4DA00EA0853 /* ActivityView.swift in Sources */, @@ -1165,6 +1167,7 @@ D845A14A2AF8A4EF00EA0853 /* PlayTestBeepsView.swift in Sources */, C124026F29C7DA9700B32844 /* PairPodViewModel.swift in Sources */, C124026E29C7DA9700B32844 /* FrameworkLocalText.swift in Sources */, + D85AEAC82B1403C000081044 /* PodDiagnostics.swift in Sources */, C124028F29C7DA9700B32844 /* PodDetailsView.swift in Sources */, C124028629C7DA9700B32844 /* NotificationSettingsView.swift in Sources */, C124027D29C7DA9700B32844 /* InsertCannulaView.swift in Sources */, @@ -1177,6 +1180,7 @@ C124027B29C7DA9700B32844 /* ErrorView.swift in Sources */, C124028829C7DA9700B32844 /* PodSetupView.swift in Sources */, C124027F29C7DA9700B32844 /* SetupCompleteView.swift in Sources */, + D85AEACA2B1403CB00081044 /* ReadPodInfoView.swift in Sources */, C124029429C7DA9700B32844 /* TimeView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift index 687fbc5aee..25660bd1cb 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/DetailedStatus.swift @@ -168,7 +168,7 @@ extension TimeInterval { if hours != 0 { str += String(format: "%uh", hours) } - if minutes != 0 || hours != 0 { + if minutes != 0 { str += String(format: "%um", minutes) } if seconds != 0 || str.isEmpty { diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfo.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfo.swift index ceb2bfeb8d..b3a607191f 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfo.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfo.swift @@ -17,10 +17,10 @@ public protocol PodInfo { public enum PodInfoResponseSubType: UInt8, Equatable { case normal = 0x00 - case configuredAlerts = 0x01 // Returns information on configured alerts - case detailedStatus = 0x02 // Returned on any pod fault + case triggeredAlerts = 0x01 // Returns values for any unacknowledged triggered alerts + case detailedStatus = 0x02 // Returns detailed pod status, returned for most calls after a pod fault case pulseLogPlus = 0x03 // Returns up to the last 60 pulse log entries plus additional info - case activationTime = 0x05 // Returns activation date, elapsed time, and fault code + case activationTime = 0x05 // Returns pod activation time and possible fault code & fault time case pulseLogRecent = 0x50 // Returns the last 50 pulse log entries case pulseLogPrevious = 0x51 // Like 0x50, but returns up to the previous 50 entries before the last 50 @@ -28,8 +28,8 @@ public enum PodInfoResponseSubType: UInt8, Equatable { switch self { case .normal: return StatusResponse.self as! PodInfo.Type - case .configuredAlerts: - return PodInfoConfiguredAlerts.self + case .triggeredAlerts: + return PodInfoTriggeredAlerts.self case .detailedStatus: return DetailedStatus.self case .pulseLogPlus: diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift index cbd2ea2f7a..5d60c78244 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift @@ -8,7 +8,7 @@ import Foundation -// Type 5 PodInfo returns the pod activation time, time pod alive, and the possible fault code +// Type 5 PodInfo returns the pod activation time and possible fault code & fault time public struct PodInfoActivationTime : PodInfo { // OFF 1 2 3 4 5 6 7 8 9 10111213 1415161718 // DATA 0 1 2 3 4 5 6 7 8 9 1011 1213141516 @@ -16,8 +16,12 @@ public struct PodInfoActivationTime : PodInfo { public let podInfoType: PodInfoResponseSubType = .activationTime public let faultEventCode: FaultEventCode - public let timeActivation: TimeInterval - public let dateTime: DateComponents + public let faultTime: TimeInterval + public let year: Int + public let month: Int + public let day: Int + public let hour: Int + public let minute: Int public let data: Data public init(encodedData: Data) throws { @@ -25,22 +29,29 @@ public struct PodInfoActivationTime : PodInfo { throw MessageBlockError.notEnoughData } self.faultEventCode = FaultEventCode(rawValue: encodedData[1]) - self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[2] & 0b1) << 8) + Int(encodedData[3]))) - self.dateTime = DateComponents(encodedDateTime: encodedData.subdata(in: 12..<17)) + self.faultTime = TimeInterval(minutes: Double((Int(encodedData[2]) << 8) + Int(encodedData[3]))) + self.year = Int(encodedData[14]) + self.month = Int(encodedData[12]) + self.day = Int(encodedData[13]) + self.hour = Int(encodedData[15]) + self.minute = Int(encodedData[16]) self.data = Data(encodedData) } } -extension DateComponents { - init(encodedDateTime: Data) { - self.init() - - year = Int(encodedDateTime[2]) + 2000 - month = Int(encodedDateTime[0]) - day = Int(encodedDateTime[1]) - hour = Int(encodedDateTime[3]) - minute = Int(encodedDateTime[4]) - - calendar = Calendar(identifier: .gregorian) - } +func activationTimeString(podInfoActivationTime: PodInfoActivationTime) -> String { + var result: [String] = [] + + // activation time info + result.append(String(format: "Year: %u", podInfoActivationTime.year)) + result.append(String(format: "Month: %u", podInfoActivationTime.month)) + result.append(String(format: "Day: %u", podInfoActivationTime.day)) + result.append(String(format: "Hour: %u", podInfoActivationTime.hour)) + result.append(String(format: "Minute: %u", podInfoActivationTime.minute)) + + // pod fault info + result.append(String(format: "\n%@", String(describing: podInfoActivationTime.faultEventCode))) + result.append(String(format: "Fault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + + return result.joined(separator: "\n") } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift deleted file mode 100644 index 918640fd4b..0000000000 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoConfiguredAlerts.swift +++ /dev/null @@ -1,55 +0,0 @@ -// -// PodInfoConfiguredAlerts.swift -// OmniKit -// -// Created by Eelke Jager on 16/09/2018. -// Copyright © 2018 Pete Schwamb. All rights reserved. -// - -import Foundation - -// Type 1 Pod Info returns information about the currently configured alerts -public struct PodInfoConfiguredAlerts : PodInfo { - // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 - // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 - // 02 13 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV - - public let podInfoType : PodInfoResponseSubType = .configuredAlerts - public let word_278 : Data - public let alertsActivations : [AlertActivation] - public let data : Data - - public struct AlertActivation { - let beepType: BeepType - let unitsLeft: Double - let timeFromPodStart: UInt8 - - public init(beepType: BeepType, timeFromPodStart: UInt8, unitsLeft: Double) { - self.beepType = beepType - self.timeFromPodStart = timeFromPodStart - self.unitsLeft = unitsLeft - } - } - - public init(encodedData: Data) throws { - guard encodedData.count >= 11 else { - throw MessageBlockError.notEnoughData - } - - self.word_278 = encodedData[1...2] - - let numAlertTypes = 8 - let beepType = BeepType.self - - var activations = [AlertActivation]() - - for alarmType in (0.. String { - var str: String = "Pulse eeeeee0a pppliiib cccccccc dfgggggg" + var result: [String] = ["Pulse eeeeee0a pppliiib cccccccc dfgggggg"] var index = pulseLogEntries.count - 1 var pulseNumber = lastPulseNumber while index >= 0 { - str += String(format: "\n%04d:", pulseNumber) + UInt32(pulseLogEntries[index]).binaryDescription + result.append(String(format: "%04d:%@", pulseNumber, UInt32(pulseLogEntries[index]).binaryDescription)) index -= 1 pulseNumber -= 1 } - return str + return result.joined(separator: "\n") } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift index 27f2cd7097..ff7837c3d8 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift @@ -49,3 +49,16 @@ public struct PodInfoPulseLogPlus : PodInfo { self.data = encodedData } } + +func pulseLogPlusString(podInfoPulseLogPlus: PodInfoPulseLogPlus) -> String { + var result: [String] = [] + + result.append(String(format: "Pod Active: %@", podInfoPulseLogPlus.timeActivation.timeIntervalStr)) + result.append(String(format: "Fault Time: %@", podInfoPulseLogPlus.timeFaultEvent.timeIntervalStr)) + result.append(String(format: "%@\n", String(describing: podInfoPulseLogPlus.faultEventCode))) + + let lastPulseNumber = Int(podInfoPulseLogPlus.nEntries) + result.append(pulseLogString(pulseLogEntries: podInfoPulseLogPlus.pulseLog, lastPulseNumber: lastPulseNumber)) + + return result.joined(separator: "\n") +} diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift new file mode 100644 index 0000000000..fd8a6d4f0f --- /dev/null +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift @@ -0,0 +1,91 @@ +// +// PodInfoTriggeredAlerts.swift +// OmniKit +// +// Created by Eelke Jager on 16/09/2018. +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + +// Type 1 Pod Info returns information about the currently unacknowledged triggered alert values +public struct PodInfoTriggeredAlerts: PodInfo { + // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 + // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 + // 02 13 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV + + public let podInfoType: PodInfoResponseSubType = .triggeredAlerts + public let unknown_word: UInt16 + public let alertsActivations: [AlertActivation] + public let data: Data + + public struct AlertActivation { + let triggeredAlertValue: TriggeredAlertValue + + public init(triggeredAlertValue: TriggeredAlertValue) { + self.triggeredAlertValue = triggeredAlertValue + } + } + + public init(encodedData: Data) throws { + guard encodedData.count >= 11 else { + throw MessageBlockError.notEnoughData + } + + let numAlerts = 8 + var activations = [AlertActivation]() + var i = 3 // starting data index for first VVVV value + for alertNum in (0.. String { + var result: [String] = [] + + for index in podInfoTriggeredAlerts.alertsActivations.indices { + // extract the alert slot debug description for a more helpful display + let description = AlertSlot(rawValue: UInt8(index)).debugDescription + let start = description.index(description.startIndex, offsetBy: 27) + let end = description.index(description.endIndex, offsetBy: -1) + let range = start..) -> Void) { - // use hasSetupPod to be able to read the pulse log from a faulted Pod + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod guard self.hasSetupPod else { completion(.failure(OmnipodPumpManagerError.noPodPaired)) return @@ -1210,6 +1210,90 @@ extension OmnipodPumpManager { } } + public func readPulseLogPlus(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmnipodPumpManagerError.noPodPaired)) + return + } + guard state.podState?.isFaulted == true || state.podState?.unfinalizedBolus?.scheduledCertainty == .uncertain || state.podState?.unfinalizedBolus?.isFinished() != false else + { + self.log.info("Skipping Read Pulse Log Plus due to bolus still in progress.") + completion(.failure(PodCommsError.unfinalizedBolus)) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + podComms.runSession(withName: "Read Pulse Log Plus", using: rileyLinkSelector) { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .bipBeeeeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .pulseLogPlus, beepBlock: beepBlock) + let podInfoPulseLogPlus = podInfoResponse.podInfo as! PodInfoPulseLogPlus + let str = pulseLogPlusString(podInfoPulseLogPlus: podInfoPulseLogPlus) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + + public func readActivationTime(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmnipodPumpManagerError.noPodPaired)) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + podComms.runSession(withName: "Read Activation Time", using: rileyLinkSelector) { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .beepBeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .activationTime, beepBlock: beepBlock) + let podInfoActivationTime = podInfoResponse.podInfo as! PodInfoActivationTime + let str = activationTimeString(podInfoActivationTime: podInfoActivationTime) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + + public func readTriggeredAlerts(completion: @escaping (Result) -> Void) { + // use hasSetupPod here instead of hasActivePod as PodInfo can be read with a faulted Pod + guard self.hasSetupPod else { + completion(.failure(OmnipodPumpManagerError.noPodPaired)) + return + } + + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice + podComms.runSession(withName: "Read Triggered Alerts", using: rileyLinkSelector) { (result) in + do { + switch result { + case .success(let session): + let beepBlock = self.beepMessageBlock(beepType: .beepBeep) + let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .triggeredAlerts, beepBlock: beepBlock) + let podInfoTriggeredAlerts = podInfoResponse.podInfo as! PodInfoTriggeredAlerts + let str = triggeredAlertsString(podInfoTriggeredAlerts: podInfoTriggeredAlerts) + completion(.success(str)) + case .failure(let error): + throw error + } + } catch let error { + completion(.failure(error)) + } + } + } + public func setConfirmationBeeps(newPreference: BeepPreference, completion: @escaping (OmnipodPumpManagerError?) -> Void) { // If there isn't an active pod or the pod is currently silenced, @@ -1307,10 +1391,10 @@ extension OmnipodPumpManager { let podAlerts = regeneratePodAlerts(silent: silencePod, configuredAlerts: configuredAlerts, activeAlertSlots: activeAlertSlots, currentPodTime: self.podTime, currentReservoirLevel: reservoirLevel) do { // Since non-responsive pod comms are currently only resolved for insulin related commands, - // it's possible that a previous pod alert was successfully configured will lose its response - // and thus the alert won't get reset when reconfiguring pod alerts with a new silence pod state. - // So acknowledge all alerts now to be absolutely sure that no triggered alert will be forgotten. - try session.configureAlerts(podAlerts, acknowledgeAll: true, beepBlock: beepBlock) + // it's possible that a response from a previous successful pod alert configuration can be lost + // and thus the alert won't get reset here when reconfiguring pod alerts with a new silence pod state. + let acknowledgeAll = true // protect against lost alert configuration response related issues + try session.configureAlerts(podAlerts, acknowledgeAll: acknowledgeAll, beepBlock: beepBlock) self.setState { (state) in state.silencePod = silencePod } @@ -2311,7 +2395,7 @@ extension OmnipodPumpManager { } for alert in state.activeAlerts { - if alert.alertIdentifier == alertIdentifier { + if alert.alertIdentifier == alertIdentifier || alert.repeatingAlertIdentifier == alertIdentifier { // If this alert was triggered by the pod find the slot to clear it. if let slot = alert.triggeringSlot { if case .some(.suspended) = self.state.podState?.suspendState, slot == .slot6SuspendTimeExpired { diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift index 0a91c9cbaf..82944b4ea2 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/OmnipodSettingsViewModel.swift @@ -348,6 +348,10 @@ class OmnipodSettingsViewModel: ObservableObject { } } + func playTestBeeps(_ completion: @escaping (Error?) -> Void) { + pumpManager.playTestBeeps(completion: completion) + } + func readPulseLog(_ completion: @escaping (_ result: Result) -> Void) { pumpManager.readPulseLog() { (result) in DispatchQueue.main.async { @@ -356,8 +360,28 @@ class OmnipodSettingsViewModel: ObservableObject { } } - func playTestBeeps(_ completion: @escaping (Error?) -> Void) { - pumpManager.playTestBeeps(completion: completion) + func readPulseLogPlus(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readPulseLogPlus() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readActivationTime(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readActivationTime() { (result) in + DispatchQueue.main.async { + completion(result) + } + } + } + + func readTriggeredAlerts(_ completion: @escaping (_ result: Result) -> Void) { + pumpManager.readTriggeredAlerts() { (result) in + DispatchQueue.main.async { + completion(result) + } + } } func pumpManagerDetails(_ completion: @escaping (_ result: String) -> Void) { diff --git a/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift index bc105972b4..804c037f04 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/OmnipodSettingsView.swift @@ -403,7 +403,8 @@ struct OmnipodSettingsView: View { if let podDetails = self.viewModel.podDetails { NavigationLink(destination: PodDetailsView(podDetails: podDetails, title: LocalizedString("Pod Details", comment: "title for pod details page"))) { - FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row").foregroundColor(Color.primary) + FrameworkLocalText("Pod Details", comment: "Text for pod details disclosure row") + .foregroundColor(Color.primary) } } else { HStack { @@ -416,7 +417,8 @@ struct OmnipodSettingsView: View { if let previousPodDetails = viewModel.previousPodDetails { NavigationLink(destination: PodDetailsView(podDetails: previousPodDetails, title: LocalizedString("Previous Pod", comment: "title for previous pod page"))) { - FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row").foregroundColor(Color.primary) + FrameworkLocalText("Previous Pod Details", comment: "Text for previous pod details row") + .foregroundColor(Color.primary) } } else { HStack { @@ -453,7 +455,8 @@ struct OmnipodSettingsView: View { } NavigationLink(destination: BeepPreferenceSelectionView(initialValue: viewModel.beepPreference, onSave: viewModel.setConfirmationBeeps)) { HStack { - FrameworkLocalText("Confidence Reminders", comment: "Text for confidence reminders navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Confidence Reminders", comment: "Text for confidence reminders navigation link") + .foregroundColor(Color.primary) Spacer() Text(viewModel.beepPreference.title) .foregroundColor(.secondary) @@ -461,7 +464,8 @@ struct OmnipodSettingsView: View { } NavigationLink(destination: SilencePodSelectionView(initialValue: viewModel.silencePodPreference, onSave: viewModel.setSilencePod)) { HStack { - FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link").foregroundColor(Color.primary) + FrameworkLocalText("Silence Pod", comment: "Text for silence pod navigation link") + .foregroundColor(Color.primary) Spacer() Text(viewModel.silencePodPreference.title) .foregroundColor(.secondary) @@ -509,21 +513,13 @@ struct OmnipodSettingsView: View { } } - Section(header: SectionHeader(label: LocalizedString("Diagnostics", comment: "Section header for diagnostic section"))) { - NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { - FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link").foregroundColor(Color.primary) - } - .disabled(self.viewModel.noPod) - NavigationLink(destination: ReadPulseLogView(toRun: viewModel.readPulseLog)) { - FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link").foregroundColor(Color.primary) - } - .disabled(self.viewModel.noPod) - NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { - FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link").foregroundColor(Color.primary) - } - .disabled(!self.viewModel.podOk) - NavigationLink(destination: PumpManagerDetailsView(toRun: viewModel.pumpManagerDetails)) { - FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link").foregroundColor(Color.primary) + Section() { + NavigationLink(destination: PodDiagnosticsView( + title: LocalizedString("Pod Diagnostics", comment: "Title for the pod diagnostic view"), + viewModel: viewModel)) + { + FrameworkLocalText("Pod Diagnostics", comment: "Text for pod diagnostics row") + .foregroundColor(Color.primary) } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift index bf8dac01dd..f544654522 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/PlayTestBeepsView.swift @@ -14,7 +14,11 @@ struct PlayTestBeepsView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: Error?) -> Void) -> Void)? + + private let title = LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps") + private let actionString = LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + private let failedString: String = LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps") @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -23,10 +27,6 @@ struct PlayTestBeepsView: View { @State private var executing: Bool = false @State private var showActivityView = false - init(toRun: @escaping (_ completion: @escaping (_ result: Error?) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -48,7 +48,7 @@ struct PlayTestBeepsView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Play Test Beeps", comment: "navigation title for play test beeps")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -61,6 +61,7 @@ struct PlayTestBeepsView: View { executing = true self.displayString = "" toRun?() { (error) in + executing = false if let error = error { self.displayString = "" self.error = error @@ -68,22 +69,21 @@ struct PlayTestBeepsView: View { } else { self.displayString = successMessage } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Playing Test Beeps...", comment: "button title when executing play test beeps") + return actionString } else { - return LocalizedString("Play Test Beeps", comment: "button title to play test beeps") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to play test beeps.", comment: "Alert title for error when playing test beeps")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PodDiagnostics.swift b/Dependencies/OmniKit/OmniKitUI/Views/PodDiagnostics.swift new file mode 100644 index 0000000000..7331a0e1ed --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Views/PodDiagnostics.swift @@ -0,0 +1,90 @@ +// +// PodDiagnotics.swift +// OmniKit +// +// Created by Joseph Moran on 11/25/23. +// Copyright © 2023 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI +import HealthKit +import OmniKit + + +struct PodDiagnosticsView: View { + + var title: String + + @ObservedObject var viewModel: OmnipodSettingsViewModel + + var body: some View { + List { + NavigationLink(destination: ReadPodStatusView(toRun: viewModel.readPodStatus)) { + FrameworkLocalText("Read Pod Status", comment: "Text for read pod status navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: PlayTestBeepsView(toRun: viewModel.playTestBeeps)) { + FrameworkLocalText("Play Test Beeps", comment: "Text for play test beeps navigation link") + .foregroundColor(Color.primary) + } + .disabled(!self.viewModel.podOk) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Pulse Log", comment: "Text for read pulse log title"), + actionString: LocalizedString("Reading Pulse Log...", comment: "Text for read pulse log action"), + failedString: LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log"), + toRun: viewModel.readPulseLog)) + { + FrameworkLocalText("Read Pulse Log", comment: "Text for read pulse log navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Pulse Log Plus", comment: "Text for read pulse log plus title"), + actionString: LocalizedString("Reading Pulse Log Plus...", comment: "Text for read pulse log plus action"), + failedString: LocalizedString("Failed to read pulse log plus.", comment: "Alert title for error when reading pulse log plus"), + toRun: viewModel.readPulseLogPlus)) + { + FrameworkLocalText("Read Pulse Log Plus", comment: "Text for read pulse log plus navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Activation Time", comment: "Text for read activation time title"), + actionString: LocalizedString("Reading Activation Time...", comment: "Text for read activation time action"), + failedString: LocalizedString("Failed to read activation time.", comment: "Alert title for error when reading activation time"), + toRun: self.viewModel.readActivationTime)) + { + FrameworkLocalText("Read Activation Time", comment: "Text for read activation time navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: ReadPodInfoView( + title: LocalizedString("Read Triggered Alerts", comment: "Text for read triggered alerts title"), + actionString: LocalizedString("Reading Triggered Alerts...", comment: "Text for read triggered alerts action"), + failedString: LocalizedString("Failed to read triggered alerts.", comment: "Alert title for error when reading triggered alerts"), + toRun: self.viewModel.readTriggeredAlerts)) + { + FrameworkLocalText("Read Triggered Alerts", comment: "Text for read triggered alerts navigation link") + .foregroundColor(Color.primary) + } + .disabled(self.viewModel.noPod) + + NavigationLink(destination: PumpManagerDetailsView( + toRun: self.viewModel.pumpManagerDetails)) + { + FrameworkLocalText("Pump Manager Details", comment: "Text for pump manager details navigation link") + .foregroundColor(Color.primary) + } + } + .insetGroupedListStyle() + .navigationBarTitle(title) + } +} diff --git a/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift b/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift index 805bbd876c..206de32944 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/PumpManagerDetailsView.swift @@ -14,7 +14,11 @@ struct PumpManagerDetailsView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: String) -> Void) -> Void)? + + private let title = LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details") + private let actionString = LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + private let buttonTitle = LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") @State private var displayString: String = "" @State private var error: Error? = nil @@ -61,7 +65,7 @@ struct PumpManagerDetailsView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Pump Manager Details", comment: "navigation title for pump manager details")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .onFirstAppear { asyncAction() @@ -81,9 +85,9 @@ struct PumpManagerDetailsView: View { private var buttonText: String { if executing { - return LocalizedString("Retrieving Pump Manager Details...", comment: "button title when retrieving pump manager details") + return actionString } else { - return LocalizedString("Refresh Pump Manager Details", comment: "button title to refresh pump manager details") + return buttonTitle } } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodInfoView.swift similarity index 50% rename from Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift rename to Dependencies/OmniKit/OmniKitUI/Views/ReadPodInfoView.swift index acaa00d568..62db6f21f2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/ReadPulseLogView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodInfoView.swift @@ -1,8 +1,8 @@ // -// ReadPulseLogView.swift +// ReadPodInfoView.swift // OmniKit // -// Created by Joe Moran on 9/1/23. +// Created by Joe Moran on 11/25/23. // Copyright © 2023 LoopKit Authors. All rights reserved. // @@ -10,11 +10,16 @@ import SwiftUI import LoopKit import OmniKit -struct ReadPulseLogView: View { + +struct ReadPodInfoView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? + var title: String // e.g., "Read Pulse Log" + var actionString: String // e.g., "Reading Pulse Log..." + var failedString: String // e.g., "Failed to read pulse log." + + var toRun: ((_ completion: @escaping (_ result: Result) -> Void) -> Void)? @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -22,10 +27,6 @@ struct ReadPulseLogView: View { @State private var executing: Bool = false @State private var showActivityView: Bool = false - init(toRun: @escaping (_ completion: @escaping (_ result: Result) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -62,7 +63,7 @@ struct ReadPulseLogView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Read Pulse Log", comment: "navigation title for read pulse log")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -75,54 +76,60 @@ struct ReadPulseLogView: View { executing = true self.displayString = "" toRun?() { (result) in + executing = false switch result { - case .success(let pulseLogString): - self.displayString = pulseLogString + case .success(let resultString): + self.displayString = resultString case .failure(let error): self.displayString = "" self.error = error self.alertIsPresented = true } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Reading Pulse Log...", comment: "button title when executing read pulse log") + return actionString } else { - return LocalizedString("Read Pulse Log", comment: "button title to read pulse log") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to read pulse log.", comment: "Alert title for error when reading pulse log")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } } -struct ReadPulsePodLogView_Previews: PreviewProvider { +struct ReadPodInfoView_Previews: PreviewProvider { static var previews: some View { - ReadPulseLogView() { completion in - let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, - 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, - 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, - 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, - 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, - 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, - 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, - 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, - 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, - 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, - 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, - 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, - 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, - 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) - let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) - completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + NavigationView { + ReadPodInfoView( + title: "Read Pulse Log", + actionString: "Reading Pulse Log...", + failedString: "Failed to read pulse log" + ) { completion in + let podInfoPulseLogRecent = try! PodInfoPulseLogRecent(encodedData: Data([0x50, 0x03, 0x17, + 0x39, 0x72, 0x58, 0x01, 0x3c, 0x72, 0x43, 0x01, 0x41, 0x72, 0x5a, 0x01, 0x44, 0x71, 0x47, 0x01, + 0x49, 0x51, 0x59, 0x01, 0x4c, 0x51, 0x44, 0x01, 0x51, 0x73, 0x59, 0x01, 0x54, 0x50, 0x43, 0x01, + 0x59, 0x50, 0x5a, 0x81, 0x5c, 0x51, 0x42, 0x81, 0x61, 0x73, 0x59, 0x81, 0x00, 0x75, 0x43, 0x80, + 0x05, 0x70, 0x5a, 0x80, 0x08, 0x50, 0x44, 0x80, 0x0d, 0x50, 0x5b, 0x80, 0x10, 0x75, 0x43, 0x80, + 0x15, 0x72, 0x5e, 0x80, 0x18, 0x73, 0x45, 0x80, 0x1d, 0x72, 0x5b, 0x00, 0x20, 0x70, 0x43, 0x00, + 0x25, 0x50, 0x5c, 0x00, 0x28, 0x50, 0x46, 0x00, 0x2d, 0x50, 0x5a, 0x00, 0x30, 0x75, 0x47, 0x00, + 0x35, 0x72, 0x59, 0x00, 0x38, 0x70, 0x46, 0x00, 0x3d, 0x75, 0x57, 0x00, 0x40, 0x72, 0x43, 0x00, + 0x45, 0x73, 0x55, 0x00, 0x48, 0x73, 0x41, 0x00, 0x4d, 0x70, 0x52, 0x00, 0x50, 0x73, 0x3f, 0x00, + 0x55, 0x74, 0x4d, 0x00, 0x58, 0x72, 0x3d, 0x80, 0x5d, 0x73, 0x4d, 0x80, 0x60, 0x71, 0x3d, 0x80, + 0x01, 0x51, 0x50, 0x80, 0x04, 0x72, 0x3d, 0x80, 0x09, 0x50, 0x4e, 0x80, 0x0c, 0x51, 0x40, 0x80, + 0x11, 0x74, 0x50, 0x80, 0x14, 0x71, 0x40, 0x80, 0x19, 0x50, 0x4d, 0x80, 0x1c, 0x75, 0x3f, 0x00, + 0x21, 0x72, 0x52, 0x00, 0x24, 0x72, 0x40, 0x00, 0x29, 0x71, 0x53, 0x00, 0x2c, 0x50, 0x42, 0x00, + 0x31, 0x51, 0x55, 0x00, 0x34, 0x50, 0x42, 0x00 ])) + let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) + completion(.success(pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber))) + } } } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift index cd4226e7cc..f79f78f521 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/ReadPodStatusView.swift @@ -10,68 +10,16 @@ import SwiftUI import LoopKit import OmniKit -private func podStatusString(status: DetailedStatus) -> String { - var result, str: String - - let formatter = DateComponentsFormatter() - formatter.unitsStyle = .full - formatter.allowedUnits = [.hour, .minute] - formatter.unitsStyle = .short - if let timeStr = formatter.string(from: status.timeActive) { - str = timeStr - } else { - str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) - } - result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) - - result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) - - result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) - - result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) - - result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) - - result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) - - result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) - - result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) - - if status.radioRSSI != 0 { - result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) - result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) - } - - if status.faultEventCode.faultType != .noFaults { - // report the additional fault related information in a separate section - result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) - result += String(format: "\n%1$@", status.faultEventCode.faultDescription) - if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, - let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) - { - result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) - } - if let errorEventInfo = status.errorEventInfo { - result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) - result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) - result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) - result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) - result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) - } - if let pdmRef = status.pdmRef { - result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) - } - } - - return result -} struct ReadPodStatusView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @Environment(\.presentationMode) var presentationMode: Binding - private var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + var toRun: ((_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void)? + + private let title = LocalizedString("Read Pod Status", comment: "navigation title for read pod status") + private let actionString = LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + private let failedString = LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status") @State private var alertIsPresented: Bool = false @State private var displayString: String = "" @@ -79,10 +27,6 @@ struct ReadPodStatusView: View { @State private var executing: Bool = false @State private var showActivityView: Bool = false - init(toRun: @escaping (_ completion: @escaping (_ result: PumpManagerResult) -> Void) -> Void) { - self.toRun = toRun - } - var body: some View { VStack { List { @@ -115,7 +59,7 @@ struct ReadPodStatusView: View { .background(Color(UIColor.secondarySystemGroupedBackground).shadow(radius: 5)) } .insetGroupedListStyle() - .navigationTitle(LocalizedString("Read Pod Status", comment: "navigation title for read pod status")) + .navigationTitle(title) .navigationBarTitleDisplayMode(.inline) .alert(isPresented: $alertIsPresented, content: { alert(error: error) }) .onFirstAppear { @@ -128,6 +72,7 @@ struct ReadPodStatusView: View { executing = true self.displayString = "" toRun?() { (result) in + executing = false switch result { case .success(let detailedStatus): self.displayString = podStatusString(status: detailedStatus) @@ -135,27 +80,83 @@ struct ReadPodStatusView: View { self.error = error self.alertIsPresented = true } - executing = false } } } private var buttonText: String { if executing { - return LocalizedString("Reading Pod Status...", comment: "button title when executing read pod status") + return actionString } else { - return LocalizedString("Read Pod Status", comment: "button title to read pod status") + return title } } private func alert(error: Error?) -> SwiftUI.Alert { return SwiftUI.Alert( - title: Text(LocalizedString("Failed to read pod status.", comment: "Alert title for error when reading pod status")), + title: Text(failedString), message: Text(error?.localizedDescription ?? "No Error") ) } } +private func podStatusString(status: DetailedStatus) -> String { + var result, str: String + + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .full + formatter.allowedUnits = [.hour, .minute] + formatter.unitsStyle = .short + if let timeStr = formatter.string(from: status.timeActive) { + str = timeStr + } else { + str = String(format: LocalizedString("%1$@ minutes", comment: "The format string for minutes (1: number of minutes string)"), String(describing: Int(status.timeActive / 60))) + } + result = String(format: LocalizedString("Pod Active: %1$@", comment: "The format string for Pod Active: (1: formatted time)"), str) + + result += String(format: LocalizedString("\nPod Progress: %1$@", comment: "The format string for Pod Progress: (1: pod progress string)"), String(describing: status.podProgressStatus)) + + result += String(format: LocalizedString("\nDelivery Status: %1$@", comment: "The format string for Delivery Status: (1: delivery status string)"), String(describing: status.deliveryStatus)) + + result += String(format: LocalizedString("\nLast Programming Seq Num: %1$@", comment: "The format string for last programming sequence number: (1: last programming sequence number)"), String(describing: status.lastProgrammingMessageSeqNum)) + + result += String(format: LocalizedString("\nBolus Not Delivered: %1$@ U", comment: "The format string for Bolus Not Delivered: (1: bolus not delivered string)"), status.bolusNotDelivered.twoDecimals) + + result += String(format: LocalizedString("\nPulse Count: %1$d", comment: "The format string for Pulse Count (1: pulse count)"), Int(round(status.totalInsulinDelivered / Pod.pulseSize))) + + result += String(format: LocalizedString("\nReservoir Level: %1$@ U", comment: "The format string for Reservoir Level: (1: reservoir level string)"), status.reservoirLevel == Pod.reservoirLevelAboveThresholdMagicNumber ? "50+" : status.reservoirLevel.twoDecimals) + + result += String(format: LocalizedString("\nAlerts: %1$@", comment: "The format string for Alerts: (1: the alerts string)"), alertSetString(alertSet: status.unacknowledgedAlerts)) + + if status.radioRSSI != 0 { + result += String(format: LocalizedString("\nRSSI: %1$@", comment: "The format string for RSSI: (1: RSSI value)"), String(describing: status.radioRSSI)) + result += String(format: LocalizedString("\nReceiver Low Gain: %1$@", comment: "The format string for receiverLowGain: (1: receiverLowGain)"), String(describing: status.receiverLowGain)) + } + + if status.faultEventCode.faultType != .noFaults { + // report the additional fault related information in a separate section + result += String(format: LocalizedString("\n\n⚠️ Critical Pod Fault %1$03d (0x%2$02X)", comment: "The format string for fault code in decimal and hex: (1: fault code for decimal display) (2: fault code for hex display)"), status.faultEventCode.rawValue, status.faultEventCode.rawValue) + result += String(format: "\n%1$@", status.faultEventCode.faultDescription) + if let faultEventTimeSinceActivation = status.faultEventTimeSinceActivation, + let faultTimeStr = formatter.string(from: faultEventTimeSinceActivation) + { + result += String(format: LocalizedString("\nFault Time: %1$@", comment: "The format string for fault time: (1: fault time string)"), faultTimeStr) + } + if let errorEventInfo = status.errorEventInfo { + result += String(format: LocalizedString("\nFault Event Info: %1$03d (0x%2$02X),", comment: "The format string for fault event info: (1: fault event info)"), errorEventInfo.rawValue, errorEventInfo.rawValue) + result += String(format: LocalizedString("\n Insulin State Table Corrupted: %@", comment: "The format string for insulin state table corrupted: (1: insulin state corrupted)"), String(describing: errorEventInfo.insulinStateTableCorruption)) + result += String(format: LocalizedString("\n Occlusion Type: %1$@", comment: "The format string for occlusion type: (1: occlusion type)"), String(describing: errorEventInfo.occlusionType)) + result += String(format: LocalizedString("\n Immediate Bolus In Progress: %1$@", comment: "The format string for immediate bolus in progress: (1: immediate bolus in progress)"), String(describing: errorEventInfo.immediateBolusInProgress)) + result += String(format: LocalizedString("\n Previous Pod Progress: %1$@", comment: "The format string for previous pod progress: (1: previous pod progress string)"), String(describing: errorEventInfo.podProgressStatus)) + } + if let pdmRef = status.pdmRef { + result += String(format: LocalizedString("\nRef: %@", comment: "The Ref format string (1: pdm ref string)"), pdmRef) + } + } + + return result +} + struct ReadPodStatusView_Previews: PreviewProvider { static var previews: some View { NavigationView { @@ -165,4 +166,4 @@ struct ReadPodStatusView_Previews: PreviewProvider { } } } - } +} From 6363f78b925fcae3d4a7b06f0069d25fa8f58895 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Fri, 1 Dec 2023 07:56:48 +0100 Subject: [PATCH 268/405] Version update --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index f9d093433c..4dc91043a1 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.9 +APP_VERSION = 2.3.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 79f123732c7c475ab092bee125397180dd97b959 Mon Sep 17 00:00:00 2001 From: sethgagnon <597958+sethgagnon@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:11:02 -0500 Subject: [PATCH 269/405] Fastfile changes to support Live Activity (#396) adding in liveactivity identifier forcing xcode 15.0.1 for creating certs --- .github/workflows/add_identifiers.yml | 4 ++-- .github/workflows/create_certs.yml | 4 ++-- fastlane/Fastfile | 14 +++++++++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index e220ee4484..c84dba30aa 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -14,8 +14,8 @@ jobs: runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed - #- name: Select Xcode version - # run: "sudo xcode-select --switch /Applications/Xcode_14.1.app/Contents/Developer" + - name: Select Xcode version + run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" # Checks-out the repo - name: Checkout Repo diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index 948d42e4e9..67db9a2d91 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -15,8 +15,8 @@ jobs: runs-on: macos-13 steps: # Uncomment to manually select Xcode version if needed - #- name: Select Xcode version - # run: "sudo xcode-select --switch /Applications/Xcode_14.1.app/Contents/Developer" + - name: Select Xcode version + run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" # Checks-out the repo - name: Checkout Repo diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 72b74d5996..275e90f0de 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -57,7 +57,8 @@ platform :ios do app_identifier: [ "ru.artpancreas.#{TEAMID}.FreeAPS", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", - "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension" + "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension", + "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity" ] ) @@ -97,6 +98,12 @@ platform :ios do code_sign_identity: "iPhone Distribution", targets: ["FreeAPSWatch"] ) + update_code_signing_settings( + path: "#{GITHUB_WORKSPACE}/FreeAPS.xcodeproj", + profile_name: mapping["ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity"], + code_sign_identity: "iPhone Distribution", + targets: ["LiveActivityExtension"] + ) gym( export_method: "app-store", @@ -162,6 +169,10 @@ platform :ios do configure_bundle_id("FreeAPSWatch", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", [ Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS ]) + + configure_bundle_id("LiveActivityExtension", "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity", [ + Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS + ]) end @@ -184,6 +195,7 @@ platform :ios do "ru.artpancreas.#{TEAMID}.FreeAPS", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp.watchkitextension", "ru.artpancreas.#{TEAMID}.FreeAPS.watchkitapp", + "ru.artpancreas.#{TEAMID}.FreeAPS.LiveActivity" ] ) end From 8f0ee3fcddcf1803494a8d0bf1a37b9919d7dd5c Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Fri, 1 Dec 2023 07:56:48 +0100 Subject: [PATCH 270/405] Version update --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index f9d093433c..4dc91043a1 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.2.9 +APP_VERSION = 2.3.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From fab1cbda3c1536e0aa3f6b766ef0064ed0c6e9ae Mon Sep 17 00:00:00 2001 From: 10nas <151583878+10nas@users.noreply.github.com> Date: Fri, 1 Dec 2023 08:15:34 -0800 Subject: [PATCH 271/405] Live activity fixes (#397) * fix mmol live activity, live activity off by default, re-create live activity always after it ended, better readability on lock screen * typo * lock screen cleanup * fix padding, fix misaligned trailing dynamic island view * camel case * prevent unwanted hiding of live activity, update dynamic island padding * also hide change label on stale live activity data * update colors --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 2 +- .../NotificationsConfigStateModel.swift | 2 +- .../View/NotificationsConfigRootView.swift | 2 +- .../LiveActivity/LiveActitiyShared.swift | 2 +- .../LiveActivity/LiveActivityBridge.swift | 93 ++++++++++++------- LiveActivity/LiveActivity.swift | 40 ++++---- 6 files changed, 83 insertions(+), 58 deletions(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index b8d1def41b..0c85e089ad 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -50,7 +50,7 @@ struct FreeAPSSettings: JSON, Equatable { var fattyMeals: Bool = false var fattyMealFactor: Decimal = 0.7 var displayPredictions: Bool = true - var useLiveActivity: Bool = true + var useLiveActivity: Bool = false } extension FreeAPSSettings: Decodable { diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift b/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift index 13b76dd218..42c965fb62 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift @@ -9,7 +9,7 @@ extension NotificationsConfig { @Published var lowGlucose: Decimal = 0 @Published var highGlucose: Decimal = 0 @Published var carbsRequiredThreshold: Decimal = 0 - @Published var useLiveActivity = true + @Published var useLiveActivity = false var units: GlucoseUnits = .mmolL override func subscribe() { diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift index 9405311df3..c60450151a 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift @@ -60,7 +60,7 @@ extension NotificationsConfig { Section( header: Text("Live Activity"), footer: Text( - "Live activity displays blood gluocse live on the lock screen and on the dynamic island (if available)" + "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" ) ) { Toggle("Show live activity", isOn: $state.useLiveActivity) diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift index 749dbfca54..26a1977e94 100644 --- a/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift @@ -5,7 +5,7 @@ struct LiveActivityAttributes: ActivityAttributes { public struct ContentState: Codable, Hashable { let bg: String let trendSystemImage: String? - let change: Int? + let change: String let date: Date } diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift index 88347571cc..1bd9caafa9 100644 --- a/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift @@ -4,7 +4,7 @@ import Swinject import UIKit extension LiveActivityAttributes.ContentState { - static func formatGlucose(_ value: Int, mmol: Bool) -> String { + static func formatGlucose(_ value: Int, mmol: Bool, forceSign: Bool) -> String { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.maximumFractionDigits = 0 @@ -12,6 +12,9 @@ extension LiveActivityAttributes.ContentState { formatter.minimumFractionDigits = 1 formatter.maximumFractionDigits = 1 } + if forceSign { + formatter.positivePrefix = formatter.plusSign + } formatter.roundingMode = .halfUp return formatter @@ -25,45 +28,62 @@ extension LiveActivityAttributes.ContentState { return nil } - let formattedBG = Self.formatGlucose(glucose, mmol: mmol) + let formattedBG = Self.formatGlucose(glucose, mmol: mmol, forceSign: false) - let trentString: String? + let trendString: String? switch bg.direction { case .doubleUp, .singleUp, .tripleUp: - trentString = "arrow.up" + trendString = "arrow.up" case .fortyFiveUp: - trentString = "arrow.up.right" + trendString = "arrow.up.right" case .flat: - trentString = "arrow.right" + trendString = "arrow.right" case .fortyFiveDown: - trentString = "arrow.down.right" + trendString = "arrow.down.right" case .doubleDown, .singleDown, .tripleDown: - trentString = "arrow.down" + trendString = "arrow.down" case .notComputable, Optional.none, .rateOutOfRange, .some(.none): - trentString = nil + trendString = nil } - let change = prev?.glucose.map({ glucose - $0 }) + let change = prev?.glucose.map({ + Self.formatGlucose(glucose - $0, mmol: mmol, forceSign: true) + }) ?? "" - self.init(bg: formattedBG, trendSystemImage: trentString, change: change, date: bg.dateString) + self.init(bg: formattedBG, trendSystemImage: trendString, change: change, date: bg.dateString) } } @available(iOS 16.2, *) private struct ActiveActivity { let activity: Activity let startDate: Date + + func needsRecreation() -> Bool { + switch activity.activityState { + case .dismissed, + .ended: + return true + case .active, + .stale: break + @unknown default: + return true + } + + return -startDate.timeIntervalSinceNow > + TimeInterval(60 * 60) + } } @available(iOS 16.2, *) final class LiveActivityBridge: Injectable { @@ -87,29 +107,37 @@ extension LiveActivityAttributes.ContentState { object: nil, queue: nil ) { _ in - // just before app resigns active, show a new activity - // only do this if there is no current activity or the current activity is older than 1h - if self.settings.useLiveActivity { - if (self.currentActivity?.startDate).map({ -$0.timeIntervalSinceNow > - TimeInterval(60 * 60) }) ?? true - { - self.forceActivityUpdate() - } - } else { - Task { - await self.endActivity() - } - } + self.forceActivityUpdate() + } + + Foundation.NotificationCenter.default.addObserver( + forName: UIApplication.didBecomeActiveNotification, + object: nil, + queue: nil + ) { _ in + self.forceActivityUpdate() } } - /// creates and tries to present a new activity update from the current GlucoseStorage values + /// creates and tries to present a new activity update from the current GlucoseStorage values if live activities are enabled in settings + /// Ends existing live activities if live activities are not enabled in settings private func forceActivityUpdate() { - glucoseDidUpdate(glucoseStorage.recent()) + // just before app resigns active, show a new activity + // only do this if there is no current activity or the current activity is older than 1h + if settings.useLiveActivity { + if currentActivity?.needsRecreation() ?? true + { + glucoseDidUpdate(glucoseStorage.recent()) + } + } else { + Task { + await self.endActivity() + } + } } /// attempts to present this live activity state, creating a new activity if none exists yet - private func pushUpdate(_ state: LiveActivityAttributes.ContentState) async { + @MainActor private func pushUpdate(_ state: LiveActivityAttributes.ContentState) async { // hide duplicate/unknown activities for unknownActivity in Activity.activities .filter({ self.currentActivity?.activity.id != $0.id }) @@ -120,18 +148,13 @@ extension LiveActivityAttributes.ContentState { let content = ActivityContent(state: state, staleDate: state.date.addingTimeInterval(TimeInterval(6 * 60))) if let currentActivity { - switch currentActivity.activity.activityState { - case .dismissed, - .ended: - // activity is no longer visible. End it and try to push the update again + if currentActivity.needsRecreation(), UIApplication.shared.applicationState == .active { + // activity is no longer visible or old. End it and try to push the update again await endActivity() await pushUpdate(state) - case .active, - .stale: await currentActivity.activity.update(content) - @unknown default: + } else { await currentActivity.activity.update(content) } - } else { do { let activity = try Activity.request( diff --git a/LiveActivity/LiveActivity.swift b/LiveActivity/LiveActivity.swift index 7efff2b26c..b400e5b2f8 100644 --- a/LiveActivity/LiveActivity.swift +++ b/LiveActivity/LiveActivity.swift @@ -11,8 +11,8 @@ struct LiveActivity: Widget { }() func changeLabel(context: ActivityViewContext) -> Text { - if let change = context.state.change { - Text("\(change > 0 ? "+" : "")\(change)") + if !context.isStale && !context.state.change.isEmpty { + Text(context.state.change) } else { Text("--") } @@ -26,7 +26,7 @@ struct LiveActivity: Widget { if context.isStale { Text("--") } else { - Text("\(context.state.bg)") + Text(context.state.bg) } } @@ -34,7 +34,7 @@ struct LiveActivity: Widget { if context.isStale { Text("--") } else { - Text("\(context.state.bg)") + Text(context.state.bg) if let trendSystemImage = context.state.trendSystemImage { Image(systemName: trendSystemImage) } @@ -44,21 +44,22 @@ struct LiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: LiveActivityAttributes.self) { context in // Lock screen/banner UI goes here - VStack(alignment: .trailing, spacing: 0) { - HStack(alignment: .top) { - HStack(alignment: .center, spacing: 3) { - bgAndTrend(context: context).font(.title) - } - Spacer() + + HStack(spacing: 3) { + bgAndTrend(context: context).font(.title) + Spacer() + VStack(alignment: .trailing, spacing: 5) { changeLabel(context: context).font(.title3) + updatedLabel(context: context).font(.caption).foregroundStyle(.black.opacity(0.7)) } - .imageScale(.small) - updatedLabel(context: context).font(.caption).offset(y: -3) } - .padding(.horizontal, 20) - .padding(.vertical, 10) + .privacySensitive() + .imageScale(.small) + .padding(.all, 15) + .background(Color.white.opacity(0.2)) + .foregroundColor(Color.black) .activityBackgroundTint(Color.cyan.opacity(0.2)) - .activitySystemActionForegroundColor(Color.white) + .activitySystemActionForegroundColor(Color.black) } dynamicIsland: { context in DynamicIsland { @@ -73,14 +74,15 @@ struct LiveActivity: Widget { changeLabel(context: context).font(.title).padding(.trailing, 5) } DynamicIslandExpandedRegion(.bottom) { - updatedLabel(context: context).font(.caption) + updatedLabel(context: context).font(.caption).foregroundStyle(Color.secondary) + .padding(.bottom, 5) } } compactLeading: { HStack(spacing: 1) { bgAndTrend(context: context) - }.bold().imageScale(.small) + }.bold().imageScale(.small).padding(.leading, 5) } compactTrailing: { - changeLabel(context: context) + changeLabel(context: context).padding(.trailing, 5) } minimal: { bgLabel(context: context).bold() } @@ -98,7 +100,7 @@ private extension LiveActivityAttributes { private extension LiveActivityAttributes.ContentState { static var test: LiveActivityAttributes.ContentState { - LiveActivityAttributes.ContentState(bg: "100", trendSystemImage: "arrow.right", change: 2, date: Date()) + LiveActivityAttributes.ContentState(bg: "100", trendSystemImage: "arrow.right", change: "+2", date: Date()) } } From cb67cbef100253c965f0a30cc2582cb1260201b0 Mon Sep 17 00:00:00 2001 From: bjornoleh <63544115+bjornoleh@users.noreply.github.com> Date: Sat, 2 Dec 2023 13:14:03 +0100 Subject: [PATCH 272/405] Sync the GitHub runner clock with the Windows time server (#404) Adding a step to workflow jobs that interface Apple servers, as a workaround for build issues caused by runner clocks being out of sync. See https://github.com/actions/runner issue number 2996 for details. - name: Sync clock run: sudo sntp -sS time.windows.com Added to the following workflows / jobs: - validate_secrets.yml / validate-fastlane-secrets - add_identifiers.yml / identifiers - build_iAPS.yml / build - create_certs.yml / certificates --- .github/workflows/add_identifiers.yml | 4 ++++ .github/workflows/build_iAPS.yml | 6 +++++- .github/workflows/create_certs.yml | 4 ++++ .github/workflows/validate_secrets.yml | 4 ++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index c84dba30aa..f42408a0e2 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -29,6 +29,10 @@ jobs: - name: Install Project Dependencies run: bundle install + # Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996) + - name: Sync clock + run: sudo sntp -sS time.windows.com + # Create or update identifiers for app - name: Fastlane Provision run: bundle exec fastlane identifiers diff --git a/.github/workflows/build_iAPS.yml b/.github/workflows/build_iAPS.yml index 4b6919a3ff..c230c21e31 100644 --- a/.github/workflows/build_iAPS.yml +++ b/.github/workflows/build_iAPS.yml @@ -228,7 +228,11 @@ jobs: # Install project dependencies - name: Install project dependencies run: bundle install - + + # Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996) + - name: Sync clock + run: sudo sntp -sS time.windows.com + # Build signed iAPS IPA file - name: Fastlane Build & Archive run: bundle exec fastlane build_iAPS diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index 67db9a2d91..e1b7a2b7b7 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -30,6 +30,10 @@ jobs: - name: Install Project Dependencies run: bundle install + # Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996) + - name: Sync clock + run: sudo sntp -sS time.windows.com + # Create or update certificates for app - name: Create Certificates run: bundle exec fastlane certs diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml index 18a11aaf5e..9acc599373 100644 --- a/.github/workflows/validate_secrets.yml +++ b/.github/workflows/validate_secrets.yml @@ -129,6 +129,10 @@ jobs: - name: Install Project Dependencies run: bundle install + # Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996) + - name: Sync clock + run: sudo sntp -sS time.windows.com + - name: Validate Fastlane Secrets run: | # Validate Fastlane Secrets From e0488c2b99e0cbda2b9f4fbad74c1cbc4af596bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 9 Dec 2023 01:55:16 +0100 Subject: [PATCH 273/405] Fix rounding of glucose entries. CGM readings and Manual entries. (cherry picked from commit 7ca62a85ef06b2c94c96a4211daf3129c1225c7c) --- .../DataTable/View/DataTableRootView.swift | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index e2ab06e09b..9e3fe377c1 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -29,10 +29,24 @@ extension DataTable { private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal - formatter.maximumFractionDigits = 0 + + if state.units == .mmolL { + formatter.maximumFractionDigits = 1 + formatter.roundingMode = .halfUp + } else { + formatter.maximumFractionDigits = 0 + } + return formatter + } + + private var manualGlucoseFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal if state.units == .mmolL { formatter.maximumFractionDigits = 1 formatter.roundingMode = .ceiling + } else { + formatter.maximumFractionDigits = 0 } return formatter } @@ -152,7 +166,7 @@ extension DataTable { DecimalTextField( " ... ", value: $state.manualGlucose, - formatter: glucoseFormatter, + formatter: manualGlucoseFormatter, autofocus: true, cleanInput: true ) @@ -317,7 +331,12 @@ extension DataTable { @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View { HStack { Text(item.glucose.glucose.map { - glucoseFormatter.string(from: Double( + ( + isManual.type == GlucoseType.manual.rawValue ? + manualGlucoseFormatter : + glucoseFormatter + ) + .string(from: Double( state.units == .mmolL ? $0.asMmolL : Decimal($0) ) as NSNumber)! } ?? "--") @@ -337,14 +356,15 @@ extension DataTable { role: .none, action: { alertGlucoseToDelete = item - - let valueText = glucoseFormatter.string(from: Double( + let valueText = ( + isManual.type == GlucoseType.manual.rawValue ? + manualGlucoseFormatter : + glucoseFormatter + ).string(from: Double( state.units == .mmolL ? Double(item.glucose.value.asMmolL) : item.glucose.value ) as NSNumber)! + " " + state.units.rawValue - alertTitle = "Delete Glucose?" alertMessage = dateFormatter.string(from: item.glucose.dateString) + ", " + valueText - isRemoveHistoryItemAlertPresented = true } ).tint(.red) @@ -355,14 +375,10 @@ extension DataTable { ) { Button("Cancel", role: .cancel) {} Button("Delete", role: .destructive) { - // gracefully unwrap value here. - // value cannot ever really be nil because it is an existing(!) table entry - // but just to be sure. guard let glucoseToDelete = alertGlucoseToDelete else { - print("Cannot gracefully unwrap alertTreatmentToDelete!") + print("Cannot unwrap alertTreatmentToDelete!") return } - state.deleteGlucose(glucoseToDelete) } } message: { From 68b3756bc7e75b4716200753ad641b45b50314ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:27:22 +0100 Subject: [PATCH 274/405] Update Config.xcconfig --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 4dc91043a1..61834b473c 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.3.1 +APP_VERSION = 2.3.2 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 8e4ab8bd22c5ec4948991f3375c6b9905da13100 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Fri, 15 Dec 2023 04:28:23 -0800 Subject: [PATCH 275/405] PodInfoTests fixes and improved temp basal checking (#420) + Update all PodInfoTests to compile, cleanly run & make sense + Update PodInfoTriggeredAlerts to be only time based triggers + Add additional checks & safeguard for temp basal duration --- .../OmnipodCommon/BasalDeliveryTable.swift | 8 +- .../PodInfoTriggeredAlerts.swift | 78 +++++-------- .../PumpManager/OmniBLEPumpManager.swift | 6 + .../OmniBLE/OmniBLETests/PodInfoTests.swift | 105 +++++++++--------- .../OmniBLE/OmniBLETests/StatusTests.swift | 6 +- .../OmnipodCommon/BasalDeliveryTable.swift | 8 +- .../PodInfoTriggeredAlerts.swift | 78 +++++-------- .../PumpManager/OmnipodPumpManager.swift | 6 + .../OmniKit/OmniKitTests/PodInfoTests.swift | 105 +++++++++--------- .../OmniKit/OmniKitTests/StatusTests.swift | 6 +- 10 files changed, 188 insertions(+), 218 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift index e11b273462..a82ccdcd0a 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/BasalDeliveryTable.swift @@ -133,8 +133,7 @@ extension BasalDeliveryTable: CustomDebugStringConvertible { // Round basal rate by rounding down to pulse size boundary, // but basal rates within a small delta will be rounded up. // Rounds down to 0 for both non-Eros and Eros (temp basals). -func roundToSupportedBasalRate(rate: Double) -> Double -{ +func roundToSupportedBasalRate(rate: Double) -> Double { let delta = 0.01 let supportedBasalRates: [Double] = (0...600).map { Double($0) / Double(Pod.pulsesPerUnit) } return supportedBasalRates.last(where: { $0 <= rate + delta }) ?? 0 @@ -199,13 +198,14 @@ public struct RateEntry { let maxPulsesPerEntry: Double = 0xffff / 10 // max # of 1/10th pulses encoded in a 2-byte value var entries = [RateEntry]() let rrate = roundToSupportedBasalTimingRate(rate: rate) + let numHalfHours = max(Int(round(duration.minutes / 30)), 1) // shortest basal duration is 30m - var remainingSegments = Int(round(duration.minutes / 30)) + var remainingSegments = numHalfHours let pulsesPerSegment = round(rrate / Pod.pulseSize) / 2 let maxSegmentsPerEntry = pulsesPerSegment > 0 ? Int(maxPulsesPerEntry / pulsesPerSegment) : 1 - var remainingPulses = rrate * duration.hours / Pod.pulseSize + var remainingPulses = rrate * Double(numHalfHours) / 2 / Pod.pulseSize while (remainingSegments > 0) { let entry: RateEntry diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift index 0b470a03b9..08b709aae8 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift @@ -10,6 +10,8 @@ import Foundation // Type 1 Pod Info returns information about the currently unacknowledged triggered alert values +// All triggered alerts values are the pod time when triggered for all current Eros and Dash pods. +// For at least earlier Eros pods, low reservoir triggered alerts might be the # of pulses remaining. public struct PodInfoTriggeredAlerts: PodInfo { // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 @@ -17,76 +19,52 @@ public struct PodInfoTriggeredAlerts: PodInfo { public let podInfoType: PodInfoResponseSubType = .triggeredAlerts public let unknown_word: UInt16 - public let alertsActivations: [AlertActivation] + public var alertActivations: [TimeInterval] = Array(repeating: 0, count: 8) public let data: Data - public struct AlertActivation { - let triggeredAlertValue: TriggeredAlertValue - - public init(triggeredAlertValue: TriggeredAlertValue) { - self.triggeredAlertValue = triggeredAlertValue - } - } - public init(encodedData: Data) throws { guard encodedData.count >= 11 else { throw MessageBlockError.notEnoughData } - let numAlerts = 8 - var activations = [AlertActivation]() - var i = 3 // starting data index for first VVVV value - for alertNum in (0.. String { +private func triggeredAlerts(podInfoTriggeredAlerts: PodInfoTriggeredAlerts, startOffset: Int, sepString: String, printAll: Bool) -> String { var result: [String] = [] - for index in podInfoTriggeredAlerts.alertsActivations.indices { + for index in podInfoTriggeredAlerts.alertActivations.indices { // extract the alert slot debug description for a more helpful display let description = AlertSlot(rawValue: UInt8(index)).debugDescription - let start = description.index(description.startIndex, offsetBy: 27) + let start = description.index(description.startIndex, offsetBy: startOffset) let end = description.index(description.endIndex, offsetBy: -1) let range = start.. String { + return triggeredAlerts(podInfoTriggeredAlerts: podInfoTriggeredAlerts, startOffset: 27, sepString: "\n", printAll: false) +} + +extension PodInfoTriggeredAlerts: CustomDebugStringConvertible { + public var debugDescription: String { + return triggeredAlerts(podInfoTriggeredAlerts: self, startOffset: 33, sepString: ", ", printAll: true) + } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift index 99d00b3ced..d20dc916a3 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -1857,6 +1857,12 @@ extension OmniBLEPumpManager: PumpManager { return } + // Legal duration values are [virtual] zero (to cancel current temp basal) or between 30 min and 12 hours + guard duration < .ulpOfOne || (duration >= .minutes(30) && duration <= .hours(12)) else { + completion(.deviceState(OmniBLEPumpManagerError.invalidSetting)) + return + } + // Round to nearest supported rate let rate = roundToSupportedBasalRate(unitsPerHour: unitsPerHour) diff --git a/Dependencies/OmniBLE/OmniBLETests/PodInfoTests.swift b/Dependencies/OmniBLE/OmniBLETests/PodInfoTests.swift index 7355c22194..002ee2e524 100644 --- a/Dependencies/OmniBLE/OmniBLETests/PodInfoTests.swift +++ b/Dependencies/OmniBLE/OmniBLETests/PodInfoTests.swift @@ -14,104 +14,106 @@ import XCTest class PodInfoTests: XCTestCase { func testFullMessage() { + // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 15 16 17 18 19 2021 + // 02 16 // 02 0J 0K LLLL MM NNNN PP QQQQ RRRR SSSS TT UU VV WW 0X YYYY + // 02 16 // 02 0d 00 0000 00 00ab 6a 0384 03ff 0386 00 00 28 57 08 030d do { // Decode let infoResponse = try PodInfoResponse(encodedData: Data(hexadecimalString: "0216020d0000000000ab6a038403ff03860000285708030d0000")!) XCTAssertEqual(infoResponse.podInfoResponseSubType, .detailedStatus) let faultEvent = infoResponse.podInfo as! DetailedStatus + XCTAssertEqual(faultEvent.podInfoType, .detailedStatus) + XCTAssertEqual(faultEvent.podProgressStatus, .faultEventOccurred) + XCTAssertEqual(faultEvent.deliveryStatus, .suspended) + XCTAssertEqual(faultEvent.bolusNotDelivered, 0) + XCTAssertEqual(faultEvent.lastProgrammingMessageSeqNum, 0) + XCTAssertEqual(faultEvent.totalInsulinDelivered, 0xab * Pod.pulseSize) + XCTAssertEqual(faultEvent.totalInsulinDelivered, 8.55) + XCTAssertEqual(faultEvent.faultEventCode.faultType, .occlusionCheckAboveThreshold) + XCTAssertEqual(faultEvent.faultEventTimeSinceActivation, 0x384 * 60) + XCTAssertEqual(faultEvent.faultEventTimeSinceActivation, 54000) + XCTAssertEqual(faultEvent.reservoirLevel, Pod.reservoirLevelAboveThresholdMagicNumber, accuracy: 0.01) + XCTAssertEqual(faultEvent.timeActive, 0x386 * 60) + XCTAssertEqual(faultEvent.timeActive, 54120) + XCTAssertEqual(faultEvent.unacknowledgedAlerts, AlertSet(rawValue: 0)) XCTAssertEqual(faultEvent.faultAccessingTables, false) XCTAssertEqual(faultEvent.podProgressStatus, .faultEventOccurred) XCTAssertEqual(faultEvent.errorEventInfo?.insulinStateTableCorruption, false) XCTAssertEqual(faultEvent.errorEventInfo?.occlusionType, 1) XCTAssertEqual(faultEvent.errorEventInfo?.immediateBolusInProgress, false) XCTAssertEqual(faultEvent.errorEventInfo?.podProgressStatus, .aboveFiftyUnits) + XCTAssertEqual(faultEvent.receiverLowGain, 0b01) + XCTAssertEqual(faultEvent.radioRSSI, 0x17) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsNoAlerts() { + func testPodInfoTriggeredAlertsEmpty() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0000 0000 0000 do { // Decode - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "01000000000000000000000000000000000000")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "01000000000000000000000000000000000000")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsSuspendStillActive() { + func testPodInfoTriggeredAlertsSuspendStillActive() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0bd7 0c40 0000 // real alert value after 2 hour suspend - // 02 13 // 01 0000 0102 0304 0506 0708 090a 0bd7 0c40 0000 // used as a tester to find each alarm do { // Decode - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000bd70c400000")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.beepBeepBeep, decoded.alertsActivations[5].beepType) - XCTAssertEqual(11, decoded.alertsActivations[5].timeFromPodStart) // in minutes - XCTAssertEqual(10.75, decoded.alertsActivations[5].unitsLeft) //, accuracy: 1) - XCTAssertEqual(.beeeeeep, decoded.alertsActivations[6].beepType) - XCTAssertEqual(12, decoded.alertsActivations[6].timeFromPodStart) // in minutes - XCTAssertEqual(3.2, decoded.alertsActivations[6].unitsLeft) //, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000bd70c400000")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("50h31m", decoded.alertActivations[5].timeIntervalStr) + XCTAssertEqual("52h16m", decoded.alertActivations[6].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePodAfter3DaysAnd8Hours() { + func testPodInfoTriggeredAlertsReplacePodAfter3DaysAnd8Hours() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0000 0000 10e1 do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000000000010e1")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(16, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(11.25, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000000000010e1")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("72h1m", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePodAfterReservoirEmpty() { + func testPodInfoTriggeredAlertsReplacePodAfterReservoirEmpty() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 1285 0000 11c7 0000 0000 119c do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000001285000011c700000000119c")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBeepBipBeepBipBeepBipBeep, decoded.alertsActivations[2].beepType) - XCTAssertEqual(18, decoded.alertsActivations[2].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(6.6, decoded.alertsActivations[2].unitsLeft, accuracy: 1) - XCTAssertEqual(.beep, decoded.alertsActivations[4].beepType) - XCTAssertEqual(17, decoded.alertsActivations[4].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(9.95, decoded.alertsActivations[4].unitsLeft, accuracy: 2) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(17, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(7.8, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000001285000011c700000000119c")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("79h1m", decoded.alertActivations[2].timeIntervalStr) + XCTAssertEqual("75h51m", decoded.alertActivations[4].timeIntervalStr) + XCTAssertEqual("75h8m", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePod() { + func testPodInfoTriggeredAlertsReplacePod() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 1284 0000 0000 0000 0000 10e0 do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000001284000000000000000010e0")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBeepBipBeepBipBeepBipBeep, decoded.alertsActivations[2].beepType) - XCTAssertEqual(18, decoded.alertsActivations[2].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(6.6, decoded.alertsActivations[2].unitsLeft, accuracy: 1) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(16, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(11.2, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000001284000000000000000010e0")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("79h", decoded.alertActivations[2].timeIntervalStr) + XCTAssertEqual("72h", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } @@ -134,7 +136,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(8100, decoded.timeActive) XCTAssertEqual(TimeInterval(minutes: 0x0087), decoded.timeActive) - XCTAssertEqual("02:15", decoded.timeActive.stringValue) + XCTAssertEqual("2h15m", decoded.timeActive.timeIntervalStr) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(false, decoded.faultAccessingTables) XCTAssertNil(decoded.errorEventInfo) @@ -208,7 +210,7 @@ class PodInfoTests: XCTestCase { } func testPodInfoFaultEventErrorShuttingDown() { - // Failed Pod after 1 day, 18+ hours of live use shortly after installing new omniloop. + // Failed Pod after 42+ hours of live use shortly after installing a buggy version of Loop. // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 15 16 17 18 19 2021 // 02 16 // 02 0J 0K LLLL MM NNNN PP QQQQ RRRR SSSS TT UU VV WW 0X YYYY // 02 16 // 02 0d 00 0000 04 07f2 86 09ff 03ff 0a02 00 00 08 23 08 0000 @@ -224,7 +226,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.basalOverInfusionPulse, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x09ff), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("1 day plus 18:39", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("42h39m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0a02), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -256,7 +258,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0e0c), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("2 days plus 11:56", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("59h56m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0e14), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -288,7 +290,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0268), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("10:16", decoded.faultEventTimeSinceActivation?.stringValue) + XCTAssertEqual("10h16m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x026b), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -395,13 +397,12 @@ class PodInfoTests: XCTestCase { let decoded = try PodInfoActivationTime(encodedData: Data(hexadecimalString: "059200010000000000000000091912170e")!) XCTAssertEqual(.activationTime, decoded.podInfoType) XCTAssertEqual(.tempPulseChanInactive, decoded.faultEventCode.faultType) - XCTAssertEqual(TimeInterval(minutes: 0x0001), decoded.timeActivation) - let decodedDateTime = decoded.dateTime - XCTAssertEqual(2018, decodedDateTime.year) - XCTAssertEqual(09, decodedDateTime.month) - XCTAssertEqual(25, decodedDateTime.day) - XCTAssertEqual(23, decodedDateTime.hour) - XCTAssertEqual(14, decodedDateTime.minute) + XCTAssertEqual(TimeInterval(minutes: 0x0001), decoded.faultTime) + XCTAssertEqual(18, decoded.year) + XCTAssertEqual(09, decoded.month) + XCTAssertEqual(25, decoded.day) + XCTAssertEqual(23, decoded.hour) + XCTAssertEqual(14, decoded.minute) } catch (let error) { XCTFail("message decoding threw error: \(error)") } diff --git a/Dependencies/OmniBLE/OmniBLETests/StatusTests.swift b/Dependencies/OmniBLE/OmniBLETests/StatusTests.swift index 96179d41be..764aea07a2 100644 --- a/Dependencies/OmniBLE/OmniBLETests/StatusTests.swift +++ b/Dependencies/OmniBLE/OmniBLETests/StatusTests.swift @@ -46,16 +46,16 @@ class StatusTests: XCTestCase { } } - func testStatusRequestCommandConfiguredAlerts() { + func testStatusRequestCommandTriggeredAlerts() { // 0e 01 01 do { // Encode - let encoded = GetStatusCommand(podInfoType: .configuredAlerts) + let encoded = GetStatusCommand(podInfoType: .triggeredAlerts) XCTAssertEqual("0e0101", encoded.data.hexadecimalString) // Decode let decoded = try GetStatusCommand(encodedData: Data(hexadecimalString: "0e0101")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) } catch (let error) { XCTFail("message decoding threw error: \(error)") } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift index 582dbc4e94..ee8fdce8ff 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/BasalDeliveryTable.swift @@ -132,8 +132,7 @@ extension BasalDeliveryTable: CustomDebugStringConvertible { // Round basal rate by rounding down to pulse size boundary, // but basal rates within a small delta will be rounded up. // Rounds down to 0 for both non-Eros and Eros (temp basals). -func roundToSupportedBasalRate(rate: Double) -> Double -{ +func roundToSupportedBasalRate(rate: Double) -> Double { let delta = 0.01 let supportedBasalRates: [Double] = (0...600).map { Double($0) / Double(Pod.pulsesPerUnit) } return supportedBasalRates.last(where: { $0 <= rate + delta }) ?? 0 @@ -198,13 +197,14 @@ public struct RateEntry { let maxPulsesPerEntry: Double = 0xffff / 10 // max # of 1/10th pulses encoded in a 2-byte value var entries = [RateEntry]() let rrate = roundToSupportedBasalTimingRate(rate: rate) + let numHalfHours = max(Int(round(duration.minutes / 30)), 1) // shortest basal duration is 30m - var remainingSegments = Int(round(duration.minutes / 30)) + var remainingSegments = numHalfHours let pulsesPerSegment = round(rrate / Pod.pulseSize) / 2 let maxSegmentsPerEntry = pulsesPerSegment > 0 ? Int(maxPulsesPerEntry / pulsesPerSegment) : 1 - var remainingPulses = rrate * duration.hours / Pod.pulseSize + var remainingPulses = rrate * Double(numHalfHours) / 2 / Pod.pulseSize while (remainingSegments > 0) { let entry: RateEntry diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift index fd8a6d4f0f..965f3bb45b 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoTriggeredAlerts.swift @@ -9,6 +9,8 @@ import Foundation // Type 1 Pod Info returns information about the currently unacknowledged triggered alert values +// All triggered alerts values are the pod time when triggered for all current Eros and Dash pods. +// For at least earlier Eros pods, low reservoir triggered alerts might be the # of pulses remaining. public struct PodInfoTriggeredAlerts: PodInfo { // CMD 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 1920 // DATA 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 @@ -16,76 +18,52 @@ public struct PodInfoTriggeredAlerts: PodInfo { public let podInfoType: PodInfoResponseSubType = .triggeredAlerts public let unknown_word: UInt16 - public let alertsActivations: [AlertActivation] + public var alertActivations: [TimeInterval] = Array(repeating: 0, count: 8) public let data: Data - public struct AlertActivation { - let triggeredAlertValue: TriggeredAlertValue - - public init(triggeredAlertValue: TriggeredAlertValue) { - self.triggeredAlertValue = triggeredAlertValue - } - } - public init(encodedData: Data) throws { guard encodedData.count >= 11 else { throw MessageBlockError.notEnoughData } - let numAlerts = 8 - var activations = [AlertActivation]() - var i = 3 // starting data index for first VVVV value - for alertNum in (0.. String { +private func triggeredAlerts(podInfoTriggeredAlerts: PodInfoTriggeredAlerts, startOffset: Int, sepString: String, printAll: Bool) -> String { var result: [String] = [] - for index in podInfoTriggeredAlerts.alertsActivations.indices { + for index in podInfoTriggeredAlerts.alertActivations.indices { // extract the alert slot debug description for a more helpful display let description = AlertSlot(rawValue: UInt8(index)).debugDescription - let start = description.index(description.startIndex, offsetBy: 27) + let start = description.index(description.startIndex, offsetBy: startOffset) let end = description.index(description.endIndex, offsetBy: -1) let range = start.. String { + return triggeredAlerts(podInfoTriggeredAlerts: podInfoTriggeredAlerts, startOffset: 27, sepString: "\n", printAll: false) +} + +extension PodInfoTriggeredAlerts: CustomDebugStringConvertible { + public var debugDescription: String { + return triggeredAlerts(podInfoTriggeredAlerts: self, startOffset: 33, sepString: ", ", printAll: true) + } } diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift index e8a7bf31f1..a7dc839c01 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift @@ -1864,6 +1864,12 @@ extension OmnipodPumpManager: PumpManager { return } + // Legal duration values are [virtual] zero (to cancel current temp basal) or between 30 min and 12 hours + guard duration < .ulpOfOne || (duration >= .minutes(30) && duration <= .hours(12)) else { + completion(.deviceState(OmnipodPumpManagerError.invalidSetting)) + return + } + // Round to nearest supported rate let rate = roundToSupportedBasalRate(unitsPerHour: unitsPerHour) diff --git a/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift b/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift index 6b81209aa8..af8d884855 100644 --- a/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift +++ b/Dependencies/OmniKit/OmniKitTests/PodInfoTests.swift @@ -13,104 +13,106 @@ import XCTest class PodInfoTests: XCTestCase { func testFullMessage() { + // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 15 16 17 18 19 2021 + // 02 16 // 02 0J 0K LLLL MM NNNN PP QQQQ RRRR SSSS TT UU VV WW 0X YYYY + // 02 16 // 02 0d 00 0000 00 00ab 6a 0384 03ff 0386 00 00 28 57 08 030d do { // Decode let infoResponse = try PodInfoResponse(encodedData: Data(hexadecimalString: "0216020d0000000000ab6a038403ff03860000285708030d0000")!) XCTAssertEqual(infoResponse.podInfoResponseSubType, .detailedStatus) let faultEvent = infoResponse.podInfo as! DetailedStatus + XCTAssertEqual(faultEvent.podInfoType, .detailedStatus) + XCTAssertEqual(faultEvent.podProgressStatus, .faultEventOccurred) + XCTAssertEqual(faultEvent.deliveryStatus, .suspended) + XCTAssertEqual(faultEvent.bolusNotDelivered, 0) + XCTAssertEqual(faultEvent.lastProgrammingMessageSeqNum, 0) + XCTAssertEqual(faultEvent.totalInsulinDelivered, 0xab * Pod.pulseSize) + XCTAssertEqual(faultEvent.totalInsulinDelivered, 8.55) + XCTAssertEqual(faultEvent.faultEventCode.faultType, .occlusionCheckAboveThreshold) + XCTAssertEqual(faultEvent.faultEventTimeSinceActivation, 0x384 * 60) + XCTAssertEqual(faultEvent.faultEventTimeSinceActivation, 54000) + XCTAssertEqual(faultEvent.reservoirLevel, Pod.reservoirLevelAboveThresholdMagicNumber, accuracy: 0.01) + XCTAssertEqual(faultEvent.timeActive, 0x386 * 60) + XCTAssertEqual(faultEvent.timeActive, 54120) + XCTAssertEqual(faultEvent.unacknowledgedAlerts, AlertSet(rawValue: 0)) XCTAssertEqual(faultEvent.faultAccessingTables, false) XCTAssertEqual(faultEvent.podProgressStatus, .faultEventOccurred) XCTAssertEqual(faultEvent.errorEventInfo?.insulinStateTableCorruption, false) XCTAssertEqual(faultEvent.errorEventInfo?.occlusionType, 1) XCTAssertEqual(faultEvent.errorEventInfo?.immediateBolusInProgress, false) XCTAssertEqual(faultEvent.errorEventInfo?.podProgressStatus, .aboveFiftyUnits) + XCTAssertEqual(faultEvent.receiverLowGain, 0b01) + XCTAssertEqual(faultEvent.radioRSSI, 0x17) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsNoAlerts() { + func testPodInfoTriggeredAlertsEmpty() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0000 0000 0000 do { // Decode - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "01000000000000000000000000000000000000")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "01000000000000000000000000000000000000")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsSuspendStillActive() { + func testPodInfoTriggeredAlertsSuspendStillActive() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0bd7 0c40 0000 // real alert value after 2 hour suspend - // 02 13 // 01 0000 0102 0304 0506 0708 090a 0bd7 0c40 0000 // used as a tester to find each alarm do { // Decode - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000bd70c400000")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.beepBeepBeep, decoded.alertsActivations[5].beepType) - XCTAssertEqual(11, decoded.alertsActivations[5].timeFromPodStart) // in minutes - XCTAssertEqual(10.75, decoded.alertsActivations[5].unitsLeft) //, accuracy: 1) - XCTAssertEqual(.beeeeeep, decoded.alertsActivations[6].beepType) - XCTAssertEqual(12, decoded.alertsActivations[6].timeFromPodStart) // in minutes - XCTAssertEqual(3.2, decoded.alertsActivations[6].unitsLeft) //, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000bd70c400000")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("50h31m", decoded.alertActivations[5].timeIntervalStr) + XCTAssertEqual("52h16m", decoded.alertActivations[6].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePodAfter3DaysAnd8Hours() { + func testPodInfoTriggeredAlertsReplacePodAfter3DaysAnd8Hours() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 0000 0000 0000 0000 0000 10e1 do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000000000010e1")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(16, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(11.25, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000000000000000000000000010e1")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("72h1m", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePodAfterReservoirEmpty() { + func testPodInfoTriggeredAlertsReplacePodAfterReservoirEmpty() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 1285 0000 11c7 0000 0000 119c do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000001285000011c700000000119c")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBeepBipBeepBipBeepBipBeep, decoded.alertsActivations[2].beepType) - XCTAssertEqual(18, decoded.alertsActivations[2].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(6.6, decoded.alertsActivations[2].unitsLeft, accuracy: 1) - XCTAssertEqual(.beep, decoded.alertsActivations[4].beepType) - XCTAssertEqual(17, decoded.alertsActivations[4].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(9.95, decoded.alertsActivations[4].unitsLeft, accuracy: 2) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(17, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(7.8, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000001285000011c700000000119c")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("79h1m", decoded.alertActivations[2].timeIntervalStr) + XCTAssertEqual("75h51m", decoded.alertActivations[4].timeIntervalStr) + XCTAssertEqual("75h8m", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } } - func testPodInfoConfiguredAlertsReplacePod() { + func testPodInfoTriggeredAlertsReplacePod() { // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 1516 1718 // 02 13 // 01 XXXX VVVV VVVV VVVV VVVV VVVV VVVV VVVV VVVV // 02 13 // 01 0000 0000 0000 1284 0000 0000 0000 0000 10e0 do { - let decoded = try PodInfoConfiguredAlerts(encodedData: Data(hexadecimalString: "010000000000001284000000000000000010e0")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) - XCTAssertEqual(.bipBeepBipBeepBipBeepBipBeep, decoded.alertsActivations[2].beepType) - XCTAssertEqual(18, decoded.alertsActivations[2].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(6.6, decoded.alertsActivations[2].unitsLeft, accuracy: 1) - XCTAssertEqual(.bipBipBipbipBipBip, decoded.alertsActivations[7].beepType) - XCTAssertEqual(16, decoded.alertsActivations[7].timeFromPodStart) // in 2 hours steps - XCTAssertEqual(11.2, decoded.alertsActivations[7].unitsLeft, accuracy: 1) + let decoded = try PodInfoTriggeredAlerts(encodedData: Data(hexadecimalString: "010000000000001284000000000000000010e0")!) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) + XCTAssertEqual("79h", decoded.alertActivations[2].timeIntervalStr) + XCTAssertEqual("72h", decoded.alertActivations[7].timeIntervalStr) } catch (let error) { XCTFail("message decoding threw error: \(error)") } @@ -133,7 +135,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(8100, decoded.timeActive) XCTAssertEqual(TimeInterval(minutes: 0x0087), decoded.timeActive) - XCTAssertEqual("02:15", decoded.timeActive.timeIntervalStr) + XCTAssertEqual("2h15m", decoded.timeActive.timeIntervalStr) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(false, decoded.faultAccessingTables) XCTAssertNil(decoded.errorEventInfo) @@ -207,7 +209,7 @@ class PodInfoTests: XCTestCase { } func testPodInfoFaultEventErrorShuttingDown() { - // Failed Pod after 1 day, 18+ hours of live use shortly after installing new omniloop. + // Failed Pod after 42+ hours of live use shortly after installing a buggy version of Loop. // 02DATAOFF 0 1 2 3 4 5 6 7 8 910 1112 1314 15 16 17 18 19 2021 // 02 16 // 02 0J 0K LLLL MM NNNN PP QQQQ RRRR SSSS TT UU VV WW 0X YYYY // 02 16 // 02 0d 00 0000 04 07f2 86 09ff 03ff 0a02 00 00 08 23 08 0000 @@ -223,7 +225,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.basalOverInfusionPulse, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x09ff), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("1 day plus 18:39", decoded.faultEventTimeSinceActivation?.timeIntervalStr) + XCTAssertEqual("42h39m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0a02), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -255,7 +257,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0e0c), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("2 days plus 11:56", decoded.faultEventTimeSinceActivation?.timeIntervalStr) + XCTAssertEqual("59h56m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x0e14), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -287,7 +289,7 @@ class PodInfoTests: XCTestCase { XCTAssertEqual(.occlusionCheckAboveThreshold, decoded.faultEventCode.faultType) XCTAssertEqual(0, decoded.unacknowledgedAlerts.rawValue) XCTAssertEqual(TimeInterval(minutes: 0x0268), decoded.faultEventTimeSinceActivation) - XCTAssertEqual("10:16", decoded.faultEventTimeSinceActivation?.timeIntervalStr) + XCTAssertEqual("10h16m", decoded.faultEventTimeSinceActivation?.timeIntervalStr) XCTAssertEqual(Pod.reservoirLevelAboveThresholdMagicNumber, decoded.reservoirLevel, accuracy: 0.01) XCTAssertEqual(TimeInterval(minutes: 0x026b), decoded.timeActive) XCTAssertEqual(false, decoded.faultAccessingTables) @@ -394,13 +396,12 @@ class PodInfoTests: XCTestCase { let decoded = try PodInfoActivationTime(encodedData: Data(hexadecimalString: "059200010000000000000000091912170e")!) XCTAssertEqual(.activationTime, decoded.podInfoType) XCTAssertEqual(.tempPulseChanInactive, decoded.faultEventCode.faultType) - XCTAssertEqual(TimeInterval(minutes: 0x0001), decoded.timeActivation) - let decodedDateTime = decoded.dateTime - XCTAssertEqual(2018, decodedDateTime.year) - XCTAssertEqual(09, decodedDateTime.month) - XCTAssertEqual(25, decodedDateTime.day) - XCTAssertEqual(23, decodedDateTime.hour) - XCTAssertEqual(14, decodedDateTime.minute) + XCTAssertEqual(TimeInterval(minutes: 0x0001), decoded.faultTime) + XCTAssertEqual(18, decoded.year) + XCTAssertEqual(09, decoded.month) + XCTAssertEqual(25, decoded.day) + XCTAssertEqual(23, decoded.hour) + XCTAssertEqual(14, decoded.minute) } catch (let error) { XCTFail("message decoding threw error: \(error)") } diff --git a/Dependencies/OmniKit/OmniKitTests/StatusTests.swift b/Dependencies/OmniKit/OmniKitTests/StatusTests.swift index 3a78979ed0..27c3471775 100644 --- a/Dependencies/OmniKit/OmniKitTests/StatusTests.swift +++ b/Dependencies/OmniKit/OmniKitTests/StatusTests.swift @@ -45,16 +45,16 @@ class StatusTests: XCTestCase { } } - func testStatusRequestCommandConfiguredAlerts() { + func testStatusRequestCommandTriggeredAlerts() { // 0e 01 01 do { // Encode - let encoded = GetStatusCommand(podInfoType: .configuredAlerts) + let encoded = GetStatusCommand(podInfoType: .triggeredAlerts) XCTAssertEqual("0e0101", encoded.data.hexadecimalString) // Decode let decoded = try GetStatusCommand(encodedData: Data(hexadecimalString: "0e0101")!) - XCTAssertEqual(.configuredAlerts, decoded.podInfoType) + XCTAssertEqual(.triggeredAlerts, decoded.podInfoType) } catch (let error) { XCTFail("message decoding threw error: \(error)") } From 8aca6dd06a0c70dcec7d6b65f05d47be20efa4b9 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Fri, 15 Dec 2023 04:31:08 -0800 Subject: [PATCH 276/405] Fix a source of possible 0x31 pod faults during pod setup (#424) + Verify setup is complete before doing cancel for non-verified pod state + Sort files in the Omni{BLE,Kit}/PumpManager directories in Xcode --- Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 6 +++--- .../OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift | 6 +++--- Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj | 6 +++--- .../OmniKit/OmniKit/PumpManager/PodCommsSession.swift | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index af3c52754c..fa893bc13c 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -636,15 +636,15 @@ 84752EAD26ED11A4009FD801 /* PumpManager */ = { isa = PBXGroup; children = ( - C1C001C027A2349D00533D35 /* OmniBLE.swift */, D8896C6127890E6B00E09A96 /* DetailedStatus+OmniBLE.swift */, 10389A2226FF7841002115E9 /* MessageTransport.swift */, + C1C001C027A2349D00533D35 /* OmniBLE.swift */, 1029AE4627094D0E00B7F5B6 /* OmniBLEPumpManager.swift */, 1029AE4727094D0E00B7F5B6 /* OmniBLEPumpManagerState.swift */, - 102111422709462300784F13 /* PodCommsSession.swift */, + C1D27A1A27911E9900C41EBA /* PodAdvertisement.swift */, 1021114C2709467400784F13 /* PodComms.swift */, + 102111422709462300784F13 /* PodCommsSession.swift */, 102111402709462300784F13 /* PodState.swift */, - C1D27A1A27911E9900C41EBA /* PodAdvertisement.swift */, ); path = PumpManager; sourceTree = ""; diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift index b3664040db..58e2b5ca18 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift @@ -741,9 +741,9 @@ public class PodCommsSession { let basalExtraCommand = BasalScheduleExtraCommand.init(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: acknowledgementBeep, programReminderInterval: programReminderInterval) do { - if !(podState.lastCommsOK && podState.deliveryStatusVerified) { - // Can't trust the current delivery state -- do a cancel all - // to be sure that setting a basal program won't fault the pod. + if podState.setupProgress == .completed && !(podState.lastCommsOK && podState.deliveryStatusVerified) { + // The pod setup is complete and the current delivery state can't be trusted so + // do a cancel all to be sure that setting the basal program won't fault the pod. let _: StatusResponse = try send([CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel)]) } var status: StatusResponse = try send([basalScheduleCommand, basalExtraCommand]) diff --git a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj index 28d9018c3a..1a8b703d5e 100644 --- a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj +++ b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj @@ -598,11 +598,11 @@ C12401A929C7D8E900B32844 /* PumpManager */ = { isa = PBXGroup; children = ( - C12401AA29C7D8E900B32844 /* PodComms.swift */, C12401AB29C7D8E900B32844 /* DetailedStatus+OmniKit.swift */, - C12401AC29C7D8E900B32844 /* PodCommsSession.swift */, - C12401AD29C7D8E900B32844 /* OmnipodPumpManagerState.swift */, C12401AE29C7D8E900B32844 /* OmnipodPumpManager.swift */, + C12401AD29C7D8E900B32844 /* OmnipodPumpManagerState.swift */, + C12401AA29C7D8E900B32844 /* PodComms.swift */, + C12401AC29C7D8E900B32844 /* PodCommsSession.swift */, C12401AF29C7D8E900B32844 /* PodState.swift */, ); path = PumpManager; diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift index e00dbad502..bc1b897c9b 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift @@ -747,9 +747,9 @@ public class PodCommsSession { let basalExtraCommand = BasalScheduleExtraCommand.init(schedule: schedule, scheduleOffset: scheduleOffset, acknowledgementBeep: acknowledgementBeep, programReminderInterval: programReminderInterval) do { - if !(podState.lastCommsOK && podState.deliveryStatusVerified) { - // Can't trust the current delivery state -- do a cancel all - // to be sure that setting a basal program won't fault the pod. + if podState.setupProgress == .completed && !(podState.lastCommsOK && podState.deliveryStatusVerified) { + // The pod setup is complete and the current delivery state can't be trusted so + // do a cancel all to be sure that setting the basal program won't fault the pod. let _: StatusResponse = try send([CancelDeliveryCommand(nonce: podState.currentNonce, deliveryType: .all, beepType: .noBeepCancel)]) } var status: StatusResponse = try send([basalScheduleCommand, basalExtraCommand]) From cab41f5e82aea53d6f8d72602e1d08f9fe359554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 15 Dec 2023 01:23:48 +0100 Subject: [PATCH 277/405] Fix Profile bug (cherry picked from commit 82dae9782b99f4ccdcde01f9edc5d3f4f0ea4b0b) --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index f043c3b32d..7c9421180e 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start,w=v.end,G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&Ye<400&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):Ye<400&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&Ye<400&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();e>=D&&e<=w&&(console.error("SMB disabled by schedule (a Profile is active with SMBs disabled)"),Pt=!1)}else console.error("SMBs are disabled (a Profile is active with SMBs disabled)"),Pt=!1;var Et=i.enableUAM,qt=0,Wt=0;qt=o(tt-wt,1);var kt=o(tt-wt,1);csf=_t/Z,console.error("profile.sens:"+n(H,i)+", sens:"+n(_t,i)+", CSF:"+o(csf,1));var Lt=o(30*csf*5/60,1);qt>Lt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ye&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ye&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ye&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Pt=!1),wLt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file From a9ca2a294586dacd8523c2ddb9b62013f6c4da98 Mon Sep 17 00:00:00 2001 From: 10nas <151583878+10nas@users.noreply.github.com> Date: Mon, 18 Dec 2023 17:59:30 -0800 Subject: [PATCH 278/405] Live activity updates 2 (#413) * detect system live activity setting, make live activity show even when initially stale, adjust lock screen colors * strike through BG values in live activity when stale, add button to system settings in live activity settings * add more live activity previews, avoid text getting truncated, make dynamic island keyline tint purple * update margins/paddings * Make live activity work on iOS 16.2+ --- FreeAPS.xcodeproj/project.pbxproj | 4 +- .../View/NotificationsConfigRootView.swift | 42 +++- .../LiveActivity/LiveActitiyShared.swift | 2 +- .../LiveActivity/LiveActivityBridge.swift | 95 +++++---- LiveActivity/LiveActivity.swift | 182 ++++++++++++++---- 5 files changed, 235 insertions(+), 90 deletions(-) diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 2b07ece80c..5f9d7f3ba8 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -3563,7 +3563,7 @@ INFOPLIST_FILE = LiveActivity/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = LiveActivity; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3597,7 +3597,7 @@ INFOPLIST_FILE = LiveActivity/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = LiveActivity; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift index c60450151a..1c74c81ced 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift @@ -1,3 +1,5 @@ +import ActivityKit +import Combine import SwiftUI import Swinject @@ -6,6 +8,14 @@ extension NotificationsConfig { let resolver: Resolver @StateObject var state = StateModel() + @State private var systemLiveActivitySetting: Bool = { + if #available(iOS 16.1, *) { + ActivityAuthorizationInfo().areActivitiesEnabled + } else { + false + } + }() + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -24,6 +34,19 @@ extension NotificationsConfig { return formatter } + private func liveActivityFooterText() -> String { + var footer = + "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" + + if !systemLiveActivitySetting { + footer = + "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" + + footer + } + + return footer + } + var body: some View { Form { Section(header: Text("Glucose")) { @@ -60,11 +83,20 @@ extension NotificationsConfig { Section( header: Text("Live Activity"), footer: Text( - "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" - ) - ) { - Toggle("Show live activity", isOn: $state.useLiveActivity) - } + liveActivityFooterText() + ), + content: { + if !systemLiveActivitySetting { + Button("Open Settings App") { + UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) + } + } else { + Toggle("Show Live Activity", isOn: $state.useLiveActivity) } + } + ) + .onReceive(resolver.resolve(LiveActivityBridge.self)!.$systemEnabled, perform: { + self.systemLiveActivitySetting = $0 + }) } } .onAppear(perform: configureView) diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift index 26a1977e94..5d9444d7b9 100644 --- a/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActitiyShared.swift @@ -4,7 +4,7 @@ import Foundation struct LiveActivityAttributes: ActivityAttributes { public struct ContentState: Codable, Hashable { let bg: String - let trendSystemImage: String? + let direction: String? let change: String let date: Date } diff --git a/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift index 1bd9caafa9..3c4b4c5a1a 100644 --- a/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift +++ b/FreeAPS/Sources/Services/LiveActivity/LiveActivityBridge.swift @@ -22,47 +22,19 @@ extension LiveActivityAttributes.ContentState { } init?(new bg: BloodGlucose, prev: BloodGlucose?, mmol: Bool) { - guard let glucose = bg.glucose, - bg.dateString.timeIntervalSinceNow > -TimeInterval(minutes: 6) - else { + guard let glucose = bg.glucose else { return nil } let formattedBG = Self.formatGlucose(glucose, mmol: mmol, forceSign: false) - let trendString: String? - switch bg.direction { - case .doubleUp, - .singleUp, - .tripleUp: - trendString = "arrow.up" - - case .fortyFiveUp: - trendString = "arrow.up.right" - - case .flat: - trendString = "arrow.right" - - case .fortyFiveDown: - trendString = "arrow.down.right" - - case .doubleDown, - .singleDown, - .tripleDown: - trendString = "arrow.down" - - case .notComputable, - Optional.none, - .rateOutOfRange, - .some(.none): - trendString = nil - } + let trendString = bg.direction?.symbol let change = prev?.glucose.map({ Self.formatGlucose(glucose - $0, mmol: mmol, forceSign: true) }) ?? "" - self.init(bg: formattedBG, trendSystemImage: trendString, change: change, date: bg.dateString) + self.init(bg: formattedBG, direction: trendString, change: change, date: bg.dateString) } } @@ -73,10 +45,10 @@ extension LiveActivityAttributes.ContentState { func needsRecreation() -> Bool { switch activity.activityState { case .dismissed, - .ended: + .ended, + .stale: return true - case .active, - .stale: break + case .active: break @unknown default: return true } @@ -86,11 +58,14 @@ extension LiveActivityAttributes.ContentState { } } -@available(iOS 16.2, *) final class LiveActivityBridge: Injectable { +@available(iOS 16.2, *) final class LiveActivityBridge: Injectable, ObservableObject { @Injected() private var settingsManager: SettingsManager! @Injected() private var glucoseStorage: GlucoseStorage! @Injected() private var broadcaster: Broadcaster! + private let activityAuthorizationInfo = ActivityAuthorizationInfo() + @Published private(set) var systemEnabled: Bool + private var settings: FreeAPSSettings { settingsManager.settings } @@ -99,6 +74,8 @@ extension LiveActivityAttributes.ContentState { private var latestGlucose: BloodGlucose? init(resolver: Resolver) { + systemEnabled = activityAuthorizationInfo.areActivitiesEnabled + injectServices(resolver) broadcaster.register(GlucoseObserver.self, observer: self) @@ -117,6 +94,20 @@ extension LiveActivityAttributes.ContentState { ) { _ in self.forceActivityUpdate() } + + monitorForLiveActivityAuthorizationChanges() + } + + private func monitorForLiveActivityAuthorizationChanges() { + Task { + for await activityState in activityAuthorizationInfo.activityEnablementUpdates { + if activityState != systemEnabled { + await MainActor.run { + systemEnabled = activityState + } + } + } + } } /// creates and tries to present a new activity update from the current GlucoseStorage values if live activities are enabled in settings @@ -145,24 +136,39 @@ extension LiveActivityAttributes.ContentState { await unknownActivity.end(nil, dismissalPolicy: .immediate) } - let content = ActivityContent(state: state, staleDate: state.date.addingTimeInterval(TimeInterval(6 * 60))) - if let currentActivity { if currentActivity.needsRecreation(), UIApplication.shared.applicationState == .active { // activity is no longer visible or old. End it and try to push the update again await endActivity() await pushUpdate(state) } else { + let content = ActivityContent( + state: state, + staleDate: min(state.date, Date.now).addingTimeInterval(TimeInterval(6 * 60)) + ) + await currentActivity.activity.update(content) } } else { do { + // always push a non-stale content as the first update + // pushing a stale content as the frst content results in the activity not being shown at all + // we want it shown though even if it is iniially stale, as we expect new BG readings to become available soon, which should then be displayed + let nonStale = ActivityContent( + state: LiveActivityAttributes.ContentState(bg: "--", direction: nil, change: "--", date: Date.now), + staleDate: Date.now.addingTimeInterval(60) + ) + let activity = try Activity.request( attributes: LiveActivityAttributes(startDate: Date.now), - content: content, + content: nonStale, pushType: nil ) + currentActivity = ActiveActivity(activity: activity, startDate: Date.now) + + // then show the actual content + await pushUpdate(state) } catch { print("activity creation error: \(error)") } @@ -172,7 +178,7 @@ extension LiveActivityAttributes.ContentState { /// ends all live activities immediateny private func endActivity() async { if let currentActivity { - await currentActivity.activity.end(nil, dismissalPolicy: ActivityUIDismissalPolicy.immediate) + await currentActivity.activity.end(nil, dismissalPolicy: .immediate) self.currentActivity = nil } @@ -186,6 +192,15 @@ extension LiveActivityAttributes.ContentState { @available(iOS 16.2, *) extension LiveActivityBridge: GlucoseObserver { func glucoseDidUpdate(_ glucose: [BloodGlucose]) { + guard settings.useLiveActivity else { + if currentActivity != nil { + Task { + await self.endActivity() + } + } + return + } + // backfill latest glucose if contained in this update if glucose.count > 1 { latestGlucose = glucose[glucose.count - 2] @@ -199,7 +214,7 @@ extension LiveActivityBridge: GlucoseObserver { prev: latestGlucose, mmol: settings.units == .mmolL ) else { - // no bg or value stale. Don't update the activity if there already is one, just let it turn stale so that it can still be used once current bg is available again + // no bg or value, can't update the live activity return } diff --git a/LiveActivity/LiveActivity.swift b/LiveActivity/LiveActivity.swift index b400e5b2f8..85c7fb14e9 100644 --- a/LiveActivity/LiveActivity.swift +++ b/LiveActivity/LiveActivity.swift @@ -2,92 +2,165 @@ import ActivityKit import SwiftUI import WidgetKit +private enum Size { + case minimal + case compact + case expanded +} + struct LiveActivity: Widget { - let dateFormatter: DateFormatter = { + private let dateFormatter: DateFormatter = { var f = DateFormatter() f.dateStyle = .none f.timeStyle = .short return f }() - func changeLabel(context: ActivityViewContext) -> Text { - if !context.isStale && !context.state.change.isEmpty { - Text(context.state.change) + @ViewBuilder private func changeLabel(context: ActivityViewContext) -> some View { + if !context.state.change.isEmpty { + if context.isStale { + Text(context.state.change).foregroundStyle(.primary.opacity(0.5)) + .strikethrough(pattern: .solid, color: .red.opacity(0.6)) + } else { + Text(context.state.change) + } } else { Text("--") } } - func updatedLabel(context: ActivityViewContext) -> Text { - Text("Updated: \(dateFormatter.string(from: context.state.date))") - } - - func bgLabel(context: ActivityViewContext) -> Text { + private func updatedLabel(context: ActivityViewContext) -> Text { + let text = Text("Updated: \(dateFormatter.string(from: context.state.date))") if context.isStale { - Text("--") + if #available(iOSApplicationExtension 17.0, *) { + return text.bold().foregroundStyle(.red) + } else { + return text.bold().foregroundColor(.red) + } } else { - Text(context.state.bg) + return text } } - @ViewBuilder func bgAndTrend(context: ActivityViewContext) -> some View { - if context.isStale { - Text("--") - } else { - Text(context.state.bg) - if let trendSystemImage = context.state.trendSystemImage { - Image(systemName: trendSystemImage) + private func bgAndTrend(context: ActivityViewContext, size: Size) -> (some View, Int) { + var characters = 0 + + let bgText = context.state.bg + characters += bgText.count + + // narrow mode is for the minimal dynamic island view + // there is not enough space to show all three arrow there + // and everything has to be squeezed together to some degree + // only display the first arrow character and make it red in case there were more characters + var directionText: String? + var warnColor: Color? + if let direction = context.state.direction { + if size == .compact { + directionText = String(direction[direction.startIndex ... direction.startIndex]) + + if direction.count > 1 { + warnColor = Color.red + } + } else { + directionText = direction } + + characters += directionText!.count } + + let spacing: CGFloat + switch size { + case .minimal: spacing = -1 + case .compact: spacing = 0 + case .expanded: spacing = 3 + } + + let stack = HStack(spacing: spacing) { + Text(bgText) + .strikethrough(context.isStale, pattern: .solid, color: .red.opacity(0.6)) + if let direction = directionText { + let text = Text(direction) + switch size { + case .minimal: + let scaledText = text.scaleEffect(x: 0.7, y: 0.7, anchor: .leading) + if let warnColor { + scaledText.foregroundStyle(warnColor) + } else { + scaledText + } + case .compact: + text.scaleEffect(x: 0.8, y: 0.8, anchor: .leading).padding(.trailing, -3) + + case .expanded: + text.scaleEffect(x: 0.7, y: 0.7, anchor: .leading).padding(.trailing, -5) + } + } + } + .foregroundStyle(context.isStale ? Color.primary.opacity(0.5) : Color.primary) + + return (stack, characters) } var body: some WidgetConfiguration { ActivityConfiguration(for: LiveActivityAttributes.self) { context in // Lock screen/banner UI goes here - HStack(spacing: 3) { - bgAndTrend(context: context).font(.title) + bgAndTrend(context: context, size: .expanded).0.font(.title) Spacer() VStack(alignment: .trailing, spacing: 5) { changeLabel(context: context).font(.title3) - updatedLabel(context: context).font(.caption).foregroundStyle(.black.opacity(0.7)) + updatedLabel(context: context).font(.caption).foregroundStyle(.primary.opacity(0.7)) } } .privacySensitive() - .imageScale(.small) .padding(.all, 15) - .background(Color.white.opacity(0.2)) - .foregroundColor(Color.black) - .activityBackgroundTint(Color.cyan.opacity(0.2)) - .activitySystemActionForegroundColor(Color.black) - + // Semantic BackgroundStyle and Color values work here. They adapt to the given interface style (light mode, dark mode) + // Semantic UIColors do NOT (as of iOS 17.1.1). Like UIColor.systemBackgroundColor (it does not adapt to changes of the interface style) + // The colorScheme environment varaible that is usually used to detect dark mode does NOT work here (it reports false values) + .foregroundStyle(Color.primary) + .background(BackgroundStyle.background.opacity(0.4)) + .activityBackgroundTint(Color.clear) } dynamicIsland: { context in DynamicIsland { // Expanded UI goes here. Compose the expanded UI through // various regions, like leading/trailing/center/bottom DynamicIslandExpandedRegion(.leading) { - HStack(spacing: 3) { - bgAndTrend(context: context) - }.imageScale(.small).font(.title).padding(.leading, 5) + bgAndTrend(context: context, size: .expanded).0.font(.title2).padding(.leading, 5) } DynamicIslandExpandedRegion(.trailing) { - changeLabel(context: context).font(.title).padding(.trailing, 5) + changeLabel(context: context).font(.title2).padding(.trailing, 5) } DynamicIslandExpandedRegion(.bottom) { - updatedLabel(context: context).font(.caption).foregroundStyle(Color.secondary) - .padding(.bottom, 5) + Group { + updatedLabel(context: context).font(.caption).foregroundStyle(Color.secondary) + } + .frame( + maxHeight: .infinity, + alignment: .bottom + ) } } compactLeading: { - HStack(spacing: 1) { - bgAndTrend(context: context) - }.bold().imageScale(.small).padding(.leading, 5) + bgAndTrend(context: context, size: .compact).0.padding(.leading, 4) } compactTrailing: { - changeLabel(context: context).padding(.trailing, 5) + changeLabel(context: context).padding(.trailing, 4) } minimal: { - bgLabel(context: context).bold() + let (_label, characterCount) = bgAndTrend(context: context, size: .minimal) + + let label = _label.padding(.leading, 7).padding(.trailing, 3) + + if characterCount < 4 { + label + } else if characterCount < 5 { + label.fontWidth(.condensed) + } else { + label.fontWidth(.compressed) + } } .widgetURL(URL(string: "freeaps-x://")) - .keylineTint(Color.cyan.opacity(0.5)) + .keylineTint(Color.purple) + .contentMargins(.horizontal, 0, for: .minimal) + .contentMargins(.trailing, 0, for: .compactLeading) + .contentMargins(.leading, 0, for: .compactTrailing) } } } @@ -99,13 +172,38 @@ private extension LiveActivityAttributes { } private extension LiveActivityAttributes.ContentState { - static var test: LiveActivityAttributes.ContentState { - LiveActivityAttributes.ContentState(bg: "100", trendSystemImage: "arrow.right", change: "+2", date: Date()) + // 0 is the widest digit. Use this to get an upper bound on text width. + + // Use mmol/l notation with decimal point as well for the same reason, it uses up to 4 characters, while mg/dl uses up to 3 + static var testWide: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "00.0", direction: "→", change: "+0.0", date: Date()) + } + + static var testVeryWide: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "00.0", direction: "↑↑", change: "+0.0", date: Date()) + } + + static var testSuperWide: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "00.0", direction: "↑↑↑", change: "+0.0", date: Date()) + } + + // 2 characters for BG, 1 character for change is the minimum that will be shown + static var testNarrow: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "00", direction: "↑", change: "+0", date: Date()) + } + + static var testMedium: LiveActivityAttributes.ContentState { + LiveActivityAttributes.ContentState(bg: "000", direction: "↗︎", change: "+00", date: Date()) } } +@available(iOS 17.0, iOSApplicationExtension 17.0, *) #Preview("Notification", as: .content, using: LiveActivityAttributes.preview) { LiveActivity() } contentStates: { - LiveActivityAttributes.ContentState.test + LiveActivityAttributes.ContentState.testSuperWide + LiveActivityAttributes.ContentState.testVeryWide + LiveActivityAttributes.ContentState.testWide + LiveActivityAttributes.ContentState.testMedium + LiveActivityAttributes.ContentState.testNarrow } From 2b82f7268826afb7211ded091b092be89a48904b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 20 Dec 2023 17:23:51 +0100 Subject: [PATCH 279/405] New UI/UX (#428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New UI/UX Header: Make the current glucose more prominent and taking up more space. Less strings and more graphics. Replace the boring and cluttered strings with dynamic graphics. Test tubes in frosted glass for IOB and COB, displaying amount as coloured liquid. Pump status using dynamic graphics instead of strings. Both battery icon and reservoir vial image is now illustrated with a dynamic fill. Loop button is now more discrete. Normally iAPS is functioning well and you shouldn’t need to worry about if looping or not, because it will be looping. However, when not looping the loop button the button will appear with red text. When tapping the loop button you will now see all info. Both chart, header and the openAPS suggestion. This pop-up info is now toggled with the loop button, meaning if you tap button again the pop-up disappears (or if tapping inside of pop-up as before). Chart and Info panel The chart and info panel is now less cluttered. Eventual glucose is displayed more readable. The legends are removed and only displayed when tapped once. Tapping once again will remove them (thanks for this idea @nas10 ). To indicate that there in fact are legends available small coloured dots are added. Bolus Progress is now displayed as layer on top of chart. Bigger and with a clearer stop button. When legends are displayed they will now appear in the future x-side: When Max IOB setting is 0 this will now be displayed more prominently: Profiles are now displayed in chart. Duration and target glucose will displayed similar to the temp targets. B Profile name will be displayed centred in info panel, as displayed below. Button Panel The extra space from the previous profile button is now used for a bigger header instead. New profile button. When profile selected, this button will be highlighted, similar to the Loop app. A enabled profile will be deactivated with just tap, also similar to the Loop app (thank you Loop authors for the idea (didn’t borrow any code)). New history button. Instead of tapping the chart you now have a button to access the history. Vertical Scroll View and Statistics Preview To make the button panel and home view both less cluttered and more extendable I’ve removed the statistics button and introduced a vertical scroll. To see a preview of statistics just scroll down. To see full statistics view tap the preview (now just TIR for current day is displayed, but more info will be added later). The idea with the vertical scroll is also to make the home more more extendable with future updates. Later we can add for instance an Insulin chart here, or a meal chart, or whatever really. Any info you would like to sometimes look at, but not always need to see. This info is only displayed when scrolling down, meaning it will not add any clutter or extra ”info overload” when using the iAPS app as you’re used to do. Temp Targets Temp targets will still work as before. For those of you who really need to use both TTs and profiles simultaneously you can display the Temp Target button in UI/UX settings. Default is to not display this button. I recommend not normally just use one of these, but I can understand the need for sometimes having to use both, which is why I decided to not remove this option entirely. Tested a couple of weeks on my own phone and with different simulators. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. --- Config.xcconfig | 2 +- .../Core_Data.xcdatamodel/contents | 8 +- .../xcschemes/LoopKit Example.xcscheme | 87 +++ .../xcschemes/Shared-watchOS.xcscheme | 76 +++ FreeAPS.xcodeproj/project.pbxproj | 18 +- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../7xx Small Clear.pdf | Bin 0 -> 5090 bytes .../7xx Small Clear.imageset/Contents.json | 12 + .../Colors/DarkGreen.colorset/Contents.json | 38 ++ .../Colors/DarkRed.colorset/Contents.json | 38 ++ .../Colors/DarkerBlue.colorset/Contents.json | 12 +- .../Colors/Header.colorset/Contents.json | 34 + .../Colors/Lemon.colorset/Contents.json | 4 +- .../Colors/PopUpGray.colorset/Contents.json | 34 + .../Colors/darkGray.colorset/Contents.json | 4 +- .../Colors/lightBlue.colorset/Contents.json | 38 ++ .../Assets.xcassets/reservoir/Contents.json | 6 + .../pod_reservoir.imageset/Contents.json | 25 + .../pod_reservoir.imageset/reservoir.pdf | Bin 0 -> 10664 bytes .../pod_reservoir.imageset/reservoir_mask.pdf | Bin 0 -> 5537 bytes .../pod_reservoir_mask.imageset/Contents.json | 12 + .../reservoir_mask.pdf | Bin 0 -> 5537 bytes .../Contents.json | 25 + .../reservoir 1.pdf | Bin 0 -> 10664 bytes .../reservoir.pdf | Bin 0 -> 10664 bytes .../reservoir.pxm | Bin 0 -> 107766 bytes .../vial.imageset/Contents.json | 22 + .../vial.imageset/vial_stroke_dark.svg | 81 +++ .../vial.imageset/vial_stroke_light.svg | 80 +++ .../vial_color.imageset/Contents.json | 15 + .../Mediamodifier-Design.svg | 22 + FreeAPS/Resources/Info.plist | 8 +- .../defaults/freeaps/freeaps_settings.json | 1 + FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 8 +- .../Sources/APS/Storage/OverrideStorage.swift | 79 +++ .../Sources/Helpers/Color+Extensions.swift | 7 + FreeAPS/Sources/Models/Configs.swift | 42 ++ FreeAPS/Sources/Models/DateFilter.swift | 11 - FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 + .../Modules/Bolus/BolusStateModel.swift | 1 - .../View/AlternativeBolusCalcRootView.swift | 26 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 23 +- .../Modules/CGM/View/CGMRootView.swift | 3 +- .../DataTable/View/DataTableRootView.swift | 2 +- .../Dynamic/View/DynamicRootView.swift | 18 +- .../Sources/Modules/Home/HomeDataFlow.swift | 1 + .../Sources/Modules/Home/HomeProvider.swift | 8 + .../Sources/Modules/Home/HomeStateModel.swift | 46 +- .../Home/View/Chart/MainChartView.swift | 234 ++++++- .../Home/View/Header/CurrentGlucoseView.swift | 99 ++- .../Modules/Home/View/Header/LoopView.swift | 61 +- .../Home/View/Header/PreviewView.swift | 255 +++++++ .../Modules/Home/View/Header/PumpView.swift | 173 +++-- .../Modules/Home/View/HomeRootView.swift | 624 ++++++++---------- .../OverrideProfilesStateModel.swift | 37 +- .../View/OverrideProfilesRootView.swift | 41 +- .../View/PreferencesEditorRootView.swift | 8 +- .../PumpConfig/View/PumpConfigRootView.swift | 2 +- .../View/PumpSettingsEditorRootView.swift | 2 +- .../Sources/Modules/Stat/StatStateModel.swift | 2 + .../Modules/Stat/View/ChartsView.swift | 20 +- .../StatConfig/StatConfigStateModel.swift | 11 + .../StatConfig/View/StatConfigRootView.swift | 11 + FreeAPS/Sources/Router/Screen.swift | 2 +- .../Services/HealthKit/HealthKitManager.swift | 3 +- .../Views/BolusProgressViewStyle.swift | 23 +- FreeAPS/Sources/Views/DecimalTextField.swift | 33 +- FreeAPS/Sources/Views/TagCloudView.swift | 2 +- FreeAPS/Sources/Views/ViewModifiers.swift | 126 +++- 69 files changed, 2078 insertions(+), 675 deletions(-) create mode 100644 Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme create mode 100644 Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_dark.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg create mode 100644 FreeAPS/Sources/APS/Storage/OverrideStorage.swift create mode 100644 FreeAPS/Sources/Models/Configs.swift delete mode 100644 FreeAPS/Sources/Models/DateFilter.swift create mode 100644 FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift diff --git a/Config.xcconfig b/Config.xcconfig index 61834b473c..7194c1f2f6 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.3.2 +APP_VERSION = 2.4.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 023a0cebc0..716aaf395a 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -100,11 +100,17 @@ + + + + + + diff --git a/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme new file mode 100644 index 0000000000..be16b5e5bc --- /dev/null +++ b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme new file mode 100644 index 0000000000..fb7a17ba47 --- /dev/null +++ b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 2b07ece80c..4441e95b77 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -33,10 +33,12 @@ 1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; }; 19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; 198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198CED9C2B2E62940073032D /* OverrideStorage.swift */; }; 199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; }; 19A910302A24BF6300C8951B /* StatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A9102F2A24BF6300C8951B /* StatsView.swift */; }; - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* DateFilter.swift */; }; + 19A910362A24D6D700C8951B /* Configs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* Configs.swift */; }; 19A910382A24EF3200C8951B /* ChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910372A24EF3200C8951B /* ChartsView.swift */; }; + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */; }; 19B0EF2128F6D66200069496 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B0EF2028F6D66200069496 /* Statistics.swift */; }; 19D466A329AA2B80004D5F33 /* FPUConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A229AA2B80004D5F33 /* FPUConfigDataFlow.swift */; }; 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; @@ -586,12 +588,14 @@ 198377E2266C0AC8004DE65E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; 198377E3266C0ADC004DE65E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 198377E4266C13D2004DE65E /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 198CED9C2B2E62940073032D /* OverrideStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideStorage.swift; sourceTree = ""; }; 199561C0275E61A50077B976 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS8.0.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; 199732B4271B72DD00129A3F /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; 199732B5271B9EE900129A3F /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; 19A9102F2A24BF6300C8951B /* StatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsView.swift; sourceTree = ""; }; - 19A910352A24D6D700C8951B /* DateFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFilter.swift; sourceTree = ""; }; + 19A910352A24D6D700C8951B /* Configs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configs.swift; sourceTree = ""; }; 19A910372A24EF3200C8951B /* ChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartsView.swift; sourceTree = ""; }; + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewView.swift; sourceTree = ""; }; 19B0EF2028F6D66200069496 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = ""; }; 19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; 19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; @@ -1246,8 +1250,8 @@ isa = PBXGroup; children = ( 195D80B22AF696EE00D25097 /* Dynamic */, - BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 19F95FF129F10F9C00314DDC /* Stat */, CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19E1F7E629D0828B005C8D20 /* IconConfig */, @@ -1573,6 +1577,7 @@ 383420D525FFE38C002D46C1 /* LoopView.swift */, 38AAF85425FFF846004AF583 /* CurrentGlucoseView.swift */, 38DAB27F260CBB7F00F74C1A /* PumpView.swift */, + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */, ); path = Header; sourceTree = ""; @@ -1712,7 +1717,7 @@ 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, 19D4E4EA29FC6A9F00351451 /* Charts.swift */, - 19A910352A24D6D700C8951B /* DateFilter.swift */, + 19A910352A24D6D700C8951B /* Configs.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, ); @@ -1761,6 +1766,7 @@ 38F3B2EE25ED8E2A005C48AA /* TempTargetsStorage.swift */, CE82E02428E867BA00473A9C /* AlertStorage.swift */, 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */, + 198CED9C2B2E62940073032D /* OverrideStorage.swift */, ); path = Storage; sourceTree = ""; @@ -2740,6 +2746,7 @@ 383948DA25CD64D500E91849 /* Glucose.swift in Sources */, CE94598029E9E3BD0047C9C6 /* WatchConfigDataFlow.swift in Sources */, 388E596C25AD95110019842D /* OpenAPS.swift in Sources */, + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */, E00EEC0527368630002FF094 /* StorageAssembly.swift in Sources */, 384E803825C388640086DB71 /* Script.swift in Sources */, CE94597E29E9E1EE0047C9C6 /* GarminManager.swift in Sources */, @@ -2868,6 +2875,7 @@ CE1856F72ADC4869007E39C7 /* CarbPresetIntentRequest.swift in Sources */, BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */, 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, 642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */, BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */, @@ -2881,7 +2889,7 @@ 38E44536274E411700EC9A94 /* Disk.swift in Sources */, 2BE9A6FA20875F6F4F9CD461 /* PumpSettingsEditorProvider.swift in Sources */, 6B9625766B697D1C98E455A2 /* PumpSettingsEditorStateModel.swift in Sources */, - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */, + 19A910362A24D6D700C8951B /* Configs.swift in Sources */, A0B8EC8CC5CD1DD237D1BCD2 /* PumpSettingsEditorRootView.swift in Sources */, E06B911A275B5EEA003C04B6 /* Array+Extension.swift in Sources */, 38EA0600262091870064E39B /* BolusProgressViewStyle.swift in Sources */, diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 142d983415..2cfe78ebfa 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41cc88bd386d677f5bdb6369b0fedf65888b95df GIT binary patch literal 5090 zcmai2cRbbK|2J;ok|_O@3E>`hEL+`{Vn5ydU>{?(;RydOcp}`8onxN-82yQ8-Ybd1`HHA$L9fLvsrd z0fK;>%$W|vUv=2#?Z>^Ar+6j2!y?7I~8uw@`u9?bM!Wocf9? zI&T|cbh5QADVCs?X@68k>NUn+e3giHP)GW8%8tME_B?ldoSCs>PS9d`892badF4XO z(~sBlmu$v`4h%P{Kk0;{L!DF-d-BNUS+#P zp|GMI9@ukQYICXRHD1eyg+W%;-BrX6-bPXAbT3?a@~dvO!v)wmpDVIyTnP!mSJU)# z0A}O-dDqV(sTXI%s@H4=CzpenS+iLAqT`OaU45eXCR_H&GCS+OI`RD&O+%bi(>vO- z789unoh>5c^O*$xz}Jx_#u+6~h_BOxS??{o^7v)u+Zz&Q-5&r(UDJdU-uaw#gR`|n0okl9S;p0((0q}4*6=( zmcyK@dhXtVQgH5>HSf$QHo}$KnY(>l>jOxlhlzaGyE49Yt%dkpy-@m5WJHZ!f1yP3 zO7{WF8Aj#KsMN7&!p|umkr~04S=Q<|BJ2tH6@@CnT+V{Da=~4ABzsN*Q*n10 znlYSjQuTIOdQ)%ot+{Y6sV!cQ#*EA@^&<0h4dyS|UsjZuras&3Ic^b77z~E^WEHHH zuyHw5F|cx;e0YD8-KrYmg3Q>dJzbR((IxFVGTReu*m`30vD3azpXXX$HP6SsWPLB# z;LB%`51XpWEJuwm>0Rw(*WfrK(s`?A``CM7LZmItkt8(d5&r#YyLDDwPa6C8>MX_f z6>}JQk&Vy2*OokN?|YnHAcg~VMm$-4KA7Fw?2?$_y*@aiSNiGo^HG=+$!W6}d6Y(AX1%w)xQa$zM2aW{ zH]=4kzZDWstl@Zxb+RBc3-;+Q+Rv;98eYKYhOfJ@#)953X3w5#vfMwPQydCbJ= z8UfC6l>R+3d}+PXTE*;RlpMzuE0|f2xqclFUM-xHg)SBkGNL$DQURHOz(^;1C!DS`#sUjE%*{v_C`jTT2OzMr z2Og!1r{v|IG89E7c_;(Q%KqX15c=)^*LeS92DZR}AfjS_XiNQ}{m(%Fh5YOge1kGK zu)^VK;CR?2SPAQ9Yk}24DgN(6BK48`P2Bu=Ab|~TF9y)ZtJh8ev_n+= zv}l3?1l^R5sIajL>sj7>O^piXvruMZd~n~qpJ9zftEEv}NqK5G{0_rPvDo@Z%6=<) zbYP~kf53W$&|gEP_5D7e32#8{haeiTEiW`0pE%jkyiLQ&Ld|SI{d&yG3V_;CqUrr! zCzG6o?Co*Id@l7JN3>DhUrP6c60HtU=bB-)3-l-anJL)K`h=;NEEUg4O-cBO2dQhDT9Plf_Q zRLyf(`;%;^X4|axR?BsF&7qg#-)M|I^iU^lR4_$CIQ&YS9w}1`pdFHJVwQ?|mX^?; zrfqf`21d{N=L5f$P|*w)hPnpDC|TxJ6ara8!P3tVnYO zM74H=s$%5H`q?0R)7a*5CLzYK#YKA;>a;temu4l%Y4@GpH3Ug*CwDB9^{(b{$oZdF zJq5=qPvzw1s3~=JGBGETEcdrr4klhp*}iXobNNZyYmU{x*<0GP@eBbWHnoA${sz&a zmcRhtzA;};aUnV`pVT{SHm+t=gg_~+Dpk5RCmAZ_d0Ku)IWHQ*f)NW8*jE3_rZ}d= zB?{*CV`lFhqj9L?n7RU=?(`N@lqF6e<1$y~Xn=hq&539_d^!-}FAAZ#eES%WAKaOC z1Vk0!ca4Si5v}Mo8e4flnS$(RDxd=NGqu|TJ7=n1f3FXK8~4SXj~WB?UmtU3Wb#AF z1A`jXAk-uNw)FSEv7E|KD2QgyI-acfiRH8*y(dyZOOlQDEixpUC02g-gJ2%##RmmM zq?XLac|3Owy~%^Ubh-~9#L<0fLI7(LO%LYSXR4Qe1Ep7a=uu4_UzI#gJ)z@xJver~ zid~kuvWa8t^f#)@fo4r{^zv==wB0HO^ru&q6r&CJsabjN#PDU&>5sVHWGuOj>GQSS#OR`APQ|Fi#w_<_&@7~Wg?|YtOAXFsh#vso6 zI6|aZ?{?H}qte9Zw4X7HS9zFQUvrJ~IQvv_8p9mLo&hS4_lMW|Exb84Cb;VH>f#97 z%KhVwF5k@W@zw)H&yNUOax^F>v-eZuUMjRoM?Gd&1d{+ zATxpEv2t4R7X;Zfuk$D?4&0EsUM=q_?}^OTIhNlWM40r$o3;0HfmIiR+0I z?Zt70F?SLc61@d9L^dk3z=l^q@zUK<{@j+m|{O^^n~OKeRKUI{1c zUUa;8FM%(?DuFs7szCjgQy*JjYJo$6W-r7}&<Bs`l(Q-^|O*$8o1{*K>1m-{MY0w1{z~IHt6xOr^{qS}SY}8D9VlrwnIam_ibg zmpgA-36zIP5sRNK<%)F6W(^n06kFt#8(3%FDDOIH5-VyXp-^dDsq3z&sRlLxo0Vv< z5M{N~iqo8KpyLbdk!Zbg4JeZTB)gAMajb zlnFBkOJyHsH@m!aSyyD?@;S6H`iOx;#eC`Bn=j2NcT6k@twDAZ7Uf+z!_zN{^F>D8 z8kPuGQ%p*S*=ujqlD3$)_{f4}D4k5OM{phU_Gi4?h1vi@AM3*GSXI|*_ynDhx6tz* z)!flkbeC|~v93%;CXR0$y&{~r?z>}EJh&K9OVMyM4`*WUt-*u|!-c(0jsA!kw`Pat z;mXNsOis6HD}C^h+vZx6N1VR&r&p$cD&9$eyfst1l#g zcQE@j`)+%~>;2zm_WH@107*a*!z?fhpaRgNlVyZ4oH*hNc+*JTSbP5*_@f!WaW6ZK z;&-H5pfrORlgX()7f#X3h$6v7&#GG5p!iFWOMDcsJ4%7sIUljHFkHEcGO$t zK9q*Cw{oJgTB5;abor!8xM4UbM~3~}=~LePZn*sIkHc!g6N}@(iDgl^@uTv^FSr*| z`5mNZ(PoY4yBE)%K6hr6Zf`Q7>NZ38NHDtZ(JFrlTFOyDv? zb>KIMObD{(oo(Opt&@Y6Hn!Rj0CCXF>?oAnD(4j_kX1K&DS zIwG*AM;${)dbQKFOY3jjl&?&;C{`4SyD*9-=tKJwsDp10bp-8OI@z;q zJg%Hx42>1NAuVLg*ECrBn)xa%U0aPIp#o9atxZv`eOG(?CGsTV#hW5x zTb@tcZFSoJx{35YSvaQ!&#c}7Nb*Xpj<@cdTY1VPJ>VHiD3}x4PuqI=!7$X2_-W`< z$jdBoTW@vm(K)}K)H7XYMC2YH+}jA>N=_+%XRStx={oh~u~eG7&zfRO;A&V1NAMMW zylhRy{1Zz|SF3UPgLUNZw-O7jpGlcqC8QGSmV)*pKAo+7`p9h2$9C?; zibLI;bNT+GiQ>rmBZQef6Eb*YtA;QYd60UVHtgu$vS_{cf$5OU9ARX?n=b#jsa&U* zQ9)Hm@Ik_EiRPOlqWa-|loTB+FeN$*Y&z`?TdS zV>vt7<8Hf>lN&lxSTDEbzfUAvY_!JAEo$y)CZt8kx!+^>zUCq5U^P9u9k5RRn~VRX zp+5<@I287qJRfr5LySV0Rgp+Vj0@HhbVy-!KqkLc4hi|c`R^fLcL9Mlu$HzMMJErC z(ILTwLd8Jh@Slv^l|tj8Ah4RPr3;0LAM$;QyFWNG6#AD-BnFSMce4If3%L9)0`#yr z7h5Ms5Ev?o_|yJ(32{LKV*%3C1sQ;#5K$)#j@4*Sa%iufBtz#)Izioqy*^I!hN#Q*9S0h9bo4}pMEBIn<>2!teM z+5Za@gHuYj-xwZ;v9-tIeqNmE+Imse6afP3I5|-w=rBqsi>vBr literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json new file mode 100644 index 0000000000..89f650c706 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "7xx Small Clear.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json new file mode 100644 index 0000000000..b84b37c721 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.663", + "red" : "0.203" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.519", + "red" : "0.200" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json new file mode 100644 index 0000000000..33ff64bee2 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.584" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.494" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json index ef3fc04315..42dc0270bf 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json new file mode 100644 index 0000000000..e28ac915cd --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json index 8bc12a80a3..f258ad918b 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json @@ -4,7 +4,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.550", "blue" : "0.089", "green" : "0.940", "red" : "1.000" @@ -22,7 +22,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.360", "blue" : "0.089", "green" : "0.940", "red" : "1.000" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json new file mode 100644 index 0000000000..9b69d5bb49 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.548" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.404" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json index b05e49b845..a0b11043bc 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json @@ -5,7 +5,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" @@ -21,7 +21,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json new file mode 100644 index 0000000000..7fa8c07f81 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json new file mode 100644 index 0000000000..2f0731fe05 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json new file mode 100644 index 0000000000..e195986940 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json new file mode 100644 index 0000000000..6bfcfa46af --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir 1.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm new file mode 100644 index 0000000000000000000000000000000000000000..7ac25ecfe5c34e9c3fd752bbddee454910344a9d GIT binary patch literal 107766 zcmeFa2S5`|yEZ(VP3R>QK|mlhDbhPgkxryaN6;8TfCwa*1P~Amieks!8;IQp>|L;T zMX_M-3W^m)rTWb#RF&sF=Q+OT|Ni&eXvpmB)O%)j=Pq+!p)o<;K|T>48^r-g$Vg-H z_?DJ85dumiiHS?a=w~sxJQjx?t54@LQdsaRLZ8pch|%XHjAt_VJVk&^Ur!^;2ZskR zbC`)9U5TzsNJelu9KHalB%4di*x1_HJ2*Ny4|j2Ob06X1>E-R?>*r4m43CJ3A4gBf zn84-nGxH|p3ks)9jnrpnrlsAGm6IpySVsqko2N2!c%$KOSB+8nj5IorS4k!-C@Lur zQc)eOrmitWQ%jp7AP7(aQ9u%i3B&~w0!e|CKw2OpkQK-YGWhKHN=<0O{eoc z={y!Ah{>mWviQ7ECfAFTp21-=*?cNHiGzJ1C1~Vf1LgAOFf!9&>Tp&rvnRFrK&iu+ zJWg6BAC5pI8&=no!D65ceq2swMj$;04x1MzQ`9J7gUklX;l)YgaCsSY1~ZtR-rFS0 zfzrcnr_+C1h2cP1U<0x_+{E7I8xNGyo6e_ur1xw1fN6!j#M<0j?tqPsf|HfQ{T*Ef zBz**PBLBaYL6|s*&P)A?@>TX|{k9T~7yy`vSxNo1z=Oo#!g)H{QE z(heP{K~bW`-j$FnF*?u6+R2n+W$%zrM#z9hR^WyCc~Yo8UiMZ__V#Ah=2m2+R!)9o zzV3I!eF_g3o=n}1ot?=KG-9L!Lr_%$V^I35$FhX1$qK~fx*V{sfp=q!BBw-j2k8} z#g@EE4}n6{==>zO?1SixkZ>B=py!6@SUOb^e@$l!4K%*6irFe+qC%q`6p7?$P;j0DCsvcmuc zg)t{&vbaoMSAoAYA=1X&%G?T$Lc!$t;Bapi1A9!-xjAJ8VUbqmcIH-5Hs(&|R#xHg z0;VdOMk6crOoiU$8;T0TfCNwg>OdbD18d*_s2~uG0^y(t%mNF*3Q!KVgDP+woCK%A zS#Ta)1ed{8a1GRgo8UIM1MYzb;1T!)K7(fP4YYtZ&;foR2!bLcL>!Ssq!C#}9#KG) z5Gs<5Y(ef3qzJBrWWpjsHK7UBLnF``=ppnaQI1F^Y7jMv+C&?o9nqOMoajpQBnAMa*2xR?JDvSBxqaA{He!T8t)^ zDV(f;fQWv<^se8oAF-U!0FX#q_%xRjk^4|eTwgJey%O8{5Dcc~I z_e(lF0;d2@0h|Ij1#k-B6u>EfQvjy`P63<(I0gO?1q#VTaaA21q%c(|W=X@ue>98% z>i#6*}=; zB7OR%7bP{OgalK(LV|q*sa_G3FrUys4=*2M8_p~7-h?#BhtlYoe2(y% z)>}W#sy8fFD1(Zt8XF^p;lh4&^RlAk{jZ4q`qTej-!^u2B!kX{GFMukUWyt*=hH;D zDAeExA3vWkQwl#PL)3laNr0h|Ij1#k-B z6u>EfQvjy`PJ#ab3P_M)C&VSC;9muq<3QF(?xxIfxy`cEWsk^P%Ztljm-#IFLe5(* zQ#MXMT251b#(zMc@h;#Lz$t)J0H**>0h|Ij1#k-B6u>F)|7!|Zqby_q<8;wEh#WQ} zl*>tCrFEZMQLshR2g)+waSQU_)FV3Wf*nf{S^QI>QWqX)kvBnO2dW1%@`o9^n;IbJb*$lM;VemxB4GJ5!D#TVyD8=x+=yF1R(N@0sN1Da0=iQz$t)J z0H**>0h|Ij1#k-B6u>EfQvjy`PJ#bL3XDg@3K1Yd7xL?7-cI&Tc9zz5Wf&UE( zC_rbvfGmdD|I1391oCra!ewX4osxbntt)RTQ!O`6x>)vu)Ja+0|Bc4rb>I}hDS%S| zrvOd?oB}una0=iQ_^(ocMk+)CkbkZ#`^i{VSWq8hW!Xene&io6pUR73@mSE^eU}xk z3>{Vy@`o!C*>-o;AkBg`(Ee}@RGwEFD?IRmU8DYR zT_F(Yg2m72>W)M*tRn6YR}r4UWU!K0jJ{Uu|BiX)nZ{%%Vki(@oe|4`ok{=0oe6~i z08DNclNZ6Ivmr_dbfd@UrXK0vGeCU};fX1*PhBtKy|+y{`j}x z6PZZMh%kYMnVOkf3o(j(s3U_SqoQLVHW4E+DH(zjW#!}-7SHH|O{A_rFgDTF9%Q0l zA&It%u!?ka^&mKr2zy9Ph%{s%Fcc`z$Xc{Ok652Dzp#+V&~TbhOsGe2I5i}g79Ih; zcZSnw>C0TtM}dr z^a$_DLF>BNCs#Bz*gGV;y9%Yyn6S(=h!KOKA0@&wIq>vMJS{W~y3Xv*s}UO0Jz2U> zA5kGZ5|8EUZc`AtaL`hC*UvuU}?shru(IIXH?CnxaMBq`~66X%aND^FLoM zwHVIS@6c!l03q@4^6m#>(t}I`3-a~*8N$Zb-@6;ahDKJ-%YzHRGT)SvXKf2ZR<=(0 z`LMGAR_jGQ4IZUm77~hKOqGR&L71t**g&g=#)PM_7)%~~!e+rUKt5~?Atw=%ltxzU zzSp&pfRU0I$ztPaWuxOTn5wcdVw-)w|+=U?q2i$`XF@q8^`AnWbK|r{ns3fbbIrKLx zdrLRa*v}ASTeP&bb#%4#^@UhtBD67SIGZ8j7{n0@4)^D9S-BiGpPrVM;{{2?$@ipJuQ@uo!`UWhj5k!hr^SCd=_KC=-vwAg2N*? z8KUCh)b-@>;UPNFrKGOsd?*?wkb$n}UI1z_V7C9pGI4Nn9$=Z+*}J&HdP5;xlMo55 z%+0y)>ZAgYf6;(~<3tuGtlAbcbXnTX^gQ;@mHQe+3R6FG*QMJ^$A$UV{9t_M@c zz5m+}c_kPMmqo#3I51sMQrO;YLxI3M3IZF!;EgHrQ;Vie$0kMsoyUY7Gv_iPG!z8H z699p+z=%f9#!jI+TUb~`!u=A@VthinMItlH!rGF}$+BR1goa!Aa+yr*7kd?Ea^cFi z@Zj;7e4hD41_ZQ&0Sm5huf<_;EiyQXw4N(kb_#T#Y|g?^=wQ0uWab%(NwDEFXGI2w z!v}2HOz#26EPyaVbHNg@9&84?z#gy<8~}&F5pWDtgA?G?Po%vM9)ic3 zNrXgQgsexZkWKBxJY0GvlTkLxLo?BAGzZN?1?UvC2%QeWnr5M!(ZlFb^aOemJ&j&KuZzWs#fgm* zV~cUca>N8;GsG5)EfrfXwo+VKTuog2r{SO7fB409t;JB5`~aH}xX1e4p;E^wDkNg; z)WiXD!AD+S#JhjPGj0QX!u5Hi{fdydUO=eD5E6g4x_^G3DXXY8^D;c40dLAPTs*| z=dV9`@%E=7RR3uRo2POKq(Y_X;|3t{f9J^Zzk%|brDcSmpM7@YN-Dp3XLr5j%M=u` zaVS$BBoKmw(#SufM0W33yZY6&=?a4fxx4r%8u@2<#h<-YEtv%H-r#2d@_pYcU|%-;K)8kINxi+P|zem{~`6 z0OmqRPrKj14ltOb!8ni%x$|652&Q%o=WGafctr?ycndrMufccFju7F%Dk4URsb~m$ zhE)HjA$7v|e{oa_$k#}wiETr-qFLw&c!_^-3j9At0b4SfKF|(tK)*1yw(=-zpq)&w z?5&?;7^0$tl^hx?KEPx2C*Lq0cgH$kbj>K4Rv=4EpG_Gc(|}%L{tXY{O0vAP42Gty zqYK$*jC1buELIsZ@UwWMQ0Ubw@Y<+4SV3I_B5_N@I3ZvBACIf6XJA;WFOVo5ieZoc zk8yP|(Z%mxM*ZF-Wo8yVTZCUhcZZqU+70kZvNf|9;4Q=iselXLLDRq-xQ$p0mV)Jw zEnf}FAPny&umx-bJ0OdG4tzkgA?rOGS%@r#?DleGC9)d14f(;R$XleDKp>C^as*|9 z20@#kPjD7JZhGES_Wd6}1h;AKGQ`MP&I2rfejbnhEt6hZTBfhC$j;sgiVyqD{2@jI z&;0E@;$Ar4e~UrC9WE$MO-(&511-%iJbGF9D+^^#au9-E4u+IQ^Vsx^2#z0@l^8Dy zind&F$wGHeLP6RXu2B5iwLy&+-3jC{QkjWe7yhioL?)CLsfbbrG5g8pcwHrn=ov3c z6Oxn!g$iAFJTZ7}UR*M4MOQ5nl2CHz;J98uuEk{IznhUiZ;xEu+<(~~kwKJ5N(xKC zgpa>Pg7)%p?>D;#n4#n0hBq5b7J@^s0qdYfV*?Z$Z3bH*O!Qx%QYhgN$u-XWMs)NH zd;o0_6j}w*gWF;%5(V{{93%so0L4eyNDfkf%!G5g6xoRUh3rQTBGt%gDCcnakq`n8Dq`@ZY-P`nSwzcWD_+?1{} zCUBu47ap8W8A(P#Q&Y|ZbNK-aV< z!}L)1q2Hx(F@e%qxCpeMP}u-Nuv-eO1P%g6DA{&`UsovTb`xku?epE~p<_&dSUE_nASBd z4h|}m=nCbtk>1P<kMZaTd1-IEY7TVlz10?G2R{bLl&^}=CsWQhSDze~U>xEa_6 zg~&&RjA<>n32uWs;2wAY9ziDc8F&F+fd=pfyak<5N>6|cs~94INFg$a972Yyt1^7} z4u-i;zc{PADO4By1(@heGGGP~3c(aFuY4 zaFcMGaEEY@@PP0h1*o)8?5vEcp%l~rHAIckVW=5ujoPC2s3Yo(x}ZL244RHkLJNh$ z=b7kobTwKIS?OI+{9J{eLa(E@&HF$3gCbIgHr&f!2do4mgg!ES-XY|uq_r!vWX!U=uCeC9;hP5`_(89C4=ZVI1b#4x5< zIXO8}{F&KlOg`T%l+H+{a}z1pri;$b0YKDeEEiDxyzot)rRIvGy!sll| zb#-=jwmFN*Fvkem^ZAzvdQuJ?=u@9LR$tG~gyPLiqGzV@DcG!LaMGYIoB|CC8BB`V z&y)BcXYA9gKJ73KV-#DcMa0hLJUQ0kKn zCPCf9bZCk(A6g5nguHb*5r3VCS+5r-NH zB}5HMgba{jh&AGfxFJ4BAQA?*cH@v_Xr6&>?xqT*MJpk1y%pJo970aO4c>L+E|eI( zhFiK;0!om95+hB*P=W=)k>EiHAVd(x5R&0`E|*Y5m`7MnC?o8E+qn~jON3j5Cxk{q zvv3Qig6hCcnnf=@#iF z>8qHSn2MO8n1h%il@*m1GzV$a2z#l@k$!7y=G@epykIA46a_zLkI z;??4{;xEO&OGry-OISfm|CTIC9!mBi)5!(oRpdkDI&!mul7f{&h(fx; z9EEKP7Ze&4#TADt`Y0wU7AbB}Jf-+t302Zl@={_bO;svaI-~SbSxnhbnW{WqdA9Oj z%2$;?4pJOsJ1A<<#6hbD9UJsS1yvcULRCpqDN)(2a$BWURa4bNm8m*YwL-O4_1j>L z!6ODU2hSQ@Ir!G#RyB&6k6NnQ0<{Bb57mk4ChDWqv(?wCpHY9Sp{y}ngP}1?W4Fe= zA%r0&L&ApS4cRc{@{ndtEloeo49yjqr!?Pcsc4PR8n3ljt4iy&wvx7+HcNZ4cD42! z${>mdC5^J2a+>l{XNZo!PNq(&&Q+Z@T|?bS-6^`2x)1fF^c?k)^cL%#)cdHftskU6 zNq@WkJp)MtM}riDWd`RAz6~`T8a=dl=z*aPhJy{MhPj5@4IdcE8o3)yFe)>;X)I>! zXq;-i#`u~E!Nkra#blL9%`n0+`(dnMYldAnC7C*zvQ5iO>&#@#Jj}ApwwpaQS1}JX zpJIN%{Jn*~#b}EK7UwKFE$uAREXytLTPa$Nw3=dd*s96e#F}Bf%KD~_tc|bDWSfIF zpKOQOGHut|-mz1%3$iP=J89Qp?_kfhudsjZpzkowVYNe@qq1YD;~dBHP9!H!r^!x7 zom!mjo%znYoj(jW8=g9R+wcY#Ll>q?xyy4`U01qmsp}IrirYB1^=?nxb=>LhW$w>L z=#5Amv1vrThq1?aj~yQGJuN-Cp8Gt%c{zLKdmZ;iz5Tprd0+KW^ojIY>GQ}}*EiXB zyYELoJHI@?vWCFqiRt7u^GzsJe9u6V|jSN~8 z^dQ(Em>ql|1cXpS7KJ@k`=jZWJ$jx;WM+_rJ;^bmR(y*YuJusY!*!;7(u(U>?QadF~n zrYmzHvp&f+X<<@BvTO395sqE7nEzU&F^^9Q|(=(n-aGtPa!bffZcM}icjo}^SE5psy zeb0`{-ZN2QB75TH9Fv@xIrX`|xf}C{d5pZ1lXNB(PI{W}kzZPX6eJX!oUAvwX!1*e zpI}R&RAFl2l_{1}7EbvxHG1mdBF!Q}(er73)3#5So6enHS3JCU-3;Ok){Lt&ZDy{R z**Pn5*2USDvzN|ppTn4Qajwt?TOUC&y7r_`@>f7#Hor5nUHWNmm=9#wvBqvOV{o76YW-qf*~z4^(O zuq~&zI&9s#ZOFEg?S$=_+h6a9-*N3P@4pUKm{pWks#MP233g`ge6wrZuG_lH}Vt!=vQJtf!jtx3iQYBSY zRQ01ex4QXw#__i&l21H8NjrJ}RLrTHr$?Q>dM4n^`Ln)fPo48PSAE{~{Lu@}7Ydeq8y){>ibY-cK(-3x9V1 zIpcZb3*L+Nmqo8+UoEZIuHV{V-Ej1^@9S%C;@-S$%xG+TJN=!)yVdWF-tYY|;=|>S zF&|%k;(q$kH0QJ0=gnViznp9iZGQAM{cGE|S>M&ZZ)tICIoBH9THlu4F5bSp!?@#c zXF%tJAL&1S!1up2zJl--gs-4~x`G5!dLtC?PMU0^Q>!;3>^Qcg2DM-qFonve*#ij5 z;Vm|>ya8l^9Nc=(1uKBoc4(AU0{7Hhs8L-6b*hPg36_E70&^(BwiM_?wFf2())r7O zdGL0)@m>WLu4}+r7+Mbo0}c3F4&}oRP%i?dxiI7+kPyhgUsr)CjjS0OA=DLy^K;Ue z;e0M9l^M!`5@g8M2(9sr`rh~B(i1VYMHu{{r+KgwJ=n=Cu48ZZu6 zW2V{}Sm(0nX_#h7sD-r3@0SLPuLXuM(?MVyq99WS6-9ntJ?s`L9QEJ-amVB!@FV24 zM8RMFcBk>jWEZ$(2bb*hNPBvxN)P7`aLLZ!iiCPe)>lIJ4@ETpFk7ECU_o56gG+XB z$qp{r!6iGmWas}b$qsxu$>7qR|5WLYK^9)z7B4bf?9!>z+2a?^KzJoyS@$Tem2Gu z+8AM$h(c3Xy%E^f3w}g}+y^(xp!v~5C=U%3cz5&OPr!4)Dg#f!Gl9Q=S_bWsUJ6DE z0tE1!j>d1AC2XIt(OSQ`+lQqVF^g{oViw)6*u?*MIpLlAn-1dSwl}M~8Nlvej9L6w zX>eu{Hv<5;8Gvw!<7NQ3831kufSUo}W&pSu0B#0=n*rcv0RKfZ0JwXS?J@-rNa)<($L0GzeKSsR?S!C4!ewZT~%oVCGO8=STIFS0hhYz^iu;09AR1a@#$dX$enyGVZBts8x#Dm1 za(!$RG5f=RokGZ&AvyzcW>;*+=&$u|#gtBE?H{&vb7bAWT}r3FO@ni0|8bm|oQTi( z`@g-`hxqwZ&pxEWxig$Q!?`n@JHxp%oIAt0Gn_laxwHQ+ch=2g=_AI!w?9ONfeVNk zv_Fi6_J?uM4;y9^h*(0KK*UNg8rlT9gB5k6NIPibhu9+yf_TB$9veTz8FB5a$wJ(q zjo%o|#!tjAdE)#M?yIMJOON~N>83>g-#$Ka{xQq*k2CgZN}qQ8!=qXMFk7ECV8Q>G z6J5~x6Yj4E_t%5_>%sl?;Qo4We?7Rrp8vc3^%S#J?X`LxuKvv>y9BBxpdc zW>zg#cD{5Tw9ospU;CL>xAv#|x63~7Z`0sfp#L~6&`Hl|LNTCnKZuX;_y%~kX0If|zLpwgm1X;jdXk>?B zKp6_;HzBdm>0urc4`FQ!1PRc%&RD>J-(i?~2)gM*=otGWVg9R|zV3Q{`E3wwc?s~R z=U!Lb3vuk8_zQYQMjC-40$lJ5^N7W^#NyW=;DQ_wI_|>&7d%2kF^~el=CGOAZ~sp( z-~v`w|9k)Piqs|iJ`PiI5_ybtxEq522VzkoAO`UnFy2uFz95dJQBD;C9EfA?^yK;o z&IkE1*-S2rL4jU3awuJpRxnNX=U?6LPWQLJ>1mk|5JLFDz}01Vso??e*95k?D3R`s zh4o>$fMuzFF`6eblLCkhNh3WQ;4u=tEb zrne6aLpVZoF^f-)fMHlZdX<+Ij>Ti)_S_UNtevnfqRDs&^#sEzFzn1s^TX^!Z2(z$vcJX zkHy3Gkl>6F&MkWw-p0)g!}>lHhMzFmkr)kOnPOseu8&_=*c?Q`b-;vh!3pp$1G*gT zfc@nG7F0`PmR$ zk`B{|TJ^fCOb*0IvLxET?{H!u(Us^(bOIEjJH$(JBYMMFC*p8n9xlwA1554g9oD+n zuvAe=6JWhem=fzF*7g&y$9$M44YrI8DT4Ke2V2k%@23h=_MyUj^-QCTjHUCYaA_={^a1k|y2#rN3C;x<>`0FE%P3u#aiNkxGXx!05~r_SO&Hr$egnVCypB zNMIvr*003A)Z}#ag#}Au!QT8_3unN-V|2ji+^_dZ?D^^$8DlqL)MOS1e+>pxOf7d> zzJ)IB>nz_{-m)x(p+*6?d3=Pzdn?`ZT;30rU22w>yYm(DEcp%$Z+Xq>QCr9kR& zVJqqIUvImx^~>rh4VHt*LONrm^`^n<5UqTca5ai%AqPGQ=pYjIm<547uvx-`*J5#DBlfds@u(S?s-EBNSj2ctj~JU1`~BC4As z!x1ke7>Ps@kVGU2NkPU#U^+IEhvXxZkwWO_avFrFn~7{e_CciEH%JFTl`xo~Log<6 zA#5Y;Ayg60L1dB#gy)2}g!hDxgfA$9s-S~Wb#w@-1tI2iQGIkMYJ{4g?x+XEEAc`7 zP%0XL20`SKQD`_CiL%i-=w=8jcOU%>VdM1SgK#uND#;+`5vLPp5NAQWl4Zp85V7Ph z;%;I!L@hZ>JWsqrtRY^9_$BX25+o^-5{W`GAX$^#NggCGk`KubBAEn0ER)fsc+yzX zI8p*Bk(5NrC#@juC*34HRGg|fO>v&$GR5_Z`xTEVUQ~Rl_+0U&V!h&P#YV+*Qyp`i;X1B5?mB@wkvh>ju{v=&V|0>qQgp`a zr0KAAGIWY`*6UR3JkWWm)1dQ4=dI2somO2*U9#?AT^(H$T?<_+T^n6HT~A#E?;+v?ph0P3tx)>ix`VB7BmaGMUq8|#dwP}i%b^{7flyk7Yi3>7Z(>d zmk}<}E{QIgF4-s`tq62>N%EiNZrYFw_n z+;Dl~^33Ih%O{u5F3qk4SE8$!t2}id^#JuW^$N9ydYyWMdW-sq`h@z7`hxn3+Ccq8 z{X+dp{Z8!|DK=7ir0hufkqRTVM(T|;7-=}tbfo!6%aPV2heth)dLH#LsyXUgR7+H6 zG>9fd6QgArdl>r|Rg6oFJB)jb2aHFICyZx|7mQDg&x~fqH%1GijnTpQktmVooCYzk zunz&-)xr;wDEjUGo92Vz|B1<_1No`)N^;xe{A6##3;csq0H**>0h|Ij1#k-B6u>Ef zQvjy`P63<(|1%0Ci;)VENTLuv$;{iy-pS6=+Rn_!)7Qbw*2B@s%)`pV(#+T1*2~Jy z!P3je&eF`<(%Qz#+REC@${t2J{DcuLEXXsB$xg(a2vFHc9O#;w&EckVNU)-Gi9cIW zXqPaB7r~{oAsjCTlbh33DV+!_93}Z@D-6lN@TquRRV1UZiZOq<3V%A!lf_S`XL!^3 z^lkzYU_}9Df3`2d^z`ll@`O0j$y`n*JCP!+BM*V~Ws3jV`g(iil|pAHGb32(Odg+} zp3&7wk28zMxOzVg#rS^&Ky3`Bkoli|3Lg&=7cWHOrXEfDvwaEAU@}-qEJmL(O2|lq z&gCsFZ^FhCpk{{%QH;faIFO3b&th_UaN5M`)47Zk7QBkkhyLVa^f?LRp~nxNB0#3E zr;+7@!{J(CCVF%wx()??k`Y`Ehc7@X$%#N3YV@?B3{nRQ0rj9p#{gCDWlSe>{}Gra?Jv1`t57oAQ23NpUPy>%;+=M{NcfmdI7}P_} z%4?`gc?X)ochCYl!4C+htc<84>WC&nLG%y{#0IfNoDdJh8^S7wAfXUenGvba&P+?| z(y2m)l`7DJ?(xl2nK?Yn2TB)BqVySQbRKULPymWR2|_^+0xAN602L4gB!QSfd=pfq zsR4BeGB*ThLS3t*KpHwWkrl{c4o#qQf8lUbd4U{8Dl^e5lgH0v~oE!QnJAnMQ?Zt`V_;J~Yvt zpPZ<4Lkht0lo0u*Gy=w0FB9RK4k1tKnJWkZC6dI%CI0CgxmGGEqNjv{y1ucs19c>( z)q@`d5&c3S?f#!Ifs_cWzzmp=77>{Z9|SR?Ad@#HI6NqmPfti=Vsm=~)VWvy%c$UR z>?$TWJVZEU$$*T6$NGeKkD?tI0kpOOdkE6)2%MmJdN^CU&Oo+ zXz$44=RmRwu@HoVEX3&Z<}fnTAwFO@D_4a5Ft~5Fp7)V3V?TU82(F$6*I+m3;Gn+Q z!c*vpoNQs9{_#SvLScNrYJ|-RgQW>?DfKN1^Qt3^?bn^35GQ)OLuEs4cu)0uBVt8k zcmu=;9R`htg8z7IvG8Dbp~E0y5PKp)-$5GCcMxH8UXQ~d(O}cSI5_>H=xLeEGC%{C zir6c;d-NEXqO%OsL}6f#WpHJsz!jx~0Z#PmAC>3B#wJFhuqXYz20^$)COes*0`HI$ zMO8wzWjvfVEFp2}+?+C~!s)@6oB(yMe`87kwK33?0>ZjurW8i7F~$ND_=Tnv&?{13 zy7q!!^cz(X={(aixx%LQM|KpBst`X?coSl3^b%f_F(fI8$HYcaw05TrWVhabW%XXU zH;BT--l$(f-Dz;Ub=+EfQvjy`P63<(I0bMD;1s|qfK%X)QXoYZQ#|Vk1>}Fs zJOESDbSdL{^%M*lSX1O5)}>QV2V_h|ce-i>N4(AOWizh5Xs- zy0m&-wIqfHphV@KS#0smsQfww0PO1vW7Ft4P@8V?&s!kW!G=cAs6ifnK9~|1)0B4G z9u&gxX80WePbWwy62b9o1e8*M@OL8eZjJaPXE+;9aK3LPw<^IM?=j#t=Y2G*% zcVL3++Pte3(Ir|+dEef)ocMe!?{4+?_RreQIZvmB$b5Y!9o|;;{n_UHwxf<$_J?ST z$5dD4Z@Q6sl=FSH+PpJAPW&id_vlz|fkd_I;p}w+Zs^!L^D&PaYq#FG?+E2HSEcKV zKd0S2*_yN3;i~py^s)Hk?OE^cmBd9=jxElAyzTp=L8N8Aq$Q_RpWm8_emeKz=F!+a z@86}TO?RpLt1;$u{l4hwrjzr&$HkqUtM$$`r?%X`cx$-)uaZ{X{;MOexqeuMMcmPbXOqr3ol6dE`?9{HSi9lf*?GE9YaeuXyiM;|dF#Mx74z@YS?{lve={t4@8yJ(kJow8ef2lP zJ?>4Pn+n`lugVMG{kVzCE4Xy&!l4DJJKxfz&FaM-IZV1b@6@i#Y^|%8I>t18Hf&E~ zCbrMzhH72(Y2lj>Iy1kHrq!ZRpeD^Jy*13eN+BU51 zU8Uxo>S~IaUGx3LFJAmGFc`XeR>|z)>PkxajwaUD!{AvWS6h93J4YiUtBl80cfjPy z$JSMHzCSvaH}%-jqhE90-F;rO|E<~M{I_?uT)upH$FMo~<-y|FO%t>nwX@g-dEZ+| zPbS^Xd)nFAIjZf>w{edR3-c=%fBd);eVdnb*4wXs*N1$4E1jo_Be}JAJGO4EzwveR z*x;bxDs^p*Hr_=4^V&Zm*X;=Y-n_A(Bgu8f{-x8VO*42ycUIk(^PbyQ_c-~(t&i8{ zOJ8r@VzcY|^>bfFjXI>@(n&2XE&cS?VdTZDSFfJ>Fz0bxsP)Gq%;e;kzJ7j&yC2({ z>pMDHxm;df{dVxN&KYhdO%W;nADw8N4xyhlvx+PY2?VE_oR=5Z+g%-I5q9~!O3k_-)w#`Y?EEHO zQrvsYZMCD->WkB!I@6y|Z@zB&c<7UO(x6ob4<7s;IV`$$YbEQ|)s-!SxahO^C>br= z44oy0cV(mN)*y}+Cr(XUwSD`yvze(D)CsoBA0FIQFoQ=`%WZp9*La@O7+u-A=Aviy zWjR$UDAU%Ebf%nA|Ri7=6KQQxsl)=%PuT_lyTFAaQb6ezf zP0N=>6}ikcGoL4(ou~EEhj~0^jLF^&NLF61Sa=|PkNc_x#S@27%od-2vMOD6eMtC< zyr{`l&t4Rw;&dzd&g!23wlqkCGt|JqU_*SN{r5$?E@jr|%=&cHX-|pH zd&Tl;waW`hJk5}WoMq{8B^{SW93s4X^0cava%SR$2 zxv`EDEHpL>S#LIF%9JwWvpeN#Tsnq!rC5I758n4EOjzwXwV}C{ILm5BbdA;` z@?yH~d=gn}Rx;Iq)2E9PPrHEbyE-Ix+ zUl#xL>E36HGdT^7m6aatOJYVokKcRC^>u7)^11yc&Nu4kbnf53Zb3+c&G6yFRbNW( z_45y1?=sXq_r;O-GbT^iIr+u=&y7~qYbGUJ)!@(CO}wY)TUqV9>+Dh1>Bo!BEj@lH zB<a7f=E%34eh`PH-Fo4Is?qIvdy)!fepmGg@mY(s+-j-XzFRXcE& z?z-jGbGgKO`UXxdsk53FPLsZ>(|NpNQ+e@`y~~*8HI?^inknbwWFFM`xlP~@FDj%g zDla1DtXBHQ*6m#EC$pt_!m?c1m?zrPo2n}Ic5HoIHl)yg=Iq%^7;|&p&8SvbSa9vV zhje|E=8YWI^VJ_(+GJi>HO*|Fj#W9jvSwq1&ld86Aw(?7fz0{bL z6!kOe)0+n`ZaH09xR|ED?a4abom;{-I=4(YqJOb95Q6J_pa%7IZYSLgOc77Da`vU^U-#Zpil-UNw(L*3va)2M#d0?jYiU@#4CU+)wmc35^TWCl9H0^$BJTR%jfQlz1lqP*c?uy^@TgTUxe?R@?lYd zOI*g71y@6VEU*}Sdz%OBDr|(d=dS5=Gp7c@8)L&IZttgE2~QWt?hp6GNTH_2vK3cv zyyzi5%}DHa;o|IupxVfk)C!v&nj@>mRaLpsjr`UJ?S`KvycluW!Is*&2T`hn-Q9qc z;))O9Zcm!;{$E^P!}c*6nn|ibc;}m3p9KSNcI>&Q@Wri#Z`Nj+BcTIEV$XIo5oWR|^yP$M=$X*R?i4~!pqYg}c zzog{R#CMU&O$P5DTFJ+Bw#-a$%c(sr(J=MfhnR*}yHwGXNL9VSZ_-blR9*}-ae1r# zT{UIZj#XK`zn^V^5(P3P#*jHxpxAFm#9 zKXHij7xc`74Eg1r4&|!Vs^7n|h7O`d9de?!m1_)R{WzBWc!C}+W!Wj1c1U1|#royX zTU@Upm8(tpm+s6yG_=v;Ou07Yb;{czHrba(3nq0V_>OTLg=9x)f=cpZ;kG@89 zJ>pi}yQHT5IoI^djtSMF(q9$FxpJG9ELxL~c9QPB8Zr9b0cD=cjd7zS?_ILH6JVO_ z*Sga2g!zm~FB6kH2tNqvih#?guQk8@$P!glQVb5g99`MoUjJ4xe)7|xl;Wma zJ6_+|b0NC55MB0!wmx0)+4GW7m+SuGcFHy{2t;uCr~ zRSOpIy*i3zAHQ4|H}Bc~X*|uB`@eVIyvf7JZe?Y~T}2YpjPaKmxq$DHTh=<8QJPnL zi{=)Y={zj%5v{0x%A$2Q7cb^ueM%^6&QazKZjwH`FIPkPH`qTw3=%g*AQ|b+)z8&EMji=bB>6PLG13 zg3D94ocG_5oZ}_AIC{M_|HHNKDVN3LExsDgId{tF$By{@U!+XkGc~qD2@97APnb8@;k@5PZqVA6zGSE4e^h z)uo@W=*1vnfzDg*p^`}RR0<7a@a6yX{`;mDvqqExbg5! zvdfR1ikB>=6TSSMPv%)}tFbHyDX^@N7o{8O&XKgA^BOj+(T>@1WKyB5CxygPa2@#ebbyJwr1E!taIQGL5IHh*^ejAYt!aXS5M z&GDV|=DIb5qiN-OMYr-c2P3nC1t}FSZP}U#WJZI{R=EB72xAStj4i)`KdXIb71}AvJ1v;8Ow8IxX67y)0){d zy28`_RpDs&Qqv1}%<5YyW8!INzun4dC||tJKN{ZhOYxtvpkO_E+uDAlSGnF^p4&Lz z++DO2&0Z26%e6N(>*>6n{wmo~=1CnhYx_aA%1$p`V`HoH;-=>IuL7{vFKS)DXLQKc z1zl9HST;w$YRqXl>bS#drpH3gEs|e;tt998mqngd#UA3>^FkaAp3~H*7K@kp(_WxM z;rMQ8MqT+@ryGs8FKfv%UL^Bo>vGw%ElE4~*0@=Za2q$l3bs%%+Wi_jhIajH>(C0N zi+&ND>jkGO;*((kO(i+&Z_9sK@9P@kw&>VL`|IvOZsTAMd)H(Lu86U*Dt{3rW0YZt6Bth>@IefFK+%XV$6$(LP1YksJmG}+7>8?Rk1 zEzVk3zv5);rL$|QLk=gjDtwl|A`|}k+|6&YuWX(UF+V%W+v>;N_RyMj#q9VMDj8## zAI^Q2epwnb1IcZTl97FLy zci(UFo))rG53*fW4Bgq;-aMizBWvq>HEnJ?z*#XhCFqN@>=D0(S6^YfH{SqZYkVtjuo%4*i|sQrF86MG}maP zgWZY+>>b0o56KA~MxRgJY#lY?FO9*khtf7`ILp<1&~Z=baQ;lOwmzBC;e5XEi$K39 zcUG%-$eWxaIStGk&zsg+#F@BDyBHgPvV{-Yxw##eC&wH)Sh{V@W$Tjob!wpv(oQqK z>`Rz=gW05an`S4!ykNJ{tDW26gIK&?;pp1kM-o?aQrwC=?zi(Ud9Piz)NCw&LHms6 zQ&*;z-JV=!a7AxJe)GYzu}cN&JBc@W(Z5gqNyQ_W>!8ivFaats?=)|y`Rd`L^|wm|oK?BSch zNN6&~o{alu1iey?zr;ve`{h~o{Kn!?w`yxMyGWPnTAAZ6;j^4xS$K(CFJ!-MRsHz& zT13UN1+}@?sBh=531oTg`Q8bc>5B{-nYLDMv#+arL&vA*g!9qy{4XKG7guhF z+N_qc9A3=``LA_z+oWITKKf)?7jPoBDk!=5N$#UJ0aflzYYt>DtlT;ONgS4iUaHe% z6M%_;D2s~bI9Ioy9ede&#jNkm?Uzt-a|*5M(bxl(@rSsBuuY&~U8PHs8*9oK%P-Hk za~g-vW)WJ>c--4OseI8_S;iNctQmzBHEzRaO?r3d@XIWA@VtZKfu|*~Fp@o4e=fGexM>C$%IxpT)0+c(Q;xh#LVo4IGm2RDl<%Rz^C4re-7 z^W9E7Hazws`}uSFUfPkYcjqpsnnKx&65It-{WCIj&!~TmxNncHN0|kM3*3U&zG|J& zdFx<)P>0tDCoyg1gCUo7Zde|1bzNw5+wz5cgU7=UO0y;}_CIWO%e}~6xkdV(Y6c3+ znt5c^_6ONBk`L&0UYpkJv^M!>bDb~C1r97_%(=Mp9~$^5?ac>&x9lSy4(GqRtY#%w z=~2aa`!!?P2ZyyO4sPU64wRRwH^*FTN%Zpj{B_>snkrv;rxX6bq7AkoThD+uAc2uz2)=#Mf~dBJGM)=JBDr?xn%ssw&O>$@@8c! z+s;^5S$X}iW$qDSk z?{dCQJb3AoQ0g~hc#nH4N39pJG&fhxW3Sa!grVT3R~bWvTRqm@0v8z5GKR!K@ zU3q=9WXJ)|HtBNuM=DQe#ks8m)SlOGW9g0m6zVyUN`D$(CPM8_$(e&Z?t7OSWzmwcSG|m@ZUoc(wN2ig6ex)-Y)t(%G4?ra|gFl@ezU< zWT8?=c3hmi;(hj}ns<%<=LStxw;O*m{5Iph{p1P5t*x!4>rJ-|{@&K&v&+83Wip}W zjB(VlGlKuq-kHZk_5Ocs)iW&Y5$a^FGh> zeuzVh5Z@yCOsIgV}lAb9!mL3%SpoUZXHbC#1Sw#7l!Oqs97=gNv&$^iXqD_<0 zW1kKlJg9FVnq5#((6alqcg`obS7hpxBpVI;gat~+@FpGRBZX~J(WO&t856ddqN^?`XMRS>dcW$mZ+!wV99 zpZyDdqz-A`aw>h_HPSzp%-<-T zt@h*vzB<>&?o%QoUM@U0p1();-De+Ta>&%Q{md>Qvl4QECT~c$u(fs9=RSxY1cSj5 zq0+Y6PJghv-1L!$$pxR1JzoT0E^Qg<-<3JaJ$3)f*YaX5uTkmG-_1?F!{w;`75itu zL&uKK`OJQ37;-$;?0bHj5EeIb_bxA<-2G)Bdc=ZvS%}@z-ezIm^JdELtAEISX@bPs z$-qFX#Ml`5XJ&D&{cZP;@4itJxkc#`cqKpMV){U*y>hPiTy{lH)}fQJJFdF9j37T8 zANHgMx6>Do@;lEAOPWh>hf~eDqO0CPzh5OA5Q!~we&)20(m60E?O}-=7 zlxHmMcB&3I+YkcAl7?gZ^q`BA1zK)RmgVx#1|IURe=a$6%_ho1dH`L_g_y8tXB6IV84Y`T=P^P9qk%?A`zM$*-aG9iAiCj{Vt_>|ykE zYM^WG(}&25>Q2%>A&`v4^Bn{)>3zXC-mulg*W31EH9UauJL~FxW%IMeSIo<6QBNUz z&n!-bkCpD5y$~H=cPSkk9oe=2t(D_Ia>ARzUfBJxLnn)!hJO1zc+&hfBG7|0|6Z4F zdFfEd3K`xP+5Ao;+SFYi;cQmFrqS{tT#}0RCg@7Z^Y%NId7z1Ia4eo zg+^DLdEW3HCVkdzvi?=ivM|_%^2tF*?_vY*bcGX6zWF8L_IazR}&&qup0q^JV{({h!N$k2kJNKV0C%=Q~DAmz;b~ zujqC5T+;mRB^3;rHTk%;_34%Ul;~eSuHUTfD1rR&$xYI|i1rhnH2qokrC-O8cj9nO zVWsRsp(TU-%G`G17fDfFeelH-ji;vqPS+3VmaN5$JDt^;5PN5>R2@tgZ~KbU(QDQ@ zI^eZXcg`}ZJWJV}z&ozNW^cY;Dc*=8Z#o3H|DFv@Y)%NW9x*8EFyEOhL zG;{sBaJ0w9J=59!Jwlgcyjzz(C>|mY*RI}u5@PV}^nMeI{Mp~E%HYO657p5Wg);$3UNyx*=0!Eaz+ zGDmvtweqCyn3cJ>(U;+h^SyVj*FTWi+HGw6XDa-A!@l1#0e>93M4sMDob5TUTJ>`B z$U9Kv+xgX-=1z59-{rZD6*`uq$_Wc^G+f_=>%=On$iKc*d#a0f8@1QnG#2lb%>DYMGGMl| zH203%;Ci@Q5${mP=L8L%?Rt8$IkZO0>%;bXuZ5EFxjCnLRn^nCe$)Vpw(%!9XsHsx*^&4vX zyjF63C@RlpS5T1#?+I_gh!4Hx zX~ONUPDdTR<=B~*pYwLx-D7$I@buJiIoGH#r>^|nf3a?0Wz zc3A+tfImw1wL5X;*)LfqT1WZ6LKD=KQW|DAF9r0*n};)4hIlx6nfm#8Df2RBZ1_Yf z1$(%<9yzj+|5%T3OF1&1jNJXbIbT+r+Gb$)qeUc`}PXqPeno?6a4nKT}+TPTYHYMyGthoksHkRB*zuL?)w-W+5TS zpRmHHV=14wJqhLPt7B|M3B3HI6(u~b0KlPO4lBl3xd55NV7Dq=IbJii5E^N5_~gph zR}p7k>0*1QUw>QPuOsRfKfSmX_Cx0Pm5253S0nDm%H~&%ybqPRQZWzG>vD!hNV~O9 zh3)hACML&m*(#C=RD_WXgx#Vf0p^AQ!puR0+Ax^ip%3R%qKWWxK6{_ScA_&}@SHv& zShz8Kzkj$iyzrfjjG91CNU5=9qkoA!I6I)k4PDUGnblsvYi5f-F@t{ZhAJP>t&Tag z2iYzOLL&$u16CMl7@YhwDYo*;m#v`do*fGf*Q(VTn7f`eG;3cq5zD)5aVP}By!t*c z=Q?AT0)!(=6M7j1viv*;>XuId6J=<8k5sMEg)h&PcA;}!@Y}#yPPl}=&>(9Ce^-1` zCAUak5NdCRv;m-x_Z*?Q<6_8e?IwJ(2ief*8$#D!w%<5B{Uf>-Q!M0W*BkfQy;kXC zYxAU6#I@L+?$xkKFwI(BD6T?s3Kf^1vcutJ%HHRZrAaHxex+LTqknW4(%$IG&%X~W z+^%VZ%9}n|Gj z8e5f4*Yyrf;*?Gny+d~d3^H(jJL274Uq$6~)NdtOyM?zcR6C(M)bhZ#wwTmvgVt2p zH{-UFi8O^Yxs*6rm(T0v%1^#lxV##6z+d(#3%$y~6-pjR+56;Yk@Gn@qvR9dWgU^~ z0|*YFn~?~;xmCC}C`1ZSH3|c8X zLb2RkqY!Nax-xv-(Na)a7RmsnJBkvJWR~nnqTS-3fl^Z}g)PzwGIov4eMIojA+ni@ z+Z@PKQt{rW3)zjBwz(=8V?c_(4Ha%&eMJ<^-PgXBik~&~$TW7gNJAU$>hk|2Lp4kg zp>~ry!?Mto3V1XK<;P|)QTh@=?GzMMH2XQ6yCy9%aAwQYYp)zDvqJ~1Fxw5gi}9w} zQSpvwnFI^e>no@^>G?G#5d)Ri=wP0?i080I>4#$5tzrj}E$pBNy4LV(7UPeD#Pf<94 zdq*)C7e!GAwBh7YwEk8DNCO_p#~p`syNsgt6o8HDJcPjo5_KoKsB;GdyxYReuU(AO z0Y9GFO`qBa2gDrVg9x;og0W~gl8Tx`;y5WPNdjB+uO8TO$)wLpka|cNZo42ojY>dJ z5davsC|%X)hcdj(mq1QId%DLnvsL(waJE8Vdzqou(xdO0W0G>!$AqpdYR9P}#N?>I zw=&tP-Ev=`%sHLp&rSNEC22kb=#E5{i=yu{18R@;B@4b^P=X_7h#Vk6V2mIEs~#pe zcEo9L^+n?S{X`5fjbN_2vX{SA)UlzS6LxdE7uffu#37Hf-7|K?D?G;Y5zSB(>*Y9a z6mq6J0Rqy6^AA`GlJsvp_ww&i{uQ9W1lVD3W0)v^hM}o`9w6{ zJc|Z`v4?RPb4|iqKE7bvikuW2v{!^*ZzY}`W+ICXtj+BdN1T3b0#RpJdi;rNRoH5#-qBsndI<5jZPBy7i%Wc9>|qB{T?N zL??pE#6`*!9-mMG(x;@p5V+wQV|r@=stey>2WS2SOKe`W01C&Vmu?R*Oc2DA4v z+7LhokRpA($~hZw5MtU+Z0wJ5KHna#aVjuz!*&_xnlwAtv`FA}J$SVtrNcHuOlWJ) z>m2ARhcXg5EfyJ2=JTXGtR5rR?I=9`fXtjmpxPv;5J!9PcayWSSW^jzWko22tnyCU z{2D6Y^vI(%E^$jPkj*4)ftsjka1{g)R6)7ZOgNNXfX=AP6N@v^cz^%twKR_Ht^)(J z#Q3s_Z2I=C9SmKF3{oVS`y1#&BcO~76p~gXuJ0nhSZ1DaOx1e#wFjxdjJs(n?Y!>5 z)EeP6Nsu|1ApVP@`=#t=dfHig#bolFG?Sbl2-cN{u!ww&V0<$0Ryv7};Nyk~r*kh# z#AQyblq>rP#+K~rqRdOTaN`B(hZNd=UxT+6kdbmIIE9PDQjdN)^Q!Rsa;deXK07dr zJ}iNtT$j{msY7UHf)Ew=z_!;3;5u~($NK{1##i$}&<*Y^(-RABd@Z;J%;!q7U-L6; z`PnQar4w175h zIc=*Xw@HZ7_#^uOd;#V|^2d_GAk5Lra)Qy+K-BdDIH;o))FfW#3t`DgGMWXsR}rYj zj%im6(_41#qEv4m2pof*jzC|PfwP7MY1M+9og}0#gk&wmXc3~-2>CCuEqZXIH3GPj z;4=i!Q*g`#F?I}`8z(|369ipESE8!f3X*BLLa1A!s)|k1S-9zJS#UOv;qMR3PDRkuol~I=z@^? z9o~lt_1vq2zIf&|mYNNLAf~|8m~$9Gsw|2dS6B&y(u|701Qm^d{LQi7_6lTN32}qtybLH{hiA=`>eP&Ld@yT_}1Q zF+BqRu?}!sByuhzL2XF79Y5P12D-Eh6b2`~h1Hyr%K5G~zZFMKz%e`U6(t0L3BWl` zn$&=#bt9);BN?^=afowVe;J`w*tySp#N9KuyW^-2@SHNjktN_zs1KzN$sNYRt@(j0 zfDsI*_)4>V9|rEwyv0fpR+OqyBhZWhCRYahlE@em2F9_hL%*Nq0#*zd=lOQFxA)O1 z9rxYH3WiknI)PyVBt*$jhlCm9!qW**iV-xe2nY;?F~{V&0o$HEr_61C%!!dQy-284 z1YAMV*TqDr8Ff8!Ku{5k`D`x`up<|3@UDA|8YLwhMPOS12@*2XuSI|vk%~M%)_y*= z`yHAmjM|?gVs0oA94Ziot++v;R};9_K=Qf_`>hCL5zp1+qmke1!_^qh#2Zm?<9OrX z8zEOl37HS1ggXHPh$?MPg!P4BY{W;g8)3P_NZk|cGb+J1kG$=~9%&t$zQKb{rqZ^H zf>sF~>Uz^h5*AE2G|qPBJd{%tu_3Oyx3S$Stzp!CWm_A zGx37E?dS}2kY@j~Mpo-~(20w7uWEivDM3i0NEEemiMHhk8#G9>ldAcsy;5qwm5Aw8 z!KcPZHM#=RykuGkBAaN?7zhH<__?-HsrPk59-ZFOfEjsg&$)dHg36`}N<$ACjJ$EU zuz&!VrzKbDRn@ahZ@dLY>hXSH8j7NeNIRKoH0+-d**bGUl|E{?X8?s)!Mxt-x$rhy zW3C7Y!tv7^5WWiIn#QhG>Me9nJh(}U`2Y?DQDwpg$;_|pr3f+gWHg_E@kVD;d zQ@G?-n}C{@kWu&zR(#>kKIVaO@dz#Un!((syW^%?q$)W2GstQZPR7}q+Xmxj+3}NV zqkv@dRgUir>OS2SH`+r~-U={LXcEDN?;y76B|pQ8z)p!$PxiwS0jBePdYV*4D{;3i z@Lsd(nl9kKEkK@)I3pGCO$KvZ4##Yj;*u_5}%H%c~+`iQsS>bJpn!&W)rq@;J8M|$6i z-cVPyRUv(B8|ZX3qU&KqbB#xHedO^LpaO@kkdsXk12X!d)0dyn(#^g-^I8nXkP_aF zz&>z@Vh6hAzs>O<{}_v1i484`ZT>B_1_7p}7-51tD&aBBpQ6UG%skJ+#R(bL;4gpM%57ZKl{Sdovpj-N;nwFcIlk{nS3T=S&0 zpyaSH4A^mK&At}LOtN(c!ctS%>B+X|oNaYdnO&)E!YSlRfMU&0PREU3Pg^xkCsWf4 z=xMm*r15}^mM8S_!PKjInQ@|NVXxB0XHSzO6USo{YNX>U>sN1 z6^|Fn9{-+dd-9wdJbGGAwlbcvCLVu+beb&9!2O9Hn?4V5I&W(kAHMH6UM~)>4;1c> z(f7!GE_*?v_(He>aJ)2f=2V21TZ9`Y8t-9^9eww00?03U6Mre6VVTcPEx^ZHd{2%% z6M;Sx8@4z1?eX-&m7p_95mIB}L4xF}wmlJAD8iUt@ZQ^&SQE^dBO%xVpc#U`oTr|{ z2`cO@`Top$?^xg&%fK1oGA#sX3<*$9mNa97@n5YmD}MRA{AS=jHsgC|1bi`XeDgk5 zs84&_;fMqxV8e8`NdZ!Cd4-<$novEo`p7%)i4R0@fg|ohlXR)%cUg6EjW9RE1i0CR zyS0f-gHh6n14DAK=|#C2-(8oNU(Wh!&#qcJa$qRVusU0c(of{)+DQ2-Ab`VHC2l%m zwn~L6kia0+4#aUs0f&$e4nOW38U^s7@&rfZ5(h>+3p4om=H%^%HNj_2GyP7Ff&lIh zQ4WNtU4DO0rPzVSH9<<1~-WpUHO|Ll| zK4`+~L9&N1Tq}Oy82B!VzheC5vypqxyjm;j2#p^uc8Ex)mKE)|TvQ2dWthnb)gf-V zJv{39h}!a~2?s)DNz+>dSvQ2h8uHvwL0?qpQd5^8;R#TfeIzDX$3^3 zK&{=}Qt&l^qFqC66ij>JtV1GP?U$g&SkqsBs1y-p{}9y_Rt0rSKEv@ZMSY{F%doBq zGA=2fI!Z`U7oWai%=u6Xer-Z}dW!aaw;T*%*)IwzB+^ALf@GdNxdx{`fR^6Bbw3&Y zRggG>McitTIi3Jm-Y0_fCBXZ{D)|A132$H5Q@93j&7f>UJm|u!dmpA$82xkx9<@$j z`71&MF(jHK`>iW82Hl3x281thCVeUqFSr1K@j!@ur|=~hbkkmvl(b43E2y0F#TPIPl?H=Ex!)$B z3&86eaG+a|TPsA>yv@?(qenDRDsMfAS~;`Bo0EVG-nDOM3P8`mRiucEEJ&(plV}7( z%I~G=$LHl>nrsxF)yMoP|KZb#-ikmx=VqfB6sS;G0>zxBw*G9BNoEXVl^6My`^fa~ zc$Pgu?e4CZ>x(HFlFWYMQzwT#4Km;!6cr+RTX=p(nxE?|gmOia%t#<2m?eSXb|PsV z0(zS7;1l?Yt9v+={PF8DZG!#uC^W|zLvj#tBD)=gqBw&W3q=rADM;UPl*JH!`hbt6hAlM}^z`_d*)RpZ1_&n| z-CZIdwqFK7K@~xhK27=a!40N~$n*oV=mMG%Syo5p=|?s(LjVJdr~0&g4{MQy^s?)( z=JtDN6d!pfUO2oMu2XJ4Cqa-DNj*?yncL%Hux;plsPOE;#tB-%n3sl4W7rArCI>5I zXS~&vyRM9|Qjbl}ZqMgF%_kSJQWyH?Ls~TaghTg{3gp6Hu|K;VzBDjqSc$4^ar!-u zMD%i)`FZ0c>j(iANLB0*rsebCN{>V=mdSaDPKcbpTr*coZwiJ$Dis*FOe7MktrXXQSvU{ z&IvU=53SCa*P~E~`_A$`zkxW&olxXEL<1S3;yY0}TT{WyF3N|$Lfb}govK+bgw8t+ zn49ldV(G@opMMygOQ1Lg^}j8?A(2S6%~Q*$qI!rKUZEwC;O|;=4)EQQlrpwlj`I(( za#Te5UB4xo=>ZkHu9t)n#d&K(AFQh-vYN<%7Yt7`N4Jdh~wbfmd7}9tYbjoz= zW3?lgclC?W+6s?*0!xyZGRA0nBR85uIZ}zps;XP|c+5?xOad_g_|BfUw)p|D+b?>9 z>_5`2#`3zTL!koV3~0J+e#MFlntE|D=&9Ng1(iS@AJxcw^uq{zS;5f^Cd*#a6~RLk zQsm&rjdrCwzQ=poMV(Jq?7_riOYK8*xoz%CD^HX5!z57g^`Jpec%{AanOrBvB~WT~!ns zj=v0yGZZay#7xM{O(xA6V-F05IuN#>s}`DMDA;8ZlkuHyV$Ov!GUZX!kHIGy07_kW z3q2GKrQ*Ue^(de+c4zcqncLOX=m1gr`l@PHv0`Ea z8^t%ejT>mjU(fDVkcgg^KZp%}G}+`HXFec?uQKK=MV=+8Z0o2#Kr~44&$#j$gy*fn zY}A6IQ=qK#R$F%G@{6nvAz;_b!{@pkGb}Uq8oPg#=6YYwVu5%8niYGNMgs#R2W6zJ z#!>eBC7>86nXLjESp^Qw%xnC`voTu~Q=-lqCT-IvbBTOWP6lmi=h-PT!lY`=^nqQN z)2Vpy(~FT93$l7awgDW0LfqJ zwk;j#pwHE^?^N<1PLW4AUj{QQFRi>gB5R}IUxU9$+qs|V`(i#R6uUuWv&>3sjv;2uYWS>_CCTA!3>QP3@Yei!i3bnnUdA|b14LAN;IDD(Hm?T) z$>4J1w2B!SgQ6M?mx0np1)rbZZ^+oWbT8!z?=fD0k3mffpr#-xlt&N=Rc(30rTa1l zeUVT#btV3m+oB%_>=D~D54Mj-iM9vs0JkajgZ#h484E-al_Q>xQ_cQL&=cuY_dU+I zUx?&75U9;lJt=!YvaP@>P31n&HLO_kW&j1z27H5{E54RBQC_Yc6$5*=S%PxGP}Nr9(LcO=qx+6tlfw$pIF zU=OkuXKp{7@le7s`GMYh?kzmuR+qB{4g76a2^h#dn`Cr?N)jlWsqq?;e11+7R3HH< zP)`E$BH(cDQ9a3xc5F zM#(~cF^~soNdr?-d=^So)~pY0Re(oU{rEmgnhs1uX-1q`tpO{R$Kck_=&RnZ$10gZ zSh-shSa|>^Oc_S9xi?msB>$FTMQ}3p5d4`Y)y@dQi`#jFgiR4$J7)xTd0>&Xv_0Ma zQ%9X%M?=nc=zz}Y=<}6$36UIkwHFT(W@Zz$6)pHVCPs*9KsO#lL&iPC%2#!Sodx#* zhM?$1acxDWg=tPZcl4(AaN^m31)T$58U<-#Vxd26Jf0NZ8maOR+MzlMQnC2X7oHHw zERoQ8yfn+GQgIOC1d>|jhA=SYs=h^>0CjvHoO!V>-v6OG==8qr1s&$8pUIMB)R5$m zx?&=$MS;ruPp88&1vupG`ax&}Ekz^Jf5g-0AoZnFj82yQxQ;lDKig?RfB}Mlm;!Ja zK={-71xJI;mFYq}3p8ipDxM zEKr0#<+^I6xDQVIAQhKwnTSx5cIRW*CCDQ%Y_grJA zW7w3U_VKmoz^)y-c*j1MZ=K^~IjeE_#ThZl7M!HEo5={5q%Q|x;;l)bGi0(~Tdt0KXEjXU&ZxbKv z)8*M*VdRsVYkFLt* zAdV)gaU}*K;lT{46b1tXLi3J~d^{8Y%*+12ksbao&C7KF-Y_fRSwHg*pAW!%|CrCu zn-BYk=A}Xa3;sj%DgmQ6%JS;rWk>*v{cXPFKQwPC81oOkQ9t%S%gfG!iGM4v@DIIF zzs}#Z)!)h-{SUp-w$9`ro|ys&X~NU}yzl0H`#&ZyuPqxBZ<(owuO9^Umm9j3u|Du0 zZs`5I9bSNE#h?lTZMdNyIcl`wpba{BzyJv17244MeEri6-NXU_{yG2uNTL67JqKIx zO7Hp0-5i|2)82nMpo5oqTEfxGKbU8KxzUFbfxHItG|v?rB;od#<~eNh%KW7%8`{~& z*O^ylqs{)#KF%AugQrtMLtJ>8ZzJD-(gxDO)5AQy)jPz;gQwScTEfSL9>m+U$c_2I zE>7+|t-{ktp0T$9PxGue5lFYcX~)0m|IyV}!D$Dex_2)bFmXBK?GhZk+k$5sLJxEX z4E%ij>AvA0(BB;0#WwmD;B~U5>RwIF-D*m_?*FgXzg_rWrT)Fx*tUO__-eVa^*57f z|J56tNwhbUXm2Lb-b|vsnMC{l*Cg5&@)iLWcP(L-7M8`9Z>?0VqO7`(it`MMt{q*q z*0(-uJ$X#wSje$98&Mm3o2xe8jvF4&InK3JwvD#!JwZ6(aiYZzZf9e6*>2_Jfs+?b zzOmP^PqH69C4VaH)ME#NgSW%|)1s&8r*F~tX~${TXzO%ydL@0u@t|XgOGdtLGR<9*!w zrVql0=5xna%-74e!%xO9%x}^@Z;YPYr(;VH9yG5*q0g*%n2LVn$6zQ==$f?Y@%`E^(2v`z@)L{eaYo1&=il9{?t9G zg{i;OoYQ*JRnqg)*E5_ldNNfr3o`#?xn}jB)jV644a@e;9zCabt~v*u6Ol7}{>b^J zTp%|sclpBU3y<^E^UCuD^F#8v1*Qcpgi$;p|i*J??OHxa|l{%LWl~KxS z%caZH%YU#uSmPDO6-|}fEAy&gRiRaHFWOw}x+?74Zw%BJ*0j{_uC2I~{h1A7Nr2lo#?7}6W!JTrXOIec)qcf@RDaP-*d_?Z0|ciee=?z#8#&l8~& zKPMSe{8MQ!P%rXc5?@xn+VScpSCe~x+HksW=IG4itkdj=*Fmq>-z2;hew+7B_TAMv zwYhuqM)L#jPriTi!T-b0g`|(@k0px=i;bTspZb<;m)?91{QT!j##j8;E6eK3Z7UWl zFIRn5e|}3_!>?6;Cx7qyas0=-pJ&$L>jl4d{A&Gu`1jNwpFe;8*Ch4EY5G4&YHRlp zA4gxhhxaB+y~$EzEcGT! zy~$EzEH#f@<$(p8EcIXb z>VJN2veYg?PXFkPe~U~1+lBwxoBx}?n=G|I-N^;m{og+ju*p(yvecU_^(ITb$x?5! z)SE2zCQH4^Qvctw)L@7NNaA15J^|k44(~1eFLUd8&vrWdIfeMR_y#L`_`3R89R43y z{d-F5f3A%_2>u(E{r3dd|E`V=nERivlc9gF<6qJ4|5+`Az&{ + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg new file mode 100644 index 0000000000..c17a7abafc --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg @@ -0,0 +1,80 @@ + + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json new file mode 100644 index 0000000000..2bce0295cb --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Mediamodifier-Design.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg new file mode 100644 index 0000000000..dfa2d38c40 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg @@ -0,0 +1,22 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index 1a9865d4ef..b844affde8 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -44,6 +44,8 @@ $(CURRENT_PROJECT_VERSION) ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + LSApplicationQueriesSchemes gcm-ciq @@ -70,6 +72,8 @@ Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices NSBluetoothPeripheralUsageDescription Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices + NSCalendarsFullAccessUsageDescription + To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay NSCalendarsUsageDescription Calendar is used to create a new glucose events. NSFaceIDUsageDescription @@ -110,10 +114,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - NSCalendarsFullAccessUsageDescription - To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay - LSApplicationCategoryType - UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 83f064eb03..05e85190c9 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -25,6 +25,7 @@ "carbsRequiredThreshold" : 10, "animatedBackground" : false, "useFPUconversion" : true, + "tins": false, "individualAdjustmentFactor" : 0.5, "timeCap" : 8, "minuteInterval" : 30, diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index f264e23539..7ec6521575 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -120,7 +120,7 @@ final class OpenAPS { func oref2() -> RawJSON { coredataContext.performAndWait { - let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) + let preferences = self.storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) var hbt_ = preferences?.halfBasalExerciseTarget ?? 160 let wp = preferences?.weightPercentage ?? 1 let smbMinutes = (preferences?.maxSMBBasalMinutes ?? 30) as NSDecimalNumber @@ -207,6 +207,12 @@ final class OpenAPS { saveToCoreData.duration = 0 saveToCoreData.indefinite = false saveToCoreData.percentage = 100 + let saveToHistory = OverrideHistory(context: self.coredataContext) + let d: Double = -1 * date.addingTimeInterval(addedMinutes.minutes.timeInterval).timeIntervalSinceNow.minutes + print("Duration: \(d) minutes") + saveToHistory.duration = d + saveToHistory.target = Double(overrideTarget) + saveToHistory.date = overrideArray.first?.date ?? Date() try? self.coredataContext.save() } } diff --git a/FreeAPS/Sources/APS/Storage/OverrideStorage.swift b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift new file mode 100644 index 0000000000..672578e49e --- /dev/null +++ b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift @@ -0,0 +1,79 @@ +import CoreData +import Foundation +import SwiftDate +import Swinject + +/* + protocol OverrideStorage { + func fetchOverrides(interval: NSDate) -> [Override] + func fetchLatestOverride() -> [Override] + } + */ +protocol OverrideObserver { + func overrideHistoryDidUpdate(_: [OverrideHistory]) +} + +final class OverrideStorage { + private let processQueue = DispatchQueue(label: "BaseOverrideStorage.processQueue") + + @Injected() private var broadcaster: Broadcaster! + + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // newBackgroundContext() + + func fetchLatestOverride() -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.fetchLimit = 1 + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrides(interval: NSDate) -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrideHistory(interval: NSDate) -> [OverrideHistory] { + var overrideArray = [OverrideHistory]() + coredataContext.performAndWait { + let requestOverrides = OverrideHistory.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func cancelProfile() { + let scheduled = fetchLatestOverride().first + coredataContext.perform { [self] in + let profiles = Override(context: self.coredataContext) + let history = OverrideHistory(context: self.coredataContext) + if let latest = scheduled { + history.duration = -1 * (latest.date ?? Date()).timeIntervalSinceNow.minutes + print("History duration: \(history.duration) min") + history.date = latest.date ?? Date() + history.target = Double(latest.target ?? 100) + } + profiles.enabled = false + profiles.date = Date() + try? self.coredataContext.save() + } + } +} diff --git a/FreeAPS/Sources/Helpers/Color+Extensions.swift b/FreeAPS/Sources/Helpers/Color+Extensions.swift index 1b66ad90d2..cd4c0a4ba4 100644 --- a/FreeAPS/Sources/Helpers/Color+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Color+Extensions.swift @@ -59,8 +59,15 @@ extension Color { static let tempBasal = Color("TempBasal") static let basal = Color("Basal") static let darkerBlue = Color("DarkerBlue") + static let lightBlue = Color("LightBlue") static let loopPink = Color("LoopPink") static let lemon = Color("Lemon") static let minus = Color("minus") static let darkGray = Color("darkGray") + static let darkRed = Color("DarkRed") + static let darkGreen = Color("DarkGreen") + static let blueComplicationBackground = Color(red: 0.1176470588, green: 0.2352941176, blue: 0.3725490196) + static let header = Color("Header") + static let homeBackground = Color("HomeBackground") + static let popUpGray = Color("PopUpGray") } diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift new file mode 100644 index 0000000000..ca1f1c9445 --- /dev/null +++ b/FreeAPS/Sources/Models/Configs.swift @@ -0,0 +1,42 @@ +import Foundation +import SwiftUI + +struct DateFilter { + var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate + var today = Calendar.current.startOfDay(for: Date()) as NSDate + var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate + var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate + var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate + var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate +} + +public enum IAPSconfig { + static let padding: CGFloat = 60 + static let iconSize: CGFloat = 20 + static let backgroundOpacity: Double = 0.2 + static let buttonSize: CGFloat = 26 + static let shadowOpacity: CGFloat = 0.75 + static let glassShadowOpacity: CGFloat = 0.6 + static let shadowFraction: CGFloat = 2 +} + +extension Font { + static let buttonFont = Font.custom("TimeButtonFont", fixedSize: 14) // Same as Eventual BG size + static let loopFont = Font.custom("LoopFont", fixedSize: 18) // Loop min ago + static let statusFont = Font.custom("StatusFont", fixedSize: 16) // IOB, COB etc. + static let pumpFont = Font.custom("StatusFont", fixedSize: 15) + static let previewSmall = Font.custom("PreviewSmallFont", fixedSize: 12) + static let previewNormal = Font.custom("PreviewNormalFont", fixedSize: 18) + static let previewHeadline = Font.custom("PreviewHeadlineFont", fixedSize: 20) + static let extraSmall = Font.custom("ExtraSmallFont", fixedSize: 14) + + static let suggestionHeadline = Font.custom("SuggestionHeadlineFont", fixedSize: 20) + static let suggestionError = Font.custom("SuggestionErrorFone", fixedSize: 18) + static let suggestionParts = Font.custom("SuggestionPartsFont", fixedSize: 17) + static let suggestionSmallParts = Font.custom("SuggestionSmallPartsFont", fixedSize: 16) + + static let glucoseFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 45) + static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 24) + static let bolusProgressStopFont = Font.custom("BolusProgressStop", fixedSize: 24) + static let bolusProgressFont = Font.custom("BolusProgress", fixedSize: 20) +} diff --git a/FreeAPS/Sources/Models/DateFilter.swift b/FreeAPS/Sources/Models/DateFilter.swift deleted file mode 100644 index 466b699f98..0000000000 --- a/FreeAPS/Sources/Models/DateFilter.swift +++ /dev/null @@ -1,11 +0,0 @@ - -import Foundation - -struct DateFilter { - var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate - var today = Calendar.current.startOfDay(for: Date()) as NSDate - var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate - var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate - var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate - var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate -} diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 0c85e089ad..c56d70700e 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -51,6 +51,7 @@ struct FreeAPSSettings: JSON, Equatable { var fattyMealFactor: Decimal = 0.7 var displayPredictions: Bool = true var useLiveActivity: Bool = false + var useTargetButton: Bool = false } extension FreeAPSSettings: Decodable { @@ -264,6 +265,10 @@ extension FreeAPSSettings: Decodable { settings.useLiveActivity = useLiveActivity } + if let useTargetButton = try? container.decode(Bool.self, forKey: .useTargetButton) { + settings.useTargetButton = useTargetButton + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index b76d833526..9a1aa13978 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -108,7 +108,6 @@ extension Bolus { deltaBG = delta } - // CALCULATIONS FOR THE BOLUS CALCULATOR func calculateInsulin() -> Decimal { var conversion: Decimal = 1.0 if units == .mmolL { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 6c3e983600..a28006c364 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -20,6 +20,7 @@ extension Bolus { } @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -125,11 +126,12 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: false, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) } + .focused($isFocused) .onChange(of: state.amount) { newValue in if newValue > state.maxBolus { exceededMaxBolus = true @@ -138,7 +140,21 @@ extension Bolus { } } - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { @@ -162,8 +178,10 @@ extension Bolus { label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } + + // Section {} footer: {}.padding(.bottom, 30) } - .blur(radius: showInfo ? 3 : 0) + .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems( diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 8329f93ec3..0af99e7106 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -16,6 +16,7 @@ extension Bolus { @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -81,7 +82,6 @@ extension Bolus { } }.contentShape(Rectangle()) } - HStack { Text("Amount") Spacer() @@ -89,13 +89,28 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: true, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } + .focused($isFocused) - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 8b8ac87a84..fc160f3c73 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -83,10 +83,9 @@ extension CGM { Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose) } } - .onAppear(perform: configureView) .navigationTitle("CGM") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $setupCGM) { if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm { CGMSettingsView( diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9e3fe377c1..b3f1dcd231 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -192,7 +192,7 @@ extension DataTable { } .onAppear(perform: configureView) .navigationTitle("Add Glucose") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: { showManualGlucose = false })) } } diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 35bce423c9..1094544a48 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -67,16 +67,16 @@ extension Dynamic { Toggle("Adjust basal", isOn: $state.tddAdjBasal) } } header: { Text("Settings") } - - Section { - HStack { - Text("Threshold Setting") - Spacer() - DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) - Text(state.unit.rawValue) - } - } header: { Text("Safety") } } + + Section { + HStack { + Text("Threshold Setting") + Spacer() + DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) + Text(state.unit.rawValue) + } + } header: { Text("Safety") } } .onAppear(perform: configureView) .navigationBarTitle("Dynamic ISF") diff --git a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift index e0ea9544c3..3b8f5af42f 100644 --- a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift +++ b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift @@ -20,4 +20,5 @@ protocol HomeProvider: Provider { func pumpReservoir() -> Decimal? func tempTarget() -> TempTarget? func announcement(_ hours: Int) -> [Announcement] + func overrides() -> [Override] } diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index fb846a2fd0..8ab9f613d2 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -15,6 +15,14 @@ extension Home { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } + func overrides() -> [Override] { + OverrideStorage().fetchOverrides(interval: DateFilter().day) + } + + func overrideHistory() -> [OverrideHistory] { + OverrideStorage().fetchOverrideHistory(interval: DateFilter().day) + } + var enactedSuggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 3f32ab5680..23641f1160 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -60,7 +60,16 @@ extension Home { @Published var displayYgridLines: Bool = false @Published var thresholdLines: Bool = false @Published var timeZone: TimeZone? - @Published var hours: Int16 = 6 + @Published var hours: Int = 6 + @Published var totalBolus: Decimal = 0 + @Published var isStatusPopupPresented: Bool = false + @Published var readings: [Readings] = [] + @Published var standing: Bool = false + @Published var preview: Bool = true + @Published var displayTimeButtons: Bool = false + @Published var useBlue: Bool = false + @Published var useTargetButton: Bool = false + @Published var overrideHistory: [OverrideHistory] = [] let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -77,8 +86,10 @@ extension Home { setupReservoir() setupAnnouncements() setupCurrentPumpTimezone() + setupOverrideHistory() suggestion = provider.suggestion + overrideHistory = provider.overrideHistory() uploadStats = settingsManager.settings.uploadStats enactedSuggestion = provider.enactedSuggestion units = settingsManager.settings.units @@ -98,6 +109,8 @@ extension Home { displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours broadcaster.register(GlucoseObserver.self, observer: self) broadcaster.register(SuggestionObserver.self, observer: self) @@ -110,7 +123,7 @@ extension Home { broadcaster.register(EnactedSuggestionObserver.self, observer: self) broadcaster.register(PumpBatteryObserver.self, observer: self) broadcaster.register(PumpReservoirObserver.self, observer: self) - + broadcaster.register(OverrideObserver.self, observer: self) animatedBackground = settingsManager.settings.animatedBackground timer.eventHandler = { @@ -209,12 +222,8 @@ extension Home { } func cancelProfile() { - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } + OverrideStorage().cancelProfile() + setupOverrideHistory() } private func setupGlucose() { @@ -222,6 +231,7 @@ extension Home { guard let self = self else { return } self.isManual = self.provider.manualGlucose(hours: self.filteredHours) self.glucose = self.provider.filteredGlucose(hours: self.filteredHours) + self.readings = CoreDataStorage().fetchGlucose(interval: DateFilter().today) self.recentGlucose = self.glucose.last if self.glucose.count >= 2 { self.glucoseDelta = (self.recentGlucose?.glucose ?? 0) - (self.glucose[self.glucose.count - 2].glucose ?? 0) @@ -311,6 +321,13 @@ extension Home { } } + private func setupOverrideHistory() { + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.overrideHistory = self.provider.overrideHistory() + } + } + private func setupAnnouncements() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } @@ -403,7 +420,8 @@ extension Home.StateModel: EnactedSuggestionObserver, PumpBatteryObserver, PumpReservoirObserver, - PumpTimeZoneObserver + PumpTimeZoneObserver, + OverrideObserver { func glucoseDidUpdate(_: [BloodGlucose]) { setupGlucose() @@ -413,6 +431,11 @@ extension Home.StateModel: self.suggestion = suggestion carbsRequired = suggestion.carbsReq setStatusTitle() + setupOverrideHistory() + } + + func overrideHistoryDidUpdate(_: [OverrideHistory]) { + setupOverrideHistory() } func settingsDidChange(_ settings: FreeAPSSettings) { @@ -429,8 +452,10 @@ extension Home.StateModel: displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks - + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours setupGlucose() + setupOverrideHistory() } func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) { @@ -459,6 +484,7 @@ extension Home.StateModel: func enactedSuggestionDidUpdate(_ suggestion: Suggestion) { enactedSuggestion = suggestion setStatusTitle() + setupOverrideHistory() } func pumpBatteryDidChange(_: Battery) { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index d574d535d6..4dbc1b8910 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -20,17 +20,23 @@ struct AnnouncementDot { let note: String } +struct OverrideStruct { + let start: Date + let end: Date + let glucose: Int +} + typealias GlucoseYRange = (minValue: Int, minY: CGFloat, maxValue: Int, maxY: CGFloat) struct MainChartView: View { private enum Config { static let endID = "End" - static let basalHeight: CGFloat = 80 + static let basalHeight: CGFloat = 50 static let topYPadding: CGFloat = 20 - static let bottomYPadding: CGFloat = 80 + static let bottomYPadding: CGFloat = 20 static let minAdditionalWidth: CGFloat = 150 static let maxGlucose = 270 - static let minGlucose = 45 + static let minGlucose = 0 // 45 static let yLinesCount = 5 static let glucoseScale: CGFloat = 2 // default 2 static let bolusSize: CGFloat = 8 @@ -72,10 +78,12 @@ struct MainChartView: View { @Binding var smooth: Bool @Binding var highGlucose: Decimal @Binding var lowGlucose: Decimal - @Binding var screenHours: Int16 + @Binding var screenHours: Int @Binding var displayXgridLines: Bool @Binding var displayYgridLines: Bool @Binding var thresholdLines: Bool + @Binding var triggerUpdate: Bool + @Binding var overrideHistory: [OverrideHistory] @State var didAppearTrigger = false @State private var glucoseDots: [CGRect] = [] @@ -89,14 +97,13 @@ struct MainChartView: View { @State private var tempBasalPath = Path() @State private var regularBasalPath = Path() @State private var tempTargetsPath = Path() + @State private var overridesPath = Path() @State private var suspensionsPath = Path() @State private var carbsDots: [DotInfo] = [] @State private var fpuDots: [DotInfo] = [] @State private var glucoseYRange: GlucoseYRange = (0, 0, 0, 0) @State private var cachedMaxBasalRate: Decimal? - private var zoomScale: Double { - 1.0 / Double(screenHours) - } + @State private var legends: Bool = false private let calculationQueue = DispatchQueue( label: "MainChartView.calculationQueue", @@ -149,14 +156,21 @@ struct MainChartView: View { return formatter } + private var fetchedTargetFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if units == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + return formatter + } + @Environment(\.horizontalSizeClass) var hSizeClass @Environment(\.verticalSizeClass) var vSizeClass - // MARK: - Views - var body: some View { GeometryReader { geo in - ZStack(alignment: .leading) { + ZStack { yGridView(fullSize: geo.size) mainScrollView(fullSize: geo.size) glucoseLabelsView(fullSize: geo.size) @@ -167,6 +181,9 @@ struct MainChartView: View { .onChange(of: vSizeClass) { _ in update(fullSize: geo.size) } + .onChange(of: screenHours) { _ in + update(fullSize: geo.size) + } .onReceive( Foundation.NotificationCenter.default .publisher(for: UIDevice.orientationDidChangeNotification) @@ -174,6 +191,60 @@ struct MainChartView: View { update(fullSize: geo.size) } } + .onTapGesture { + legends.toggle() + } + } + + var legendPanel: some View { + ZStack { + HStack { + if legends { + Group { + Circle().fill(Color.insulin).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("IOB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Circle().fill(Color.zt).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("ZT") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Circle().fill(Color.loopYellow).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("COB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Circle().fill(Color.uam).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("UAM") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } else { + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } + } + .padding(.bottom, 20) + } } private func mainScrollView(fullSize: CGSize) -> some View { @@ -181,7 +252,10 @@ struct MainChartView: View { ScrollView(.horizontal, showsIndicators: false) { ZStack(alignment: .top) { tempTargetsView(fullSize: fullSize).drawingGroup() + overridesView(fullSize: fullSize).drawingGroup() basalView(fullSize: fullSize).drawingGroup() + legendPanel.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, legends ? 20 : 70).padding(.bottom, 20) mainView(fullSize: fullSize).id(Config.endID) .drawingGroup() } @@ -272,7 +346,7 @@ struct MainChartView: View { .scaleEffect(x: 1, y: -1) .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) .frame(maxHeight: Config.basalHeight) - .background(Color.secondary.opacity(0.1)) + .background(Color.clear) .onChange(of: tempBasals) { _ in calculateBasalPoints(fullSize: fullSize) } @@ -345,13 +419,14 @@ struct MainChartView: View { return ZStack { Path { path in for hour in 0 ..< hours + hours { - let x = ( - firstHourPosition(viewWidth: fullSize.width) + + if screenHours < 12 || hour % 2 == 0 { + // only show every second line if screenHours is too big + let x = firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale - path.move(to: CGPoint(x: x, y: 0)) - path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + path.move(to: CGPoint(x: x, y: 0)) + path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + } } } .stroke(useColour, lineWidth: 0.15) @@ -371,19 +446,21 @@ struct MainChartView: View { private func timeLabelsView(fullSize: CGSize) -> some View { let format = screenHours > 6 ? date24Formatter : dateFormatter return ZStack { - // X time labels - ForEach(0 ..< hours + hours, id: \.self) { hour in - Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) - .font(.caption) - .position( - x: ( - firstHourPosition(viewWidth: fullSize.width) + + ForEach(0 ..< hours + hours) { hour in + if screenHours >= 12 && hour % 2 == 1 { + // only show every second time label if screenHours is too big + EmptyView() + } else { + Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) + .font(.caption) + .position( + x: firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * - CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale, - y: 10.0 - ) - .foregroundColor(.secondary) + CGFloat(hour) * CGFloat(1.hours.timeInterval), + y: 10.0 + ) + .foregroundColor(.secondary) + } } }.frame(maxHeight: 20) } @@ -600,12 +677,28 @@ struct MainChartView: View { } } - private func scale(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.origin.x * zoomScale, y: rect.origin.y), size: rect.size) - } - - private func scaleCenter(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.midX * zoomScale - rect.width / 2, y: rect.origin.y), size: rect.size) + private func overridesView(fullSize: CGSize) -> some View { + ZStack { + overridesPath + .fill(Color.purple.opacity(0.4)) + overridesPath + .stroke(Color.purple.opacity(0.7), lineWidth: 0.5) + } + .onChange(of: glucose) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: suggestion) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: overrideHistory) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: triggerUpdate) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + calculateOverridesRects(fullSize: fullSize) + } } private func predictionsView(fullSize: CGSize) -> some View { @@ -659,6 +752,7 @@ extension MainChartView { calculateCarbsDots(fullSize: fullSize) calculateFPUsDots(fullSize: fullSize) calculateTempTargetsRects(fullSize: fullSize) + calculateOverridesRects(fullSize: fullSize) calculateBasalPoints(fullSize: fullSize) calculateSuspensions(fullSize: fullSize) } @@ -1001,17 +1095,85 @@ extension MainChartView { return res } } - let path = Path { path in path.addRects(rects) } - DispatchQueue.main.async { tempTargetsPath = path } } } + private func calculateOverridesRects(fullSize: CGSize) { + calculationQueue.async { + let latest = OverrideStorage().fetchLatestOverride().first + let rects = overrideHistory.compactMap { each -> CGRect in + let duration = each.duration + let xStart = timeToXCoordinate(each.date!.timeIntervalSince1970, fullSize: fullSize) + let xEnd = timeToXCoordinate( + each.date!.addingTimeInterval(Int(duration).minutes.timeInterval).timeIntervalSince1970, + fullSize: fullSize + ) + let y = glucoseToYCoordinate(Int(each.target), fullSize: fullSize) + return CGRect( + x: xStart, + y: y - 3, + width: xEnd - xStart, + height: 6 + ) + } + if latest?.enabled ?? false { + var old = Array(rects) + if (latest?.duration ?? 0) != 0 { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(Int(latest?.duration ?? 0).minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate( + Int(Double(latest?.target ?? 100)), + fullSize: fullSize + ), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } else { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(60.minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } + } + let path = Path { path in + path.addRects(rects) + } + DispatchQueue.main.async { + overridesPath = path + } + } + } + private func findRegularBasalPoints( timeBegin: TimeInterval, timeEnd: TimeInterval, diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 584c8b467d..1c2844b6a7 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -9,6 +9,14 @@ struct CurrentGlucoseView: View { @Binding var lowGlucose: Decimal @Binding var highGlucose: Decimal + @State private var rotationDegrees: Double = 0.0 + + enum Config { + static let size: CGFloat = 100 + } + + @Environment(\.colorScheme) var colorScheme + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -45,47 +53,54 @@ struct CurrentGlucoseView: View { } var body: some View { - VStack(alignment: .center) { - HStack { - Text( - (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose - .map { - glucoseFormatter - .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } - ?? "--" - ) - .font(.title).fontWeight(.bold) - .foregroundColor(alarm == nil ? colorOfGlucose : .loopRed) - - image - } - HStack { - let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 - let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" - Text( - minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( - text + " " + - NSLocalizedString("min", comment: "Short form for minutes") + " " + ZStack { + VStack(alignment: .center) { + // HStack { + ZStack { + Text( + (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose + .map { + glucoseFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } + ?? "--" ) - ) - .font(.caption2).foregroundColor(.secondary) + .font(.glucoseFont) + .foregroundColor(alarm == nil ? .primary : .loopRed) + .frame(maxWidth: .infinity, alignment: .center) - Text( - delta - .map { - deltaFormatter.string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! - } ?? "--" - ) - .font(.caption2).foregroundColor(.secondary) - }.frame(alignment: .top) + HStack(spacing: 20) { + image + .font(.system(size: 25)) + VStack { + Text( + delta + .map { + deltaFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! + } ?? "--" + ) + HStack { + let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 + let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" + Text( + minutesAgo <= 1 ? "" : ( + text + " " + + NSLocalizedString("min", comment: "Short form for minutes") + " " + ) + ) + }.offset(x: 7, y: 0) + } + .font(.extraSmall).foregroundStyle(.secondary) + }.frame(maxWidth: .infinity, alignment: .trailing).padding(.trailing, 50) + } + } } } - var image: Image { + var image: some View { guard let direction = recentGlucose?.direction else { return Image(systemName: "arrow.left.and.right") } - switch direction { case .doubleUp, .singleUp, @@ -101,28 +116,10 @@ struct CurrentGlucoseView: View { .singleDown, .tripleDown: return Image(systemName: "arrow.down") - case .none, .notComputable, .rateOutOfRange: return Image(systemName: "arrow.left.and.right") } } - - var colorOfGlucose: Color { - let whichGlucose = recentGlucose?.glucose ?? 0 - - guard lowGlucose < highGlucose else { return .primary } - - switch whichGlucose { - case 0 ..< Int(lowGlucose): - return .loopRed - case Int(lowGlucose) ..< Int(highGlucose): - return .loopGreen - case Int(highGlucose)...: - return .loopYellow - default: - return .loopYellow - } - } } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index b92a98eb40..e1211201f4 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -21,38 +21,37 @@ struct LoopView: View { return formatter } - private let rect = CGRect(x: 0, y: 0, width: 28, height: 28) + @Environment(\.colorScheme) var colorScheme var body: some View { - VStack(alignment: .center) { - ZStack { - Circle() - .strokeBorder(color, lineWidth: 5) - .frame(width: rect.width, height: rect.height, alignment: .bottom) - .mask(mask(in: rect).fill(style: FillStyle(eoFill: true))) - if isLooping { - ProgressView() + VStack { + LoopEllipse() + .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) + .overlay { + let textColor: Color = .secondary + HStack { + ZStack { + if !isLooping, actualSuggestion?.timestamp != nil { + if minutesAgo > 1440 { + Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) + } else { + let timeString = "\(minutesAgo) " + + NSLocalizedString("min", comment: "Minutes ago since last loop") + Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + } + } + if isLooping { + ProgressView() + } + } + } } - } - if isLooping { - Text("looping").font(.caption2) - } else if manualTempBasal { - Text("Manual").font(.caption2) - } else if actualSuggestion?.timestamp != nil { - Text(timeString).font(.caption2) - .foregroundColor(.secondary) - } else { - Text("--").font(.caption2).foregroundColor(.secondary) - } } } - private var timeString: String { + private var minutesAgo: Int { let minAgo = Int((timerDate.timeIntervalSince(lastLoopDate) - Config.lag) / 60) + 1 - if minAgo > 1440 { - return "--" - } - return "\(minAgo) " + NSLocalizedString("min", comment: "Minutes ago since last loop") + return minAgo } private var color: Color { @@ -64,26 +63,18 @@ struct LoopView: View { } let delta = timerDate.timeIntervalSince(lastLoopDate) - Config.lag - if delta <= 5.minutes.timeInterval { + if delta <= 8.minutes.timeInterval { guard actualSuggestion?.deliverAt != nil else { return .loopYellow } return .loopGreen - } else if delta <= 10.minutes.timeInterval { + } else if delta <= 12.minutes.timeInterval { return .loopYellow } else { return .loopRed } } - func mask(in rect: CGRect) -> Path { - var path = Rectangle().path(in: rect) - if !closedLoop || manualTempBasal { - path.addPath(Rectangle().path(in: CGRect(x: rect.minX, y: rect.midY - 5, width: rect.width, height: 10))) - } - return path - } - private var actualSuggestion: Suggestion? { if closedLoop, enactedSuggestion?.recieved == true { return enactedSuggestion ?? suggestion diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift new file mode 100644 index 0000000000..383a796539 --- /dev/null +++ b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift @@ -0,0 +1,255 @@ +import Charts +import SwiftUI + +struct PreviewChart: View { + @Binding var readings: [Readings] + @Binding var lowLimit: Decimal + @Binding var highLimit: Decimal + + @Environment(\.colorScheme) var colorScheme + + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + + var body: some View { + let fetched = previewTir() + + struct TIRinPercent: Identifiable { + let type: String + let group: String + let percentage: Decimal + let id: UUID + } + + let separator: Decimal = 4 + + var data: [TIRinPercent] = [ + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very Low", + comment: "" + ), + percentage: fetched[4].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Low", + comment: "" + ), + percentage: fetched[0].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString("In Range", comment: ""), + percentage: fetched[1].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "High", + comment: "" + ), + percentage: fetched[2].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very High", + comment: "" + ), + percentage: fetched[3].decimal, + id: UUID() + ) + ] + + for index in 0 ..< 3 { + if data[index].percentage == 0 { + data.remove(at: index + 1) + } + } + + return HStack { + VStack { + Chart(data) { item in + BarMark( + x: .value("TIR", item.type), + y: .value("Percentage", item.percentage), + width: .fixed(60) + ) + .foregroundStyle(by: .value("Group", item.group)) + .annotation(position: .trailing) { + if item.group == NSLocalizedString("In Range", comment: ""), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + }.font(.previewNormal) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Low", + comment: "" + ), item.percentage > 0.0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: -5) + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very Low", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: 5) + .font(.previewSmall) + .padding(.leading, 20) + } + } + } + .chartForegroundStyleScale([ + NSLocalizedString( + "Low", + comment: "" + ): .red, + NSLocalizedString("In Range", comment: ""): .darkGreen, + NSLocalizedString( + "High", + comment: "" + ): .yellow, + NSLocalizedString( + "Very High", + comment: "" + ): .red, + NSLocalizedString( + "Very Low", + comment: "" + ): .darkRed, + "Separator": colorScheme == .dark ? .black : .white + ]) + .chartXAxis(.hidden) + .chartYAxis(.hidden) + .chartLegend(.hidden) + .padding(.bottom, 15) + .frame(maxWidth: UIScreen.main.bounds.width / 5, alignment: .leading) + }.frame(maxHeight: 200) + + }.padding(.top, 20).padding(.leading, 20) + } + + private func previewTir() -> [(decimal: Decimal, string: String)] { + let hypoLimit = Int(lowLimit) + let hyperLimit = Int(highLimit) + + let glucose = readings + + let justGlucoseArray = glucose.compactMap({ each in Int(each.glucose as Int16) }) + let totalReadings = justGlucoseArray.count + + let hyperArray = glucose.filter({ $0.glucose >= hyperLimit }) + let hyperReadings = hyperArray.compactMap({ each in each.glucose as Int16 }).count + var hyperPercentage = Double(hyperReadings) / Double(totalReadings) * 100 + + let hypoArray = glucose.filter({ $0.glucose <= hypoLimit }) + let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count + var hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + + let veryHighArray = glucose.filter({ $0.glucose > 197 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 60 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + + hypoPercentage -= veryLowPercentage + hyperPercentage -= veryHighPercentage + + let tir = 100 - (hypoPercentage + hyperPercentage + veryHighPercentage + veryLowPercentage) + + var array: [(decimal: Decimal, string: String)] = [] + array.append((decimal: Decimal(hypoPercentage), string: "Low")) + array.append((decimal: Decimal(tir), string: "NormaL")) + array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) + + return array + } +} diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index e809049b82..148af785e9 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -6,7 +6,10 @@ struct PumpView: View { @Binding var name: String @Binding var expiresAtDate: Date? @Binding var timerDate: Date - @Binding var timeZone: TimeZone? + + @State var state: Home.StateModel + + @Environment(\.colorScheme) var colorScheme private var reservoirFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -21,99 +24,123 @@ struct PumpView: View { return formatter } + private var numberFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var dateFormatter: DateFormatter { + let dateFormatter = DateFormatter() + dateFormatter.timeStyle = .short + return dateFormatter + } + var body: some View { - VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 10) { + if let battery = battery, expiresAtDate == nil { + let percent = (battery.percent ?? 100) > 80 ? 100 : (battery.percent ?? 100) < 81 && + (battery.percent ?? 100) > + 60 ? 75 : (battery.percent ?? 100) < 61 && (battery.percent ?? 100) > 40 ? 50 : 25 + Image(systemName: "battery.\(percent)") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 15) + .foregroundColor(batteryColor) + } + if let reservoir = reservoir { + let fill = CGFloat(min(max(Double(reservoir) / 200.0, 0.15), Double(reservoir) / 200.0, 0.9)) * 12 HStack { - Image(systemName: "drop.fill") + Image("vial") .resizable() .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) + .frame(maxWidth: 10) .foregroundColor(reservoirColor) + .offset(x: 0, y: -3) + .overlay { + UnevenRoundedRectangle(cornerRadii: .init(bottomLeading: 2, bottomTrailing: 2)) + .fill(Color.insulin) + .frame(maxWidth: 8.8, maxHeight: fill) + .frame(maxHeight: .infinity, alignment: .bottom) + .offset(x: -0.09, y: -3.22) + } if reservoir == 0xDEAD_BEEF { - Text("50+ " + NSLocalizedString("U", comment: "Insulin unit")).font(.footnote) - .fontWeight(.bold) + HStack(spacing: 0) { + Text("50+ ").font(.statusFont).bold() + Text(NSLocalizedString("U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } else { - Text( - reservoirFormatter - .string(from: reservoir as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - } - - if let timeZone = timeZone, timeZone.secondsFromGMT() != TimeZone.current.secondsFromGMT() { - Image(systemName: "clock.badge.exclamationmark.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 13) - .symbolRenderingMode(.palette) - .foregroundStyle(.red, Color(.warning)) - .padding(.bottom, 10) + HStack(spacing: 0) { + Text( + reservoirFormatter + .string(from: reservoir as NSNumber)! + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } - }.frame(alignment: .top) - } - if let battery = battery, battery.display ?? false, expiresAtDate == nil { - HStack { - Image(systemName: "battery.100") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(batteryColor) - Text("\(Int(battery.percent ?? 100)) %").font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + }.offset(x: 0, y: 4) + } else { + Text("No Pump").font(.statusFont).foregroundStyle(.secondary) } if let date = expiresAtDate { - HStack { - Image(systemName: "stopwatch.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(timerColor) - Text(remainingTimeString(time: date.timeIntervalSince(timerDate))).font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + HStack(spacing: 2) { + Image("pod_reservoir") + .resizable(resizingMode: .stretch) + .frame(width: IAPSconfig.iconSize * 1.15, height: IAPSconfig.iconSize * 1.6) + .foregroundColor(colorScheme == .dark ? .secondary : .white) + remainingTime(time: date.timeIntervalSince(timerDate)) + .font(.pumpFont) + } } } } - private func remainingTimeString(time: TimeInterval) -> String { - guard time > 0 else { - return NSLocalizedString("Replace pod", comment: "View/Header when pod expired") - } - - var time = time - let days = Int(time / 1.days.timeInterval) - time -= days.days.timeInterval - let hours = Int(time / 1.hours.timeInterval) - time -= hours.hours.timeInterval - let minutes = Int(time / 1.minutes.timeInterval) - - if days >= 1 { - return "\(days)" + NSLocalizedString("d", comment: "abbreviation for days") + " \(hours)" + - NSLocalizedString("h", comment: "abbreviation for hours") - } - - if hours >= 1 { - return "\(hours)" + NSLocalizedString("h", comment: "abbreviation for hours") + private func remainingTime(time: TimeInterval) -> some View { + VStack { + if time > 0 { + let days = Int(time / 1.days.timeInterval) + let hours = Int(time / 1.hours.timeInterval) + let minutes = Int(time / 1.minutes.timeInterval) + if days >= 1 { + HStack(spacing: 0) { + Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("d", comment: "abbreviation for days")) // .foregroundStyle(.secondary) + } + HStack(spacing: 0) { + Text(" \(hours - days * 24)") + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else if hours >= 1 { + HStack(spacing: 0) { + Text("\(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else { + HStack(spacing: 0) { + Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("m", comment: "abbreviation for minutes")) // .foregroundStyle(.secondary) + } + } + } else { + Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) + } } - - return "\(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes") } private var batteryColor: Color { guard let battery = battery, let percent = battery.percent else { return .gray } - switch percent { case ...10: - return .loopRed + return .red case ...20: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } @@ -124,11 +151,11 @@ struct PumpView: View { switch reservoir { case ...10: - return .loopRed + return .red case ...30: - return .loopYellow + return .yellow default: - return .insulin + return .blue } } @@ -141,11 +168,11 @@ struct PumpView: View { switch time { case ...8.hours.timeInterval: - return .loopRed + return .red case ...1.days.timeInterval: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 5802528dac..f6e9d83593 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -11,24 +11,7 @@ extension Home { @StateObject var state = StateModel() @State var isStatusPopupPresented = false @State var showCancelAlert = false - - struct Buttons: Identifiable { - let label: String - let number: String - var active: Bool - let hours: Int16 - var id: String { label } - } - - @State var timeButtons: [Buttons] = [ - Buttons(label: "2 hours", number: "2", active: false, hours: 2), - Buttons(label: "4 hours", number: "4", active: false, hours: 4), - Buttons(label: "6 hours", number: "6", active: false, hours: 6), - Buttons(label: "12 hours", number: "12", active: false, hours: 12), - Buttons(label: "24 hours", number: "24", active: false, hours: 24) - ] - - let buttonFont = Font.custom("TimeButtonFont", size: 14) + @State var triggerUpdate = false @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme @@ -98,45 +81,6 @@ extension Home { return scene } - @ViewBuilder func header(_ geo: GeometryProxy) -> some View { - HStack(alignment: .bottom) { - Spacer() - cobIobView - Spacer() - glucoseView - Spacer() - pumpView - Spacer() - loopView - Spacer() - } - .frame(maxWidth: .infinity) - .padding(.top, 10 + geo.safeAreaInsets.top) - .padding(.bottom, 10) - .background(Color.gray.opacity(0.3)) - } - - var cobIobView: some View { - VStack(alignment: .leading, spacing: 12) { - HStack { - Text("IOB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .top) - HStack { - Text("COB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" g", comment: "gram of carbs") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .bottom) - } - } - var glucoseView: some View { CurrentGlucoseView( recentGlucose: $state.recentGlucose, @@ -172,7 +116,7 @@ extension Home { name: $state.pumpName, expiresAtDate: $state.pumpExpiresAtDate, timerDate: $state.timerDate, - timeZone: $state.timeZone + state: state ) .onTapGesture { if state.pumpDisplayState != nil { @@ -190,8 +134,9 @@ extension Home { isLooping: $state.isLooping, lastLoopDate: $state.lastLoopDate, manualTempBasal: $state.manualTempBasal - ).onTapGesture { - isStatusPopupPresented = true + ) + .onTapGesture { + state.isStatusPopupPresented.toggle() }.onLongPressGesture { let impactHeavy = UIImpactFeedbackGenerator(style: .heavy) impactHeavy.impactOccurred() @@ -212,209 +157,59 @@ extension Home { comment: "Manual Temp basal" ) } - return rateString + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString + return rateString + " " + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString } var tempTargetString: String? { guard let tempTarget = state.tempTarget else { return nil } - let target = tempTarget.targetBottom ?? 0 - let unitString = targetFormatter.string(from: (tempTarget.targetBottom?.asMmolL ?? 0) as NSNumber) ?? "" - let rawString = (tirFormatter.string(from: (tempTarget.targetBottom ?? 0) as NSNumber) ?? "") + " " + state.units - .rawValue - - var string = "" - if sliderTTpresets.first?.active ?? false { - let hbt = sliderTTpresets.first?.hbt ?? 0 - string = ", " + (tirFormatter.string(from: state.infoPanelTTPercentage(hbt, target) as NSNumber) ?? "") + " %" - } - - let percentString = state - .units == .mmolL ? (unitString + " mmol/L" + string) : (rawString + (string == "0" ? "" : string)) - return tempTarget.displayName + " " + percentString - } - - var overrideString: String? { - guard fetchedPercent.first?.enabled ?? false else { - return nil - } - var percentString = "\((fetchedPercent.first?.percentage ?? 100).formatted(.number)) %" - var target = (fetchedPercent.first?.target ?? 100) as Decimal - let indefinite = (fetchedPercent.first?.indefinite ?? false) - let unit = state.units.rawValue - if state.units == .mmolL { - target = target.asMmolL - } - var targetString = (fetchedTargetFormatter.string(from: target as NSNumber) ?? "") + " " + unit - if tempTargetString != nil || target == 0 { targetString = "" } - percentString = percentString == "100 %" ? "" : percentString - - let duration = (fetchedPercent.first?.duration ?? 0) as Decimal - let addedMinutes = Int(duration) - let date = fetchedPercent.first?.date ?? Date() - var newDuration: Decimal = 0 - - if date.addingTimeInterval(addedMinutes.minutes.timeInterval) > Date() { - newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes) - } - - var durationString = indefinite ? - "" : newDuration >= 1 ? - (newDuration.formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " min") : - ( - newDuration > 0 ? ( - (newDuration * 60).formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " s" - ) : - "" - ) - - let smbToggleString = (fetchedPercent.first?.smbIsOff ?? false) ? " \u{20e0}" : "" - var comma1 = ", " - var comma2 = comma1 - var comma3 = comma1 - if targetString == "" || percentString == "" { comma1 = "" } - if durationString == "" { comma2 = "" } - if smbToggleString == "" { comma3 = "" } - - if percentString == "", targetString == "" { - comma1 = "" - comma2 = "" - } - if percentString == "", targetString == "", smbToggleString == "" { - durationString = "" - comma1 = "" - comma2 = "" - comma3 = "" - } - if durationString == "" { - comma2 = "" - } - if smbToggleString == "" { - comma3 = "" - } - - if durationString == "", !indefinite { - return nil - } - return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + return tempTarget.displayName } var infoPanel: some View { - HStack(alignment: .center) { - if state.pumpSuspended { - Text("Pump suspended") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGray) - .padding(.leading, 8) - } else if let tempBasalString = tempBasalString { - Text(tempBasalString) - .font(.system(size: 12, weight: .bold)) - .foregroundColor(.insulin) - .padding(.leading, 8) - } - - if let tempTargetString = tempTargetString { - Text(tempTargetString) - .font(.caption) - .foregroundColor(.secondary) - } - - Spacer() - - if let overrideString = overrideString { - Text("👤 " + overrideString) - .font(.system(size: 12)) - .foregroundColor(.secondary) - .padding(.trailing, 8) - } - - if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { - Text("Max IOB: 0").font(.callout).foregroundColor(.orange).padding(.trailing, 20) - } - - if let progress = state.bolusProgress { + HStack(spacing: 10) { + ZStack { HStack { - Text("Bolusing") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - ProgressView(value: Double(progress)) - .progressViewStyle(BolusProgressViewStyle()) - .padding(.trailing, 8) - } - .onTapGesture { - state.cancelBolus() - } - } - } - .frame(maxWidth: .infinity, maxHeight: 30) - } - - var timeInterval: some View { - HStack(alignment: .center) { - ForEach(timeButtons) { button in - Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { - state.hours = button.hours - } - .foregroundStyle(button.active ? .primary : .secondary) - .frame(maxHeight: 20).padding(.horizontal) - .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) - } - Image(systemName: "ellipsis.circle.fill") - .foregroundStyle(.secondary) - .padding(.leading) - .onTapGesture { - state.showModal(for: .statisticsConfig) - } - } - .font(buttonFont) - .padding(.top, 20) - .padding(.bottom, 40) - } - - var legendPanel: some View { - ZStack { - HStack(alignment: .center) { - Group { - Circle().fill(Color.loopGreen).frame(width: 8, height: 8) - Text("BG") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGreen) - } - Group { - Circle().fill(Color.insulin).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("IOB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - } - Group { - Circle().fill(Color.zt).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("ZT") - .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) - } - Group { - Circle().fill(Color.loopYellow).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("COB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + if state.pumpSuspended { + Text("Pump suspended") + .font(.custom("TempBasal", fixedSize: 13)).bold().foregroundColor(.loopGray) + } else if let tempBasalString = tempBasalString { + Text(tempBasalString) + .font(.custom("TempBasal", fixedSize: 13)).bold() + .foregroundColor(.insulin) + } + if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { + Text("Check Max IOB Setting").font(.extraSmall).foregroundColor(.orange) + } } - Group { - Circle().fill(Color.uam).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("UAM") - .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + .padding(.leading, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + if let tempTargetString = tempTargetString, !(fetchedPercent.first?.enabled ?? false) { + Text(tempTargetString) + .font(.buttonFont) + .foregroundColor(.secondary) + } else { + profileView } if let eventualBG = state.eventualBG { - Text( - "⇢ " + numberFormatter.string( - from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber - )! - ) - .font(.system(size: 12, weight: .bold)).foregroundColor(.secondary) + HStack { + Image(systemName: "arrow.forward") + Text( + fetchedTargetFormatter.string( + from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber + )! + ).font(.statusFont).foregroundColor(colorScheme == .dark ? .white : .black) + Text(state.units.rawValue).font(.system(size: 12)).foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .trailing) + .padding(.trailing, 8) } } - .frame(maxWidth: .infinity) - .padding([.bottom], 20) } + .frame(maxWidth: .infinity, maxHeight: 30, alignment: .bottom) } var mainChart: some View { @@ -424,7 +219,6 @@ extension Home { .ignoresSafeArea() .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) } - MainChartView( glucose: $state.glucose, isManual: $state.isManual, @@ -447,52 +241,15 @@ extension Home { screenHours: $state.hours, displayXgridLines: $state.displayXgridLines, displayYgridLines: $state.displayYgridLines, - thresholdLines: $state.thresholdLines + thresholdLines: $state.thresholdLines, + triggerUpdate: $triggerUpdate, + overrideHistory: $state.overrideHistory ) } - // .padding(.bottom) + .padding(.bottom, 5) .modal(for: .dataTable, from: self) } - @ViewBuilder private func profiles(_: GeometryProxy) -> some View { - let colour: Color = colorScheme == .dark ? .black : .white - // Rectangle().fill(colour).frame(maxHeight: 1) - ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(maxHeight: 40) - let cancel = fetchedPercent.first?.enabled ?? false - HStack(spacing: cancel ? 25 : 15) { - Text(selectedProfile().name).foregroundColor(.secondary) - if cancel, selectedProfile().isOn { - Button { showCancelAlert.toggle() } - label: { - Image(systemName: "xmark") - .foregroundStyle(.secondary) - } - } - Button { state.showModal(for: .overrideProfilesConfig) } - label: { - Image(systemName: "person.3.sequence.fill") - .symbolRenderingMode(.palette) - .foregroundStyle( - !(fetchedPercent.first?.enabled ?? false) ? .green : .cyan, - !(fetchedPercent.first?.enabled ?? false) ? .cyan : .green, - .purple - ) - } - } - } - .alert( - "Return to Normal?", isPresented: $showCancelAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.cancelProfile() - } - }, message: { Text("This will change settings back to your normal profile.") } - ) - Rectangle().fill(colour).frame(maxHeight: 1) - } - private func selectedProfile() -> (name: String, isOn: Bool) { var profileString = "" var display: Bool = false @@ -519,24 +276,32 @@ extension Home { return (name: profileString, isOn: display) } - func highlightButtons() { - for i in 0 ..< timeButtons.count { - timeButtons[i].active = timeButtons[i].hours == state.hours - } - } - - @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { + @ViewBuilder private func buttonPanel(_ geo: GeometryProxy) -> some View { ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) - + addHeaderBackground() + // Rectangle().fill(colorScheme == .light ? .gray.opacity(0.15) : Color.header.opacity(0.15)) + .frame(height: 50 + geo.safeAreaInsets.bottom) + let isOverride = fetchedPercent.first?.enabled ?? false HStack { + Button { state.showModal(for: .dataTable) } + label: { + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "book.pages") + .symbolRenderingMode(.hierarchical) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .foregroundColor(.secondary) + .padding(8) + } + }.buttonStyle(.borderless) + Spacer() Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image("carbs") + Image(systemName: "fork.knife") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .foregroundColor(.loopYellow) .padding(8) if let carbsReq = state.carbsRequired { @@ -549,16 +314,41 @@ extension Home { } }.buttonStyle(.borderless) Spacer() - Button { state.showModal(for: .addTempTarget) } + Button { + if isOverride { + state.cancelProfile() + triggerUpdate.toggle() + } else { + state.showModal(for: .overrideProfilesConfig) + } + } label: { - Image("target") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "person.fill") + .symbolRenderingMode(.palette) + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundStyle(.purple) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .padding(8) + .background(isOverride ? .blue.opacity(0.3) : .clear) + .clipShape(RoundedRectangle(cornerRadius: 10)) + } + }.buttonStyle(.borderless) + + if state.useTargetButton { + Spacer() + Button { state.showModal(for: .addTempTarget) } + label: { + Image("target") + .renderingMode(.template) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize) + .padding(8) + } + .foregroundColor(.loopGreen) + .buttonStyle(.borderless) } - .foregroundColor(.loopGreen) - .buttonStyle(.borderless) Spacer() Button { state.showModal(for: .bolus( @@ -570,11 +360,11 @@ extension Home { Image("bolus") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.insulin) .buttonStyle(.borderless) + .foregroundColor(.insulin) Spacer() if state.allowManualTemp { Button { state.showModal(for: .manualTempBasal) } @@ -582,80 +372,209 @@ extension Home { Image("bolus1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } .foregroundColor(.insulin) - .buttonStyle(.borderless) Spacer() } - Button { state.showModal(for: .statistics) - } - label: { - Image(systemName: "chart.xyaxis.line") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) - } - .foregroundColor(.purple) - .buttonStyle(.borderless) - Spacer() Button { state.showModal(for: .settings) } label: { Image("settings1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.loopGray) .buttonStyle(.borderless) + .foregroundColor(.gray) } .padding(.horizontal, 24) .padding(.bottom, geo.safeAreaInsets.bottom) } } + var chart: some View { + addColouredBackground() + .overlay { + VStack { + infoPanel + mainChart + } + } + .frame( + minHeight: UIScreen.main.bounds.height / 1.46 + ) + .addShadows() + } + + var carbsAndInsulinView: some View { + HStack(spacing: 10) { + if let settings = state.settingsManager { + let opacity: CGFloat = colorScheme == .dark ? 0.2 : 0.6 + let materialOpacity: CGFloat = colorScheme == .dark ? 0.25 : 0.10 + HStack { + let substance = Double(state.suggestion?.cob ?? 0) + let max = max(Double(settings.preferences.maxCOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .loopYellow, materialOpacity: materialOpacity) + .frame(width: 13.8, height: 40) + .offset(x: 0, y: -6) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" g", comment: "gram of carbs")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + HStack { + let substance = Double(state.suggestion?.iob ?? 0) + let max = max(Double(settings.preferences.maxIOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .insulin, materialOpacity: materialOpacity) + .frame(width: 11, height: 36) + .offset(x: 0, y: -2.5) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + } + } + } + + var preview: some View { + addBackground() + .frame(maxWidth: .infinity, minHeight: 170, alignment: .topLeading) + .overlay(alignment: .topLeading) { + PreviewChart(readings: $state.readings, lowLimit: $state.lowGlucose, highLimit: $state.highGlucose) + } + .clipShape(RoundedRectangle(cornerRadius: 15)) + .addShadows() + .padding(.horizontal, 10) + .onTapGesture { + state.showModal(for: .statistics) + } + } + + var profileView: some View { + HStack(spacing: 0) { + if let override = fetchedPercent.first { + if override.enabled { + if override.isPreset { + let profile = fetchedProfiles.first(where: { $0.id == override.id }) + if let currentProfile = profile { + if let name = currentProfile.name, name != "EMPTY", name.nonEmpty != nil, name != "", + name != "\u{0022}\u{0022}" + { + Text(name).font(.statusFont).foregroundStyle(.secondary) + } + } + } else if override.percentage != 100 { + Text(override.percentage.formatted() + " %").font(.statusFont).foregroundStyle(.secondary) + } else if override.smbIsOff, !override.smbIsAlwaysOff { + Text("No ").font(.statusFont).foregroundStyle(.secondary) // "No" as in no SMBs + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else if override.smbIsOff { + Image(systemName: "clock").font(.statusFont).foregroundStyle(.secondary) + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else { + Text("Override").font(.statusFont).foregroundStyle(.secondary) + } + } + } + } + } + + func bolusProgressView(progress: Decimal) -> some View { + ZStack { + HStack { + Text("Bolusing") + .foregroundColor(.primary).font(.bolusProgressFont) + ProgressView(value: Double(progress)) + .progressViewStyle(BolusProgressViewStyle()) + Image(systemName: "xmark.square.fill") + .symbolRenderingMode(.palette) + .foregroundStyle(.white, .blue) + .font(.bolusProgressStopFont) + .onTapGesture { + state.cancelBolus() + } + } + } + } + + @ViewBuilder private func headerView(_ geo: GeometryProxy) -> some View { + addHeaderBackground() + .frame(minHeight: 120 + geo.safeAreaInsets.top) + .overlay { + VStack { + ZStack { + glucoseView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top).padding(.top, 10) + loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 5) + carbsAndInsulinView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading) + .padding(.leading, 10) + pumpView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, 7).padding(.bottom, 5) + }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 5) + } + } + .clipShape(Rectangle()) + } + var body: some View { GeometryReader { geo in - VStack(spacing: 0) { - header(geo) - infoPanel - mainChart - timeInterval - legendPanel - profiles(geo) - bottomPanel(geo) + VStack { + ScrollView { + VStack(spacing: 0) { + headerView(geo) + chart + preview.padding(.top, !state.displayTimeButtons ? 15 : 15) + } + } + .scrollIndicators(.hidden) + buttonPanel(geo) } + .background(.gray.opacity(IAPSconfig.backgroundOpacity)) .edgesIgnoringSafeArea(.vertical) - } - .onChange(of: state.hours) { _ in - highlightButtons() - } - .onAppear { - configureView { - highlightButtons() + .overlay { + if let progress = state.bolusProgress { + ZStack { + RoundedRectangle(cornerRadius: 15) + .fill(.gray.opacity(0.8)) + .frame(width: 300, height: 50) + bolusProgressView(progress: progress) + }.frame(maxWidth: .infinity, alignment: .center) + } } } + .onAppear(perform: configureView) .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) - .popup(isPresented: isStatusPopupPresented, alignment: .top, direction: .top) { + .popup(isPresented: state.isStatusPopupPresented, alignment: .bottom, direction: .bottom) { popup .padding() .background( RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(UIColor.darkGray)) + .fill(Color.popUpGray) ) .onTapGesture { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } .gesture( DragGesture(minimumDistance: 10, coordinateSpace: .local) .onEnded { value in if value.translation.height < 0 { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } } ) @@ -664,27 +583,26 @@ extension Home { private var popup: some View { VStack(alignment: .leading, spacing: 4) { - Text(state.statusTitle).font(.headline).foregroundColor(.white) + Text(state.statusTitle).font(.suggestionHeadline).foregroundColor(.white) .padding(.bottom, 4) if let suggestion = state.suggestion { TagCloudView(tags: suggestion.reasonParts).animation(.none, value: false) - Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.caption).foregroundColor(.white) - + Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.suggestionSmallParts) + .foregroundColor(.white) } else { - Text("No sugestion found").font(.body).foregroundColor(.white) + Text("No sugestion found").font(.suggestionHeadline).foregroundColor(.white) } - if let errorMessage = state.errorMessage, let date = state.errorDate { Text(NSLocalizedString("Error at", comment: "") + " " + dateFormatter.string(from: date)) .foregroundColor(.white) - .font(.headline) + .font(.suggestionError) .padding(.bottom, 4) .padding(.top, 8) - Text(errorMessage).font(.caption).foregroundColor(.loopRed) + Text(errorMessage).font(.buttonFont).foregroundColor(.loopRed) } else if let suggestion = state.suggestion, (suggestion.bg ?? 100) == 400 { - Text("Invalid CGM reading (HIGH).").font(.callout).bold().foregroundColor(.loopRed).padding(.top, 8) - Text("SMBs and High Temps Disabled.").font(.caption).foregroundColor(.white).padding(.bottom, 4) + Text("Invalid CGM reading (HIGH).").font(.suggestionError).bold().foregroundColor(.loopRed).padding(.top, 8) + Text("SMBs and High Temps Disabled.").font(.suggestionParts).foregroundColor(.white).padding(.bottom, 4) } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index 953bdfcdd1..3d92c1b662 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -26,7 +26,9 @@ extension OverrideProfilesConfig { @Published var uamMinutes: Decimal = 0 @Published var defaultSmbMinutes: Decimal = 0 @Published var defaultUamMinutes: Decimal = 0 + @Published var emoji: String = "" + @Injected() var broadcaster: Broadcaster! var units: GlucoseUnits = .mmolL override func subscribe() { @@ -46,18 +48,19 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.enabled = true saveOverride.smbIsOff = self.smbIsOff + if self.isPreset { saveOverride.isPreset = true saveOverride.id = id } else { saveOverride.isPreset = false } saveOverride.date = Date() if override_target { - if units == .mmolL { - target = target.asMgdL - } - saveOverride.target = target as NSDecimalNumber - } else { saveOverride.target = 0 } - + saveOverride.target = ( + units == .mmolL + ? target.asMgdL + : target + ) as NSDecimalNumber + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -77,6 +80,11 @@ extension OverrideProfilesConfig { } try? self.coredataContext.save() } + DispatchQueue.main.async { + self.broadcaster.notify(OverrideObserver.self, on: .main) { + $0.overrideHistoryDidUpdate(OverrideStorage().fetchOverrideHistory(interval: DateFilter().today)) + } + } } func savePreset() { @@ -87,6 +95,7 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.smbIsOff = self.smbIsOff saveOverride.name = self.profileName + saveOverride.emoji = self.emoji id = UUID().uuidString self.isPreset.toggle() saveOverride.id = id @@ -97,7 +106,7 @@ extension OverrideProfilesConfig { ? target.asMgdL : target ) as NSDecimalNumber - } else { saveOverride.target = 0 } + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -137,9 +146,14 @@ extension OverrideProfilesConfig { saveOverride.smbIsOff = profile.smbIsOff saveOverride.isPreset = true saveOverride.date = Date() - saveOverride.target = profile.target saveOverride.id = id_ + if let tar = profile.target, tar == 0 { + saveOverride.target = 6 + } else { + saveOverride.target = profile.target + } + if profile.advancedSettings { saveOverride.advancedSettings = true if !isfAndCr { @@ -238,14 +252,9 @@ extension OverrideProfilesConfig { override_target = false smbIsOff = false advancedSettings = false - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } smbMinutes = defaultSmbMinutes uamMinutes = defaultUamMinutes + OverrideStorage().cancelProfile() } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 76d51be136..16a28b3ac4 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -12,6 +12,7 @@ extension OverrideProfilesConfig { @State private var showingDetail = false @State private var alertSring = "" @State var isSheetPresented: Bool = false + @State var index: Int = 1 @Environment(\.dismiss) var dismiss @Environment(\.managedObjectContext) var moc @@ -44,15 +45,18 @@ extension OverrideProfilesConfig { var presetPopover: some View { Form { Section { - TextField("Name Of Profile", text: $state.profileName) - } header: { Text("Enter Name of Profile") } + TextField("Name", text: $state.profileName) + } header: { Text("Profile Name").foregroundStyle(.primary) } Section { Button("Save") { state.savePreset() isSheetPresented = false } - .disabled(state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }).isNotEmpty) + .disabled( + state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }) + .isNotEmpty + ) Button("Cancel") { isSheetPresented = false @@ -257,20 +261,21 @@ extension OverrideProfilesConfig { "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." ) } - - Button("Return to Normal") { - state.cancelProfile() - dismiss() - } - .frame(maxWidth: .infinity, alignment: .center) - .buttonStyle(BorderlessButtonStyle()) - .disabled(!state.isEnabled) - .tint(.red) + Section { + Button("Return to Normal") { + state.cancelProfile() + dismiss() + } + .frame(maxWidth: .infinity, alignment: .center) + .buttonStyle(BorderlessButtonStyle()) + .disabled(!state.isEnabled) + .tint(.red) + } footer: { Text("").padding(.bottom, 150) } } .onAppear(perform: configureView) .onAppear { state.savedSettings() } .navigationBarTitle("Profiles") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } @@ -279,6 +284,9 @@ extension OverrideProfilesConfig { .asMmolL : (preset.target ?? 0) as Decimal let duration = (preset.duration ?? 0) as Decimal let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name! + let identifier = ((preset.emoji ?? "") == "") || (preset.emoji?.isEmpty ?? true) || + (preset.emoji ?? "") == "\u{0022}\u{0022}" ? + "" : preset.emoji! let percent = preset.percentage / 100 let perpetual = preset.indefinite let durationString = perpetual ? "" : "\(formatter.string(from: duration as NSNumber)!)" @@ -294,11 +302,8 @@ extension OverrideProfilesConfig { if name != "" { HStack { - VStack { - HStack { - Text(name) - Spacer() - } + VStack(alignment: .leading) { + Text(name) HStack(spacing: 5) { Text(percent.formatted(.percent.grouping(.never).rounded().precision(.fractionLength(0)))) if targetString != "" { diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 18e06eee91..e1405b8c55 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -22,13 +22,12 @@ extension PreferencesEditor { var body: some View { Form { - Section(header: Text("iAPS").textCase(nil)) { + Section { Picker("Glucose units", selection: $state.unitsIndex) { Text("mg/dL").tag(0) Text("mmol/L").tag(1) } - } - + } header: { Text("iAPS").textCase(nil) } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in Section(header: Text(section.displayName)) { ForEach(section.fields.indexed(), id: \.1.id) { fieldIndex, field in @@ -75,6 +74,7 @@ extension PreferencesEditor { } } } + Section {} footer: { Text("").padding(.bottom, 300) } } .onAppear(perform: configureView) .navigationTitle("Preferences") @@ -82,7 +82,7 @@ extension PreferencesEditor { .navigationBarItems( trailing: Button { - let lang = Locale.current.languageCode ?? "en" + let lang = Locale.current.language.languageCode?.identifier ?? "en" if lang == "en" { UIApplication.shared.open( URL( diff --git a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift index 45ae196ba1..77c35c244f 100644 --- a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift +++ b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift @@ -33,7 +33,7 @@ extension PumpConfig { } .onAppear(perform: configureView) .navigationTitle("Pump config") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $state.setupPump) { if let pumpManager = state.provider.apsManager.pumpManager { PumpSettingsView( diff --git a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift index 9634afa5f4..27889b538c 100644 --- a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift @@ -51,7 +51,7 @@ extension PumpSettingsEditor { } .onAppear(perform: configureView) .navigationTitle("Pump Settings") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) } } } diff --git a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift index 63386f5e4f..1c7c87128e 100644 --- a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift +++ b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift @@ -10,6 +10,8 @@ extension Stat { @Published var overrideUnit: Bool = false @Published var layingChart: Bool = false @Published var units: GlucoseUnits = .mmolL + @Published var preview: Bool = false + @Published var readings: [Readings] = [] override func subscribe() { highLimit = settingsManager.settings.high diff --git a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift index d8ffe216c9..c1dc330334 100644 --- a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift @@ -12,10 +12,16 @@ struct ChartsView: View { @Binding var overrideUnit: Bool @Binding var standing: Bool - @State var headline: Color = .secondary - private let conversionFactor = 0.0555 + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .none + return formatter + } + + @Environment(\.colorScheme) var colorScheme + var body: some View { glucoseChart Rectangle().fill(.cyan.opacity(0.2)).frame(maxHeight: 3) @@ -284,12 +290,22 @@ struct ChartsView: View { let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count let hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + let veryHighArray = glucose.filter({ $0.glucose > 198 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 59 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + let tir = 100 - (hypoPercentage + hyperPercentage) var array: [(decimal: Decimal, string: String)] = [] array.append((decimal: Decimal(hypoPercentage), string: "Low")) array.append((decimal: Decimal(tir), string: "NormaL")) array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) return array } diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index a9632db0d1..a0bc86aadb 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -11,6 +11,9 @@ extension StatConfig { @Published var rulerMarks: Bool = false @Published var skipBolusScreenAfterCarbs: Bool = false @Published var useFPUconversion: Bool = true + @Published var useTargetButton: Bool = false + @Published var hours: Decimal = 6 + var units: GlucoseUnits = .mmolL override func subscribe() { @@ -22,6 +25,7 @@ extension StatConfig { subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } + subscribeSetting(\.useTargetButton, on: $useTargetButton) { useTargetButton = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } @@ -40,6 +44,13 @@ extension StatConfig { guard units == .mmolL else { return $0 } return $0.asMgdL }) + + subscribeSetting(\.hours, on: $hours.map(Int.init), initial: { + let value = max(min($0, 24), 2) + hours = Decimal(value) + }, map: { + $0 + }) } } } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index fe7a0528db..76d19c4a5c 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -31,8 +31,19 @@ extension StatConfig { Toggle("Display Chart Y - Grid lines", isOn: $state.yGridLines) Toggle("Display Chart Threshold lines for Low and High", isOn: $state.rulerMarks) Toggle("Standing / Laying TIR Chart", isOn: $state.oneDimensionalGraph) + HStack { + Text("Horizontal Scroll View Visible hours") + Spacer() + DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) + Text("hours").foregroundColor(.secondary) + } } header: { Text("Home Chart settings ") } + Section { + Toggle("Display Temp Targets Button", isOn: $state.useTargetButton) + } header: { Text("Home View Button Panel ") } + footer: { Text("In case you're using both profiles and temp targets") } + Section { HStack { Text("Low") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 55a634de8f..a69b55ccf8 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -1,3 +1,4 @@ +import Combine import SwiftUI import Swinject @@ -34,7 +35,6 @@ enum Screen: Identifiable, Hashable { case statisticsConfig case bolusCalculatorConfig case dynamicISF - var id: Int { String(reflecting: self).hashValue } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 6cf5018595..f05e082b99 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -45,7 +45,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P static let healthCarbObject = HKObjectType.quantityType(forIdentifier: .dietaryCarbohydrates) static let healthInsulinObject = HKObjectType.quantityType(forIdentifier: .insulinDelivery) - // Meta-data key of FreeASPX data in HealthStore + // Meta-data key of iAPS data in HealthStore static let freeAPSMetaKey = "From iAPS" } @@ -203,6 +203,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P start: $0.actualDate ?? $0.createdAt, end: $0.actualDate ?? $0.createdAt, metadata: [ + HKMetadataKeyExternalUUID: $0.id ?? "_id", HKMetadataKeySyncIdentifier: $0.id ?? "_id", HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true diff --git a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift index a0049c3092..33e3e1eac5 100644 --- a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift +++ b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift @@ -1,23 +1,14 @@ import SwiftUI public struct BolusProgressViewStyle: ProgressViewStyle { + @Environment(\.colorScheme) var colorScheme + public func makeBody(configuration: LinearProgressViewStyle.Configuration) -> some View { + @State var progress = CGFloat(configuration.fractionCompleted ?? 0) ZStack { - Circle() - .stroke(lineWidth: 4.0) - .opacity(0.3) - .foregroundColor(.secondary) - .frame(width: 22, height: 22) - - Rectangle().fill(Color.insulin) - .frame(width: 8, height: 8) - - Circle() - .trim(from: 0.0, to: CGFloat(configuration.fractionCompleted ?? 0)) - .stroke(style: StrokeStyle(lineWidth: 4.0, lineCap: .butt, lineJoin: .round)) - .foregroundColor(.insulin) - .rotationEffect(Angle(degrees: -90)) - .frame(width: 22, height: 22) - }.frame(width: 30, height: 30) + VStack { + ProgressView(value: progress) + } + }.frame(width: 80, height: 30) } } diff --git a/FreeAPS/Sources/Views/DecimalTextField.swift b/FreeAPS/Sources/Views/DecimalTextField.swift index 9cf67e8a5e..2441f5d1ff 100644 --- a/FreeAPS/Sources/Views/DecimalTextField.swift +++ b/FreeAPS/Sources/Views/DecimalTextField.swift @@ -7,19 +7,22 @@ struct DecimalTextField: UIViewRepresentable { private var formatter: NumberFormatter private var autofocus: Bool private var cleanInput: Bool + private var useButtons: Bool init( _ placeholder: String, value: Binding, formatter: NumberFormatter, autofocus: Bool = false, - cleanInput: Bool = false + cleanInput: Bool = false, + useButtons: Bool = true ) { self.placeholder = placeholder _value = value self.formatter = formatter self.autofocus = autofocus self.cleanInput = cleanInput + self.useButtons = useButtons } func makeUIView(context: Context) -> UITextField { @@ -30,6 +33,34 @@ struct DecimalTextField: UIViewRepresentable { textfield.text = cleanInput ? "" : formatter.string(for: value) ?? placeholder textfield.textAlignment = .right + let toolBar = UIToolbar(frame: CGRect( + x: 0, + y: 0, + width: textfield.frame.size.width, + height: 44 + )) + let clearButton = UIBarButtonItem( + title: NSLocalizedString("Clear", comment: "Clear button"), + style: .plain, + target: self, + action: #selector(textfield.clearButtonTapped(button:)) + ) + let doneButton = UIBarButtonItem( + title: NSLocalizedString("Done", comment: "Done button"), + style: .done, + target: self, + action: #selector(textfield.doneButtonTapped(button:)) + ) + let space = UIBarButtonItem( + barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, + target: nil, + action: nil + ) + if useButtons { + toolBar.setItems([clearButton, space, doneButton], animated: true) + textfield.inputAccessoryView = toolBar + } + if autofocus { DispatchQueue.main.async { textfield.becomeFirstResponder() diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index df49349aaa..98ad0779e0 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -77,7 +77,7 @@ struct TagCloudView: View { return ZStack { Text(textTag) .padding(.vertical, 2) .padding(.horizontal, 4) - .font(.subheadline) + .font(.suggestionParts) .background(colorOfTag.opacity(0.8)) .foregroundColor(Color.white) .cornerRadius(2) } diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 8351e69226..9d44aa90f6 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -37,6 +37,102 @@ struct CapsulaBackground: ViewModifier { } } +struct AddShadow: ViewModifier { + @Environment(\.colorScheme) var colorScheme + func body(content: Content) -> some View { + content + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.shadowOpacity : IAPSconfig.shadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 3 : 2.5 + ) + } +} + +struct TestTube: View { + let opacity: CGFloat + let amount: CGFloat + let colourOfSubstance: Color + let materialOpacity: CGFloat + @Environment(\.colorScheme) var colorScheme + + var body: some View { + UnevenRoundedRectangle.testTube + .fill( + LinearGradient( + gradient: Gradient(stops: [ + Gradient.Stop(color: .white.opacity(opacity), location: amount), + Gradient.Stop(color: colourOfSubstance, location: amount) + ]), + startPoint: .top, + endPoint: .bottom + ) + ) + .overlay { + FrostedGlass(opacity: materialOpacity) + } + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.glassShadowOpacity : IAPSconfig.glassShadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 2.2 : 3 + ) + } +} + +struct FrostedGlass: View { + let opacity: CGFloat + var body: some View { + UnevenRoundedRectangle.testTube + .fill(.ultraThinMaterial.opacity(opacity)) + } +} + +struct ColouredRoundedBackground: View { + @Environment(\.colorScheme) var colorScheme + + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct ColouredBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct LoopEllipse: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) + } +} + +struct HeaderBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header.opacity(1)) + // .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.darkerBlue.opacity(1)) + } +} + private let navigationCache = LRUCache(capacity: 10) struct NavigationLazyView: View { @@ -126,8 +222,24 @@ extension View { modifier(RoundedBackground()) } - func buttonBackground() -> some View { - modifier(RoundedBackground(color: .accentColor)) + func addShadows() -> some View { + modifier(AddShadow()) + } + + func addBackground() -> some View { + ColouredRoundedBackground() + } + + func addColouredBackground() -> some View { + ColouredBackground() + } + + func addHeaderBackground() -> some View { + HeaderBackground() + } + + func frostedGlassLayer(_ opacity: CGFloat) -> some View { + FrostedGlass(opacity: opacity) } func navigationLink(to screen: Screen, from view: V) -> some View { @@ -146,3 +258,13 @@ extension View { func asAny() -> AnyView { .init(self) } } + +extension UnevenRoundedRectangle { + static let testTube = + UnevenRoundedRectangle( + topLeadingRadius: 1.5, + bottomLeadingRadius: 50, + bottomTrailingRadius: 50, + topTrailingRadius: 1.5 + ) +} From 004caaf1fd48dbc7220a1fbc199c9c514b76add1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 17:34:40 +0100 Subject: [PATCH 280/405] clean (cherry picked from commit 62af4eaca29ffa4103d26075a0476d54b1aacc1c) --- FreeAPS/Sources/Modules/Home/HomeStateModel.swift | 2 -- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 23641f1160..e2473e5440 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -66,8 +66,6 @@ extension Home { @Published var readings: [Readings] = [] @Published var standing: Bool = false @Published var preview: Bool = true - @Published var displayTimeButtons: Bool = false - @Published var useBlue: Bool = false @Published var useTargetButton: Bool = false @Published var overrideHistory: [OverrideHistory] = [] diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index f6e9d83593..9027f25469 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -537,7 +537,7 @@ extension Home { VStack(spacing: 0) { headerView(geo) chart - preview.padding(.top, !state.displayTimeButtons ? 15 : 15) + preview.padding(.top, 15) } } .scrollIndicators(.hidden) From cd6c9748d4e288c144cb3773ed6ab56488388182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 17:51:47 +0100 Subject: [PATCH 281/405] Fix bad merge --- .../Home/View/Chart/MainChartView.swift | 244 ++++++++---------- 1 file changed, 111 insertions(+), 133 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 4dbc1b8910..679d34895d 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -94,22 +94,22 @@ struct MainChartView: View { @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @State private var bolusDots: [DotInfo] = [] + @State private var bolusPath = Path() @State private var tempBasalPath = Path() @State private var regularBasalPath = Path() @State private var tempTargetsPath = Path() @State private var overridesPath = Path() @State private var suspensionsPath = Path() @State private var carbsDots: [DotInfo] = [] + @State private var carbsPath = Path() @State private var fpuDots: [DotInfo] = [] + @State private var fpuPath = Path() @State private var glucoseYRange: GlucoseYRange = (0, 0, 0, 0) + @State private var offset: CGFloat = 0 @State private var cachedMaxBasalRate: Decimal? @State private var legends: Bool = false - private let calculationQueue = DispatchQueue( - label: "MainChartView.calculationQueue", - qos: .userInteractive, - attributes: .concurrent - ) + private let calculationQueue = DispatchQueue(label: "MainChartView.calculationQueue") private var dateFormatter: DateFormatter { let formatter = DateFormatter() @@ -248,8 +248,8 @@ struct MainChartView: View { } private func mainScrollView(fullSize: CGSize) -> some View { - ScrollViewReader { scroll in - ScrollView(.horizontal, showsIndicators: false) { + ScrollView(.horizontal, showsIndicators: false) { + ScrollViewReader { scroll in ZStack(alignment: .top) { tempTargetsView(fullSize: fullSize).drawingGroup() overridesView(fullSize: fullSize).drawingGroup() @@ -258,25 +258,26 @@ struct MainChartView: View { .padding(.trailing, legends ? 20 : 70).padding(.bottom, 20) mainView(fullSize: fullSize).id(Config.endID) .drawingGroup() - } - } - .onChange(of: glucose) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: suggestion) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: tempBasals) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: screenHours) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onAppear { - // add trigger to the end of main queue - DispatchQueue.main.async { - scroll.scrollTo(Config.endID, anchor: .trailing) - didAppearTrigger = true + .onChange(of: glucose) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: suggestion) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: tempBasals) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: screenHours) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + + .onAppear { + // add trigger to the end of main queue + DispatchQueue.main.async { + scroll.scrollTo(Config.endID, anchor: .trailing) + didAppearTrigger = true + } + } } } } @@ -335,16 +336,14 @@ struct MainChartView: View { private func basalView(fullSize: CGSize) -> some View { ZStack { - tempBasalPath.scale(x: zoomScale, anchor: .zero).fill(Color.basal.opacity(0.5)) - tempBasalPath.scale(x: zoomScale, anchor: .zero).stroke(Color.insulin, lineWidth: 1) - regularBasalPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) - suspensionsPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) - suspensionsPath.scale(x: zoomScale, anchor: .zero).fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) + tempBasalPath.fill(Color.basal.opacity(0.5)) + tempBasalPath.stroke(Color.insulin, lineWidth: 1) + regularBasalPath.stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) + suspensionsPath.stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) + suspensionsPath.fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) } .scaleEffect(x: 1, y: -1) - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) .frame(maxHeight: Config.basalHeight) .background(Color.clear) .onChange(of: tempBasals) { _ in @@ -365,51 +364,24 @@ struct MainChartView: View { } private func mainView(fullSize: CGSize) -> some View { - VStack { - ZStack { - xGridView(fullSize: fullSize) - carbsView(fullSize: fullSize) - fpuView(fullSize: fullSize) - bolusView(fullSize: fullSize) - if smooth { unSmoothedGlucoseView(fullSize: fullSize) } - glucoseView(fullSize: fullSize) - manualGlucoseView(fullSize: fullSize) - manualGlucoseCenterView(fullSize: fullSize) - announcementView(fullSize: fullSize) - predictionsView(fullSize: fullSize) + Group { + VStack { + ZStack { + xGridView(fullSize: fullSize) + carbsView(fullSize: fullSize) + fpuView(fullSize: fullSize) + bolusView(fullSize: fullSize) + if smooth { unSmoothedGlucoseView(fullSize: fullSize) } + glucoseView(fullSize: fullSize) + manualGlucoseView(fullSize: fullSize) + manualGlucoseCenterView(fullSize: fullSize) + announcementView(fullSize: fullSize) + predictionsView(fullSize: fullSize) + } + timeLabelsView(fullSize: fullSize) } - timeLabelsView(fullSize: fullSize) } - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) - } - - /// returns the width of the full chart view including predictions for the current `screenHours` - private func glucoseAndAdditionalWidth(fullSize: CGSize) -> CGFloat { - // fullGlucoseWidth returns the width scaled to 1h screen hours. Scale it down to screenHours - fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(screenHours) - + additionalWidthScaled(viewWidth: fullSize.width) - } - - /// returns the additional width for predictions, scaled to `screenHours` - private func additionalWidthScaled(viewWidth: CGFloat) -> CGFloat { - guard let predictions = suggestion?.predictions, - let deliveredAt = suggestion?.deliverAt, - let last = glucose.last - else { - return Config.minAdditionalWidth - } - - let iob = predictions.iob?.count ?? 0 - let zt = predictions.zt?.count ?? 0 - let cob = predictions.cob?.count ?? 0 - let uam = predictions.uam?.count ?? 0 - let max = [iob, zt, cob, uam].max() ?? 0 - - let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) - let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) - let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) / CGFloat(screenHours) - - return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) } @Environment(\.colorScheme) var colorScheme @@ -432,7 +404,7 @@ struct MainChartView: View { .stroke(useColour, lineWidth: 0.15) Path { path in // vertical timeline - let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) * zoomScale + let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) path.move(to: CGPoint(x: x, y: 0)) path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) } @@ -468,7 +440,7 @@ struct MainChartView: View { private func glucoseView(fullSize: CGSize) -> some View { Path { path in for rect in glucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.loopGreen) @@ -486,7 +458,7 @@ struct MainChartView: View { private func manualGlucoseView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.gray) @@ -504,9 +476,7 @@ struct MainChartView: View { private func announcementView(fullSize: CGSize) -> some View { ZStack { ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in - let scaledRect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: scaledRect.midX + 5, y: scaledRect.maxY - Config.owlOffset) + let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) let type: String = info.note.contains("true") ? Command.open : @@ -535,7 +505,7 @@ struct MainChartView: View { private func manualGlucoseCenterView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDotsCenter { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.red) @@ -558,9 +528,8 @@ struct MainChartView: View { Path { path in var lines: [CGPoint] = [] for rect in unSmoothedGlucoseDots { - let scaled = scaleCenter(rect: rect) - lines.append(CGPoint(x: scaled.midX, y: scaled.midY)) - path.addEllipse(in: scaled) + lines.append(CGPoint(x: rect.midX, y: rect.midY)) + path.addEllipse(in: rect) } path.addLines(lines) } @@ -578,21 +547,13 @@ struct MainChartView: View { private func bolusView(fullSize: CGSize) -> some View { ZStack { - let bolusPath = Path { path in - for dot in bolusDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - bolusPath .fill(Color.insulin) bolusPath .stroke(Color.primary, lineWidth: 0.5) ForEach(bolusDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.maxY + 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.maxY + 8) return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -608,21 +569,13 @@ struct MainChartView: View { private func carbsView(fullSize: CGSize) -> some View { ZStack { - let carbsPath = Path { path in - for dot in carbsDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - carbsPath .fill(Color.loopYellow) carbsPath .stroke(Color.primary, lineWidth: 0.5) ForEach(carbsDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.minY - 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -638,12 +591,6 @@ struct MainChartView: View { private func fpuView(fullSize: CGSize) -> some View { ZStack { - let fpuPath = Path { path in - for dot in fpuDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - fpuPath .fill(.orange.opacity(0.5)) fpuPath @@ -660,10 +607,8 @@ struct MainChartView: View { private func tempTargetsView(fullSize: CGSize) -> some View { ZStack { tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .fill(Color.tempBasal.opacity(0.5)) tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .stroke(Color.basal.opacity(0.5), lineWidth: 1) } .onChange(of: glucose) { _ in @@ -705,25 +650,25 @@ struct MainChartView: View { Group { Path { path in for rect in predictionDots[.iob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.insulin) Path { path in for rect in predictionDots[.cob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.loopYellow) Path { path in for rect in predictionDots[.zt] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.zt) Path { path in for rect in predictionDots[.uam] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.uam) } @@ -735,8 +680,6 @@ struct MainChartView: View { // MARK: - Calculations -/// some of the calculations done here can take quite long (100ms+) and are not able to update data at a fast rate -/// therefore we stick to the 1h screen window for these calculations and scale the results as needed to `screenHours` which has little extra overhead and enables changing the screen hours with no lag extension MainChartView { private func update(fullSize: CGSize) { calculatePredictionDots(fullSize: fullSize, type: .iob) @@ -854,8 +797,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.amount ?? 0) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { bolusDots = dots + bolusPath = path } } } @@ -874,8 +824,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { carbsDots = dots + carbsPath = path } } } @@ -894,8 +851,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { fpuDots = dots + fpuPath = path } } } @@ -970,8 +934,9 @@ extension MainChartView { path.addLine(to: CGPoint(x: lastPoint.x, y: Config.basalHeight)) path.addLine(to: CGPoint(x: 0, y: Config.basalHeight)) } - let endDateTime = dayAgoTime + 12.hours - .timeInterval + 12.hours + let adjustForOptionalExtraHours = screenHours > 12 ? screenHours - 12 : 0 + let endDateTime = dayAgoTime + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours + .timeInterval + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours .timeInterval let autotunedBasalPoints = findRegularBasalPoints( timeBegin: dayAgoTime, @@ -1031,7 +996,8 @@ extension MainChartView { .map { self.timeToXCoordinate($0.timestamp.timeIntervalSince1970, fullSize: fullSize) } let x0 = self.timeToXCoordinate(event.timestamp.timeIntervalSince1970, fullSize: fullSize) - let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + 275 + let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + self + .additionalWidth(viewWidth: fullSize.width) return CGRect(x: x0, y: 0, width: x1 - x0, height: Config.basalHeight * 0.7) } @@ -1245,11 +1211,32 @@ extension MainChartView { } private func fullGlucoseWidth(viewWidth: CGFloat) -> CGFloat { - viewWidth * CGFloat(hours) + viewWidth * CGFloat(hours) / CGFloat(min(max(screenHours, 2), 24)) + } + + private func additionalWidth(viewWidth: CGFloat) -> CGFloat { + guard let predictions = suggestion?.predictions, + let deliveredAt = suggestion?.deliverAt, + let last = glucose.last + else { + return Config.minAdditionalWidth + } + + let iob = predictions.iob?.count ?? 0 + let zt = predictions.zt?.count ?? 0 + let cob = predictions.cob?.count ?? 0 + let uam = predictions.uam?.count ?? 0 + let max = [iob, zt, cob, uam].max() ?? 0 + + let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) + let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) + let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) + + return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) } private func oneSecondStep(viewWidth: CGFloat) -> CGFloat { - viewWidth / CGFloat(1.hours.timeInterval) + viewWidth / (CGFloat(min(max(screenHours, 2), 24)) * CGFloat(1.hours.timeInterval)) } private func maxPredValue() -> Int? { @@ -1316,15 +1303,6 @@ extension MainChartView { return x } - /// inverse of `timeToXCoordinate` - private func xCoordinateToTime(x: CGFloat, fullSize: CGSize) -> TimeInterval { - let stepXFraction = fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(hours.hours.timeInterval) - let xx = x / stepXFraction - let xOffset = -Date().addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970 - let time = xx - xOffset - return time - } - private func glucoseToYCoordinate(_ glucoseValue: Int, fullSize: CGSize) -> CGFloat { let topYPaddint = Config.topYPadding + Config.basalHeight let bottomYPadding = Config.bottomYPadding From dcaee137d35817c7e7a6430e63d01112a562ac72 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Wed, 20 Dec 2023 19:12:01 +0100 Subject: [PATCH 282/405] New UI/UX (#428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New UI/UX Header: Make the current glucose more prominent and taking up more space. Less strings and more graphics. Replace the boring and cluttered strings with dynamic graphics. Test tubes in frosted glass for IOB and COB, displaying amount as coloured liquid. Pump status using dynamic graphics instead of strings. Both battery icon and reservoir vial image is now illustrated with a dynamic fill. Loop button is now more discrete. Normally iAPS is functioning well and you shouldn’t need to worry about if looping or not, because it will be looping. However, when not looping the loop button the button will appear with red text. When tapping the loop button you will now see all info. Both chart, header and the openAPS suggestion. This pop-up info is now toggled with the loop button, meaning if you tap button again the pop-up disappears (or if tapping inside of pop-up as before). Chart and Info panel The chart and info panel is now less cluttered. Eventual glucose is displayed more readable. The legends are removed and only displayed when tapped once. Tapping once again will remove them (thanks for this idea @nas10 ). To indicate that there in fact are legends available small coloured dots are added. Bolus Progress is now displayed as layer on top of chart. Bigger and with a clearer stop button. When legends are displayed they will now appear in the future x-side: When Max IOB setting is 0 this will now be displayed more prominently: Profiles are now displayed in chart. Duration and target glucose will displayed similar to the temp targets. B Profile name will be displayed centred in info panel, as displayed below. Button Panel The extra space from the previous profile button is now used for a bigger header instead. New profile button. When profile selected, this button will be highlighted, similar to the Loop app. A enabled profile will be deactivated with just tap, also similar to the Loop app (thank you Loop authors for the idea (didn’t borrow any code)). New history button. Instead of tapping the chart you now have a button to access the history. Vertical Scroll View and Statistics Preview To make the button panel and home view both less cluttered and more extendable I’ve removed the statistics button and introduced a vertical scroll. To see a preview of statistics just scroll down. To see full statistics view tap the preview (now just TIR for current day is displayed, but more info will be added later). The idea with the vertical scroll is also to make the home more more extendable with future updates. Later we can add for instance an Insulin chart here, or a meal chart, or whatever really. Any info you would like to sometimes look at, but not always need to see. This info is only displayed when scrolling down, meaning it will not add any clutter or extra ”info overload” when using the iAPS app as you’re used to do. Temp Targets Temp targets will still work as before. For those of you who really need to use both TTs and profiles simultaneously you can display the Temp Target button in UI/UX settings. Default is to not display this button. I recommend not normally just use one of these, but I can understand the need for sometimes having to use both, which is why I decided to not remove this option entirely. Tested a couple of weeks on my own phone and with different simulators. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. clean (cherry picked from commit 62af4eaca29ffa4103d26075a0476d54b1aacc1c) Fix bad merge --- Config.xcconfig | 2 +- .../Core_Data.xcdatamodel/contents | 8 +- .../xcschemes/LoopKit Example.xcscheme | 87 +++ .../xcschemes/Shared-watchOS.xcscheme | 76 +++ FreeAPS.xcodeproj/project.pbxproj | 18 +- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../7xx Small Clear.pdf | Bin 0 -> 5090 bytes .../7xx Small Clear.imageset/Contents.json | 12 + .../Colors/DarkGreen.colorset/Contents.json | 38 ++ .../Colors/DarkRed.colorset/Contents.json | 38 ++ .../Colors/DarkerBlue.colorset/Contents.json | 12 +- .../Colors/Header.colorset/Contents.json | 34 + .../Colors/Lemon.colorset/Contents.json | 4 +- .../Colors/PopUpGray.colorset/Contents.json | 34 + .../Colors/darkGray.colorset/Contents.json | 4 +- .../Colors/lightBlue.colorset/Contents.json | 38 ++ .../Assets.xcassets/reservoir/Contents.json | 6 + .../pod_reservoir.imageset/Contents.json | 25 + .../pod_reservoir.imageset/reservoir.pdf | Bin 0 -> 10664 bytes .../pod_reservoir.imageset/reservoir_mask.pdf | Bin 0 -> 5537 bytes .../pod_reservoir_mask.imageset/Contents.json | 12 + .../reservoir_mask.pdf | Bin 0 -> 5537 bytes .../Contents.json | 25 + .../reservoir 1.pdf | Bin 0 -> 10664 bytes .../reservoir.pdf | Bin 0 -> 10664 bytes .../reservoir.pxm | Bin 0 -> 107766 bytes .../vial.imageset/Contents.json | 22 + .../vial.imageset/vial_stroke_dark.svg | 81 +++ .../vial.imageset/vial_stroke_light.svg | 80 +++ .../vial_color.imageset/Contents.json | 15 + .../Mediamodifier-Design.svg | 22 + FreeAPS/Resources/Info.plist | 8 +- .../defaults/freeaps/freeaps_settings.json | 1 + FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 8 +- .../Sources/APS/Storage/OverrideStorage.swift | 79 +++ .../Sources/Helpers/Color+Extensions.swift | 7 + FreeAPS/Sources/Models/Configs.swift | 42 ++ FreeAPS/Sources/Models/DateFilter.swift | 11 - FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 + .../Modules/Bolus/BolusStateModel.swift | 1 - .../View/AlternativeBolusCalcRootView.swift | 26 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 23 +- .../Modules/CGM/View/CGMRootView.swift | 3 +- .../DataTable/View/DataTableRootView.swift | 2 +- .../Dynamic/View/DynamicRootView.swift | 18 +- .../Sources/Modules/Home/HomeDataFlow.swift | 1 + .../Sources/Modules/Home/HomeProvider.swift | 8 + .../Sources/Modules/Home/HomeStateModel.swift | 44 +- .../Home/View/Chart/MainChartView.swift | 478 +++++++++----- .../Home/View/Header/CurrentGlucoseView.swift | 99 ++- .../Modules/Home/View/Header/LoopView.swift | 61 +- .../Home/View/Header/PreviewView.swift | 255 +++++++ .../Modules/Home/View/Header/PumpView.swift | 173 +++-- .../Modules/Home/View/HomeRootView.swift | 624 ++++++++---------- .../OverrideProfilesStateModel.swift | 37 +- .../View/OverrideProfilesRootView.swift | 41 +- .../View/PreferencesEditorRootView.swift | 8 +- .../PumpConfig/View/PumpConfigRootView.swift | 2 +- .../View/PumpSettingsEditorRootView.swift | 2 +- .../Sources/Modules/Stat/StatStateModel.swift | 2 + .../Modules/Stat/View/ChartsView.swift | 20 +- .../StatConfig/StatConfigStateModel.swift | 11 + .../StatConfig/View/StatConfigRootView.swift | 11 + FreeAPS/Sources/Router/Screen.swift | 2 +- .../Services/HealthKit/HealthKitManager.swift | 3 +- .../Views/BolusProgressViewStyle.swift | 23 +- FreeAPS/Sources/Views/DecimalTextField.swift | 33 +- FreeAPS/Sources/Views/TagCloudView.swift | 2 +- FreeAPS/Sources/Views/ViewModifiers.swift | 126 +++- 69 files changed, 2187 insertions(+), 808 deletions(-) create mode 100644 Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme create mode 100644 Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_dark.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg create mode 100644 FreeAPS/Sources/APS/Storage/OverrideStorage.swift create mode 100644 FreeAPS/Sources/Models/Configs.swift delete mode 100644 FreeAPS/Sources/Models/DateFilter.swift create mode 100644 FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift diff --git a/Config.xcconfig b/Config.xcconfig index 61834b473c..7194c1f2f6 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.3.2 +APP_VERSION = 2.4.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 023a0cebc0..716aaf395a 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -100,11 +100,17 @@ + + + + + + diff --git a/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme new file mode 100644 index 0000000000..be16b5e5bc --- /dev/null +++ b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme new file mode 100644 index 0000000000..fb7a17ba47 --- /dev/null +++ b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 2b07ece80c..4441e95b77 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -33,10 +33,12 @@ 1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; }; 19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; 198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198CED9C2B2E62940073032D /* OverrideStorage.swift */; }; 199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; }; 19A910302A24BF6300C8951B /* StatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A9102F2A24BF6300C8951B /* StatsView.swift */; }; - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* DateFilter.swift */; }; + 19A910362A24D6D700C8951B /* Configs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* Configs.swift */; }; 19A910382A24EF3200C8951B /* ChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910372A24EF3200C8951B /* ChartsView.swift */; }; + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */; }; 19B0EF2128F6D66200069496 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B0EF2028F6D66200069496 /* Statistics.swift */; }; 19D466A329AA2B80004D5F33 /* FPUConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A229AA2B80004D5F33 /* FPUConfigDataFlow.swift */; }; 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; @@ -586,12 +588,14 @@ 198377E2266C0AC8004DE65E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; 198377E3266C0ADC004DE65E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 198377E4266C13D2004DE65E /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 198CED9C2B2E62940073032D /* OverrideStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideStorage.swift; sourceTree = ""; }; 199561C0275E61A50077B976 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS8.0.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; 199732B4271B72DD00129A3F /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; 199732B5271B9EE900129A3F /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; 19A9102F2A24BF6300C8951B /* StatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsView.swift; sourceTree = ""; }; - 19A910352A24D6D700C8951B /* DateFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFilter.swift; sourceTree = ""; }; + 19A910352A24D6D700C8951B /* Configs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configs.swift; sourceTree = ""; }; 19A910372A24EF3200C8951B /* ChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartsView.swift; sourceTree = ""; }; + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewView.swift; sourceTree = ""; }; 19B0EF2028F6D66200069496 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = ""; }; 19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; 19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; @@ -1246,8 +1250,8 @@ isa = PBXGroup; children = ( 195D80B22AF696EE00D25097 /* Dynamic */, - BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 19F95FF129F10F9C00314DDC /* Stat */, CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19E1F7E629D0828B005C8D20 /* IconConfig */, @@ -1573,6 +1577,7 @@ 383420D525FFE38C002D46C1 /* LoopView.swift */, 38AAF85425FFF846004AF583 /* CurrentGlucoseView.swift */, 38DAB27F260CBB7F00F74C1A /* PumpView.swift */, + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */, ); path = Header; sourceTree = ""; @@ -1712,7 +1717,7 @@ 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, 19D4E4EA29FC6A9F00351451 /* Charts.swift */, - 19A910352A24D6D700C8951B /* DateFilter.swift */, + 19A910352A24D6D700C8951B /* Configs.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, ); @@ -1761,6 +1766,7 @@ 38F3B2EE25ED8E2A005C48AA /* TempTargetsStorage.swift */, CE82E02428E867BA00473A9C /* AlertStorage.swift */, 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */, + 198CED9C2B2E62940073032D /* OverrideStorage.swift */, ); path = Storage; sourceTree = ""; @@ -2740,6 +2746,7 @@ 383948DA25CD64D500E91849 /* Glucose.swift in Sources */, CE94598029E9E3BD0047C9C6 /* WatchConfigDataFlow.swift in Sources */, 388E596C25AD95110019842D /* OpenAPS.swift in Sources */, + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */, E00EEC0527368630002FF094 /* StorageAssembly.swift in Sources */, 384E803825C388640086DB71 /* Script.swift in Sources */, CE94597E29E9E1EE0047C9C6 /* GarminManager.swift in Sources */, @@ -2868,6 +2875,7 @@ CE1856F72ADC4869007E39C7 /* CarbPresetIntentRequest.swift in Sources */, BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */, 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, 642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */, BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */, @@ -2881,7 +2889,7 @@ 38E44536274E411700EC9A94 /* Disk.swift in Sources */, 2BE9A6FA20875F6F4F9CD461 /* PumpSettingsEditorProvider.swift in Sources */, 6B9625766B697D1C98E455A2 /* PumpSettingsEditorStateModel.swift in Sources */, - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */, + 19A910362A24D6D700C8951B /* Configs.swift in Sources */, A0B8EC8CC5CD1DD237D1BCD2 /* PumpSettingsEditorRootView.swift in Sources */, E06B911A275B5EEA003C04B6 /* Array+Extension.swift in Sources */, 38EA0600262091870064E39B /* BolusProgressViewStyle.swift in Sources */, diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 142d983415..2cfe78ebfa 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41cc88bd386d677f5bdb6369b0fedf65888b95df GIT binary patch literal 5090 zcmai2cRbbK|2J;ok|_O@3E>`hEL+`{Vn5ydU>{?(;RydOcp}`8onxN-82yQ8-Ybd1`HHA$L9fLvsrd z0fK;>%$W|vUv=2#?Z>^Ar+6j2!y?7I~8uw@`u9?bM!Wocf9? zI&T|cbh5QADVCs?X@68k>NUn+e3giHP)GW8%8tME_B?ldoSCs>PS9d`892badF4XO z(~sBlmu$v`4h%P{Kk0;{L!DF-d-BNUS+#P zp|GMI9@ukQYICXRHD1eyg+W%;-BrX6-bPXAbT3?a@~dvO!v)wmpDVIyTnP!mSJU)# z0A}O-dDqV(sTXI%s@H4=CzpenS+iLAqT`OaU45eXCR_H&GCS+OI`RD&O+%bi(>vO- z789unoh>5c^O*$xz}Jx_#u+6~h_BOxS??{o^7v)u+Zz&Q-5&r(UDJdU-uaw#gR`|n0okl9S;p0((0q}4*6=( zmcyK@dhXtVQgH5>HSf$QHo}$KnY(>l>jOxlhlzaGyE49Yt%dkpy-@m5WJHZ!f1yP3 zO7{WF8Aj#KsMN7&!p|umkr~04S=Q<|BJ2tH6@@CnT+V{Da=~4ABzsN*Q*n10 znlYSjQuTIOdQ)%ot+{Y6sV!cQ#*EA@^&<0h4dyS|UsjZuras&3Ic^b77z~E^WEHHH zuyHw5F|cx;e0YD8-KrYmg3Q>dJzbR((IxFVGTReu*m`30vD3azpXXX$HP6SsWPLB# z;LB%`51XpWEJuwm>0Rw(*WfrK(s`?A``CM7LZmItkt8(d5&r#YyLDDwPa6C8>MX_f z6>}JQk&Vy2*OokN?|YnHAcg~VMm$-4KA7Fw?2?$_y*@aiSNiGo^HG=+$!W6}d6Y(AX1%w)xQa$zM2aW{ zH]=4kzZDWstl@Zxb+RBc3-;+Q+Rv;98eYKYhOfJ@#)953X3w5#vfMwPQydCbJ= z8UfC6l>R+3d}+PXTE*;RlpMzuE0|f2xqclFUM-xHg)SBkGNL$DQURHOz(^;1C!DS`#sUjE%*{v_C`jTT2OzMr z2Og!1r{v|IG89E7c_;(Q%KqX15c=)^*LeS92DZR}AfjS_XiNQ}{m(%Fh5YOge1kGK zu)^VK;CR?2SPAQ9Yk}24DgN(6BK48`P2Bu=Ab|~TF9y)ZtJh8ev_n+= zv}l3?1l^R5sIajL>sj7>O^piXvruMZd~n~qpJ9zftEEv}NqK5G{0_rPvDo@Z%6=<) zbYP~kf53W$&|gEP_5D7e32#8{haeiTEiW`0pE%jkyiLQ&Ld|SI{d&yG3V_;CqUrr! zCzG6o?Co*Id@l7JN3>DhUrP6c60HtU=bB-)3-l-anJL)K`h=;NEEUg4O-cBO2dQhDT9Plf_Q zRLyf(`;%;^X4|axR?BsF&7qg#-)M|I^iU^lR4_$CIQ&YS9w}1`pdFHJVwQ?|mX^?; zrfqf`21d{N=L5f$P|*w)hPnpDC|TxJ6ara8!P3tVnYO zM74H=s$%5H`q?0R)7a*5CLzYK#YKA;>a;temu4l%Y4@GpH3Ug*CwDB9^{(b{$oZdF zJq5=qPvzw1s3~=JGBGETEcdrr4klhp*}iXobNNZyYmU{x*<0GP@eBbWHnoA${sz&a zmcRhtzA;};aUnV`pVT{SHm+t=gg_~+Dpk5RCmAZ_d0Ku)IWHQ*f)NW8*jE3_rZ}d= zB?{*CV`lFhqj9L?n7RU=?(`N@lqF6e<1$y~Xn=hq&539_d^!-}FAAZ#eES%WAKaOC z1Vk0!ca4Si5v}Mo8e4flnS$(RDxd=NGqu|TJ7=n1f3FXK8~4SXj~WB?UmtU3Wb#AF z1A`jXAk-uNw)FSEv7E|KD2QgyI-acfiRH8*y(dyZOOlQDEixpUC02g-gJ2%##RmmM zq?XLac|3Owy~%^Ubh-~9#L<0fLI7(LO%LYSXR4Qe1Ep7a=uu4_UzI#gJ)z@xJver~ zid~kuvWa8t^f#)@fo4r{^zv==wB0HO^ru&q6r&CJsabjN#PDU&>5sVHWGuOj>GQSS#OR`APQ|Fi#w_<_&@7~Wg?|YtOAXFsh#vso6 zI6|aZ?{?H}qte9Zw4X7HS9zFQUvrJ~IQvv_8p9mLo&hS4_lMW|Exb84Cb;VH>f#97 z%KhVwF5k@W@zw)H&yNUOax^F>v-eZuUMjRoM?Gd&1d{+ zATxpEv2t4R7X;Zfuk$D?4&0EsUM=q_?}^OTIhNlWM40r$o3;0HfmIiR+0I z?Zt70F?SLc61@d9L^dk3z=l^q@zUK<{@j+m|{O^^n~OKeRKUI{1c zUUa;8FM%(?DuFs7szCjgQy*JjYJo$6W-r7}&<Bs`l(Q-^|O*$8o1{*K>1m-{MY0w1{z~IHt6xOr^{qS}SY}8D9VlrwnIam_ibg zmpgA-36zIP5sRNK<%)F6W(^n06kFt#8(3%FDDOIH5-VyXp-^dDsq3z&sRlLxo0Vv< z5M{N~iqo8KpyLbdk!Zbg4JeZTB)gAMajb zlnFBkOJyHsH@m!aSyyD?@;S6H`iOx;#eC`Bn=j2NcT6k@twDAZ7Uf+z!_zN{^F>D8 z8kPuGQ%p*S*=ujqlD3$)_{f4}D4k5OM{phU_Gi4?h1vi@AM3*GSXI|*_ynDhx6tz* z)!flkbeC|~v93%;CXR0$y&{~r?z>}EJh&K9OVMyM4`*WUt-*u|!-c(0jsA!kw`Pat z;mXNsOis6HD}C^h+vZx6N1VR&r&p$cD&9$eyfst1l#g zcQE@j`)+%~>;2zm_WH@107*a*!z?fhpaRgNlVyZ4oH*hNc+*JTSbP5*_@f!WaW6ZK z;&-H5pfrORlgX()7f#X3h$6v7&#GG5p!iFWOMDcsJ4%7sIUljHFkHEcGO$t zK9q*Cw{oJgTB5;abor!8xM4UbM~3~}=~LePZn*sIkHc!g6N}@(iDgl^@uTv^FSr*| z`5mNZ(PoY4yBE)%K6hr6Zf`Q7>NZ38NHDtZ(JFrlTFOyDv? zb>KIMObD{(oo(Opt&@Y6Hn!Rj0CCXF>?oAnD(4j_kX1K&DS zIwG*AM;${)dbQKFOY3jjl&?&;C{`4SyD*9-=tKJwsDp10bp-8OI@z;q zJg%Hx42>1NAuVLg*ECrBn)xa%U0aPIp#o9atxZv`eOG(?CGsTV#hW5x zTb@tcZFSoJx{35YSvaQ!&#c}7Nb*Xpj<@cdTY1VPJ>VHiD3}x4PuqI=!7$X2_-W`< z$jdBoTW@vm(K)}K)H7XYMC2YH+}jA>N=_+%XRStx={oh~u~eG7&zfRO;A&V1NAMMW zylhRy{1Zz|SF3UPgLUNZw-O7jpGlcqC8QGSmV)*pKAo+7`p9h2$9C?; zibLI;bNT+GiQ>rmBZQef6Eb*YtA;QYd60UVHtgu$vS_{cf$5OU9ARX?n=b#jsa&U* zQ9)Hm@Ik_EiRPOlqWa-|loTB+FeN$*Y&z`?TdS zV>vt7<8Hf>lN&lxSTDEbzfUAvY_!JAEo$y)CZt8kx!+^>zUCq5U^P9u9k5RRn~VRX zp+5<@I287qJRfr5LySV0Rgp+Vj0@HhbVy-!KqkLc4hi|c`R^fLcL9Mlu$HzMMJErC z(ILTwLd8Jh@Slv^l|tj8Ah4RPr3;0LAM$;QyFWNG6#AD-BnFSMce4If3%L9)0`#yr z7h5Ms5Ev?o_|yJ(32{LKV*%3C1sQ;#5K$)#j@4*Sa%iufBtz#)Izioqy*^I!hN#Q*9S0h9bo4}pMEBIn<>2!teM z+5Za@gHuYj-xwZ;v9-tIeqNmE+Imse6afP3I5|-w=rBqsi>vBr literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json new file mode 100644 index 0000000000..89f650c706 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "7xx Small Clear.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json new file mode 100644 index 0000000000..b84b37c721 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.663", + "red" : "0.203" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.519", + "red" : "0.200" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json new file mode 100644 index 0000000000..33ff64bee2 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.584" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.494" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json index ef3fc04315..42dc0270bf 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json new file mode 100644 index 0000000000..e28ac915cd --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json index 8bc12a80a3..f258ad918b 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json @@ -4,7 +4,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.550", "blue" : "0.089", "green" : "0.940", "red" : "1.000" @@ -22,7 +22,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.360", "blue" : "0.089", "green" : "0.940", "red" : "1.000" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json new file mode 100644 index 0000000000..9b69d5bb49 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.548" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.404" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json index b05e49b845..a0b11043bc 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json @@ -5,7 +5,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" @@ -21,7 +21,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json new file mode 100644 index 0000000000..7fa8c07f81 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json new file mode 100644 index 0000000000..2f0731fe05 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json new file mode 100644 index 0000000000..e195986940 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json new file mode 100644 index 0000000000..6bfcfa46af --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir 1.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm new file mode 100644 index 0000000000000000000000000000000000000000..7ac25ecfe5c34e9c3fd752bbddee454910344a9d GIT binary patch literal 107766 zcmeFa2S5`|yEZ(VP3R>QK|mlhDbhPgkxryaN6;8TfCwa*1P~Amieks!8;IQp>|L;T zMX_M-3W^m)rTWb#RF&sF=Q+OT|Ni&eXvpmB)O%)j=Pq+!p)o<;K|T>48^r-g$Vg-H z_?DJ85dumiiHS?a=w~sxJQjx?t54@LQdsaRLZ8pch|%XHjAt_VJVk&^Ur!^;2ZskR zbC`)9U5TzsNJelu9KHalB%4di*x1_HJ2*Ny4|j2Ob06X1>E-R?>*r4m43CJ3A4gBf zn84-nGxH|p3ks)9jnrpnrlsAGm6IpySVsqko2N2!c%$KOSB+8nj5IorS4k!-C@Lur zQc)eOrmitWQ%jp7AP7(aQ9u%i3B&~w0!e|CKw2OpkQK-YGWhKHN=<0O{eoc z={y!Ah{>mWviQ7ECfAFTp21-=*?cNHiGzJ1C1~Vf1LgAOFf!9&>Tp&rvnRFrK&iu+ zJWg6BAC5pI8&=no!D65ceq2swMj$;04x1MzQ`9J7gUklX;l)YgaCsSY1~ZtR-rFS0 zfzrcnr_+C1h2cP1U<0x_+{E7I8xNGyo6e_ur1xw1fN6!j#M<0j?tqPsf|HfQ{T*Ef zBz**PBLBaYL6|s*&P)A?@>TX|{k9T~7yy`vSxNo1z=Oo#!g)H{QE z(heP{K~bW`-j$FnF*?u6+R2n+W$%zrM#z9hR^WyCc~Yo8UiMZ__V#Ah=2m2+R!)9o zzV3I!eF_g3o=n}1ot?=KG-9L!Lr_%$V^I35$FhX1$qK~fx*V{sfp=q!BBw-j2k8} z#g@EE4}n6{==>zO?1SixkZ>B=py!6@SUOb^e@$l!4K%*6irFe+qC%q`6p7?$P;j0DCsvcmuc zg)t{&vbaoMSAoAYA=1X&%G?T$Lc!$t;Bapi1A9!-xjAJ8VUbqmcIH-5Hs(&|R#xHg z0;VdOMk6crOoiU$8;T0TfCNwg>OdbD18d*_s2~uG0^y(t%mNF*3Q!KVgDP+woCK%A zS#Ta)1ed{8a1GRgo8UIM1MYzb;1T!)K7(fP4YYtZ&;foR2!bLcL>!Ssq!C#}9#KG) z5Gs<5Y(ef3qzJBrWWpjsHK7UBLnF``=ppnaQI1F^Y7jMv+C&?o9nqOMoajpQBnAMa*2xR?JDvSBxqaA{He!T8t)^ zDV(f;fQWv<^se8oAF-U!0FX#q_%xRjk^4|eTwgJey%O8{5Dcc~I z_e(lF0;d2@0h|Ij1#k-B6u>EfQvjy`P63<(I0gO?1q#VTaaA21q%c(|W=X@ue>98% z>i#6*}=; zB7OR%7bP{OgalK(LV|q*sa_G3FrUys4=*2M8_p~7-h?#BhtlYoe2(y% z)>}W#sy8fFD1(Zt8XF^p;lh4&^RlAk{jZ4q`qTej-!^u2B!kX{GFMukUWyt*=hH;D zDAeExA3vWkQwl#PL)3laNr0h|Ij1#k-B z6u>EfQvjy`PJ#ab3P_M)C&VSC;9muq<3QF(?xxIfxy`cEWsk^P%Ztljm-#IFLe5(* zQ#MXMT251b#(zMc@h;#Lz$t)J0H**>0h|Ij1#k-B6u>F)|7!|Zqby_q<8;wEh#WQ} zl*>tCrFEZMQLshR2g)+waSQU_)FV3Wf*nf{S^QI>QWqX)kvBnO2dW1%@`o9^n;IbJb*$lM;VemxB4GJ5!D#TVyD8=x+=yF1R(N@0sN1Da0=iQz$t)J z0H**>0h|Ij1#k-B6u>EfQvjy`PJ#bL3XDg@3K1Yd7xL?7-cI&Tc9zz5Wf&UE( zC_rbvfGmdD|I1391oCra!ewX4osxbntt)RTQ!O`6x>)vu)Ja+0|Bc4rb>I}hDS%S| zrvOd?oB}una0=iQ_^(ocMk+)CkbkZ#`^i{VSWq8hW!Xene&io6pUR73@mSE^eU}xk z3>{Vy@`o!C*>-o;AkBg`(Ee}@RGwEFD?IRmU8DYR zT_F(Yg2m72>W)M*tRn6YR}r4UWU!K0jJ{Uu|BiX)nZ{%%Vki(@oe|4`ok{=0oe6~i z08DNclNZ6Ivmr_dbfd@UrXK0vGeCU};fX1*PhBtKy|+y{`j}x z6PZZMh%kYMnVOkf3o(j(s3U_SqoQLVHW4E+DH(zjW#!}-7SHH|O{A_rFgDTF9%Q0l zA&It%u!?ka^&mKr2zy9Ph%{s%Fcc`z$Xc{Ok652Dzp#+V&~TbhOsGe2I5i}g79Ih; zcZSnw>C0TtM}dr z^a$_DLF>BNCs#Bz*gGV;y9%Yyn6S(=h!KOKA0@&wIq>vMJS{W~y3Xv*s}UO0Jz2U> zA5kGZ5|8EUZc`AtaL`hC*UvuU}?shru(IIXH?CnxaMBq`~66X%aND^FLoM zwHVIS@6c!l03q@4^6m#>(t}I`3-a~*8N$Zb-@6;ahDKJ-%YzHRGT)SvXKf2ZR<=(0 z`LMGAR_jGQ4IZUm77~hKOqGR&L71t**g&g=#)PM_7)%~~!e+rUKt5~?Atw=%ltxzU zzSp&pfRU0I$ztPaWuxOTn5wcdVw-)w|+=U?q2i$`XF@q8^`AnWbK|r{ns3fbbIrKLx zdrLRa*v}ASTeP&bb#%4#^@UhtBD67SIGZ8j7{n0@4)^D9S-BiGpPrVM;{{2?$@ipJuQ@uo!`UWhj5k!hr^SCd=_KC=-vwAg2N*? z8KUCh)b-@>;UPNFrKGOsd?*?wkb$n}UI1z_V7C9pGI4Nn9$=Z+*}J&HdP5;xlMo55 z%+0y)>ZAgYf6;(~<3tuGtlAbcbXnTX^gQ;@mHQe+3R6FG*QMJ^$A$UV{9t_M@c zz5m+}c_kPMmqo#3I51sMQrO;YLxI3M3IZF!;EgHrQ;Vie$0kMsoyUY7Gv_iPG!z8H z699p+z=%f9#!jI+TUb~`!u=A@VthinMItlH!rGF}$+BR1goa!Aa+yr*7kd?Ea^cFi z@Zj;7e4hD41_ZQ&0Sm5huf<_;EiyQXw4N(kb_#T#Y|g?^=wQ0uWab%(NwDEFXGI2w z!v}2HOz#26EPyaVbHNg@9&84?z#gy<8~}&F5pWDtgA?G?Po%vM9)ic3 zNrXgQgsexZkWKBxJY0GvlTkLxLo?BAGzZN?1?UvC2%QeWnr5M!(ZlFb^aOemJ&j&KuZzWs#fgm* zV~cUca>N8;GsG5)EfrfXwo+VKTuog2r{SO7fB409t;JB5`~aH}xX1e4p;E^wDkNg; z)WiXD!AD+S#JhjPGj0QX!u5Hi{fdydUO=eD5E6g4x_^G3DXXY8^D;c40dLAPTs*| z=dV9`@%E=7RR3uRo2POKq(Y_X;|3t{f9J^Zzk%|brDcSmpM7@YN-Dp3XLr5j%M=u` zaVS$BBoKmw(#SufM0W33yZY6&=?a4fxx4r%8u@2<#h<-YEtv%H-r#2d@_pYcU|%-;K)8kINxi+P|zem{~`6 z0OmqRPrKj14ltOb!8ni%x$|652&Q%o=WGafctr?ycndrMufccFju7F%Dk4URsb~m$ zhE)HjA$7v|e{oa_$k#}wiETr-qFLw&c!_^-3j9At0b4SfKF|(tK)*1yw(=-zpq)&w z?5&?;7^0$tl^hx?KEPx2C*Lq0cgH$kbj>K4Rv=4EpG_Gc(|}%L{tXY{O0vAP42Gty zqYK$*jC1buELIsZ@UwWMQ0Ubw@Y<+4SV3I_B5_N@I3ZvBACIf6XJA;WFOVo5ieZoc zk8yP|(Z%mxM*ZF-Wo8yVTZCUhcZZqU+70kZvNf|9;4Q=iselXLLDRq-xQ$p0mV)Jw zEnf}FAPny&umx-bJ0OdG4tzkgA?rOGS%@r#?DleGC9)d14f(;R$XleDKp>C^as*|9 z20@#kPjD7JZhGES_Wd6}1h;AKGQ`MP&I2rfejbnhEt6hZTBfhC$j;sgiVyqD{2@jI z&;0E@;$Ar4e~UrC9WE$MO-(&511-%iJbGF9D+^^#au9-E4u+IQ^Vsx^2#z0@l^8Dy zind&F$wGHeLP6RXu2B5iwLy&+-3jC{QkjWe7yhioL?)CLsfbbrG5g8pcwHrn=ov3c z6Oxn!g$iAFJTZ7}UR*M4MOQ5nl2CHz;J98uuEk{IznhUiZ;xEu+<(~~kwKJ5N(xKC zgpa>Pg7)%p?>D;#n4#n0hBq5b7J@^s0qdYfV*?Z$Z3bH*O!Qx%QYhgN$u-XWMs)NH zd;o0_6j}w*gWF;%5(V{{93%so0L4eyNDfkf%!G5g6xoRUh3rQTBGt%gDCcnakq`n8Dq`@ZY-P`nSwzcWD_+?1{} zCUBu47ap8W8A(P#Q&Y|ZbNK-aV< z!}L)1q2Hx(F@e%qxCpeMP}u-Nuv-eO1P%g6DA{&`UsovTb`xku?epE~p<_&dSUE_nASBd z4h|}m=nCbtk>1P<kMZaTd1-IEY7TVlz10?G2R{bLl&^}=CsWQhSDze~U>xEa_6 zg~&&RjA<>n32uWs;2wAY9ziDc8F&F+fd=pfyak<5N>6|cs~94INFg$a972Yyt1^7} z4u-i;zc{PADO4By1(@heGGGP~3c(aFuY4 zaFcMGaEEY@@PP0h1*o)8?5vEcp%l~rHAIckVW=5ujoPC2s3Yo(x}ZL244RHkLJNh$ z=b7kobTwKIS?OI+{9J{eLa(E@&HF$3gCbIgHr&f!2do4mgg!ES-XY|uq_r!vWX!U=uCeC9;hP5`_(89C4=ZVI1b#4x5< zIXO8}{F&KlOg`T%l+H+{a}z1pri;$b0YKDeEEiDxyzot)rRIvGy!sll| zb#-=jwmFN*Fvkem^ZAzvdQuJ?=u@9LR$tG~gyPLiqGzV@DcG!LaMGYIoB|CC8BB`V z&y)BcXYA9gKJ73KV-#DcMa0hLJUQ0kKn zCPCf9bZCk(A6g5nguHb*5r3VCS+5r-NH zB}5HMgba{jh&AGfxFJ4BAQA?*cH@v_Xr6&>?xqT*MJpk1y%pJo970aO4c>L+E|eI( zhFiK;0!om95+hB*P=W=)k>EiHAVd(x5R&0`E|*Y5m`7MnC?o8E+qn~jON3j5Cxk{q zvv3Qig6hCcnnf=@#iF z>8qHSn2MO8n1h%il@*m1GzV$a2z#l@k$!7y=G@epykIA46a_zLkI z;??4{;xEO&OGry-OISfm|CTIC9!mBi)5!(oRpdkDI&!mul7f{&h(fx; z9EEKP7Ze&4#TADt`Y0wU7AbB}Jf-+t302Zl@={_bO;svaI-~SbSxnhbnW{WqdA9Oj z%2$;?4pJOsJ1A<<#6hbD9UJsS1yvcULRCpqDN)(2a$BWURa4bNm8m*YwL-O4_1j>L z!6ODU2hSQ@Ir!G#RyB&6k6NnQ0<{Bb57mk4ChDWqv(?wCpHY9Sp{y}ngP}1?W4Fe= zA%r0&L&ApS4cRc{@{ndtEloeo49yjqr!?Pcsc4PR8n3ljt4iy&wvx7+HcNZ4cD42! z${>mdC5^J2a+>l{XNZo!PNq(&&Q+Z@T|?bS-6^`2x)1fF^c?k)^cL%#)cdHftskU6 zNq@WkJp)MtM}riDWd`RAz6~`T8a=dl=z*aPhJy{MhPj5@4IdcE8o3)yFe)>;X)I>! zXq;-i#`u~E!Nkra#blL9%`n0+`(dnMYldAnC7C*zvQ5iO>&#@#Jj}ApwwpaQS1}JX zpJIN%{Jn*~#b}EK7UwKFE$uAREXytLTPa$Nw3=dd*s96e#F}Bf%KD~_tc|bDWSfIF zpKOQOGHut|-mz1%3$iP=J89Qp?_kfhudsjZpzkowVYNe@qq1YD;~dBHP9!H!r^!x7 zom!mjo%znYoj(jW8=g9R+wcY#Ll>q?xyy4`U01qmsp}IrirYB1^=?nxb=>LhW$w>L z=#5Amv1vrThq1?aj~yQGJuN-Cp8Gt%c{zLKdmZ;iz5Tprd0+KW^ojIY>GQ}}*EiXB zyYELoJHI@?vWCFqiRt7u^GzsJe9u6V|jSN~8 z^dQ(Em>ql|1cXpS7KJ@k`=jZWJ$jx;WM+_rJ;^bmR(y*YuJusY!*!;7(u(U>?QadF~n zrYmzHvp&f+X<<@BvTO395sqE7nEzU&F^^9Q|(=(n-aGtPa!bffZcM}icjo}^SE5psy zeb0`{-ZN2QB75TH9Fv@xIrX`|xf}C{d5pZ1lXNB(PI{W}kzZPX6eJX!oUAvwX!1*e zpI}R&RAFl2l_{1}7EbvxHG1mdBF!Q}(er73)3#5So6enHS3JCU-3;Ok){Lt&ZDy{R z**Pn5*2USDvzN|ppTn4Qajwt?TOUC&y7r_`@>f7#Hor5nUHWNmm=9#wvBqvOV{o76YW-qf*~z4^(O zuq~&zI&9s#ZOFEg?S$=_+h6a9-*N3P@4pUKm{pWks#MP233g`ge6wrZuG_lH}Vt!=vQJtf!jtx3iQYBSY zRQ01ex4QXw#__i&l21H8NjrJ}RLrTHr$?Q>dM4n^`Ln)fPo48PSAE{~{Lu@}7Ydeq8y){>ibY-cK(-3x9V1 zIpcZb3*L+Nmqo8+UoEZIuHV{V-Ej1^@9S%C;@-S$%xG+TJN=!)yVdWF-tYY|;=|>S zF&|%k;(q$kH0QJ0=gnViznp9iZGQAM{cGE|S>M&ZZ)tICIoBH9THlu4F5bSp!?@#c zXF%tJAL&1S!1up2zJl--gs-4~x`G5!dLtC?PMU0^Q>!;3>^Qcg2DM-qFonve*#ij5 z;Vm|>ya8l^9Nc=(1uKBoc4(AU0{7Hhs8L-6b*hPg36_E70&^(BwiM_?wFf2())r7O zdGL0)@m>WLu4}+r7+Mbo0}c3F4&}oRP%i?dxiI7+kPyhgUsr)CjjS0OA=DLy^K;Ue z;e0M9l^M!`5@g8M2(9sr`rh~B(i1VYMHu{{r+KgwJ=n=Cu48ZZu6 zW2V{}Sm(0nX_#h7sD-r3@0SLPuLXuM(?MVyq99WS6-9ntJ?s`L9QEJ-amVB!@FV24 zM8RMFcBk>jWEZ$(2bb*hNPBvxN)P7`aLLZ!iiCPe)>lIJ4@ETpFk7ECU_o56gG+XB z$qp{r!6iGmWas}b$qsxu$>7qR|5WLYK^9)z7B4bf?9!>z+2a?^KzJoyS@$Tem2Gu z+8AM$h(c3Xy%E^f3w}g}+y^(xp!v~5C=U%3cz5&OPr!4)Dg#f!Gl9Q=S_bWsUJ6DE z0tE1!j>d1AC2XIt(OSQ`+lQqVF^g{oViw)6*u?*MIpLlAn-1dSwl}M~8Nlvej9L6w zX>eu{Hv<5;8Gvw!<7NQ3831kufSUo}W&pSu0B#0=n*rcv0RKfZ0JwXS?J@-rNa)<($L0GzeKSsR?S!C4!ewZT~%oVCGO8=STIFS0hhYz^iu;09AR1a@#$dX$enyGVZBts8x#Dm1 za(!$RG5f=RokGZ&AvyzcW>;*+=&$u|#gtBE?H{&vb7bAWT}r3FO@ni0|8bm|oQTi( z`@g-`hxqwZ&pxEWxig$Q!?`n@JHxp%oIAt0Gn_laxwHQ+ch=2g=_AI!w?9ONfeVNk zv_Fi6_J?uM4;y9^h*(0KK*UNg8rlT9gB5k6NIPibhu9+yf_TB$9veTz8FB5a$wJ(q zjo%o|#!tjAdE)#M?yIMJOON~N>83>g-#$Ka{xQq*k2CgZN}qQ8!=qXMFk7ECV8Q>G z6J5~x6Yj4E_t%5_>%sl?;Qo4We?7Rrp8vc3^%S#J?X`LxuKvv>y9BBxpdc zW>zg#cD{5Tw9ospU;CL>xAv#|x63~7Z`0sfp#L~6&`Hl|LNTCnKZuX;_y%~kX0If|zLpwgm1X;jdXk>?B zKp6_;HzBdm>0urc4`FQ!1PRc%&RD>J-(i?~2)gM*=otGWVg9R|zV3Q{`E3wwc?s~R z=U!Lb3vuk8_zQYQMjC-40$lJ5^N7W^#NyW=;DQ_wI_|>&7d%2kF^~el=CGOAZ~sp( z-~v`w|9k)Piqs|iJ`PiI5_ybtxEq522VzkoAO`UnFy2uFz95dJQBD;C9EfA?^yK;o z&IkE1*-S2rL4jU3awuJpRxnNX=U?6LPWQLJ>1mk|5JLFDz}01Vso??e*95k?D3R`s zh4o>$fMuzFF`6eblLCkhNh3WQ;4u=tEb zrne6aLpVZoF^f-)fMHlZdX<+Ij>Ti)_S_UNtevnfqRDs&^#sEzFzn1s^TX^!Z2(z$vcJX zkHy3Gkl>6F&MkWw-p0)g!}>lHhMzFmkr)kOnPOseu8&_=*c?Q`b-;vh!3pp$1G*gT zfc@nG7F0`PmR$ zk`B{|TJ^fCOb*0IvLxET?{H!u(Us^(bOIEjJH$(JBYMMFC*p8n9xlwA1554g9oD+n zuvAe=6JWhem=fzF*7g&y$9$M44YrI8DT4Ke2V2k%@23h=_MyUj^-QCTjHUCYaA_={^a1k|y2#rN3C;x<>`0FE%P3u#aiNkxGXx!05~r_SO&Hr$egnVCypB zNMIvr*003A)Z}#ag#}Au!QT8_3unN-V|2ji+^_dZ?D^^$8DlqL)MOS1e+>pxOf7d> zzJ)IB>nz_{-m)x(p+*6?d3=Pzdn?`ZT;30rU22w>yYm(DEcp%$Z+Xq>QCr9kR& zVJqqIUvImx^~>rh4VHt*LONrm^`^n<5UqTca5ai%AqPGQ=pYjIm<547uvx-`*J5#DBlfds@u(S?s-EBNSj2ctj~JU1`~BC4As z!x1ke7>Ps@kVGU2NkPU#U^+IEhvXxZkwWO_avFrFn~7{e_CciEH%JFTl`xo~Log<6 zA#5Y;Ayg60L1dB#gy)2}g!hDxgfA$9s-S~Wb#w@-1tI2iQGIkMYJ{4g?x+XEEAc`7 zP%0XL20`SKQD`_CiL%i-=w=8jcOU%>VdM1SgK#uND#;+`5vLPp5NAQWl4Zp85V7Ph z;%;I!L@hZ>JWsqrtRY^9_$BX25+o^-5{W`GAX$^#NggCGk`KubBAEn0ER)fsc+yzX zI8p*Bk(5NrC#@juC*34HRGg|fO>v&$GR5_Z`xTEVUQ~Rl_+0U&V!h&P#YV+*Qyp`i;X1B5?mB@wkvh>ju{v=&V|0>qQgp`a zr0KAAGIWY`*6UR3JkWWm)1dQ4=dI2somO2*U9#?AT^(H$T?<_+T^n6HT~A#E?;+v?ph0P3tx)>ix`VB7BmaGMUq8|#dwP}i%b^{7flyk7Yi3>7Z(>d zmk}<}E{QIgF4-s`tq62>N%EiNZrYFw_n z+;Dl~^33Ih%O{u5F3qk4SE8$!t2}id^#JuW^$N9ydYyWMdW-sq`h@z7`hxn3+Ccq8 z{X+dp{Z8!|DK=7ir0hufkqRTVM(T|;7-=}tbfo!6%aPV2heth)dLH#LsyXUgR7+H6 zG>9fd6QgArdl>r|Rg6oFJB)jb2aHFICyZx|7mQDg&x~fqH%1GijnTpQktmVooCYzk zunz&-)xr;wDEjUGo92Vz|B1<_1No`)N^;xe{A6##3;csq0H**>0h|Ij1#k-B6u>Ef zQvjy`P63<(|1%0Ci;)VENTLuv$;{iy-pS6=+Rn_!)7Qbw*2B@s%)`pV(#+T1*2~Jy z!P3je&eF`<(%Qz#+REC@${t2J{DcuLEXXsB$xg(a2vFHc9O#;w&EckVNU)-Gi9cIW zXqPaB7r~{oAsjCTlbh33DV+!_93}Z@D-6lN@TquRRV1UZiZOq<3V%A!lf_S`XL!^3 z^lkzYU_}9Df3`2d^z`ll@`O0j$y`n*JCP!+BM*V~Ws3jV`g(iil|pAHGb32(Odg+} zp3&7wk28zMxOzVg#rS^&Ky3`Bkoli|3Lg&=7cWHOrXEfDvwaEAU@}-qEJmL(O2|lq z&gCsFZ^FhCpk{{%QH;faIFO3b&th_UaN5M`)47Zk7QBkkhyLVa^f?LRp~nxNB0#3E zr;+7@!{J(CCVF%wx()??k`Y`Ehc7@X$%#N3YV@?B3{nRQ0rj9p#{gCDWlSe>{}Gra?Jv1`t57oAQ23NpUPy>%;+=M{NcfmdI7}P_} z%4?`gc?X)ochCYl!4C+htc<84>WC&nLG%y{#0IfNoDdJh8^S7wAfXUenGvba&P+?| z(y2m)l`7DJ?(xl2nK?Yn2TB)BqVySQbRKULPymWR2|_^+0xAN602L4gB!QSfd=pfq zsR4BeGB*ThLS3t*KpHwWkrl{c4o#qQf8lUbd4U{8Dl^e5lgH0v~oE!QnJAnMQ?Zt`V_;J~Yvt zpPZ<4Lkht0lo0u*Gy=w0FB9RK4k1tKnJWkZC6dI%CI0CgxmGGEqNjv{y1ucs19c>( z)q@`d5&c3S?f#!Ifs_cWzzmp=77>{Z9|SR?Ad@#HI6NqmPfti=Vsm=~)VWvy%c$UR z>?$TWJVZEU$$*T6$NGeKkD?tI0kpOOdkE6)2%MmJdN^CU&Oo+ zXz$44=RmRwu@HoVEX3&Z<}fnTAwFO@D_4a5Ft~5Fp7)V3V?TU82(F$6*I+m3;Gn+Q z!c*vpoNQs9{_#SvLScNrYJ|-RgQW>?DfKN1^Qt3^?bn^35GQ)OLuEs4cu)0uBVt8k zcmu=;9R`htg8z7IvG8Dbp~E0y5PKp)-$5GCcMxH8UXQ~d(O}cSI5_>H=xLeEGC%{C zir6c;d-NEXqO%OsL}6f#WpHJsz!jx~0Z#PmAC>3B#wJFhuqXYz20^$)COes*0`HI$ zMO8wzWjvfVEFp2}+?+C~!s)@6oB(yMe`87kwK33?0>ZjurW8i7F~$ND_=Tnv&?{13 zy7q!!^cz(X={(aixx%LQM|KpBst`X?coSl3^b%f_F(fI8$HYcaw05TrWVhabW%XXU zH;BT--l$(f-Dz;Ub=+EfQvjy`P63<(I0bMD;1s|qfK%X)QXoYZQ#|Vk1>}Fs zJOESDbSdL{^%M*lSX1O5)}>QV2V_h|ce-i>N4(AOWizh5Xs- zy0m&-wIqfHphV@KS#0smsQfww0PO1vW7Ft4P@8V?&s!kW!G=cAs6ifnK9~|1)0B4G z9u&gxX80WePbWwy62b9o1e8*M@OL8eZjJaPXE+;9aK3LPw<^IM?=j#t=Y2G*% zcVL3++Pte3(Ir|+dEef)ocMe!?{4+?_RreQIZvmB$b5Y!9o|;;{n_UHwxf<$_J?ST z$5dD4Z@Q6sl=FSH+PpJAPW&id_vlz|fkd_I;p}w+Zs^!L^D&PaYq#FG?+E2HSEcKV zKd0S2*_yN3;i~py^s)Hk?OE^cmBd9=jxElAyzTp=L8N8Aq$Q_RpWm8_emeKz=F!+a z@86}TO?RpLt1;$u{l4hwrjzr&$HkqUtM$$`r?%X`cx$-)uaZ{X{;MOexqeuMMcmPbXOqr3ol6dE`?9{HSi9lf*?GE9YaeuXyiM;|dF#Mx74z@YS?{lve={t4@8yJ(kJow8ef2lP zJ?>4Pn+n`lugVMG{kVzCE4Xy&!l4DJJKxfz&FaM-IZV1b@6@i#Y^|%8I>t18Hf&E~ zCbrMzhH72(Y2lj>Iy1kHrq!ZRpeD^Jy*13eN+BU51 zU8Uxo>S~IaUGx3LFJAmGFc`XeR>|z)>PkxajwaUD!{AvWS6h93J4YiUtBl80cfjPy z$JSMHzCSvaH}%-jqhE90-F;rO|E<~M{I_?uT)upH$FMo~<-y|FO%t>nwX@g-dEZ+| zPbS^Xd)nFAIjZf>w{edR3-c=%fBd);eVdnb*4wXs*N1$4E1jo_Be}JAJGO4EzwveR z*x;bxDs^p*Hr_=4^V&Zm*X;=Y-n_A(Bgu8f{-x8VO*42ycUIk(^PbyQ_c-~(t&i8{ zOJ8r@VzcY|^>bfFjXI>@(n&2XE&cS?VdTZDSFfJ>Fz0bxsP)Gq%;e;kzJ7j&yC2({ z>pMDHxm;df{dVxN&KYhdO%W;nADw8N4xyhlvx+PY2?VE_oR=5Z+g%-I5q9~!O3k_-)w#`Y?EEHO zQrvsYZMCD->WkB!I@6y|Z@zB&c<7UO(x6ob4<7s;IV`$$YbEQ|)s-!SxahO^C>br= z44oy0cV(mN)*y}+Cr(XUwSD`yvze(D)CsoBA0FIQFoQ=`%WZp9*La@O7+u-A=Aviy zWjR$UDAU%Ebf%nA|Ri7=6KQQxsl)=%PuT_lyTFAaQb6ezf zP0N=>6}ikcGoL4(ou~EEhj~0^jLF^&NLF61Sa=|PkNc_x#S@27%od-2vMOD6eMtC< zyr{`l&t4Rw;&dzd&g!23wlqkCGt|JqU_*SN{r5$?E@jr|%=&cHX-|pH zd&Tl;waW`hJk5}WoMq{8B^{SW93s4X^0cava%SR$2 zxv`EDEHpL>S#LIF%9JwWvpeN#Tsnq!rC5I758n4EOjzwXwV}C{ILm5BbdA;` z@?yH~d=gn}Rx;Iq)2E9PPrHEbyE-Ix+ zUl#xL>E36HGdT^7m6aatOJYVokKcRC^>u7)^11yc&Nu4kbnf53Zb3+c&G6yFRbNW( z_45y1?=sXq_r;O-GbT^iIr+u=&y7~qYbGUJ)!@(CO}wY)TUqV9>+Dh1>Bo!BEj@lH zB<a7f=E%34eh`PH-Fo4Is?qIvdy)!fepmGg@mY(s+-j-XzFRXcE& z?z-jGbGgKO`UXxdsk53FPLsZ>(|NpNQ+e@`y~~*8HI?^inknbwWFFM`xlP~@FDj%g zDla1DtXBHQ*6m#EC$pt_!m?c1m?zrPo2n}Ic5HoIHl)yg=Iq%^7;|&p&8SvbSa9vV zhje|E=8YWI^VJ_(+GJi>HO*|Fj#W9jvSwq1&ld86Aw(?7fz0{bL z6!kOe)0+n`ZaH09xR|ED?a4abom;{-I=4(YqJOb95Q6J_pa%7IZYSLgOc77Da`vU^U-#Zpil-UNw(L*3va)2M#d0?jYiU@#4CU+)wmc35^TWCl9H0^$BJTR%jfQlz1lqP*c?uy^@TgTUxe?R@?lYd zOI*g71y@6VEU*}Sdz%OBDr|(d=dS5=Gp7c@8)L&IZttgE2~QWt?hp6GNTH_2vK3cv zyyzi5%}DHa;o|IupxVfk)C!v&nj@>mRaLpsjr`UJ?S`KvycluW!Is*&2T`hn-Q9qc z;))O9Zcm!;{$E^P!}c*6nn|ibc;}m3p9KSNcI>&Q@Wri#Z`Nj+BcTIEV$XIo5oWR|^yP$M=$X*R?i4~!pqYg}c zzog{R#CMU&O$P5DTFJ+Bw#-a$%c(sr(J=MfhnR*}yHwGXNL9VSZ_-blR9*}-ae1r# zT{UIZj#XK`zn^V^5(P3P#*jHxpxAFm#9 zKXHij7xc`74Eg1r4&|!Vs^7n|h7O`d9de?!m1_)R{WzBWc!C}+W!Wj1c1U1|#royX zTU@Upm8(tpm+s6yG_=v;Ou07Yb;{czHrba(3nq0V_>OTLg=9x)f=cpZ;kG@89 zJ>pi}yQHT5IoI^djtSMF(q9$FxpJG9ELxL~c9QPB8Zr9b0cD=cjd7zS?_ILH6JVO_ z*Sga2g!zm~FB6kH2tNqvih#?guQk8@$P!glQVb5g99`MoUjJ4xe)7|xl;Wma zJ6_+|b0NC55MB0!wmx0)+4GW7m+SuGcFHy{2t;uCr~ zRSOpIy*i3zAHQ4|H}Bc~X*|uB`@eVIyvf7JZe?Y~T}2YpjPaKmxq$DHTh=<8QJPnL zi{=)Y={zj%5v{0x%A$2Q7cb^ueM%^6&QazKZjwH`FIPkPH`qTw3=%g*AQ|b+)z8&EMji=bB>6PLG13 zg3D94ocG_5oZ}_AIC{M_|HHNKDVN3LExsDgId{tF$By{@U!+XkGc~qD2@97APnb8@;k@5PZqVA6zGSE4e^h z)uo@W=*1vnfzDg*p^`}RR0<7a@a6yX{`;mDvqqExbg5! zvdfR1ikB>=6TSSMPv%)}tFbHyDX^@N7o{8O&XKgA^BOj+(T>@1WKyB5CxygPa2@#ebbyJwr1E!taIQGL5IHh*^ejAYt!aXS5M z&GDV|=DIb5qiN-OMYr-c2P3nC1t}FSZP}U#WJZI{R=EB72xAStj4i)`KdXIb71}AvJ1v;8Ow8IxX67y)0){d zy28`_RpDs&Qqv1}%<5YyW8!INzun4dC||tJKN{ZhOYxtvpkO_E+uDAlSGnF^p4&Lz z++DO2&0Z26%e6N(>*>6n{wmo~=1CnhYx_aA%1$p`V`HoH;-=>IuL7{vFKS)DXLQKc z1zl9HST;w$YRqXl>bS#drpH3gEs|e;tt998mqngd#UA3>^FkaAp3~H*7K@kp(_WxM z;rMQ8MqT+@ryGs8FKfv%UL^Bo>vGw%ElE4~*0@=Za2q$l3bs%%+Wi_jhIajH>(C0N zi+&ND>jkGO;*((kO(i+&Z_9sK@9P@kw&>VL`|IvOZsTAMd)H(Lu86U*Dt{3rW0YZt6Bth>@IefFK+%XV$6$(LP1YksJmG}+7>8?Rk1 zEzVk3zv5);rL$|QLk=gjDtwl|A`|}k+|6&YuWX(UF+V%W+v>;N_RyMj#q9VMDj8## zAI^Q2epwnb1IcZTl97FLy zci(UFo))rG53*fW4Bgq;-aMizBWvq>HEnJ?z*#XhCFqN@>=D0(S6^YfH{SqZYkVtjuo%4*i|sQrF86MG}maP zgWZY+>>b0o56KA~MxRgJY#lY?FO9*khtf7`ILp<1&~Z=baQ;lOwmzBC;e5XEi$K39 zcUG%-$eWxaIStGk&zsg+#F@BDyBHgPvV{-Yxw##eC&wH)Sh{V@W$Tjob!wpv(oQqK z>`Rz=gW05an`S4!ykNJ{tDW26gIK&?;pp1kM-o?aQrwC=?zi(Ud9Piz)NCw&LHms6 zQ&*;z-JV=!a7AxJe)GYzu}cN&JBc@W(Z5gqNyQ_W>!8ivFaats?=)|y`Rd`L^|wm|oK?BSch zNN6&~o{alu1iey?zr;ve`{h~o{Kn!?w`yxMyGWPnTAAZ6;j^4xS$K(CFJ!-MRsHz& zT13UN1+}@?sBh=531oTg`Q8bc>5B{-nYLDMv#+arL&vA*g!9qy{4XKG7guhF z+N_qc9A3=``LA_z+oWITKKf)?7jPoBDk!=5N$#UJ0aflzYYt>DtlT;ONgS4iUaHe% z6M%_;D2s~bI9Ioy9ede&#jNkm?Uzt-a|*5M(bxl(@rSsBuuY&~U8PHs8*9oK%P-Hk za~g-vW)WJ>c--4OseI8_S;iNctQmzBHEzRaO?r3d@XIWA@VtZKfu|*~Fp@o4e=fGexM>C$%IxpT)0+c(Q;xh#LVo4IGm2RDl<%Rz^C4re-7 z^W9E7Hazws`}uSFUfPkYcjqpsnnKx&65It-{WCIj&!~TmxNncHN0|kM3*3U&zG|J& zdFx<)P>0tDCoyg1gCUo7Zde|1bzNw5+wz5cgU7=UO0y;}_CIWO%e}~6xkdV(Y6c3+ znt5c^_6ONBk`L&0UYpkJv^M!>bDb~C1r97_%(=Mp9~$^5?ac>&x9lSy4(GqRtY#%w z=~2aa`!!?P2ZyyO4sPU64wRRwH^*FTN%Zpj{B_>snkrv;rxX6bq7AkoThD+uAc2uz2)=#Mf~dBJGM)=JBDr?xn%ssw&O>$@@8c! z+s;^5S$X}iW$qDSk z?{dCQJb3AoQ0g~hc#nH4N39pJG&fhxW3Sa!grVT3R~bWvTRqm@0v8z5GKR!K@ zU3q=9WXJ)|HtBNuM=DQe#ks8m)SlOGW9g0m6zVyUN`D$(CPM8_$(e&Z?t7OSWzmwcSG|m@ZUoc(wN2ig6ex)-Y)t(%G4?ra|gFl@ezU< zWT8?=c3hmi;(hj}ns<%<=LStxw;O*m{5Iph{p1P5t*x!4>rJ-|{@&K&v&+83Wip}W zjB(VlGlKuq-kHZk_5Ocs)iW&Y5$a^FGh> zeuzVh5Z@yCOsIgV}lAb9!mL3%SpoUZXHbC#1Sw#7l!Oqs97=gNv&$^iXqD_<0 zW1kKlJg9FVnq5#((6alqcg`obS7hpxBpVI;gat~+@FpGRBZX~J(WO&t856ddqN^?`XMRS>dcW$mZ+!wV99 zpZyDdqz-A`aw>h_HPSzp%-<-T zt@h*vzB<>&?o%QoUM@U0p1();-De+Ta>&%Q{md>Qvl4QECT~c$u(fs9=RSxY1cSj5 zq0+Y6PJghv-1L!$$pxR1JzoT0E^Qg<-<3JaJ$3)f*YaX5uTkmG-_1?F!{w;`75itu zL&uKK`OJQ37;-$;?0bHj5EeIb_bxA<-2G)Bdc=ZvS%}@z-ezIm^JdELtAEISX@bPs z$-qFX#Ml`5XJ&D&{cZP;@4itJxkc#`cqKpMV){U*y>hPiTy{lH)}fQJJFdF9j37T8 zANHgMx6>Do@;lEAOPWh>hf~eDqO0CPzh5OA5Q!~we&)20(m60E?O}-=7 zlxHmMcB&3I+YkcAl7?gZ^q`BA1zK)RmgVx#1|IURe=a$6%_ho1dH`L_g_y8tXB6IV84Y`T=P^P9qk%?A`zM$*-aG9iAiCj{Vt_>|ykE zYM^WG(}&25>Q2%>A&`v4^Bn{)>3zXC-mulg*W31EH9UauJL~FxW%IMeSIo<6QBNUz z&n!-bkCpD5y$~H=cPSkk9oe=2t(D_Ia>ARzUfBJxLnn)!hJO1zc+&hfBG7|0|6Z4F zdFfEd3K`xP+5Ao;+SFYi;cQmFrqS{tT#}0RCg@7Z^Y%NId7z1Ia4eo zg+^DLdEW3HCVkdzvi?=ivM|_%^2tF*?_vY*bcGX6zWF8L_IazR}&&qup0q^JV{({h!N$k2kJNKV0C%=Q~DAmz;b~ zujqC5T+;mRB^3;rHTk%;_34%Ul;~eSuHUTfD1rR&$xYI|i1rhnH2qokrC-O8cj9nO zVWsRsp(TU-%G`G17fDfFeelH-ji;vqPS+3VmaN5$JDt^;5PN5>R2@tgZ~KbU(QDQ@ zI^eZXcg`}ZJWJV}z&ozNW^cY;Dc*=8Z#o3H|DFv@Y)%NW9x*8EFyEOhL zG;{sBaJ0w9J=59!Jwlgcyjzz(C>|mY*RI}u5@PV}^nMeI{Mp~E%HYO657p5Wg);$3UNyx*=0!Eaz+ zGDmvtweqCyn3cJ>(U;+h^SyVj*FTWi+HGw6XDa-A!@l1#0e>93M4sMDob5TUTJ>`B z$U9Kv+xgX-=1z59-{rZD6*`uq$_Wc^G+f_=>%=On$iKc*d#a0f8@1QnG#2lb%>DYMGGMl| zH203%;Ci@Q5${mP=L8L%?Rt8$IkZO0>%;bXuZ5EFxjCnLRn^nCe$)Vpw(%!9XsHsx*^&4vX zyjF63C@RlpS5T1#?+I_gh!4Hx zX~ONUPDdTR<=B~*pYwLx-D7$I@buJiIoGH#r>^|nf3a?0Wz zc3A+tfImw1wL5X;*)LfqT1WZ6LKD=KQW|DAF9r0*n};)4hIlx6nfm#8Df2RBZ1_Yf z1$(%<9yzj+|5%T3OF1&1jNJXbIbT+r+Gb$)qeUc`}PXqPeno?6a4nKT}+TPTYHYMyGthoksHkRB*zuL?)w-W+5TS zpRmHHV=14wJqhLPt7B|M3B3HI6(u~b0KlPO4lBl3xd55NV7Dq=IbJii5E^N5_~gph zR}p7k>0*1QUw>QPuOsRfKfSmX_Cx0Pm5253S0nDm%H~&%ybqPRQZWzG>vD!hNV~O9 zh3)hACML&m*(#C=RD_WXgx#Vf0p^AQ!puR0+Ax^ip%3R%qKWWxK6{_ScA_&}@SHv& zShz8Kzkj$iyzrfjjG91CNU5=9qkoA!I6I)k4PDUGnblsvYi5f-F@t{ZhAJP>t&Tag z2iYzOLL&$u16CMl7@YhwDYo*;m#v`do*fGf*Q(VTn7f`eG;3cq5zD)5aVP}By!t*c z=Q?AT0)!(=6M7j1viv*;>XuId6J=<8k5sMEg)h&PcA;}!@Y}#yPPl}=&>(9Ce^-1` zCAUak5NdCRv;m-x_Z*?Q<6_8e?IwJ(2ief*8$#D!w%<5B{Uf>-Q!M0W*BkfQy;kXC zYxAU6#I@L+?$xkKFwI(BD6T?s3Kf^1vcutJ%HHRZrAaHxex+LTqknW4(%$IG&%X~W z+^%VZ%9}n|Gj z8e5f4*Yyrf;*?Gny+d~d3^H(jJL274Uq$6~)NdtOyM?zcR6C(M)bhZ#wwTmvgVt2p zH{-UFi8O^Yxs*6rm(T0v%1^#lxV##6z+d(#3%$y~6-pjR+56;Yk@Gn@qvR9dWgU^~ z0|*YFn~?~;xmCC}C`1ZSH3|c8X zLb2RkqY!Nax-xv-(Na)a7RmsnJBkvJWR~nnqTS-3fl^Z}g)PzwGIov4eMIojA+ni@ z+Z@PKQt{rW3)zjBwz(=8V?c_(4Ha%&eMJ<^-PgXBik~&~$TW7gNJAU$>hk|2Lp4kg zp>~ry!?Mto3V1XK<;P|)QTh@=?GzMMH2XQ6yCy9%aAwQYYp)zDvqJ~1Fxw5gi}9w} zQSpvwnFI^e>no@^>G?G#5d)Ri=wP0?i080I>4#$5tzrj}E$pBNy4LV(7UPeD#Pf<94 zdq*)C7e!GAwBh7YwEk8DNCO_p#~p`syNsgt6o8HDJcPjo5_KoKsB;GdyxYReuU(AO z0Y9GFO`qBa2gDrVg9x;og0W~gl8Tx`;y5WPNdjB+uO8TO$)wLpka|cNZo42ojY>dJ z5davsC|%X)hcdj(mq1QId%DLnvsL(waJE8Vdzqou(xdO0W0G>!$AqpdYR9P}#N?>I zw=&tP-Ev=`%sHLp&rSNEC22kb=#E5{i=yu{18R@;B@4b^P=X_7h#Vk6V2mIEs~#pe zcEo9L^+n?S{X`5fjbN_2vX{SA)UlzS6LxdE7uffu#37Hf-7|K?D?G;Y5zSB(>*Y9a z6mq6J0Rqy6^AA`GlJsvp_ww&i{uQ9W1lVD3W0)v^hM}o`9w6{ zJc|Z`v4?RPb4|iqKE7bvikuW2v{!^*ZzY}`W+ICXtj+BdN1T3b0#RpJdi;rNRoH5#-qBsndI<5jZPBy7i%Wc9>|qB{T?N zL??pE#6`*!9-mMG(x;@p5V+wQV|r@=stey>2WS2SOKe`W01C&Vmu?R*Oc2DA4v z+7LhokRpA($~hZw5MtU+Z0wJ5KHna#aVjuz!*&_xnlwAtv`FA}J$SVtrNcHuOlWJ) z>m2ARhcXg5EfyJ2=JTXGtR5rR?I=9`fXtjmpxPv;5J!9PcayWSSW^jzWko22tnyCU z{2D6Y^vI(%E^$jPkj*4)ftsjka1{g)R6)7ZOgNNXfX=AP6N@v^cz^%twKR_Ht^)(J z#Q3s_Z2I=C9SmKF3{oVS`y1#&BcO~76p~gXuJ0nhSZ1DaOx1e#wFjxdjJs(n?Y!>5 z)EeP6Nsu|1ApVP@`=#t=dfHig#bolFG?Sbl2-cN{u!ww&V0<$0Ryv7};Nyk~r*kh# z#AQyblq>rP#+K~rqRdOTaN`B(hZNd=UxT+6kdbmIIE9PDQjdN)^Q!Rsa;deXK07dr zJ}iNtT$j{msY7UHf)Ew=z_!;3;5u~($NK{1##i$}&<*Y^(-RABd@Z;J%;!q7U-L6; z`PnQar4w175h zIc=*Xw@HZ7_#^uOd;#V|^2d_GAk5Lra)Qy+K-BdDIH;o))FfW#3t`DgGMWXsR}rYj zj%im6(_41#qEv4m2pof*jzC|PfwP7MY1M+9og}0#gk&wmXc3~-2>CCuEqZXIH3GPj z;4=i!Q*g`#F?I}`8z(|369ipESE8!f3X*BLLa1A!s)|k1S-9zJS#UOv;qMR3PDRkuol~I=z@^? z9o~lt_1vq2zIf&|mYNNLAf~|8m~$9Gsw|2dS6B&y(u|701Qm^d{LQi7_6lTN32}qtybLH{hiA=`>eP&Ld@yT_}1Q zF+BqRu?}!sByuhzL2XF79Y5P12D-Eh6b2`~h1Hyr%K5G~zZFMKz%e`U6(t0L3BWl` zn$&=#bt9);BN?^=afowVe;J`w*tySp#N9KuyW^-2@SHNjktN_zs1KzN$sNYRt@(j0 zfDsI*_)4>V9|rEwyv0fpR+OqyBhZWhCRYahlE@em2F9_hL%*Nq0#*zd=lOQFxA)O1 z9rxYH3WiknI)PyVBt*$jhlCm9!qW**iV-xe2nY;?F~{V&0o$HEr_61C%!!dQy-284 z1YAMV*TqDr8Ff8!Ku{5k`D`x`up<|3@UDA|8YLwhMPOS12@*2XuSI|vk%~M%)_y*= z`yHAmjM|?gVs0oA94Ziot++v;R};9_K=Qf_`>hCL5zp1+qmke1!_^qh#2Zm?<9OrX z8zEOl37HS1ggXHPh$?MPg!P4BY{W;g8)3P_NZk|cGb+J1kG$=~9%&t$zQKb{rqZ^H zf>sF~>Uz^h5*AE2G|qPBJd{%tu_3Oyx3S$Stzp!CWm_A zGx37E?dS}2kY@j~Mpo-~(20w7uWEivDM3i0NEEemiMHhk8#G9>ldAcsy;5qwm5Aw8 z!KcPZHM#=RykuGkBAaN?7zhH<__?-HsrPk59-ZFOfEjsg&$)dHg36`}N<$ACjJ$EU zuz&!VrzKbDRn@ahZ@dLY>hXSH8j7NeNIRKoH0+-d**bGUl|E{?X8?s)!Mxt-x$rhy zW3C7Y!tv7^5WWiIn#QhG>Me9nJh(}U`2Y?DQDwpg$;_|pr3f+gWHg_E@kVD;d zQ@G?-n}C{@kWu&zR(#>kKIVaO@dz#Un!((syW^%?q$)W2GstQZPR7}q+Xmxj+3}NV zqkv@dRgUir>OS2SH`+r~-U={LXcEDN?;y76B|pQ8z)p!$PxiwS0jBePdYV*4D{;3i z@Lsd(nl9kKEkK@)I3pGCO$KvZ4##Yj;*u_5}%H%c~+`iQsS>bJpn!&W)rq@;J8M|$6i z-cVPyRUv(B8|ZX3qU&KqbB#xHedO^LpaO@kkdsXk12X!d)0dyn(#^g-^I8nXkP_aF zz&>z@Vh6hAzs>O<{}_v1i484`ZT>B_1_7p}7-51tD&aBBpQ6UG%skJ+#R(bL;4gpM%57ZKl{Sdovpj-N;nwFcIlk{nS3T=S&0 zpyaSH4A^mK&At}LOtN(c!ctS%>B+X|oNaYdnO&)E!YSlRfMU&0PREU3Pg^xkCsWf4 z=xMm*r15}^mM8S_!PKjInQ@|NVXxB0XHSzO6USo{YNX>U>sN1 z6^|Fn9{-+dd-9wdJbGGAwlbcvCLVu+beb&9!2O9Hn?4V5I&W(kAHMH6UM~)>4;1c> z(f7!GE_*?v_(He>aJ)2f=2V21TZ9`Y8t-9^9eww00?03U6Mre6VVTcPEx^ZHd{2%% z6M;Sx8@4z1?eX-&m7p_95mIB}L4xF}wmlJAD8iUt@ZQ^&SQE^dBO%xVpc#U`oTr|{ z2`cO@`Top$?^xg&%fK1oGA#sX3<*$9mNa97@n5YmD}MRA{AS=jHsgC|1bi`XeDgk5 zs84&_;fMqxV8e8`NdZ!Cd4-<$novEo`p7%)i4R0@fg|ohlXR)%cUg6EjW9RE1i0CR zyS0f-gHh6n14DAK=|#C2-(8oNU(Wh!&#qcJa$qRVusU0c(of{)+DQ2-Ab`VHC2l%m zwn~L6kia0+4#aUs0f&$e4nOW38U^s7@&rfZ5(h>+3p4om=H%^%HNj_2GyP7Ff&lIh zQ4WNtU4DO0rPzVSH9<<1~-WpUHO|Ll| zK4`+~L9&N1Tq}Oy82B!VzheC5vypqxyjm;j2#p^uc8Ex)mKE)|TvQ2dWthnb)gf-V zJv{39h}!a~2?s)DNz+>dSvQ2h8uHvwL0?qpQd5^8;R#TfeIzDX$3^3 zK&{=}Qt&l^qFqC66ij>JtV1GP?U$g&SkqsBs1y-p{}9y_Rt0rSKEv@ZMSY{F%doBq zGA=2fI!Z`U7oWai%=u6Xer-Z}dW!aaw;T*%*)IwzB+^ALf@GdNxdx{`fR^6Bbw3&Y zRggG>McitTIi3Jm-Y0_fCBXZ{D)|A132$H5Q@93j&7f>UJm|u!dmpA$82xkx9<@$j z`71&MF(jHK`>iW82Hl3x281thCVeUqFSr1K@j!@ur|=~hbkkmvl(b43E2y0F#TPIPl?H=Ex!)$B z3&86eaG+a|TPsA>yv@?(qenDRDsMfAS~;`Bo0EVG-nDOM3P8`mRiucEEJ&(plV}7( z%I~G=$LHl>nrsxF)yMoP|KZb#-ikmx=VqfB6sS;G0>zxBw*G9BNoEXVl^6My`^fa~ zc$Pgu?e4CZ>x(HFlFWYMQzwT#4Km;!6cr+RTX=p(nxE?|gmOia%t#<2m?eSXb|PsV z0(zS7;1l?Yt9v+={PF8DZG!#uC^W|zLvj#tBD)=gqBw&W3q=rADM;UPl*JH!`hbt6hAlM}^z`_d*)RpZ1_&n| z-CZIdwqFK7K@~xhK27=a!40N~$n*oV=mMG%Syo5p=|?s(LjVJdr~0&g4{MQy^s?)( z=JtDN6d!pfUO2oMu2XJ4Cqa-DNj*?yncL%Hux;plsPOE;#tB-%n3sl4W7rArCI>5I zXS~&vyRM9|Qjbl}ZqMgF%_kSJQWyH?Ls~TaghTg{3gp6Hu|K;VzBDjqSc$4^ar!-u zMD%i)`FZ0c>j(iANLB0*rsebCN{>V=mdSaDPKcbpTr*coZwiJ$Dis*FOe7MktrXXQSvU{ z&IvU=53SCa*P~E~`_A$`zkxW&olxXEL<1S3;yY0}TT{WyF3N|$Lfb}govK+bgw8t+ zn49ldV(G@opMMygOQ1Lg^}j8?A(2S6%~Q*$qI!rKUZEwC;O|;=4)EQQlrpwlj`I(( za#Te5UB4xo=>ZkHu9t)n#d&K(AFQh-vYN<%7Yt7`N4Jdh~wbfmd7}9tYbjoz= zW3?lgclC?W+6s?*0!xyZGRA0nBR85uIZ}zps;XP|c+5?xOad_g_|BfUw)p|D+b?>9 z>_5`2#`3zTL!koV3~0J+e#MFlntE|D=&9Ng1(iS@AJxcw^uq{zS;5f^Cd*#a6~RLk zQsm&rjdrCwzQ=poMV(Jq?7_riOYK8*xoz%CD^HX5!z57g^`Jpec%{AanOrBvB~WT~!ns zj=v0yGZZay#7xM{O(xA6V-F05IuN#>s}`DMDA;8ZlkuHyV$Ov!GUZX!kHIGy07_kW z3q2GKrQ*Ue^(de+c4zcqncLOX=m1gr`l@PHv0`Ea z8^t%ejT>mjU(fDVkcgg^KZp%}G}+`HXFec?uQKK=MV=+8Z0o2#Kr~44&$#j$gy*fn zY}A6IQ=qK#R$F%G@{6nvAz;_b!{@pkGb}Uq8oPg#=6YYwVu5%8niYGNMgs#R2W6zJ z#!>eBC7>86nXLjESp^Qw%xnC`voTu~Q=-lqCT-IvbBTOWP6lmi=h-PT!lY`=^nqQN z)2Vpy(~FT93$l7awgDW0LfqJ zwk;j#pwHE^?^N<1PLW4AUj{QQFRi>gB5R}IUxU9$+qs|V`(i#R6uUuWv&>3sjv;2uYWS>_CCTA!3>QP3@Yei!i3bnnUdA|b14LAN;IDD(Hm?T) z$>4J1w2B!SgQ6M?mx0np1)rbZZ^+oWbT8!z?=fD0k3mffpr#-xlt&N=Rc(30rTa1l zeUVT#btV3m+oB%_>=D~D54Mj-iM9vs0JkajgZ#h484E-al_Q>xQ_cQL&=cuY_dU+I zUx?&75U9;lJt=!YvaP@>P31n&HLO_kW&j1z27H5{E54RBQC_Yc6$5*=S%PxGP}Nr9(LcO=qx+6tlfw$pIF zU=OkuXKp{7@le7s`GMYh?kzmuR+qB{4g76a2^h#dn`Cr?N)jlWsqq?;e11+7R3HH< zP)`E$BH(cDQ9a3xc5F zM#(~cF^~soNdr?-d=^So)~pY0Re(oU{rEmgnhs1uX-1q`tpO{R$Kck_=&RnZ$10gZ zSh-shSa|>^Oc_S9xi?msB>$FTMQ}3p5d4`Y)y@dQi`#jFgiR4$J7)xTd0>&Xv_0Ma zQ%9X%M?=nc=zz}Y=<}6$36UIkwHFT(W@Zz$6)pHVCPs*9KsO#lL&iPC%2#!Sodx#* zhM?$1acxDWg=tPZcl4(AaN^m31)T$58U<-#Vxd26Jf0NZ8maOR+MzlMQnC2X7oHHw zERoQ8yfn+GQgIOC1d>|jhA=SYs=h^>0CjvHoO!V>-v6OG==8qr1s&$8pUIMB)R5$m zx?&=$MS;ruPp88&1vupG`ax&}Ekz^Jf5g-0AoZnFj82yQxQ;lDKig?RfB}Mlm;!Ja zK={-71xJI;mFYq}3p8ipDxM zEKr0#<+^I6xDQVIAQhKwnTSx5cIRW*CCDQ%Y_grJA zW7w3U_VKmoz^)y-c*j1MZ=K^~IjeE_#ThZl7M!HEo5={5q%Q|x;;l)bGi0(~Tdt0KXEjXU&ZxbKv z)8*M*VdRsVYkFLt* zAdV)gaU}*K;lT{46b1tXLi3J~d^{8Y%*+12ksbao&C7KF-Y_fRSwHg*pAW!%|CrCu zn-BYk=A}Xa3;sj%DgmQ6%JS;rWk>*v{cXPFKQwPC81oOkQ9t%S%gfG!iGM4v@DIIF zzs}#Z)!)h-{SUp-w$9`ro|ys&X~NU}yzl0H`#&ZyuPqxBZ<(owuO9^Umm9j3u|Du0 zZs`5I9bSNE#h?lTZMdNyIcl`wpba{BzyJv17244MeEri6-NXU_{yG2uNTL67JqKIx zO7Hp0-5i|2)82nMpo5oqTEfxGKbU8KxzUFbfxHItG|v?rB;od#<~eNh%KW7%8`{~& z*O^ylqs{)#KF%AugQrtMLtJ>8ZzJD-(gxDO)5AQy)jPz;gQwScTEfSL9>m+U$c_2I zE>7+|t-{ktp0T$9PxGue5lFYcX~)0m|IyV}!D$Dex_2)bFmXBK?GhZk+k$5sLJxEX z4E%ij>AvA0(BB;0#WwmD;B~U5>RwIF-D*m_?*FgXzg_rWrT)Fx*tUO__-eVa^*57f z|J56tNwhbUXm2Lb-b|vsnMC{l*Cg5&@)iLWcP(L-7M8`9Z>?0VqO7`(it`MMt{q*q z*0(-uJ$X#wSje$98&Mm3o2xe8jvF4&InK3JwvD#!JwZ6(aiYZzZf9e6*>2_Jfs+?b zzOmP^PqH69C4VaH)ME#NgSW%|)1s&8r*F~tX~${TXzO%ydL@0u@t|XgOGdtLGR<9*!w zrVql0=5xna%-74e!%xO9%x}^@Z;YPYr(;VH9yG5*q0g*%n2LVn$6zQ==$f?Y@%`E^(2v`z@)L{eaYo1&=il9{?t9G zg{i;OoYQ*JRnqg)*E5_ldNNfr3o`#?xn}jB)jV644a@e;9zCabt~v*u6Ol7}{>b^J zTp%|sclpBU3y<^E^UCuD^F#8v1*Qcpgi$;p|i*J??OHxa|l{%LWl~KxS z%caZH%YU#uSmPDO6-|}fEAy&gRiRaHFWOw}x+?74Zw%BJ*0j{_uC2I~{h1A7Nr2lo#?7}6W!JTrXOIec)qcf@RDaP-*d_?Z0|ciee=?z#8#&l8~& zKPMSe{8MQ!P%rXc5?@xn+VScpSCe~x+HksW=IG4itkdj=*Fmq>-z2;hew+7B_TAMv zwYhuqM)L#jPriTi!T-b0g`|(@k0px=i;bTspZb<;m)?91{QT!j##j8;E6eK3Z7UWl zFIRn5e|}3_!>?6;Cx7qyas0=-pJ&$L>jl4d{A&Gu`1jNwpFe;8*Ch4EY5G4&YHRlp zA4gxhhxaB+y~$EzEcGT! zy~$EzEH#f@<$(p8EcIXb z>VJN2veYg?PXFkPe~U~1+lBwxoBx}?n=G|I-N^;m{og+ju*p(yvecU_^(ITb$x?5! z)SE2zCQH4^Qvctw)L@7NNaA15J^|k44(~1eFLUd8&vrWdIfeMR_y#L`_`3R89R43y z{d-F5f3A%_2>u(E{r3dd|E`V=nERivlc9gF<6qJ4|5+`Az&{ + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg new file mode 100644 index 0000000000..c17a7abafc --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg @@ -0,0 +1,80 @@ + + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json new file mode 100644 index 0000000000..2bce0295cb --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Mediamodifier-Design.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg new file mode 100644 index 0000000000..dfa2d38c40 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg @@ -0,0 +1,22 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index 1a9865d4ef..b844affde8 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -44,6 +44,8 @@ $(CURRENT_PROJECT_VERSION) ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + LSApplicationQueriesSchemes gcm-ciq @@ -70,6 +72,8 @@ Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices NSBluetoothPeripheralUsageDescription Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices + NSCalendarsFullAccessUsageDescription + To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay NSCalendarsUsageDescription Calendar is used to create a new glucose events. NSFaceIDUsageDescription @@ -110,10 +114,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - NSCalendarsFullAccessUsageDescription - To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay - LSApplicationCategoryType - UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 83f064eb03..05e85190c9 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -25,6 +25,7 @@ "carbsRequiredThreshold" : 10, "animatedBackground" : false, "useFPUconversion" : true, + "tins": false, "individualAdjustmentFactor" : 0.5, "timeCap" : 8, "minuteInterval" : 30, diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index f264e23539..7ec6521575 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -120,7 +120,7 @@ final class OpenAPS { func oref2() -> RawJSON { coredataContext.performAndWait { - let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) + let preferences = self.storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) var hbt_ = preferences?.halfBasalExerciseTarget ?? 160 let wp = preferences?.weightPercentage ?? 1 let smbMinutes = (preferences?.maxSMBBasalMinutes ?? 30) as NSDecimalNumber @@ -207,6 +207,12 @@ final class OpenAPS { saveToCoreData.duration = 0 saveToCoreData.indefinite = false saveToCoreData.percentage = 100 + let saveToHistory = OverrideHistory(context: self.coredataContext) + let d: Double = -1 * date.addingTimeInterval(addedMinutes.minutes.timeInterval).timeIntervalSinceNow.minutes + print("Duration: \(d) minutes") + saveToHistory.duration = d + saveToHistory.target = Double(overrideTarget) + saveToHistory.date = overrideArray.first?.date ?? Date() try? self.coredataContext.save() } } diff --git a/FreeAPS/Sources/APS/Storage/OverrideStorage.swift b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift new file mode 100644 index 0000000000..672578e49e --- /dev/null +++ b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift @@ -0,0 +1,79 @@ +import CoreData +import Foundation +import SwiftDate +import Swinject + +/* + protocol OverrideStorage { + func fetchOverrides(interval: NSDate) -> [Override] + func fetchLatestOverride() -> [Override] + } + */ +protocol OverrideObserver { + func overrideHistoryDidUpdate(_: [OverrideHistory]) +} + +final class OverrideStorage { + private let processQueue = DispatchQueue(label: "BaseOverrideStorage.processQueue") + + @Injected() private var broadcaster: Broadcaster! + + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // newBackgroundContext() + + func fetchLatestOverride() -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.fetchLimit = 1 + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrides(interval: NSDate) -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrideHistory(interval: NSDate) -> [OverrideHistory] { + var overrideArray = [OverrideHistory]() + coredataContext.performAndWait { + let requestOverrides = OverrideHistory.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func cancelProfile() { + let scheduled = fetchLatestOverride().first + coredataContext.perform { [self] in + let profiles = Override(context: self.coredataContext) + let history = OverrideHistory(context: self.coredataContext) + if let latest = scheduled { + history.duration = -1 * (latest.date ?? Date()).timeIntervalSinceNow.minutes + print("History duration: \(history.duration) min") + history.date = latest.date ?? Date() + history.target = Double(latest.target ?? 100) + } + profiles.enabled = false + profiles.date = Date() + try? self.coredataContext.save() + } + } +} diff --git a/FreeAPS/Sources/Helpers/Color+Extensions.swift b/FreeAPS/Sources/Helpers/Color+Extensions.swift index 1b66ad90d2..cd4c0a4ba4 100644 --- a/FreeAPS/Sources/Helpers/Color+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Color+Extensions.swift @@ -59,8 +59,15 @@ extension Color { static let tempBasal = Color("TempBasal") static let basal = Color("Basal") static let darkerBlue = Color("DarkerBlue") + static let lightBlue = Color("LightBlue") static let loopPink = Color("LoopPink") static let lemon = Color("Lemon") static let minus = Color("minus") static let darkGray = Color("darkGray") + static let darkRed = Color("DarkRed") + static let darkGreen = Color("DarkGreen") + static let blueComplicationBackground = Color(red: 0.1176470588, green: 0.2352941176, blue: 0.3725490196) + static let header = Color("Header") + static let homeBackground = Color("HomeBackground") + static let popUpGray = Color("PopUpGray") } diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift new file mode 100644 index 0000000000..ca1f1c9445 --- /dev/null +++ b/FreeAPS/Sources/Models/Configs.swift @@ -0,0 +1,42 @@ +import Foundation +import SwiftUI + +struct DateFilter { + var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate + var today = Calendar.current.startOfDay(for: Date()) as NSDate + var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate + var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate + var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate + var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate +} + +public enum IAPSconfig { + static let padding: CGFloat = 60 + static let iconSize: CGFloat = 20 + static let backgroundOpacity: Double = 0.2 + static let buttonSize: CGFloat = 26 + static let shadowOpacity: CGFloat = 0.75 + static let glassShadowOpacity: CGFloat = 0.6 + static let shadowFraction: CGFloat = 2 +} + +extension Font { + static let buttonFont = Font.custom("TimeButtonFont", fixedSize: 14) // Same as Eventual BG size + static let loopFont = Font.custom("LoopFont", fixedSize: 18) // Loop min ago + static let statusFont = Font.custom("StatusFont", fixedSize: 16) // IOB, COB etc. + static let pumpFont = Font.custom("StatusFont", fixedSize: 15) + static let previewSmall = Font.custom("PreviewSmallFont", fixedSize: 12) + static let previewNormal = Font.custom("PreviewNormalFont", fixedSize: 18) + static let previewHeadline = Font.custom("PreviewHeadlineFont", fixedSize: 20) + static let extraSmall = Font.custom("ExtraSmallFont", fixedSize: 14) + + static let suggestionHeadline = Font.custom("SuggestionHeadlineFont", fixedSize: 20) + static let suggestionError = Font.custom("SuggestionErrorFone", fixedSize: 18) + static let suggestionParts = Font.custom("SuggestionPartsFont", fixedSize: 17) + static let suggestionSmallParts = Font.custom("SuggestionSmallPartsFont", fixedSize: 16) + + static let glucoseFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 45) + static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 24) + static let bolusProgressStopFont = Font.custom("BolusProgressStop", fixedSize: 24) + static let bolusProgressFont = Font.custom("BolusProgress", fixedSize: 20) +} diff --git a/FreeAPS/Sources/Models/DateFilter.swift b/FreeAPS/Sources/Models/DateFilter.swift deleted file mode 100644 index 466b699f98..0000000000 --- a/FreeAPS/Sources/Models/DateFilter.swift +++ /dev/null @@ -1,11 +0,0 @@ - -import Foundation - -struct DateFilter { - var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate - var today = Calendar.current.startOfDay(for: Date()) as NSDate - var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate - var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate - var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate - var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate -} diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 0c85e089ad..c56d70700e 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -51,6 +51,7 @@ struct FreeAPSSettings: JSON, Equatable { var fattyMealFactor: Decimal = 0.7 var displayPredictions: Bool = true var useLiveActivity: Bool = false + var useTargetButton: Bool = false } extension FreeAPSSettings: Decodable { @@ -264,6 +265,10 @@ extension FreeAPSSettings: Decodable { settings.useLiveActivity = useLiveActivity } + if let useTargetButton = try? container.decode(Bool.self, forKey: .useTargetButton) { + settings.useTargetButton = useTargetButton + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index b76d833526..9a1aa13978 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -108,7 +108,6 @@ extension Bolus { deltaBG = delta } - // CALCULATIONS FOR THE BOLUS CALCULATOR func calculateInsulin() -> Decimal { var conversion: Decimal = 1.0 if units == .mmolL { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 6c3e983600..a28006c364 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -20,6 +20,7 @@ extension Bolus { } @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -125,11 +126,12 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: false, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) } + .focused($isFocused) .onChange(of: state.amount) { newValue in if newValue > state.maxBolus { exceededMaxBolus = true @@ -138,7 +140,21 @@ extension Bolus { } } - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { @@ -162,8 +178,10 @@ extension Bolus { label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } + + // Section {} footer: {}.padding(.bottom, 30) } - .blur(radius: showInfo ? 3 : 0) + .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems( diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 8329f93ec3..0af99e7106 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -16,6 +16,7 @@ extension Bolus { @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -81,7 +82,6 @@ extension Bolus { } }.contentShape(Rectangle()) } - HStack { Text("Amount") Spacer() @@ -89,13 +89,28 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: true, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } + .focused($isFocused) - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 8b8ac87a84..fc160f3c73 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -83,10 +83,9 @@ extension CGM { Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose) } } - .onAppear(perform: configureView) .navigationTitle("CGM") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $setupCGM) { if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm { CGMSettingsView( diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9e3fe377c1..b3f1dcd231 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -192,7 +192,7 @@ extension DataTable { } .onAppear(perform: configureView) .navigationTitle("Add Glucose") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: { showManualGlucose = false })) } } diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 35bce423c9..1094544a48 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -67,16 +67,16 @@ extension Dynamic { Toggle("Adjust basal", isOn: $state.tddAdjBasal) } } header: { Text("Settings") } - - Section { - HStack { - Text("Threshold Setting") - Spacer() - DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) - Text(state.unit.rawValue) - } - } header: { Text("Safety") } } + + Section { + HStack { + Text("Threshold Setting") + Spacer() + DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) + Text(state.unit.rawValue) + } + } header: { Text("Safety") } } .onAppear(perform: configureView) .navigationBarTitle("Dynamic ISF") diff --git a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift index e0ea9544c3..3b8f5af42f 100644 --- a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift +++ b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift @@ -20,4 +20,5 @@ protocol HomeProvider: Provider { func pumpReservoir() -> Decimal? func tempTarget() -> TempTarget? func announcement(_ hours: Int) -> [Announcement] + func overrides() -> [Override] } diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index fb846a2fd0..8ab9f613d2 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -15,6 +15,14 @@ extension Home { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } + func overrides() -> [Override] { + OverrideStorage().fetchOverrides(interval: DateFilter().day) + } + + func overrideHistory() -> [OverrideHistory] { + OverrideStorage().fetchOverrideHistory(interval: DateFilter().day) + } + var enactedSuggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 3f32ab5680..e2473e5440 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -60,7 +60,14 @@ extension Home { @Published var displayYgridLines: Bool = false @Published var thresholdLines: Bool = false @Published var timeZone: TimeZone? - @Published var hours: Int16 = 6 + @Published var hours: Int = 6 + @Published var totalBolus: Decimal = 0 + @Published var isStatusPopupPresented: Bool = false + @Published var readings: [Readings] = [] + @Published var standing: Bool = false + @Published var preview: Bool = true + @Published var useTargetButton: Bool = false + @Published var overrideHistory: [OverrideHistory] = [] let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -77,8 +84,10 @@ extension Home { setupReservoir() setupAnnouncements() setupCurrentPumpTimezone() + setupOverrideHistory() suggestion = provider.suggestion + overrideHistory = provider.overrideHistory() uploadStats = settingsManager.settings.uploadStats enactedSuggestion = provider.enactedSuggestion units = settingsManager.settings.units @@ -98,6 +107,8 @@ extension Home { displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours broadcaster.register(GlucoseObserver.self, observer: self) broadcaster.register(SuggestionObserver.self, observer: self) @@ -110,7 +121,7 @@ extension Home { broadcaster.register(EnactedSuggestionObserver.self, observer: self) broadcaster.register(PumpBatteryObserver.self, observer: self) broadcaster.register(PumpReservoirObserver.self, observer: self) - + broadcaster.register(OverrideObserver.self, observer: self) animatedBackground = settingsManager.settings.animatedBackground timer.eventHandler = { @@ -209,12 +220,8 @@ extension Home { } func cancelProfile() { - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } + OverrideStorage().cancelProfile() + setupOverrideHistory() } private func setupGlucose() { @@ -222,6 +229,7 @@ extension Home { guard let self = self else { return } self.isManual = self.provider.manualGlucose(hours: self.filteredHours) self.glucose = self.provider.filteredGlucose(hours: self.filteredHours) + self.readings = CoreDataStorage().fetchGlucose(interval: DateFilter().today) self.recentGlucose = self.glucose.last if self.glucose.count >= 2 { self.glucoseDelta = (self.recentGlucose?.glucose ?? 0) - (self.glucose[self.glucose.count - 2].glucose ?? 0) @@ -311,6 +319,13 @@ extension Home { } } + private func setupOverrideHistory() { + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.overrideHistory = self.provider.overrideHistory() + } + } + private func setupAnnouncements() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } @@ -403,7 +418,8 @@ extension Home.StateModel: EnactedSuggestionObserver, PumpBatteryObserver, PumpReservoirObserver, - PumpTimeZoneObserver + PumpTimeZoneObserver, + OverrideObserver { func glucoseDidUpdate(_: [BloodGlucose]) { setupGlucose() @@ -413,6 +429,11 @@ extension Home.StateModel: self.suggestion = suggestion carbsRequired = suggestion.carbsReq setStatusTitle() + setupOverrideHistory() + } + + func overrideHistoryDidUpdate(_: [OverrideHistory]) { + setupOverrideHistory() } func settingsDidChange(_ settings: FreeAPSSettings) { @@ -429,8 +450,10 @@ extension Home.StateModel: displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks - + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours setupGlucose() + setupOverrideHistory() } func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) { @@ -459,6 +482,7 @@ extension Home.StateModel: func enactedSuggestionDidUpdate(_ suggestion: Suggestion) { enactedSuggestion = suggestion setStatusTitle() + setupOverrideHistory() } func pumpBatteryDidChange(_: Battery) { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index d574d535d6..679d34895d 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -20,17 +20,23 @@ struct AnnouncementDot { let note: String } +struct OverrideStruct { + let start: Date + let end: Date + let glucose: Int +} + typealias GlucoseYRange = (minValue: Int, minY: CGFloat, maxValue: Int, maxY: CGFloat) struct MainChartView: View { private enum Config { static let endID = "End" - static let basalHeight: CGFloat = 80 + static let basalHeight: CGFloat = 50 static let topYPadding: CGFloat = 20 - static let bottomYPadding: CGFloat = 80 + static let bottomYPadding: CGFloat = 20 static let minAdditionalWidth: CGFloat = 150 static let maxGlucose = 270 - static let minGlucose = 45 + static let minGlucose = 0 // 45 static let yLinesCount = 5 static let glucoseScale: CGFloat = 2 // default 2 static let bolusSize: CGFloat = 8 @@ -72,10 +78,12 @@ struct MainChartView: View { @Binding var smooth: Bool @Binding var highGlucose: Decimal @Binding var lowGlucose: Decimal - @Binding var screenHours: Int16 + @Binding var screenHours: Int @Binding var displayXgridLines: Bool @Binding var displayYgridLines: Bool @Binding var thresholdLines: Bool + @Binding var triggerUpdate: Bool + @Binding var overrideHistory: [OverrideHistory] @State var didAppearTrigger = false @State private var glucoseDots: [CGRect] = [] @@ -86,23 +94,22 @@ struct MainChartView: View { @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @State private var bolusDots: [DotInfo] = [] + @State private var bolusPath = Path() @State private var tempBasalPath = Path() @State private var regularBasalPath = Path() @State private var tempTargetsPath = Path() + @State private var overridesPath = Path() @State private var suspensionsPath = Path() @State private var carbsDots: [DotInfo] = [] + @State private var carbsPath = Path() @State private var fpuDots: [DotInfo] = [] + @State private var fpuPath = Path() @State private var glucoseYRange: GlucoseYRange = (0, 0, 0, 0) + @State private var offset: CGFloat = 0 @State private var cachedMaxBasalRate: Decimal? - private var zoomScale: Double { - 1.0 / Double(screenHours) - } + @State private var legends: Bool = false - private let calculationQueue = DispatchQueue( - label: "MainChartView.calculationQueue", - qos: .userInteractive, - attributes: .concurrent - ) + private let calculationQueue = DispatchQueue(label: "MainChartView.calculationQueue") private var dateFormatter: DateFormatter { let formatter = DateFormatter() @@ -149,14 +156,21 @@ struct MainChartView: View { return formatter } + private var fetchedTargetFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if units == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + return formatter + } + @Environment(\.horizontalSizeClass) var hSizeClass @Environment(\.verticalSizeClass) var vSizeClass - // MARK: - Views - var body: some View { GeometryReader { geo in - ZStack(alignment: .leading) { + ZStack { yGridView(fullSize: geo.size) mainScrollView(fullSize: geo.size) glucoseLabelsView(fullSize: geo.size) @@ -167,6 +181,9 @@ struct MainChartView: View { .onChange(of: vSizeClass) { _ in update(fullSize: geo.size) } + .onChange(of: screenHours) { _ in + update(fullSize: geo.size) + } .onReceive( Foundation.NotificationCenter.default .publisher(for: UIDevice.orientationDidChangeNotification) @@ -174,35 +191,93 @@ struct MainChartView: View { update(fullSize: geo.size) } } + .onTapGesture { + legends.toggle() + } + } + + var legendPanel: some View { + ZStack { + HStack { + if legends { + Group { + Circle().fill(Color.insulin).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("IOB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Circle().fill(Color.zt).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("ZT") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Circle().fill(Color.loopYellow).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("COB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Circle().fill(Color.uam).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("UAM") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } else { + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } + } + .padding(.bottom, 20) + } } private func mainScrollView(fullSize: CGSize) -> some View { - ScrollViewReader { scroll in - ScrollView(.horizontal, showsIndicators: false) { + ScrollView(.horizontal, showsIndicators: false) { + ScrollViewReader { scroll in ZStack(alignment: .top) { tempTargetsView(fullSize: fullSize).drawingGroup() + overridesView(fullSize: fullSize).drawingGroup() basalView(fullSize: fullSize).drawingGroup() + legendPanel.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, legends ? 20 : 70).padding(.bottom, 20) mainView(fullSize: fullSize).id(Config.endID) .drawingGroup() - } - } - .onChange(of: glucose) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: suggestion) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: tempBasals) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: screenHours) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onAppear { - // add trigger to the end of main queue - DispatchQueue.main.async { - scroll.scrollTo(Config.endID, anchor: .trailing) - didAppearTrigger = true + .onChange(of: glucose) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: suggestion) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: tempBasals) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: screenHours) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + + .onAppear { + // add trigger to the end of main queue + DispatchQueue.main.async { + scroll.scrollTo(Config.endID, anchor: .trailing) + didAppearTrigger = true + } + } } } } @@ -261,18 +336,16 @@ struct MainChartView: View { private func basalView(fullSize: CGSize) -> some View { ZStack { - tempBasalPath.scale(x: zoomScale, anchor: .zero).fill(Color.basal.opacity(0.5)) - tempBasalPath.scale(x: zoomScale, anchor: .zero).stroke(Color.insulin, lineWidth: 1) - regularBasalPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) - suspensionsPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) - suspensionsPath.scale(x: zoomScale, anchor: .zero).fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) + tempBasalPath.fill(Color.basal.opacity(0.5)) + tempBasalPath.stroke(Color.insulin, lineWidth: 1) + regularBasalPath.stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) + suspensionsPath.stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) + suspensionsPath.fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) } .scaleEffect(x: 1, y: -1) - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) .frame(maxHeight: Config.basalHeight) - .background(Color.secondary.opacity(0.1)) + .background(Color.clear) .onChange(of: tempBasals) { _ in calculateBasalPoints(fullSize: fullSize) } @@ -291,51 +364,24 @@ struct MainChartView: View { } private func mainView(fullSize: CGSize) -> some View { - VStack { - ZStack { - xGridView(fullSize: fullSize) - carbsView(fullSize: fullSize) - fpuView(fullSize: fullSize) - bolusView(fullSize: fullSize) - if smooth { unSmoothedGlucoseView(fullSize: fullSize) } - glucoseView(fullSize: fullSize) - manualGlucoseView(fullSize: fullSize) - manualGlucoseCenterView(fullSize: fullSize) - announcementView(fullSize: fullSize) - predictionsView(fullSize: fullSize) + Group { + VStack { + ZStack { + xGridView(fullSize: fullSize) + carbsView(fullSize: fullSize) + fpuView(fullSize: fullSize) + bolusView(fullSize: fullSize) + if smooth { unSmoothedGlucoseView(fullSize: fullSize) } + glucoseView(fullSize: fullSize) + manualGlucoseView(fullSize: fullSize) + manualGlucoseCenterView(fullSize: fullSize) + announcementView(fullSize: fullSize) + predictionsView(fullSize: fullSize) + } + timeLabelsView(fullSize: fullSize) } - timeLabelsView(fullSize: fullSize) } - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) - } - - /// returns the width of the full chart view including predictions for the current `screenHours` - private func glucoseAndAdditionalWidth(fullSize: CGSize) -> CGFloat { - // fullGlucoseWidth returns the width scaled to 1h screen hours. Scale it down to screenHours - fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(screenHours) - + additionalWidthScaled(viewWidth: fullSize.width) - } - - /// returns the additional width for predictions, scaled to `screenHours` - private func additionalWidthScaled(viewWidth: CGFloat) -> CGFloat { - guard let predictions = suggestion?.predictions, - let deliveredAt = suggestion?.deliverAt, - let last = glucose.last - else { - return Config.minAdditionalWidth - } - - let iob = predictions.iob?.count ?? 0 - let zt = predictions.zt?.count ?? 0 - let cob = predictions.cob?.count ?? 0 - let uam = predictions.uam?.count ?? 0 - let max = [iob, zt, cob, uam].max() ?? 0 - - let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) - let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) - let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) / CGFloat(screenHours) - - return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) } @Environment(\.colorScheme) var colorScheme @@ -345,19 +391,20 @@ struct MainChartView: View { return ZStack { Path { path in for hour in 0 ..< hours + hours { - let x = ( - firstHourPosition(viewWidth: fullSize.width) + + if screenHours < 12 || hour % 2 == 0 { + // only show every second line if screenHours is too big + let x = firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale - path.move(to: CGPoint(x: x, y: 0)) - path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + path.move(to: CGPoint(x: x, y: 0)) + path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + } } } .stroke(useColour, lineWidth: 0.15) Path { path in // vertical timeline - let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) * zoomScale + let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) path.move(to: CGPoint(x: x, y: 0)) path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) } @@ -371,19 +418,21 @@ struct MainChartView: View { private func timeLabelsView(fullSize: CGSize) -> some View { let format = screenHours > 6 ? date24Formatter : dateFormatter return ZStack { - // X time labels - ForEach(0 ..< hours + hours, id: \.self) { hour in - Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) - .font(.caption) - .position( - x: ( - firstHourPosition(viewWidth: fullSize.width) + + ForEach(0 ..< hours + hours) { hour in + if screenHours >= 12 && hour % 2 == 1 { + // only show every second time label if screenHours is too big + EmptyView() + } else { + Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) + .font(.caption) + .position( + x: firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * - CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale, - y: 10.0 - ) - .foregroundColor(.secondary) + CGFloat(hour) * CGFloat(1.hours.timeInterval), + y: 10.0 + ) + .foregroundColor(.secondary) + } } }.frame(maxHeight: 20) } @@ -391,7 +440,7 @@ struct MainChartView: View { private func glucoseView(fullSize: CGSize) -> some View { Path { path in for rect in glucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.loopGreen) @@ -409,7 +458,7 @@ struct MainChartView: View { private func manualGlucoseView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.gray) @@ -427,9 +476,7 @@ struct MainChartView: View { private func announcementView(fullSize: CGSize) -> some View { ZStack { ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in - let scaledRect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: scaledRect.midX + 5, y: scaledRect.maxY - Config.owlOffset) + let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) let type: String = info.note.contains("true") ? Command.open : @@ -458,7 +505,7 @@ struct MainChartView: View { private func manualGlucoseCenterView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDotsCenter { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.red) @@ -481,9 +528,8 @@ struct MainChartView: View { Path { path in var lines: [CGPoint] = [] for rect in unSmoothedGlucoseDots { - let scaled = scaleCenter(rect: rect) - lines.append(CGPoint(x: scaled.midX, y: scaled.midY)) - path.addEllipse(in: scaled) + lines.append(CGPoint(x: rect.midX, y: rect.midY)) + path.addEllipse(in: rect) } path.addLines(lines) } @@ -501,21 +547,13 @@ struct MainChartView: View { private func bolusView(fullSize: CGSize) -> some View { ZStack { - let bolusPath = Path { path in - for dot in bolusDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - bolusPath .fill(Color.insulin) bolusPath .stroke(Color.primary, lineWidth: 0.5) ForEach(bolusDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.maxY + 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.maxY + 8) return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -531,21 +569,13 @@ struct MainChartView: View { private func carbsView(fullSize: CGSize) -> some View { ZStack { - let carbsPath = Path { path in - for dot in carbsDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - carbsPath .fill(Color.loopYellow) carbsPath .stroke(Color.primary, lineWidth: 0.5) ForEach(carbsDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.minY - 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -561,12 +591,6 @@ struct MainChartView: View { private func fpuView(fullSize: CGSize) -> some View { ZStack { - let fpuPath = Path { path in - for dot in fpuDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - fpuPath .fill(.orange.opacity(0.5)) fpuPath @@ -583,10 +607,8 @@ struct MainChartView: View { private func tempTargetsView(fullSize: CGSize) -> some View { ZStack { tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .fill(Color.tempBasal.opacity(0.5)) tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .stroke(Color.basal.opacity(0.5), lineWidth: 1) } .onChange(of: glucose) { _ in @@ -600,37 +622,53 @@ struct MainChartView: View { } } - private func scale(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.origin.x * zoomScale, y: rect.origin.y), size: rect.size) - } - - private func scaleCenter(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.midX * zoomScale - rect.width / 2, y: rect.origin.y), size: rect.size) + private func overridesView(fullSize: CGSize) -> some View { + ZStack { + overridesPath + .fill(Color.purple.opacity(0.4)) + overridesPath + .stroke(Color.purple.opacity(0.7), lineWidth: 0.5) + } + .onChange(of: glucose) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: suggestion) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: overrideHistory) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: triggerUpdate) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + calculateOverridesRects(fullSize: fullSize) + } } private func predictionsView(fullSize: CGSize) -> some View { Group { Path { path in for rect in predictionDots[.iob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.insulin) Path { path in for rect in predictionDots[.cob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.loopYellow) Path { path in for rect in predictionDots[.zt] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.zt) Path { path in for rect in predictionDots[.uam] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.uam) } @@ -642,8 +680,6 @@ struct MainChartView: View { // MARK: - Calculations -/// some of the calculations done here can take quite long (100ms+) and are not able to update data at a fast rate -/// therefore we stick to the 1h screen window for these calculations and scale the results as needed to `screenHours` which has little extra overhead and enables changing the screen hours with no lag extension MainChartView { private func update(fullSize: CGSize) { calculatePredictionDots(fullSize: fullSize, type: .iob) @@ -659,6 +695,7 @@ extension MainChartView { calculateCarbsDots(fullSize: fullSize) calculateFPUsDots(fullSize: fullSize) calculateTempTargetsRects(fullSize: fullSize) + calculateOverridesRects(fullSize: fullSize) calculateBasalPoints(fullSize: fullSize) calculateSuspensions(fullSize: fullSize) } @@ -760,8 +797,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.amount ?? 0) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { bolusDots = dots + bolusPath = path } } } @@ -780,8 +824,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { carbsDots = dots + carbsPath = path } } } @@ -800,8 +851,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { fpuDots = dots + fpuPath = path } } } @@ -876,8 +934,9 @@ extension MainChartView { path.addLine(to: CGPoint(x: lastPoint.x, y: Config.basalHeight)) path.addLine(to: CGPoint(x: 0, y: Config.basalHeight)) } - let endDateTime = dayAgoTime + 12.hours - .timeInterval + 12.hours + let adjustForOptionalExtraHours = screenHours > 12 ? screenHours - 12 : 0 + let endDateTime = dayAgoTime + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours + .timeInterval + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours .timeInterval let autotunedBasalPoints = findRegularBasalPoints( timeBegin: dayAgoTime, @@ -937,7 +996,8 @@ extension MainChartView { .map { self.timeToXCoordinate($0.timestamp.timeIntervalSince1970, fullSize: fullSize) } let x0 = self.timeToXCoordinate(event.timestamp.timeIntervalSince1970, fullSize: fullSize) - let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + 275 + let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + self + .additionalWidth(viewWidth: fullSize.width) return CGRect(x: x0, y: 0, width: x1 - x0, height: Config.basalHeight * 0.7) } @@ -1001,17 +1061,85 @@ extension MainChartView { return res } } - let path = Path { path in path.addRects(rects) } - DispatchQueue.main.async { tempTargetsPath = path } } } + private func calculateOverridesRects(fullSize: CGSize) { + calculationQueue.async { + let latest = OverrideStorage().fetchLatestOverride().first + let rects = overrideHistory.compactMap { each -> CGRect in + let duration = each.duration + let xStart = timeToXCoordinate(each.date!.timeIntervalSince1970, fullSize: fullSize) + let xEnd = timeToXCoordinate( + each.date!.addingTimeInterval(Int(duration).minutes.timeInterval).timeIntervalSince1970, + fullSize: fullSize + ) + let y = glucoseToYCoordinate(Int(each.target), fullSize: fullSize) + return CGRect( + x: xStart, + y: y - 3, + width: xEnd - xStart, + height: 6 + ) + } + if latest?.enabled ?? false { + var old = Array(rects) + if (latest?.duration ?? 0) != 0 { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(Int(latest?.duration ?? 0).minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate( + Int(Double(latest?.target ?? 100)), + fullSize: fullSize + ), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } else { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(60.minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } + } + let path = Path { path in + path.addRects(rects) + } + DispatchQueue.main.async { + overridesPath = path + } + } + } + private func findRegularBasalPoints( timeBegin: TimeInterval, timeEnd: TimeInterval, @@ -1083,11 +1211,32 @@ extension MainChartView { } private func fullGlucoseWidth(viewWidth: CGFloat) -> CGFloat { - viewWidth * CGFloat(hours) + viewWidth * CGFloat(hours) / CGFloat(min(max(screenHours, 2), 24)) + } + + private func additionalWidth(viewWidth: CGFloat) -> CGFloat { + guard let predictions = suggestion?.predictions, + let deliveredAt = suggestion?.deliverAt, + let last = glucose.last + else { + return Config.minAdditionalWidth + } + + let iob = predictions.iob?.count ?? 0 + let zt = predictions.zt?.count ?? 0 + let cob = predictions.cob?.count ?? 0 + let uam = predictions.uam?.count ?? 0 + let max = [iob, zt, cob, uam].max() ?? 0 + + let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) + let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) + let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) + + return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) } private func oneSecondStep(viewWidth: CGFloat) -> CGFloat { - viewWidth / CGFloat(1.hours.timeInterval) + viewWidth / (CGFloat(min(max(screenHours, 2), 24)) * CGFloat(1.hours.timeInterval)) } private func maxPredValue() -> Int? { @@ -1154,15 +1303,6 @@ extension MainChartView { return x } - /// inverse of `timeToXCoordinate` - private func xCoordinateToTime(x: CGFloat, fullSize: CGSize) -> TimeInterval { - let stepXFraction = fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(hours.hours.timeInterval) - let xx = x / stepXFraction - let xOffset = -Date().addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970 - let time = xx - xOffset - return time - } - private func glucoseToYCoordinate(_ glucoseValue: Int, fullSize: CGSize) -> CGFloat { let topYPaddint = Config.topYPadding + Config.basalHeight let bottomYPadding = Config.bottomYPadding diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 584c8b467d..1c2844b6a7 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -9,6 +9,14 @@ struct CurrentGlucoseView: View { @Binding var lowGlucose: Decimal @Binding var highGlucose: Decimal + @State private var rotationDegrees: Double = 0.0 + + enum Config { + static let size: CGFloat = 100 + } + + @Environment(\.colorScheme) var colorScheme + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -45,47 +53,54 @@ struct CurrentGlucoseView: View { } var body: some View { - VStack(alignment: .center) { - HStack { - Text( - (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose - .map { - glucoseFormatter - .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } - ?? "--" - ) - .font(.title).fontWeight(.bold) - .foregroundColor(alarm == nil ? colorOfGlucose : .loopRed) - - image - } - HStack { - let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 - let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" - Text( - minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( - text + " " + - NSLocalizedString("min", comment: "Short form for minutes") + " " + ZStack { + VStack(alignment: .center) { + // HStack { + ZStack { + Text( + (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose + .map { + glucoseFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } + ?? "--" ) - ) - .font(.caption2).foregroundColor(.secondary) + .font(.glucoseFont) + .foregroundColor(alarm == nil ? .primary : .loopRed) + .frame(maxWidth: .infinity, alignment: .center) - Text( - delta - .map { - deltaFormatter.string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! - } ?? "--" - ) - .font(.caption2).foregroundColor(.secondary) - }.frame(alignment: .top) + HStack(spacing: 20) { + image + .font(.system(size: 25)) + VStack { + Text( + delta + .map { + deltaFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! + } ?? "--" + ) + HStack { + let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 + let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" + Text( + minutesAgo <= 1 ? "" : ( + text + " " + + NSLocalizedString("min", comment: "Short form for minutes") + " " + ) + ) + }.offset(x: 7, y: 0) + } + .font(.extraSmall).foregroundStyle(.secondary) + }.frame(maxWidth: .infinity, alignment: .trailing).padding(.trailing, 50) + } + } } } - var image: Image { + var image: some View { guard let direction = recentGlucose?.direction else { return Image(systemName: "arrow.left.and.right") } - switch direction { case .doubleUp, .singleUp, @@ -101,28 +116,10 @@ struct CurrentGlucoseView: View { .singleDown, .tripleDown: return Image(systemName: "arrow.down") - case .none, .notComputable, .rateOutOfRange: return Image(systemName: "arrow.left.and.right") } } - - var colorOfGlucose: Color { - let whichGlucose = recentGlucose?.glucose ?? 0 - - guard lowGlucose < highGlucose else { return .primary } - - switch whichGlucose { - case 0 ..< Int(lowGlucose): - return .loopRed - case Int(lowGlucose) ..< Int(highGlucose): - return .loopGreen - case Int(highGlucose)...: - return .loopYellow - default: - return .loopYellow - } - } } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index b92a98eb40..e1211201f4 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -21,38 +21,37 @@ struct LoopView: View { return formatter } - private let rect = CGRect(x: 0, y: 0, width: 28, height: 28) + @Environment(\.colorScheme) var colorScheme var body: some View { - VStack(alignment: .center) { - ZStack { - Circle() - .strokeBorder(color, lineWidth: 5) - .frame(width: rect.width, height: rect.height, alignment: .bottom) - .mask(mask(in: rect).fill(style: FillStyle(eoFill: true))) - if isLooping { - ProgressView() + VStack { + LoopEllipse() + .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) + .overlay { + let textColor: Color = .secondary + HStack { + ZStack { + if !isLooping, actualSuggestion?.timestamp != nil { + if minutesAgo > 1440 { + Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) + } else { + let timeString = "\(minutesAgo) " + + NSLocalizedString("min", comment: "Minutes ago since last loop") + Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + } + } + if isLooping { + ProgressView() + } + } + } } - } - if isLooping { - Text("looping").font(.caption2) - } else if manualTempBasal { - Text("Manual").font(.caption2) - } else if actualSuggestion?.timestamp != nil { - Text(timeString).font(.caption2) - .foregroundColor(.secondary) - } else { - Text("--").font(.caption2).foregroundColor(.secondary) - } } } - private var timeString: String { + private var minutesAgo: Int { let minAgo = Int((timerDate.timeIntervalSince(lastLoopDate) - Config.lag) / 60) + 1 - if minAgo > 1440 { - return "--" - } - return "\(minAgo) " + NSLocalizedString("min", comment: "Minutes ago since last loop") + return minAgo } private var color: Color { @@ -64,26 +63,18 @@ struct LoopView: View { } let delta = timerDate.timeIntervalSince(lastLoopDate) - Config.lag - if delta <= 5.minutes.timeInterval { + if delta <= 8.minutes.timeInterval { guard actualSuggestion?.deliverAt != nil else { return .loopYellow } return .loopGreen - } else if delta <= 10.minutes.timeInterval { + } else if delta <= 12.minutes.timeInterval { return .loopYellow } else { return .loopRed } } - func mask(in rect: CGRect) -> Path { - var path = Rectangle().path(in: rect) - if !closedLoop || manualTempBasal { - path.addPath(Rectangle().path(in: CGRect(x: rect.minX, y: rect.midY - 5, width: rect.width, height: 10))) - } - return path - } - private var actualSuggestion: Suggestion? { if closedLoop, enactedSuggestion?.recieved == true { return enactedSuggestion ?? suggestion diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift new file mode 100644 index 0000000000..383a796539 --- /dev/null +++ b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift @@ -0,0 +1,255 @@ +import Charts +import SwiftUI + +struct PreviewChart: View { + @Binding var readings: [Readings] + @Binding var lowLimit: Decimal + @Binding var highLimit: Decimal + + @Environment(\.colorScheme) var colorScheme + + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + + var body: some View { + let fetched = previewTir() + + struct TIRinPercent: Identifiable { + let type: String + let group: String + let percentage: Decimal + let id: UUID + } + + let separator: Decimal = 4 + + var data: [TIRinPercent] = [ + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very Low", + comment: "" + ), + percentage: fetched[4].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Low", + comment: "" + ), + percentage: fetched[0].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString("In Range", comment: ""), + percentage: fetched[1].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "High", + comment: "" + ), + percentage: fetched[2].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very High", + comment: "" + ), + percentage: fetched[3].decimal, + id: UUID() + ) + ] + + for index in 0 ..< 3 { + if data[index].percentage == 0 { + data.remove(at: index + 1) + } + } + + return HStack { + VStack { + Chart(data) { item in + BarMark( + x: .value("TIR", item.type), + y: .value("Percentage", item.percentage), + width: .fixed(60) + ) + .foregroundStyle(by: .value("Group", item.group)) + .annotation(position: .trailing) { + if item.group == NSLocalizedString("In Range", comment: ""), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + }.font(.previewNormal) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Low", + comment: "" + ), item.percentage > 0.0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: -5) + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very Low", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: 5) + .font(.previewSmall) + .padding(.leading, 20) + } + } + } + .chartForegroundStyleScale([ + NSLocalizedString( + "Low", + comment: "" + ): .red, + NSLocalizedString("In Range", comment: ""): .darkGreen, + NSLocalizedString( + "High", + comment: "" + ): .yellow, + NSLocalizedString( + "Very High", + comment: "" + ): .red, + NSLocalizedString( + "Very Low", + comment: "" + ): .darkRed, + "Separator": colorScheme == .dark ? .black : .white + ]) + .chartXAxis(.hidden) + .chartYAxis(.hidden) + .chartLegend(.hidden) + .padding(.bottom, 15) + .frame(maxWidth: UIScreen.main.bounds.width / 5, alignment: .leading) + }.frame(maxHeight: 200) + + }.padding(.top, 20).padding(.leading, 20) + } + + private func previewTir() -> [(decimal: Decimal, string: String)] { + let hypoLimit = Int(lowLimit) + let hyperLimit = Int(highLimit) + + let glucose = readings + + let justGlucoseArray = glucose.compactMap({ each in Int(each.glucose as Int16) }) + let totalReadings = justGlucoseArray.count + + let hyperArray = glucose.filter({ $0.glucose >= hyperLimit }) + let hyperReadings = hyperArray.compactMap({ each in each.glucose as Int16 }).count + var hyperPercentage = Double(hyperReadings) / Double(totalReadings) * 100 + + let hypoArray = glucose.filter({ $0.glucose <= hypoLimit }) + let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count + var hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + + let veryHighArray = glucose.filter({ $0.glucose > 197 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 60 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + + hypoPercentage -= veryLowPercentage + hyperPercentage -= veryHighPercentage + + let tir = 100 - (hypoPercentage + hyperPercentage + veryHighPercentage + veryLowPercentage) + + var array: [(decimal: Decimal, string: String)] = [] + array.append((decimal: Decimal(hypoPercentage), string: "Low")) + array.append((decimal: Decimal(tir), string: "NormaL")) + array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) + + return array + } +} diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index e809049b82..148af785e9 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -6,7 +6,10 @@ struct PumpView: View { @Binding var name: String @Binding var expiresAtDate: Date? @Binding var timerDate: Date - @Binding var timeZone: TimeZone? + + @State var state: Home.StateModel + + @Environment(\.colorScheme) var colorScheme private var reservoirFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -21,99 +24,123 @@ struct PumpView: View { return formatter } + private var numberFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var dateFormatter: DateFormatter { + let dateFormatter = DateFormatter() + dateFormatter.timeStyle = .short + return dateFormatter + } + var body: some View { - VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 10) { + if let battery = battery, expiresAtDate == nil { + let percent = (battery.percent ?? 100) > 80 ? 100 : (battery.percent ?? 100) < 81 && + (battery.percent ?? 100) > + 60 ? 75 : (battery.percent ?? 100) < 61 && (battery.percent ?? 100) > 40 ? 50 : 25 + Image(systemName: "battery.\(percent)") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 15) + .foregroundColor(batteryColor) + } + if let reservoir = reservoir { + let fill = CGFloat(min(max(Double(reservoir) / 200.0, 0.15), Double(reservoir) / 200.0, 0.9)) * 12 HStack { - Image(systemName: "drop.fill") + Image("vial") .resizable() .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) + .frame(maxWidth: 10) .foregroundColor(reservoirColor) + .offset(x: 0, y: -3) + .overlay { + UnevenRoundedRectangle(cornerRadii: .init(bottomLeading: 2, bottomTrailing: 2)) + .fill(Color.insulin) + .frame(maxWidth: 8.8, maxHeight: fill) + .frame(maxHeight: .infinity, alignment: .bottom) + .offset(x: -0.09, y: -3.22) + } if reservoir == 0xDEAD_BEEF { - Text("50+ " + NSLocalizedString("U", comment: "Insulin unit")).font(.footnote) - .fontWeight(.bold) + HStack(spacing: 0) { + Text("50+ ").font(.statusFont).bold() + Text(NSLocalizedString("U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } else { - Text( - reservoirFormatter - .string(from: reservoir as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - } - - if let timeZone = timeZone, timeZone.secondsFromGMT() != TimeZone.current.secondsFromGMT() { - Image(systemName: "clock.badge.exclamationmark.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 13) - .symbolRenderingMode(.palette) - .foregroundStyle(.red, Color(.warning)) - .padding(.bottom, 10) + HStack(spacing: 0) { + Text( + reservoirFormatter + .string(from: reservoir as NSNumber)! + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } - }.frame(alignment: .top) - } - if let battery = battery, battery.display ?? false, expiresAtDate == nil { - HStack { - Image(systemName: "battery.100") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(batteryColor) - Text("\(Int(battery.percent ?? 100)) %").font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + }.offset(x: 0, y: 4) + } else { + Text("No Pump").font(.statusFont).foregroundStyle(.secondary) } if let date = expiresAtDate { - HStack { - Image(systemName: "stopwatch.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(timerColor) - Text(remainingTimeString(time: date.timeIntervalSince(timerDate))).font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + HStack(spacing: 2) { + Image("pod_reservoir") + .resizable(resizingMode: .stretch) + .frame(width: IAPSconfig.iconSize * 1.15, height: IAPSconfig.iconSize * 1.6) + .foregroundColor(colorScheme == .dark ? .secondary : .white) + remainingTime(time: date.timeIntervalSince(timerDate)) + .font(.pumpFont) + } } } } - private func remainingTimeString(time: TimeInterval) -> String { - guard time > 0 else { - return NSLocalizedString("Replace pod", comment: "View/Header when pod expired") - } - - var time = time - let days = Int(time / 1.days.timeInterval) - time -= days.days.timeInterval - let hours = Int(time / 1.hours.timeInterval) - time -= hours.hours.timeInterval - let minutes = Int(time / 1.minutes.timeInterval) - - if days >= 1 { - return "\(days)" + NSLocalizedString("d", comment: "abbreviation for days") + " \(hours)" + - NSLocalizedString("h", comment: "abbreviation for hours") - } - - if hours >= 1 { - return "\(hours)" + NSLocalizedString("h", comment: "abbreviation for hours") + private func remainingTime(time: TimeInterval) -> some View { + VStack { + if time > 0 { + let days = Int(time / 1.days.timeInterval) + let hours = Int(time / 1.hours.timeInterval) + let minutes = Int(time / 1.minutes.timeInterval) + if days >= 1 { + HStack(spacing: 0) { + Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("d", comment: "abbreviation for days")) // .foregroundStyle(.secondary) + } + HStack(spacing: 0) { + Text(" \(hours - days * 24)") + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else if hours >= 1 { + HStack(spacing: 0) { + Text("\(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else { + HStack(spacing: 0) { + Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("m", comment: "abbreviation for minutes")) // .foregroundStyle(.secondary) + } + } + } else { + Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) + } } - - return "\(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes") } private var batteryColor: Color { guard let battery = battery, let percent = battery.percent else { return .gray } - switch percent { case ...10: - return .loopRed + return .red case ...20: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } @@ -124,11 +151,11 @@ struct PumpView: View { switch reservoir { case ...10: - return .loopRed + return .red case ...30: - return .loopYellow + return .yellow default: - return .insulin + return .blue } } @@ -141,11 +168,11 @@ struct PumpView: View { switch time { case ...8.hours.timeInterval: - return .loopRed + return .red case ...1.days.timeInterval: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 5802528dac..9027f25469 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -11,24 +11,7 @@ extension Home { @StateObject var state = StateModel() @State var isStatusPopupPresented = false @State var showCancelAlert = false - - struct Buttons: Identifiable { - let label: String - let number: String - var active: Bool - let hours: Int16 - var id: String { label } - } - - @State var timeButtons: [Buttons] = [ - Buttons(label: "2 hours", number: "2", active: false, hours: 2), - Buttons(label: "4 hours", number: "4", active: false, hours: 4), - Buttons(label: "6 hours", number: "6", active: false, hours: 6), - Buttons(label: "12 hours", number: "12", active: false, hours: 12), - Buttons(label: "24 hours", number: "24", active: false, hours: 24) - ] - - let buttonFont = Font.custom("TimeButtonFont", size: 14) + @State var triggerUpdate = false @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme @@ -98,45 +81,6 @@ extension Home { return scene } - @ViewBuilder func header(_ geo: GeometryProxy) -> some View { - HStack(alignment: .bottom) { - Spacer() - cobIobView - Spacer() - glucoseView - Spacer() - pumpView - Spacer() - loopView - Spacer() - } - .frame(maxWidth: .infinity) - .padding(.top, 10 + geo.safeAreaInsets.top) - .padding(.bottom, 10) - .background(Color.gray.opacity(0.3)) - } - - var cobIobView: some View { - VStack(alignment: .leading, spacing: 12) { - HStack { - Text("IOB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .top) - HStack { - Text("COB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" g", comment: "gram of carbs") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .bottom) - } - } - var glucoseView: some View { CurrentGlucoseView( recentGlucose: $state.recentGlucose, @@ -172,7 +116,7 @@ extension Home { name: $state.pumpName, expiresAtDate: $state.pumpExpiresAtDate, timerDate: $state.timerDate, - timeZone: $state.timeZone + state: state ) .onTapGesture { if state.pumpDisplayState != nil { @@ -190,8 +134,9 @@ extension Home { isLooping: $state.isLooping, lastLoopDate: $state.lastLoopDate, manualTempBasal: $state.manualTempBasal - ).onTapGesture { - isStatusPopupPresented = true + ) + .onTapGesture { + state.isStatusPopupPresented.toggle() }.onLongPressGesture { let impactHeavy = UIImpactFeedbackGenerator(style: .heavy) impactHeavy.impactOccurred() @@ -212,209 +157,59 @@ extension Home { comment: "Manual Temp basal" ) } - return rateString + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString + return rateString + " " + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString } var tempTargetString: String? { guard let tempTarget = state.tempTarget else { return nil } - let target = tempTarget.targetBottom ?? 0 - let unitString = targetFormatter.string(from: (tempTarget.targetBottom?.asMmolL ?? 0) as NSNumber) ?? "" - let rawString = (tirFormatter.string(from: (tempTarget.targetBottom ?? 0) as NSNumber) ?? "") + " " + state.units - .rawValue - - var string = "" - if sliderTTpresets.first?.active ?? false { - let hbt = sliderTTpresets.first?.hbt ?? 0 - string = ", " + (tirFormatter.string(from: state.infoPanelTTPercentage(hbt, target) as NSNumber) ?? "") + " %" - } - - let percentString = state - .units == .mmolL ? (unitString + " mmol/L" + string) : (rawString + (string == "0" ? "" : string)) - return tempTarget.displayName + " " + percentString - } - - var overrideString: String? { - guard fetchedPercent.first?.enabled ?? false else { - return nil - } - var percentString = "\((fetchedPercent.first?.percentage ?? 100).formatted(.number)) %" - var target = (fetchedPercent.first?.target ?? 100) as Decimal - let indefinite = (fetchedPercent.first?.indefinite ?? false) - let unit = state.units.rawValue - if state.units == .mmolL { - target = target.asMmolL - } - var targetString = (fetchedTargetFormatter.string(from: target as NSNumber) ?? "") + " " + unit - if tempTargetString != nil || target == 0 { targetString = "" } - percentString = percentString == "100 %" ? "" : percentString - - let duration = (fetchedPercent.first?.duration ?? 0) as Decimal - let addedMinutes = Int(duration) - let date = fetchedPercent.first?.date ?? Date() - var newDuration: Decimal = 0 - - if date.addingTimeInterval(addedMinutes.minutes.timeInterval) > Date() { - newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes) - } - - var durationString = indefinite ? - "" : newDuration >= 1 ? - (newDuration.formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " min") : - ( - newDuration > 0 ? ( - (newDuration * 60).formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " s" - ) : - "" - ) - - let smbToggleString = (fetchedPercent.first?.smbIsOff ?? false) ? " \u{20e0}" : "" - var comma1 = ", " - var comma2 = comma1 - var comma3 = comma1 - if targetString == "" || percentString == "" { comma1 = "" } - if durationString == "" { comma2 = "" } - if smbToggleString == "" { comma3 = "" } - - if percentString == "", targetString == "" { - comma1 = "" - comma2 = "" - } - if percentString == "", targetString == "", smbToggleString == "" { - durationString = "" - comma1 = "" - comma2 = "" - comma3 = "" - } - if durationString == "" { - comma2 = "" - } - if smbToggleString == "" { - comma3 = "" - } - - if durationString == "", !indefinite { - return nil - } - return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + return tempTarget.displayName } var infoPanel: some View { - HStack(alignment: .center) { - if state.pumpSuspended { - Text("Pump suspended") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGray) - .padding(.leading, 8) - } else if let tempBasalString = tempBasalString { - Text(tempBasalString) - .font(.system(size: 12, weight: .bold)) - .foregroundColor(.insulin) - .padding(.leading, 8) - } - - if let tempTargetString = tempTargetString { - Text(tempTargetString) - .font(.caption) - .foregroundColor(.secondary) - } - - Spacer() - - if let overrideString = overrideString { - Text("👤 " + overrideString) - .font(.system(size: 12)) - .foregroundColor(.secondary) - .padding(.trailing, 8) - } - - if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { - Text("Max IOB: 0").font(.callout).foregroundColor(.orange).padding(.trailing, 20) - } - - if let progress = state.bolusProgress { + HStack(spacing: 10) { + ZStack { HStack { - Text("Bolusing") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - ProgressView(value: Double(progress)) - .progressViewStyle(BolusProgressViewStyle()) - .padding(.trailing, 8) - } - .onTapGesture { - state.cancelBolus() - } - } - } - .frame(maxWidth: .infinity, maxHeight: 30) - } - - var timeInterval: some View { - HStack(alignment: .center) { - ForEach(timeButtons) { button in - Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { - state.hours = button.hours - } - .foregroundStyle(button.active ? .primary : .secondary) - .frame(maxHeight: 20).padding(.horizontal) - .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) - } - Image(systemName: "ellipsis.circle.fill") - .foregroundStyle(.secondary) - .padding(.leading) - .onTapGesture { - state.showModal(for: .statisticsConfig) - } - } - .font(buttonFont) - .padding(.top, 20) - .padding(.bottom, 40) - } - - var legendPanel: some View { - ZStack { - HStack(alignment: .center) { - Group { - Circle().fill(Color.loopGreen).frame(width: 8, height: 8) - Text("BG") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGreen) - } - Group { - Circle().fill(Color.insulin).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("IOB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - } - Group { - Circle().fill(Color.zt).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("ZT") - .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) - } - Group { - Circle().fill(Color.loopYellow).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("COB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + if state.pumpSuspended { + Text("Pump suspended") + .font(.custom("TempBasal", fixedSize: 13)).bold().foregroundColor(.loopGray) + } else if let tempBasalString = tempBasalString { + Text(tempBasalString) + .font(.custom("TempBasal", fixedSize: 13)).bold() + .foregroundColor(.insulin) + } + if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { + Text("Check Max IOB Setting").font(.extraSmall).foregroundColor(.orange) + } } - Group { - Circle().fill(Color.uam).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("UAM") - .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + .padding(.leading, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + if let tempTargetString = tempTargetString, !(fetchedPercent.first?.enabled ?? false) { + Text(tempTargetString) + .font(.buttonFont) + .foregroundColor(.secondary) + } else { + profileView } if let eventualBG = state.eventualBG { - Text( - "⇢ " + numberFormatter.string( - from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber - )! - ) - .font(.system(size: 12, weight: .bold)).foregroundColor(.secondary) + HStack { + Image(systemName: "arrow.forward") + Text( + fetchedTargetFormatter.string( + from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber + )! + ).font(.statusFont).foregroundColor(colorScheme == .dark ? .white : .black) + Text(state.units.rawValue).font(.system(size: 12)).foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .trailing) + .padding(.trailing, 8) } } - .frame(maxWidth: .infinity) - .padding([.bottom], 20) } + .frame(maxWidth: .infinity, maxHeight: 30, alignment: .bottom) } var mainChart: some View { @@ -424,7 +219,6 @@ extension Home { .ignoresSafeArea() .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) } - MainChartView( glucose: $state.glucose, isManual: $state.isManual, @@ -447,52 +241,15 @@ extension Home { screenHours: $state.hours, displayXgridLines: $state.displayXgridLines, displayYgridLines: $state.displayYgridLines, - thresholdLines: $state.thresholdLines + thresholdLines: $state.thresholdLines, + triggerUpdate: $triggerUpdate, + overrideHistory: $state.overrideHistory ) } - // .padding(.bottom) + .padding(.bottom, 5) .modal(for: .dataTable, from: self) } - @ViewBuilder private func profiles(_: GeometryProxy) -> some View { - let colour: Color = colorScheme == .dark ? .black : .white - // Rectangle().fill(colour).frame(maxHeight: 1) - ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(maxHeight: 40) - let cancel = fetchedPercent.first?.enabled ?? false - HStack(spacing: cancel ? 25 : 15) { - Text(selectedProfile().name).foregroundColor(.secondary) - if cancel, selectedProfile().isOn { - Button { showCancelAlert.toggle() } - label: { - Image(systemName: "xmark") - .foregroundStyle(.secondary) - } - } - Button { state.showModal(for: .overrideProfilesConfig) } - label: { - Image(systemName: "person.3.sequence.fill") - .symbolRenderingMode(.palette) - .foregroundStyle( - !(fetchedPercent.first?.enabled ?? false) ? .green : .cyan, - !(fetchedPercent.first?.enabled ?? false) ? .cyan : .green, - .purple - ) - } - } - } - .alert( - "Return to Normal?", isPresented: $showCancelAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.cancelProfile() - } - }, message: { Text("This will change settings back to your normal profile.") } - ) - Rectangle().fill(colour).frame(maxHeight: 1) - } - private func selectedProfile() -> (name: String, isOn: Bool) { var profileString = "" var display: Bool = false @@ -519,24 +276,32 @@ extension Home { return (name: profileString, isOn: display) } - func highlightButtons() { - for i in 0 ..< timeButtons.count { - timeButtons[i].active = timeButtons[i].hours == state.hours - } - } - - @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { + @ViewBuilder private func buttonPanel(_ geo: GeometryProxy) -> some View { ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) - + addHeaderBackground() + // Rectangle().fill(colorScheme == .light ? .gray.opacity(0.15) : Color.header.opacity(0.15)) + .frame(height: 50 + geo.safeAreaInsets.bottom) + let isOverride = fetchedPercent.first?.enabled ?? false HStack { + Button { state.showModal(for: .dataTable) } + label: { + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "book.pages") + .symbolRenderingMode(.hierarchical) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .foregroundColor(.secondary) + .padding(8) + } + }.buttonStyle(.borderless) + Spacer() Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image("carbs") + Image(systemName: "fork.knife") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .foregroundColor(.loopYellow) .padding(8) if let carbsReq = state.carbsRequired { @@ -549,16 +314,41 @@ extension Home { } }.buttonStyle(.borderless) Spacer() - Button { state.showModal(for: .addTempTarget) } + Button { + if isOverride { + state.cancelProfile() + triggerUpdate.toggle() + } else { + state.showModal(for: .overrideProfilesConfig) + } + } label: { - Image("target") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "person.fill") + .symbolRenderingMode(.palette) + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundStyle(.purple) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .padding(8) + .background(isOverride ? .blue.opacity(0.3) : .clear) + .clipShape(RoundedRectangle(cornerRadius: 10)) + } + }.buttonStyle(.borderless) + + if state.useTargetButton { + Spacer() + Button { state.showModal(for: .addTempTarget) } + label: { + Image("target") + .renderingMode(.template) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize) + .padding(8) + } + .foregroundColor(.loopGreen) + .buttonStyle(.borderless) } - .foregroundColor(.loopGreen) - .buttonStyle(.borderless) Spacer() Button { state.showModal(for: .bolus( @@ -570,11 +360,11 @@ extension Home { Image("bolus") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.insulin) .buttonStyle(.borderless) + .foregroundColor(.insulin) Spacer() if state.allowManualTemp { Button { state.showModal(for: .manualTempBasal) } @@ -582,80 +372,209 @@ extension Home { Image("bolus1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } .foregroundColor(.insulin) - .buttonStyle(.borderless) Spacer() } - Button { state.showModal(for: .statistics) - } - label: { - Image(systemName: "chart.xyaxis.line") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) - } - .foregroundColor(.purple) - .buttonStyle(.borderless) - Spacer() Button { state.showModal(for: .settings) } label: { Image("settings1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.loopGray) .buttonStyle(.borderless) + .foregroundColor(.gray) } .padding(.horizontal, 24) .padding(.bottom, geo.safeAreaInsets.bottom) } } + var chart: some View { + addColouredBackground() + .overlay { + VStack { + infoPanel + mainChart + } + } + .frame( + minHeight: UIScreen.main.bounds.height / 1.46 + ) + .addShadows() + } + + var carbsAndInsulinView: some View { + HStack(spacing: 10) { + if let settings = state.settingsManager { + let opacity: CGFloat = colorScheme == .dark ? 0.2 : 0.6 + let materialOpacity: CGFloat = colorScheme == .dark ? 0.25 : 0.10 + HStack { + let substance = Double(state.suggestion?.cob ?? 0) + let max = max(Double(settings.preferences.maxCOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .loopYellow, materialOpacity: materialOpacity) + .frame(width: 13.8, height: 40) + .offset(x: 0, y: -6) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" g", comment: "gram of carbs")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + HStack { + let substance = Double(state.suggestion?.iob ?? 0) + let max = max(Double(settings.preferences.maxIOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .insulin, materialOpacity: materialOpacity) + .frame(width: 11, height: 36) + .offset(x: 0, y: -2.5) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + } + } + } + + var preview: some View { + addBackground() + .frame(maxWidth: .infinity, minHeight: 170, alignment: .topLeading) + .overlay(alignment: .topLeading) { + PreviewChart(readings: $state.readings, lowLimit: $state.lowGlucose, highLimit: $state.highGlucose) + } + .clipShape(RoundedRectangle(cornerRadius: 15)) + .addShadows() + .padding(.horizontal, 10) + .onTapGesture { + state.showModal(for: .statistics) + } + } + + var profileView: some View { + HStack(spacing: 0) { + if let override = fetchedPercent.first { + if override.enabled { + if override.isPreset { + let profile = fetchedProfiles.first(where: { $0.id == override.id }) + if let currentProfile = profile { + if let name = currentProfile.name, name != "EMPTY", name.nonEmpty != nil, name != "", + name != "\u{0022}\u{0022}" + { + Text(name).font(.statusFont).foregroundStyle(.secondary) + } + } + } else if override.percentage != 100 { + Text(override.percentage.formatted() + " %").font(.statusFont).foregroundStyle(.secondary) + } else if override.smbIsOff, !override.smbIsAlwaysOff { + Text("No ").font(.statusFont).foregroundStyle(.secondary) // "No" as in no SMBs + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else if override.smbIsOff { + Image(systemName: "clock").font(.statusFont).foregroundStyle(.secondary) + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else { + Text("Override").font(.statusFont).foregroundStyle(.secondary) + } + } + } + } + } + + func bolusProgressView(progress: Decimal) -> some View { + ZStack { + HStack { + Text("Bolusing") + .foregroundColor(.primary).font(.bolusProgressFont) + ProgressView(value: Double(progress)) + .progressViewStyle(BolusProgressViewStyle()) + Image(systemName: "xmark.square.fill") + .symbolRenderingMode(.palette) + .foregroundStyle(.white, .blue) + .font(.bolusProgressStopFont) + .onTapGesture { + state.cancelBolus() + } + } + } + } + + @ViewBuilder private func headerView(_ geo: GeometryProxy) -> some View { + addHeaderBackground() + .frame(minHeight: 120 + geo.safeAreaInsets.top) + .overlay { + VStack { + ZStack { + glucoseView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top).padding(.top, 10) + loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 5) + carbsAndInsulinView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading) + .padding(.leading, 10) + pumpView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, 7).padding(.bottom, 5) + }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 5) + } + } + .clipShape(Rectangle()) + } + var body: some View { GeometryReader { geo in - VStack(spacing: 0) { - header(geo) - infoPanel - mainChart - timeInterval - legendPanel - profiles(geo) - bottomPanel(geo) + VStack { + ScrollView { + VStack(spacing: 0) { + headerView(geo) + chart + preview.padding(.top, 15) + } + } + .scrollIndicators(.hidden) + buttonPanel(geo) } + .background(.gray.opacity(IAPSconfig.backgroundOpacity)) .edgesIgnoringSafeArea(.vertical) - } - .onChange(of: state.hours) { _ in - highlightButtons() - } - .onAppear { - configureView { - highlightButtons() + .overlay { + if let progress = state.bolusProgress { + ZStack { + RoundedRectangle(cornerRadius: 15) + .fill(.gray.opacity(0.8)) + .frame(width: 300, height: 50) + bolusProgressView(progress: progress) + }.frame(maxWidth: .infinity, alignment: .center) + } } } + .onAppear(perform: configureView) .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) - .popup(isPresented: isStatusPopupPresented, alignment: .top, direction: .top) { + .popup(isPresented: state.isStatusPopupPresented, alignment: .bottom, direction: .bottom) { popup .padding() .background( RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(UIColor.darkGray)) + .fill(Color.popUpGray) ) .onTapGesture { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } .gesture( DragGesture(minimumDistance: 10, coordinateSpace: .local) .onEnded { value in if value.translation.height < 0 { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } } ) @@ -664,27 +583,26 @@ extension Home { private var popup: some View { VStack(alignment: .leading, spacing: 4) { - Text(state.statusTitle).font(.headline).foregroundColor(.white) + Text(state.statusTitle).font(.suggestionHeadline).foregroundColor(.white) .padding(.bottom, 4) if let suggestion = state.suggestion { TagCloudView(tags: suggestion.reasonParts).animation(.none, value: false) - Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.caption).foregroundColor(.white) - + Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.suggestionSmallParts) + .foregroundColor(.white) } else { - Text("No sugestion found").font(.body).foregroundColor(.white) + Text("No sugestion found").font(.suggestionHeadline).foregroundColor(.white) } - if let errorMessage = state.errorMessage, let date = state.errorDate { Text(NSLocalizedString("Error at", comment: "") + " " + dateFormatter.string(from: date)) .foregroundColor(.white) - .font(.headline) + .font(.suggestionError) .padding(.bottom, 4) .padding(.top, 8) - Text(errorMessage).font(.caption).foregroundColor(.loopRed) + Text(errorMessage).font(.buttonFont).foregroundColor(.loopRed) } else if let suggestion = state.suggestion, (suggestion.bg ?? 100) == 400 { - Text("Invalid CGM reading (HIGH).").font(.callout).bold().foregroundColor(.loopRed).padding(.top, 8) - Text("SMBs and High Temps Disabled.").font(.caption).foregroundColor(.white).padding(.bottom, 4) + Text("Invalid CGM reading (HIGH).").font(.suggestionError).bold().foregroundColor(.loopRed).padding(.top, 8) + Text("SMBs and High Temps Disabled.").font(.suggestionParts).foregroundColor(.white).padding(.bottom, 4) } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index 953bdfcdd1..3d92c1b662 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -26,7 +26,9 @@ extension OverrideProfilesConfig { @Published var uamMinutes: Decimal = 0 @Published var defaultSmbMinutes: Decimal = 0 @Published var defaultUamMinutes: Decimal = 0 + @Published var emoji: String = "" + @Injected() var broadcaster: Broadcaster! var units: GlucoseUnits = .mmolL override func subscribe() { @@ -46,18 +48,19 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.enabled = true saveOverride.smbIsOff = self.smbIsOff + if self.isPreset { saveOverride.isPreset = true saveOverride.id = id } else { saveOverride.isPreset = false } saveOverride.date = Date() if override_target { - if units == .mmolL { - target = target.asMgdL - } - saveOverride.target = target as NSDecimalNumber - } else { saveOverride.target = 0 } - + saveOverride.target = ( + units == .mmolL + ? target.asMgdL + : target + ) as NSDecimalNumber + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -77,6 +80,11 @@ extension OverrideProfilesConfig { } try? self.coredataContext.save() } + DispatchQueue.main.async { + self.broadcaster.notify(OverrideObserver.self, on: .main) { + $0.overrideHistoryDidUpdate(OverrideStorage().fetchOverrideHistory(interval: DateFilter().today)) + } + } } func savePreset() { @@ -87,6 +95,7 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.smbIsOff = self.smbIsOff saveOverride.name = self.profileName + saveOverride.emoji = self.emoji id = UUID().uuidString self.isPreset.toggle() saveOverride.id = id @@ -97,7 +106,7 @@ extension OverrideProfilesConfig { ? target.asMgdL : target ) as NSDecimalNumber - } else { saveOverride.target = 0 } + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -137,9 +146,14 @@ extension OverrideProfilesConfig { saveOverride.smbIsOff = profile.smbIsOff saveOverride.isPreset = true saveOverride.date = Date() - saveOverride.target = profile.target saveOverride.id = id_ + if let tar = profile.target, tar == 0 { + saveOverride.target = 6 + } else { + saveOverride.target = profile.target + } + if profile.advancedSettings { saveOverride.advancedSettings = true if !isfAndCr { @@ -238,14 +252,9 @@ extension OverrideProfilesConfig { override_target = false smbIsOff = false advancedSettings = false - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } smbMinutes = defaultSmbMinutes uamMinutes = defaultUamMinutes + OverrideStorage().cancelProfile() } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 76d51be136..16a28b3ac4 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -12,6 +12,7 @@ extension OverrideProfilesConfig { @State private var showingDetail = false @State private var alertSring = "" @State var isSheetPresented: Bool = false + @State var index: Int = 1 @Environment(\.dismiss) var dismiss @Environment(\.managedObjectContext) var moc @@ -44,15 +45,18 @@ extension OverrideProfilesConfig { var presetPopover: some View { Form { Section { - TextField("Name Of Profile", text: $state.profileName) - } header: { Text("Enter Name of Profile") } + TextField("Name", text: $state.profileName) + } header: { Text("Profile Name").foregroundStyle(.primary) } Section { Button("Save") { state.savePreset() isSheetPresented = false } - .disabled(state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }).isNotEmpty) + .disabled( + state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }) + .isNotEmpty + ) Button("Cancel") { isSheetPresented = false @@ -257,20 +261,21 @@ extension OverrideProfilesConfig { "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." ) } - - Button("Return to Normal") { - state.cancelProfile() - dismiss() - } - .frame(maxWidth: .infinity, alignment: .center) - .buttonStyle(BorderlessButtonStyle()) - .disabled(!state.isEnabled) - .tint(.red) + Section { + Button("Return to Normal") { + state.cancelProfile() + dismiss() + } + .frame(maxWidth: .infinity, alignment: .center) + .buttonStyle(BorderlessButtonStyle()) + .disabled(!state.isEnabled) + .tint(.red) + } footer: { Text("").padding(.bottom, 150) } } .onAppear(perform: configureView) .onAppear { state.savedSettings() } .navigationBarTitle("Profiles") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } @@ -279,6 +284,9 @@ extension OverrideProfilesConfig { .asMmolL : (preset.target ?? 0) as Decimal let duration = (preset.duration ?? 0) as Decimal let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name! + let identifier = ((preset.emoji ?? "") == "") || (preset.emoji?.isEmpty ?? true) || + (preset.emoji ?? "") == "\u{0022}\u{0022}" ? + "" : preset.emoji! let percent = preset.percentage / 100 let perpetual = preset.indefinite let durationString = perpetual ? "" : "\(formatter.string(from: duration as NSNumber)!)" @@ -294,11 +302,8 @@ extension OverrideProfilesConfig { if name != "" { HStack { - VStack { - HStack { - Text(name) - Spacer() - } + VStack(alignment: .leading) { + Text(name) HStack(spacing: 5) { Text(percent.formatted(.percent.grouping(.never).rounded().precision(.fractionLength(0)))) if targetString != "" { diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 18e06eee91..e1405b8c55 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -22,13 +22,12 @@ extension PreferencesEditor { var body: some View { Form { - Section(header: Text("iAPS").textCase(nil)) { + Section { Picker("Glucose units", selection: $state.unitsIndex) { Text("mg/dL").tag(0) Text("mmol/L").tag(1) } - } - + } header: { Text("iAPS").textCase(nil) } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in Section(header: Text(section.displayName)) { ForEach(section.fields.indexed(), id: \.1.id) { fieldIndex, field in @@ -75,6 +74,7 @@ extension PreferencesEditor { } } } + Section {} footer: { Text("").padding(.bottom, 300) } } .onAppear(perform: configureView) .navigationTitle("Preferences") @@ -82,7 +82,7 @@ extension PreferencesEditor { .navigationBarItems( trailing: Button { - let lang = Locale.current.languageCode ?? "en" + let lang = Locale.current.language.languageCode?.identifier ?? "en" if lang == "en" { UIApplication.shared.open( URL( diff --git a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift index 45ae196ba1..77c35c244f 100644 --- a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift +++ b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift @@ -33,7 +33,7 @@ extension PumpConfig { } .onAppear(perform: configureView) .navigationTitle("Pump config") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $state.setupPump) { if let pumpManager = state.provider.apsManager.pumpManager { PumpSettingsView( diff --git a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift index 9634afa5f4..27889b538c 100644 --- a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift @@ -51,7 +51,7 @@ extension PumpSettingsEditor { } .onAppear(perform: configureView) .navigationTitle("Pump Settings") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) } } } diff --git a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift index 63386f5e4f..1c7c87128e 100644 --- a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift +++ b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift @@ -10,6 +10,8 @@ extension Stat { @Published var overrideUnit: Bool = false @Published var layingChart: Bool = false @Published var units: GlucoseUnits = .mmolL + @Published var preview: Bool = false + @Published var readings: [Readings] = [] override func subscribe() { highLimit = settingsManager.settings.high diff --git a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift index d8ffe216c9..c1dc330334 100644 --- a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift @@ -12,10 +12,16 @@ struct ChartsView: View { @Binding var overrideUnit: Bool @Binding var standing: Bool - @State var headline: Color = .secondary - private let conversionFactor = 0.0555 + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .none + return formatter + } + + @Environment(\.colorScheme) var colorScheme + var body: some View { glucoseChart Rectangle().fill(.cyan.opacity(0.2)).frame(maxHeight: 3) @@ -284,12 +290,22 @@ struct ChartsView: View { let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count let hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + let veryHighArray = glucose.filter({ $0.glucose > 198 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 59 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + let tir = 100 - (hypoPercentage + hyperPercentage) var array: [(decimal: Decimal, string: String)] = [] array.append((decimal: Decimal(hypoPercentage), string: "Low")) array.append((decimal: Decimal(tir), string: "NormaL")) array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) return array } diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index a9632db0d1..a0bc86aadb 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -11,6 +11,9 @@ extension StatConfig { @Published var rulerMarks: Bool = false @Published var skipBolusScreenAfterCarbs: Bool = false @Published var useFPUconversion: Bool = true + @Published var useTargetButton: Bool = false + @Published var hours: Decimal = 6 + var units: GlucoseUnits = .mmolL override func subscribe() { @@ -22,6 +25,7 @@ extension StatConfig { subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } + subscribeSetting(\.useTargetButton, on: $useTargetButton) { useTargetButton = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } @@ -40,6 +44,13 @@ extension StatConfig { guard units == .mmolL else { return $0 } return $0.asMgdL }) + + subscribeSetting(\.hours, on: $hours.map(Int.init), initial: { + let value = max(min($0, 24), 2) + hours = Decimal(value) + }, map: { + $0 + }) } } } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index fe7a0528db..76d19c4a5c 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -31,8 +31,19 @@ extension StatConfig { Toggle("Display Chart Y - Grid lines", isOn: $state.yGridLines) Toggle("Display Chart Threshold lines for Low and High", isOn: $state.rulerMarks) Toggle("Standing / Laying TIR Chart", isOn: $state.oneDimensionalGraph) + HStack { + Text("Horizontal Scroll View Visible hours") + Spacer() + DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) + Text("hours").foregroundColor(.secondary) + } } header: { Text("Home Chart settings ") } + Section { + Toggle("Display Temp Targets Button", isOn: $state.useTargetButton) + } header: { Text("Home View Button Panel ") } + footer: { Text("In case you're using both profiles and temp targets") } + Section { HStack { Text("Low") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 55a634de8f..a69b55ccf8 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -1,3 +1,4 @@ +import Combine import SwiftUI import Swinject @@ -34,7 +35,6 @@ enum Screen: Identifiable, Hashable { case statisticsConfig case bolusCalculatorConfig case dynamicISF - var id: Int { String(reflecting: self).hashValue } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 6cf5018595..f05e082b99 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -45,7 +45,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P static let healthCarbObject = HKObjectType.quantityType(forIdentifier: .dietaryCarbohydrates) static let healthInsulinObject = HKObjectType.quantityType(forIdentifier: .insulinDelivery) - // Meta-data key of FreeASPX data in HealthStore + // Meta-data key of iAPS data in HealthStore static let freeAPSMetaKey = "From iAPS" } @@ -203,6 +203,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P start: $0.actualDate ?? $0.createdAt, end: $0.actualDate ?? $0.createdAt, metadata: [ + HKMetadataKeyExternalUUID: $0.id ?? "_id", HKMetadataKeySyncIdentifier: $0.id ?? "_id", HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true diff --git a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift index a0049c3092..33e3e1eac5 100644 --- a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift +++ b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift @@ -1,23 +1,14 @@ import SwiftUI public struct BolusProgressViewStyle: ProgressViewStyle { + @Environment(\.colorScheme) var colorScheme + public func makeBody(configuration: LinearProgressViewStyle.Configuration) -> some View { + @State var progress = CGFloat(configuration.fractionCompleted ?? 0) ZStack { - Circle() - .stroke(lineWidth: 4.0) - .opacity(0.3) - .foregroundColor(.secondary) - .frame(width: 22, height: 22) - - Rectangle().fill(Color.insulin) - .frame(width: 8, height: 8) - - Circle() - .trim(from: 0.0, to: CGFloat(configuration.fractionCompleted ?? 0)) - .stroke(style: StrokeStyle(lineWidth: 4.0, lineCap: .butt, lineJoin: .round)) - .foregroundColor(.insulin) - .rotationEffect(Angle(degrees: -90)) - .frame(width: 22, height: 22) - }.frame(width: 30, height: 30) + VStack { + ProgressView(value: progress) + } + }.frame(width: 80, height: 30) } } diff --git a/FreeAPS/Sources/Views/DecimalTextField.swift b/FreeAPS/Sources/Views/DecimalTextField.swift index 9cf67e8a5e..2441f5d1ff 100644 --- a/FreeAPS/Sources/Views/DecimalTextField.swift +++ b/FreeAPS/Sources/Views/DecimalTextField.swift @@ -7,19 +7,22 @@ struct DecimalTextField: UIViewRepresentable { private var formatter: NumberFormatter private var autofocus: Bool private var cleanInput: Bool + private var useButtons: Bool init( _ placeholder: String, value: Binding, formatter: NumberFormatter, autofocus: Bool = false, - cleanInput: Bool = false + cleanInput: Bool = false, + useButtons: Bool = true ) { self.placeholder = placeholder _value = value self.formatter = formatter self.autofocus = autofocus self.cleanInput = cleanInput + self.useButtons = useButtons } func makeUIView(context: Context) -> UITextField { @@ -30,6 +33,34 @@ struct DecimalTextField: UIViewRepresentable { textfield.text = cleanInput ? "" : formatter.string(for: value) ?? placeholder textfield.textAlignment = .right + let toolBar = UIToolbar(frame: CGRect( + x: 0, + y: 0, + width: textfield.frame.size.width, + height: 44 + )) + let clearButton = UIBarButtonItem( + title: NSLocalizedString("Clear", comment: "Clear button"), + style: .plain, + target: self, + action: #selector(textfield.clearButtonTapped(button:)) + ) + let doneButton = UIBarButtonItem( + title: NSLocalizedString("Done", comment: "Done button"), + style: .done, + target: self, + action: #selector(textfield.doneButtonTapped(button:)) + ) + let space = UIBarButtonItem( + barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, + target: nil, + action: nil + ) + if useButtons { + toolBar.setItems([clearButton, space, doneButton], animated: true) + textfield.inputAccessoryView = toolBar + } + if autofocus { DispatchQueue.main.async { textfield.becomeFirstResponder() diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index df49349aaa..98ad0779e0 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -77,7 +77,7 @@ struct TagCloudView: View { return ZStack { Text(textTag) .padding(.vertical, 2) .padding(.horizontal, 4) - .font(.subheadline) + .font(.suggestionParts) .background(colorOfTag.opacity(0.8)) .foregroundColor(Color.white) .cornerRadius(2) } diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 8351e69226..9d44aa90f6 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -37,6 +37,102 @@ struct CapsulaBackground: ViewModifier { } } +struct AddShadow: ViewModifier { + @Environment(\.colorScheme) var colorScheme + func body(content: Content) -> some View { + content + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.shadowOpacity : IAPSconfig.shadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 3 : 2.5 + ) + } +} + +struct TestTube: View { + let opacity: CGFloat + let amount: CGFloat + let colourOfSubstance: Color + let materialOpacity: CGFloat + @Environment(\.colorScheme) var colorScheme + + var body: some View { + UnevenRoundedRectangle.testTube + .fill( + LinearGradient( + gradient: Gradient(stops: [ + Gradient.Stop(color: .white.opacity(opacity), location: amount), + Gradient.Stop(color: colourOfSubstance, location: amount) + ]), + startPoint: .top, + endPoint: .bottom + ) + ) + .overlay { + FrostedGlass(opacity: materialOpacity) + } + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.glassShadowOpacity : IAPSconfig.glassShadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 2.2 : 3 + ) + } +} + +struct FrostedGlass: View { + let opacity: CGFloat + var body: some View { + UnevenRoundedRectangle.testTube + .fill(.ultraThinMaterial.opacity(opacity)) + } +} + +struct ColouredRoundedBackground: View { + @Environment(\.colorScheme) var colorScheme + + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct ColouredBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct LoopEllipse: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) + } +} + +struct HeaderBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header.opacity(1)) + // .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.darkerBlue.opacity(1)) + } +} + private let navigationCache = LRUCache(capacity: 10) struct NavigationLazyView: View { @@ -126,8 +222,24 @@ extension View { modifier(RoundedBackground()) } - func buttonBackground() -> some View { - modifier(RoundedBackground(color: .accentColor)) + func addShadows() -> some View { + modifier(AddShadow()) + } + + func addBackground() -> some View { + ColouredRoundedBackground() + } + + func addColouredBackground() -> some View { + ColouredBackground() + } + + func addHeaderBackground() -> some View { + HeaderBackground() + } + + func frostedGlassLayer(_ opacity: CGFloat) -> some View { + FrostedGlass(opacity: opacity) } func navigationLink(to screen: Screen, from view: V) -> some View { @@ -146,3 +258,13 @@ extension View { func asAny() -> AnyView { .init(self) } } + +extension UnevenRoundedRectangle { + static let testTube = + UnevenRoundedRectangle( + topLeadingRadius: 1.5, + bottomLeadingRadius: 50, + bottomTrailingRadius: 50, + topTrailingRadius: 1.5 + ) +} From 4e605c20cd7ab1a00882005ca50a884662b213d0 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Wed, 20 Dec 2023 19:12:01 +0100 Subject: [PATCH 283/405] New UI/UX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New UI/UX Header: Make the current glucose more prominent and taking up more space. Less strings and more graphics. Replace the boring and cluttered strings with dynamic graphics. Test tubes in frosted glass for IOB and COB, displaying amount as coloured liquid. Pump status using dynamic graphics instead of strings. Both battery icon and reservoir vial image is now illustrated with a dynamic fill. Loop button is now more discrete. Normally iAPS is functioning well and you shouldn’t need to worry about if looping or not, because it will be looping. However, when not looping the loop button the button will appear with red text. When tapping the loop button you will now see all info. Both chart, header and the openAPS suggestion. This pop-up info is now toggled with the loop button, meaning if you tap button again the pop-up disappears (or if tapping inside of pop-up as before). Chart and Info panel The chart and info panel is now less cluttered. Eventual glucose is displayed more readable. The legends are removed and only displayed when tapped once. Tapping once again will remove them (thanks for this idea @nas10 ). To indicate that there in fact are legends available small coloured dots are added. Bolus Progress is now displayed as layer on top of chart. Bigger and with a clearer stop button. When legends are displayed they will now appear in the future x-side: When Max IOB setting is 0 this will now be displayed more prominently: Profiles are now displayed in chart. Duration and target glucose will displayed similar to the temp targets. B Profile name will be displayed centred in info panel, as displayed below. Button Panel The extra space from the previous profile button is now used for a bigger header instead. New profile button. When profile selected, this button will be highlighted, similar to the Loop app. A enabled profile will be deactivated with just tap, also similar to the Loop app (thank you Loop authors for the idea (didn’t borrow any code)). New history button. Instead of tapping the chart you now have a button to access the history. Vertical Scroll View and Statistics Preview To make the button panel and home view both less cluttered and more extendable I’ve removed the statistics button and introduced a vertical scroll. To see a preview of statistics just scroll down. To see full statistics view tap the preview (now just TIR for current day is displayed, but more info will be added later). The idea with the vertical scroll is also to make the home more more extendable with future updates. Later we can add for instance an Insulin chart here, or a meal chart, or whatever really. Any info you would like to sometimes look at, but not always need to see. This info is only displayed when scrolling down, meaning it will not add any clutter or extra ”info overload” when using the iAPS app as you’re used to do. Temp Targets Temp targets will still work as before. For those of you who really need to use both TTs and profiles simultaneously you can display the Temp Target button in UI/UX settings. Default is to not display this button. I recommend not normally just use one of these, but I can understand the need for sometimes having to use both, which is why I decided to not remove this option entirely. Tested a couple of weeks on my own phone and with different simulators. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. To do: When activating a new profile the new highlight and the name in info panel will appear instantly, but there is a delay before the new current profile is illustrated also in the chart. I'll fix this ASAP. clean (cherry picked from commit 62af4eaca29ffa4103d26075a0476d54b1aacc1c) Fix bad merge --- Config.xcconfig | 2 +- .../Core_Data.xcdatamodel/contents | 8 +- .../xcschemes/LoopKit Example.xcscheme | 87 +++ .../xcschemes/Shared-watchOS.xcscheme | 76 +++ FreeAPS.xcodeproj/project.pbxproj | 18 +- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../7xx Small Clear.pdf | Bin 0 -> 5090 bytes .../7xx Small Clear.imageset/Contents.json | 12 + .../Colors/DarkGreen.colorset/Contents.json | 38 ++ .../Colors/DarkRed.colorset/Contents.json | 38 ++ .../Colors/DarkerBlue.colorset/Contents.json | 12 +- .../Colors/Header.colorset/Contents.json | 34 + .../Colors/Lemon.colorset/Contents.json | 4 +- .../Colors/PopUpGray.colorset/Contents.json | 34 + .../Colors/darkGray.colorset/Contents.json | 4 +- .../Colors/lightBlue.colorset/Contents.json | 38 ++ .../Assets.xcassets/reservoir/Contents.json | 6 + .../pod_reservoir.imageset/Contents.json | 25 + .../pod_reservoir.imageset/reservoir.pdf | Bin 0 -> 10664 bytes .../pod_reservoir.imageset/reservoir_mask.pdf | Bin 0 -> 5537 bytes .../pod_reservoir_mask.imageset/Contents.json | 12 + .../reservoir_mask.pdf | Bin 0 -> 5537 bytes .../Contents.json | 25 + .../reservoir 1.pdf | Bin 0 -> 10664 bytes .../reservoir.pdf | Bin 0 -> 10664 bytes .../reservoir.pxm | Bin 0 -> 107766 bytes .../vial.imageset/Contents.json | 22 + .../vial.imageset/vial_stroke_dark.svg | 81 +++ .../vial.imageset/vial_stroke_light.svg | 80 +++ .../vial_color.imageset/Contents.json | 15 + .../Mediamodifier-Design.svg | 22 + FreeAPS/Resources/Info.plist | 8 +- .../defaults/freeaps/freeaps_settings.json | 1 + FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 8 +- .../Sources/APS/Storage/OverrideStorage.swift | 79 +++ .../Sources/Helpers/Color+Extensions.swift | 7 + FreeAPS/Sources/Models/Configs.swift | 42 ++ FreeAPS/Sources/Models/DateFilter.swift | 11 - FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 + .../Modules/Bolus/BolusStateModel.swift | 1 - .../View/AlternativeBolusCalcRootView.swift | 26 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 23 +- .../Modules/CGM/View/CGMRootView.swift | 3 +- .../DataTable/View/DataTableRootView.swift | 2 +- .../Dynamic/View/DynamicRootView.swift | 18 +- .../Sources/Modules/Home/HomeDataFlow.swift | 1 + .../Sources/Modules/Home/HomeProvider.swift | 8 + .../Sources/Modules/Home/HomeStateModel.swift | 44 +- .../Home/View/Chart/MainChartView.swift | 478 +++++++++----- .../Home/View/Header/CurrentGlucoseView.swift | 99 ++- .../Modules/Home/View/Header/LoopView.swift | 61 +- .../Home/View/Header/PreviewView.swift | 255 +++++++ .../Modules/Home/View/Header/PumpView.swift | 173 +++-- .../Modules/Home/View/HomeRootView.swift | 624 ++++++++---------- .../OverrideProfilesStateModel.swift | 37 +- .../View/OverrideProfilesRootView.swift | 41 +- .../View/PreferencesEditorRootView.swift | 8 +- .../PumpConfig/View/PumpConfigRootView.swift | 2 +- .../View/PumpSettingsEditorRootView.swift | 2 +- .../Sources/Modules/Stat/StatStateModel.swift | 2 + .../Modules/Stat/View/ChartsView.swift | 20 +- .../StatConfig/StatConfigStateModel.swift | 11 + .../StatConfig/View/StatConfigRootView.swift | 11 + FreeAPS/Sources/Router/Screen.swift | 2 +- .../Services/HealthKit/HealthKitManager.swift | 3 +- .../Views/BolusProgressViewStyle.swift | 23 +- FreeAPS/Sources/Views/DecimalTextField.swift | 33 +- FreeAPS/Sources/Views/TagCloudView.swift | 2 +- FreeAPS/Sources/Views/ViewModifiers.swift | 126 +++- 69 files changed, 2187 insertions(+), 808 deletions(-) create mode 100644 Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme create mode 100644 Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf create mode 100644 FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_dark.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json create mode 100644 FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg create mode 100644 FreeAPS/Sources/APS/Storage/OverrideStorage.swift create mode 100644 FreeAPS/Sources/Models/Configs.swift delete mode 100644 FreeAPS/Sources/Models/DateFilter.swift create mode 100644 FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift diff --git a/Config.xcconfig b/Config.xcconfig index 61834b473c..7194c1f2f6 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.3.2 +APP_VERSION = 2.4.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 023a0cebc0..716aaf395a 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -100,11 +100,17 @@ + + + + + + diff --git a/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme new file mode 100644 index 0000000000..be16b5e5bc --- /dev/null +++ b/Dependencies/LoopKit/LoopKit.xcodeproj/xcshareddata/xcschemes/LoopKit Example.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme new file mode 100644 index 0000000000..fb7a17ba47 --- /dev/null +++ b/Dependencies/dexcom-share-client-swift/ShareClient.xcodeproj/xcshareddata/xcschemes/Shared-watchOS.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 2b07ece80c..4441e95b77 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -33,10 +33,12 @@ 1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; }; 19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; 198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; }; + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198CED9C2B2E62940073032D /* OverrideStorage.swift */; }; 199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; }; 19A910302A24BF6300C8951B /* StatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A9102F2A24BF6300C8951B /* StatsView.swift */; }; - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* DateFilter.swift */; }; + 19A910362A24D6D700C8951B /* Configs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910352A24D6D700C8951B /* Configs.swift */; }; 19A910382A24EF3200C8951B /* ChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910372A24EF3200C8951B /* ChartsView.swift */; }; + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */; }; 19B0EF2128F6D66200069496 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B0EF2028F6D66200069496 /* Statistics.swift */; }; 19D466A329AA2B80004D5F33 /* FPUConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A229AA2B80004D5F33 /* FPUConfigDataFlow.swift */; }; 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; @@ -586,12 +588,14 @@ 198377E2266C0AC8004DE65E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; 198377E3266C0ADC004DE65E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 198377E4266C13D2004DE65E /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 198CED9C2B2E62940073032D /* OverrideStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideStorage.swift; sourceTree = ""; }; 199561C0275E61A50077B976 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS8.0.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; 199732B4271B72DD00129A3F /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; 199732B5271B9EE900129A3F /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; 19A9102F2A24BF6300C8951B /* StatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsView.swift; sourceTree = ""; }; - 19A910352A24D6D700C8951B /* DateFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFilter.swift; sourceTree = ""; }; + 19A910352A24D6D700C8951B /* Configs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configs.swift; sourceTree = ""; }; 19A910372A24EF3200C8951B /* ChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartsView.swift; sourceTree = ""; }; + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewView.swift; sourceTree = ""; }; 19B0EF2028F6D66200069496 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = ""; }; 19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; 19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; @@ -1246,8 +1250,8 @@ isa = PBXGroup; children = ( 195D80B22AF696EE00D25097 /* Dynamic */, - BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 190EBCC229FF134900BA767D /* StatConfig */, + BD7DA9A32AE06DBA00601B20 /* BolusCalculatorConfig */, 19F95FF129F10F9C00314DDC /* Stat */, CE94597C29E9E1CD0047C9C6 /* WatchConfig */, 19E1F7E629D0828B005C8D20 /* IconConfig */, @@ -1573,6 +1577,7 @@ 383420D525FFE38C002D46C1 /* LoopView.swift */, 38AAF85425FFF846004AF583 /* CurrentGlucoseView.swift */, 38DAB27F260CBB7F00F74C1A /* PumpView.swift */, + 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */, ); path = Header; sourceTree = ""; @@ -1712,7 +1717,7 @@ 191F62672AD6B05A004D7911 /* NightscoutSettings.swift */, 1967DFBD29D052C200759F30 /* Icons.swift */, 19D4E4EA29FC6A9F00351451 /* Charts.swift */, - 19A910352A24D6D700C8951B /* DateFilter.swift */, + 19A910352A24D6D700C8951B /* Configs.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, ); @@ -1761,6 +1766,7 @@ 38F3B2EE25ED8E2A005C48AA /* TempTargetsStorage.swift */, CE82E02428E867BA00473A9C /* AlertStorage.swift */, 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */, + 198CED9C2B2E62940073032D /* OverrideStorage.swift */, ); path = Storage; sourceTree = ""; @@ -2740,6 +2746,7 @@ 383948DA25CD64D500E91849 /* Glucose.swift in Sources */, CE94598029E9E3BD0047C9C6 /* WatchConfigDataFlow.swift in Sources */, 388E596C25AD95110019842D /* OpenAPS.swift in Sources */, + 198CED9D2B2E62940073032D /* OverrideStorage.swift in Sources */, E00EEC0527368630002FF094 /* StorageAssembly.swift in Sources */, 384E803825C388640086DB71 /* Script.swift in Sources */, CE94597E29E9E1EE0047C9C6 /* GarminManager.swift in Sources */, @@ -2868,6 +2875,7 @@ CE1856F72ADC4869007E39C7 /* CarbPresetIntentRequest.swift in Sources */, BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */, 9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigStateModel.swift in Sources */, + 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */, 38A43598262E0E4900E80935 /* FetchAnnouncementsManager.swift in Sources */, 642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */, BD7DA9AC2AE06EB900601B20 /* BolusCalculatorConfigRootView.swift in Sources */, @@ -2881,7 +2889,7 @@ 38E44536274E411700EC9A94 /* Disk.swift in Sources */, 2BE9A6FA20875F6F4F9CD461 /* PumpSettingsEditorProvider.swift in Sources */, 6B9625766B697D1C98E455A2 /* PumpSettingsEditorStateModel.swift in Sources */, - 19A910362A24D6D700C8951B /* DateFilter.swift in Sources */, + 19A910362A24D6D700C8951B /* Configs.swift in Sources */, A0B8EC8CC5CD1DD237D1BCD2 /* PumpSettingsEditorRootView.swift in Sources */, E06B911A275B5EEA003C04B6 /* Array+Extension.swift in Sources */, 38EA0600262091870064E39B /* BolusProgressViewStyle.swift in Sources */, diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 142d983415..2cfe78ebfa 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -30,7 +30,7 @@ }, { "package": "SwiftCharts", - "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts", + "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git", "state": { "branch": "master", "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2", diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/7xx Small Clear.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41cc88bd386d677f5bdb6369b0fedf65888b95df GIT binary patch literal 5090 zcmai2cRbbK|2J;ok|_O@3E>`hEL+`{Vn5ydU>{?(;RydOcp}`8onxN-82yQ8-Ybd1`HHA$L9fLvsrd z0fK;>%$W|vUv=2#?Z>^Ar+6j2!y?7I~8uw@`u9?bM!Wocf9? zI&T|cbh5QADVCs?X@68k>NUn+e3giHP)GW8%8tME_B?ldoSCs>PS9d`892badF4XO z(~sBlmu$v`4h%P{Kk0;{L!DF-d-BNUS+#P zp|GMI9@ukQYICXRHD1eyg+W%;-BrX6-bPXAbT3?a@~dvO!v)wmpDVIyTnP!mSJU)# z0A}O-dDqV(sTXI%s@H4=CzpenS+iLAqT`OaU45eXCR_H&GCS+OI`RD&O+%bi(>vO- z789unoh>5c^O*$xz}Jx_#u+6~h_BOxS??{o^7v)u+Zz&Q-5&r(UDJdU-uaw#gR`|n0okl9S;p0((0q}4*6=( zmcyK@dhXtVQgH5>HSf$QHo}$KnY(>l>jOxlhlzaGyE49Yt%dkpy-@m5WJHZ!f1yP3 zO7{WF8Aj#KsMN7&!p|umkr~04S=Q<|BJ2tH6@@CnT+V{Da=~4ABzsN*Q*n10 znlYSjQuTIOdQ)%ot+{Y6sV!cQ#*EA@^&<0h4dyS|UsjZuras&3Ic^b77z~E^WEHHH zuyHw5F|cx;e0YD8-KrYmg3Q>dJzbR((IxFVGTReu*m`30vD3azpXXX$HP6SsWPLB# z;LB%`51XpWEJuwm>0Rw(*WfrK(s`?A``CM7LZmItkt8(d5&r#YyLDDwPa6C8>MX_f z6>}JQk&Vy2*OokN?|YnHAcg~VMm$-4KA7Fw?2?$_y*@aiSNiGo^HG=+$!W6}d6Y(AX1%w)xQa$zM2aW{ zH]=4kzZDWstl@Zxb+RBc3-;+Q+Rv;98eYKYhOfJ@#)953X3w5#vfMwPQydCbJ= z8UfC6l>R+3d}+PXTE*;RlpMzuE0|f2xqclFUM-xHg)SBkGNL$DQURHOz(^;1C!DS`#sUjE%*{v_C`jTT2OzMr z2Og!1r{v|IG89E7c_;(Q%KqX15c=)^*LeS92DZR}AfjS_XiNQ}{m(%Fh5YOge1kGK zu)^VK;CR?2SPAQ9Yk}24DgN(6BK48`P2Bu=Ab|~TF9y)ZtJh8ev_n+= zv}l3?1l^R5sIajL>sj7>O^piXvruMZd~n~qpJ9zftEEv}NqK5G{0_rPvDo@Z%6=<) zbYP~kf53W$&|gEP_5D7e32#8{haeiTEiW`0pE%jkyiLQ&Ld|SI{d&yG3V_;CqUrr! zCzG6o?Co*Id@l7JN3>DhUrP6c60HtU=bB-)3-l-anJL)K`h=;NEEUg4O-cBO2dQhDT9Plf_Q zRLyf(`;%;^X4|axR?BsF&7qg#-)M|I^iU^lR4_$CIQ&YS9w}1`pdFHJVwQ?|mX^?; zrfqf`21d{N=L5f$P|*w)hPnpDC|TxJ6ara8!P3tVnYO zM74H=s$%5H`q?0R)7a*5CLzYK#YKA;>a;temu4l%Y4@GpH3Ug*CwDB9^{(b{$oZdF zJq5=qPvzw1s3~=JGBGETEcdrr4klhp*}iXobNNZyYmU{x*<0GP@eBbWHnoA${sz&a zmcRhtzA;};aUnV`pVT{SHm+t=gg_~+Dpk5RCmAZ_d0Ku)IWHQ*f)NW8*jE3_rZ}d= zB?{*CV`lFhqj9L?n7RU=?(`N@lqF6e<1$y~Xn=hq&539_d^!-}FAAZ#eES%WAKaOC z1Vk0!ca4Si5v}Mo8e4flnS$(RDxd=NGqu|TJ7=n1f3FXK8~4SXj~WB?UmtU3Wb#AF z1A`jXAk-uNw)FSEv7E|KD2QgyI-acfiRH8*y(dyZOOlQDEixpUC02g-gJ2%##RmmM zq?XLac|3Owy~%^Ubh-~9#L<0fLI7(LO%LYSXR4Qe1Ep7a=uu4_UzI#gJ)z@xJver~ zid~kuvWa8t^f#)@fo4r{^zv==wB0HO^ru&q6r&CJsabjN#PDU&>5sVHWGuOj>GQSS#OR`APQ|Fi#w_<_&@7~Wg?|YtOAXFsh#vso6 zI6|aZ?{?H}qte9Zw4X7HS9zFQUvrJ~IQvv_8p9mLo&hS4_lMW|Exb84Cb;VH>f#97 z%KhVwF5k@W@zw)H&yNUOax^F>v-eZuUMjRoM?Gd&1d{+ zATxpEv2t4R7X;Zfuk$D?4&0EsUM=q_?}^OTIhNlWM40r$o3;0HfmIiR+0I z?Zt70F?SLc61@d9L^dk3z=l^q@zUK<{@j+m|{O^^n~OKeRKUI{1c zUUa;8FM%(?DuFs7szCjgQy*JjYJo$6W-r7}&<Bs`l(Q-^|O*$8o1{*K>1m-{MY0w1{z~IHt6xOr^{qS}SY}8D9VlrwnIam_ibg zmpgA-36zIP5sRNK<%)F6W(^n06kFt#8(3%FDDOIH5-VyXp-^dDsq3z&sRlLxo0Vv< z5M{N~iqo8KpyLbdk!Zbg4JeZTB)gAMajb zlnFBkOJyHsH@m!aSyyD?@;S6H`iOx;#eC`Bn=j2NcT6k@twDAZ7Uf+z!_zN{^F>D8 z8kPuGQ%p*S*=ujqlD3$)_{f4}D4k5OM{phU_Gi4?h1vi@AM3*GSXI|*_ynDhx6tz* z)!flkbeC|~v93%;CXR0$y&{~r?z>}EJh&K9OVMyM4`*WUt-*u|!-c(0jsA!kw`Pat z;mXNsOis6HD}C^h+vZx6N1VR&r&p$cD&9$eyfst1l#g zcQE@j`)+%~>;2zm_WH@107*a*!z?fhpaRgNlVyZ4oH*hNc+*JTSbP5*_@f!WaW6ZK z;&-H5pfrORlgX()7f#X3h$6v7&#GG5p!iFWOMDcsJ4%7sIUljHFkHEcGO$t zK9q*Cw{oJgTB5;abor!8xM4UbM~3~}=~LePZn*sIkHc!g6N}@(iDgl^@uTv^FSr*| z`5mNZ(PoY4yBE)%K6hr6Zf`Q7>NZ38NHDtZ(JFrlTFOyDv? zb>KIMObD{(oo(Opt&@Y6Hn!Rj0CCXF>?oAnD(4j_kX1K&DS zIwG*AM;${)dbQKFOY3jjl&?&;C{`4SyD*9-=tKJwsDp10bp-8OI@z;q zJg%Hx42>1NAuVLg*ECrBn)xa%U0aPIp#o9atxZv`eOG(?CGsTV#hW5x zTb@tcZFSoJx{35YSvaQ!&#c}7Nb*Xpj<@cdTY1VPJ>VHiD3}x4PuqI=!7$X2_-W`< z$jdBoTW@vm(K)}K)H7XYMC2YH+}jA>N=_+%XRStx={oh~u~eG7&zfRO;A&V1NAMMW zylhRy{1Zz|SF3UPgLUNZw-O7jpGlcqC8QGSmV)*pKAo+7`p9h2$9C?; zibLI;bNT+GiQ>rmBZQef6Eb*YtA;QYd60UVHtgu$vS_{cf$5OU9ARX?n=b#jsa&U* zQ9)Hm@Ik_EiRPOlqWa-|loTB+FeN$*Y&z`?TdS zV>vt7<8Hf>lN&lxSTDEbzfUAvY_!JAEo$y)CZt8kx!+^>zUCq5U^P9u9k5RRn~VRX zp+5<@I287qJRfr5LySV0Rgp+Vj0@HhbVy-!KqkLc4hi|c`R^fLcL9Mlu$HzMMJErC z(ILTwLd8Jh@Slv^l|tj8Ah4RPr3;0LAM$;QyFWNG6#AD-BnFSMce4If3%L9)0`#yr z7h5Ms5Ev?o_|yJ(32{LKV*%3C1sQ;#5K$)#j@4*Sa%iufBtz#)Izioqy*^I!hN#Q*9S0h9bo4}pMEBIn<>2!teM z+5Za@gHuYj-xwZ;v9-tIeqNmE+Imse6afP3I5|-w=rBqsi>vBr literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json new file mode 100644 index 0000000000..89f650c706 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/7xx Small Clear.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "7xx Small Clear.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json new file mode 100644 index 0000000000..b84b37c721 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkGreen.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.663", + "red" : "0.203" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.519", + "red" : "0.200" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json new file mode 100644 index 0000000000..33ff64bee2 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkRed.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.584" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.494" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json index ef3fc04315..42dc0270bf 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "0.288", - "red" : "0.118" + "blue" : "0.147", + "green" : "0.024", + "red" : "0.020" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json new file mode 100644 index 0000000000..e28ac915cd --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Header.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json index 8bc12a80a3..f258ad918b 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json @@ -4,7 +4,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.550", "blue" : "0.089", "green" : "0.940", "red" : "1.000" @@ -22,7 +22,7 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", + "alpha" : "0.360", "blue" : "0.089", "green" : "0.940", "red" : "1.000" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json new file mode 100644 index 0000000000..9b69d5bb49 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/PopUpGray.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.548" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.404" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json index b05e49b845..a0b11043bc 100644 --- a/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json +++ b/FreeAPS/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json @@ -5,7 +5,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" @@ -21,7 +21,7 @@ "color-space" : "extended-gray", "components" : { "alpha" : "1.000", - "white" : "0.145" + "white" : "0.319" } }, "idiom" : "universal" diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json new file mode 100644 index 0000000000..7fa8c07f81 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/lightBlue.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.370", + "blue" : "0.988", + "green" : "0.588", + "red" : "0.118" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json new file mode 100644 index 0000000000..2f0731fe05 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json new file mode 100644 index 0000000000..e195986940 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "reservoir_mask.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_mask.imageset/reservoir_mask.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04076939773d5b05d5212779f437dd2b22ea346a GIT binary patch literal 5537 zcmai&cT`i$7RIU46h!Hu1SB9uNFV_sy%!5r1SCKp0jWWHF(62hZYa{E7wJV%danu+ zdQpmW=~4t~@`6|2^}hSZJ1Z+^^39%|ea_5U-){z}si=GdEGR+=Y+Kk~SbepV*4NfS z2?2lrXfta{NlAdvZIr#G^Fsg>FKGjWl&x%?QI7b#Ey5Y4h%!ebQ2=RaN+)MW6vB?u zoiH|DE@EEvywbjOz$jscYK)@VDohR(%9e%&5DF7=mv?>JQ5`Q{SrNQ{5B)Lc7DUM# z6McGgxO#~BkRI|D8mVc%f;o9>-8bTS+hP?)1J^m9k0}He=LK4yPU{78EX7nAWcdql z-sjH>7;t~Q)$K=XR?>c3lG*%&doIwiUqJw)TRx=kW$-#Ms(M~(%(Hl4Q~)v0b<9`v zeQ8o_{U)s^fA%=KdQOdD)@<@iqB93Fw6~t-WhAt0S$k}4*H~rvO#noDQ67?Y{aOjH z^R{L+Q+hb<7M5M_YVfNp{`+haZ!9|;Ka>C{W?)($ccf6GE?TI zV;orVhyFeFu+?cvz*qU#=oHP^s}IVrWZNtCp-A4j(23C7J#vrm`jYKRG>_OUDn@cf zDlcmH30FKb7}FDLWjdEunH}`eDYT8%a8@apUF)fU#dBI-eHzqxQYC%$@LAIK7oj1| zkbUJJ&mz)1>5bIW*y;GH&<>d*t6uEe;uzj+UzQkQDfr=3h6tr~DZ6b3=+x%Lv+IEE% zOjIgaB)woa`m`pti87UGMEcDiG2iCd`w}#~FGLhj`-D`I`YIQQl=?R9#uh^%k@$mt6q>{a`@LsJSxLACDQo|5feSzfk z$;+v^nUJJ7%W4mdUs7H()kIz9p^m-r*v2E%uyCPQ?>FqL$4ec8k|^HCpBmT)Lhe?1 zc*G{({va+B+q zus5d8m1_U+LrZ*aalymBW0crF=Vh;#hC{jUzJJmMw1%UIq-)2A5h^L%hqbMkq-7f8 z8H>pEt73DZo4w@|YZSHJAG)vE|Ck%^9hFRWX~3288%&H1s~%}BdA%S5tE-{gBI5*(R3Vhlvmue-~@IA4}iBkT@ zUX?o-Ke&u*!`@cy^g+sN{@4?L`2G!_FON0GzHM`yb`|#sRwkD;eh-6d+?-x`JLu6> zT#h@=+5x^!>fI--?Y+An-5Y1TowI{!D*k~zt=oZ1yEe?P#=z^BkLz~YKLz#f$H2E- zBH`l;c1vEp#g@rJRoOcy%QfHNl_PQKg2L(FzR7&`aBenfaC93W6*6f|)8f)(8BJYJ zRil~S>ll+A(^>hJFVbP69iGtO!-L*z;3M8vs(8k@IOT(bRD?1lnHaH6*vZ*MViTxl z=N0J5UU?7E*)~K%fS$ppOtF^+}cKHEsKw(dVC(-!0um(U2&3|Xoa1#;;{yx0-C630p#gpmI*xU11E}cc z>C-aFVY4~1Sk_YOV-}fmiVkg0<+5F`%hyYv>u_6ircu!8Ger!6tElJ_Lc_>KW!Uf` zBiF2FY=`coH4PlQ^3i#BOVebe;7TANR^luO`z>-qYAjKA*9RQTG?_D?b5uO@K4<#` z>GmhNVSV*D#HB87ZBvdL52?A`ZTSK$@6@iZYVu0H8P6xzd))lu2!1QEQhCJ0D!}K2 zy{i8XKPAc@`OER}tuv!MbH}qgSWHyxtoN)f{D+C^dN`l}LYfH6pWlusduM>iUxuoU zazeW}nxmWmqJIerXnSXTzZ2lhgtgDi^;f>L{@4-MhK{*2+;FBsU1KN zQO5ycjsl#ywt^EFAoeT4A34PT$nneAVLzjU?&1p)k~=eZd%Uv)gcMP(R^}*e75V?~ z`N=QbbaloVf^hX>^?jE(0l-}rPYS?*gepCWR^ zxe^`KQ$Mp&itUS<9nD&bN(+-=HWZsh(4DEolTL%_@ukYqam!82Xbpkpu^&l`vp(Sy zNV-1V#%iKOC==as&NT`-^Z@oSg}^<>az2D4Sj{Ylb~N5<;Y*jr;a0iMff<-T zruELuGxyuL-HP)OAjT&p=od(8cx;&5WZE>&R zQslx?45n?@3We$!2==%PldhCE#NH#QusbKaFjJ_p2_V=eC8(HsxpOtp);Owd_B;<& z=-QgC6Je^2ApaM!qf|fi`^G@nenR)gk)A{jqm1u0HF^=0(n8LwoLh=LJ?E+8aLAMW zi>Gr7lPC`vvv;x$-9r}> z0!#o*vr3Ju3oS*UaE+MDUdEFMv-;p7n6j&(?qLzO#3@qP^T*O5JC#w0{mgASPMyWQ z^N~nLV1@v5=Cr?UGts5zWX@@n5MMzMk$~w1wkIME#8UtQ|0k*!iC+*4suEerlDw9a z9wVTX1CJ59KDBlr81nV(Bf0A*>Tu48s*@HgrTqeG!`RNLpQoGljS!&4PPY=_``T&q~ zCxjS(+IXTt#Dy_}w@=1PCD_PSTDm_gy3@ZTV{G~~qh7@zOJT zV#G`xG#qapuXmeqQPkq1i0^@4w%Kr5jy_MJj4OpGZBqD+Ha*iw(+8z-WyE8MH3>HA z&L-wrHV5x2CL>{cXfa78&1hKdlhxJ>Gu&J5b$nBFn|?ISPG8L)b2L!;u=!k_j%4p> z8Z$gEyu9`I`oLh>!o+J9*O{9t=lYy+UMln|^zywGWC8HU0otsWWolQx8{4Pwr zTGm6>Lm^xHLazOgetvvSvY|%3B1Rn}q!KL>w-Yz_t|+3 zT0o}XMYNf-!=l4#!y4uZ@ z?eaB-K-S#W2O0+i9rL|IvQnMOW8Xx$)Z|VblG!2zY zYR*j$NpD1?ATnpnujOM4`uQ>qGbK92&EGx>*^-`nz+D=gtQMsf{_c*>*wB=&X$`Id zciv|4AvdG|THBdXI$>Z?s63JeYnAMJoavEtz)vL=svnxnFv(ydur8o;V^x6NfY*Rj z->zb%^sx0~TcQoz9Mc(SJ!f9tn=`rirYP^mv}@x!Mj{bjI>}Ibw-&cYy~laPeFP?x z3UUvsr`{iPcD-Kfj~S+2{W4S4yA?J^#^c3PHmLS$I@zF?xA#JCCe?YyuZ%-Cm>l~b z%~Y{DVg-?cVJ7Yl=|lHE#m*V79`@WB4PSC?vum3ilNvv%I^w6fMT1od?TmR9y~Ki} zGJY0UavyuYq%vyXY}0!4mGn*NVCit_%MGp#1sI|4h!dg{*Tc!3(XUH~qemJf;v|I> zUnsLklu7i+q^X1{E|I#Bv^Enq*ZQ#w4VZ8l4KWbOA1k;9NK!!0!|4y5m;?nNh1_c% zRrlPz-Q7rTm?VDeVb+}bSV+=ift(Tno6kB)B^^15-w&rO;Q9`RjeWxq0g@ih2y zOWwlm;$4$!w*`{X=-Qy8sHG16rSL8IchoVKB+mb}f4^c}8$8%ttyqm-ZH`Do?#*YH z*CyM(^La7PV={R~^7`{WSov3cuNagEB0@^};UZEz^+K(XOprp&d#mA%dzUk0`?0sL zI~iEi#z*|P{Y^EDD+&12fU4a3^^~OwD)qfq5AEXaeB!))_my`$?~c5o7Em`A%LdmU zfyd3z4IApBfRSROPt|wb;LSBN-x^jU?ErSF<6pa#yTehe)Ak`#Lt1HCr46PJ%QqK0 z+-+iVxn@T{!OXyTys!8(ylA0kJ7c@D_WoLf9^%0xQyQyCWMqYK?(2H>5^I&= zS1Va7zATZ6i}fpBmFvkLJ3oy!PTTnm5{47ElSyBtW2^J&+SjxxlCx_^Ow1Iv;#Ml>n9O&X!1*VTqwpv0Skj(U$P2jO#-xRzq7c6UvWLAGC z5$Awy&31lg-%L3#IqngH$zSFff4?GDUxmug@!eq_cYWdBkUH!5{`N@m9qKF1k%+ewJNN8%W z2D1=xn#@WZdhT#Tu)*upctUC!Gj-BWmPcbO)8i?A^6WaCG(r;Hmv5=({`f{(ctl?+wFs#hbz)us9ebEDRC` zL!lyuAP^7!^LOMQHR5*yNEdVbk=)NZ@F#Q%_>(wid;yAQ82>XTUc7@w{`vdw>fIet z7L*_WScDSv-wPm$|4%5u0`NU|3`y}LH-p75f{hLtZY$^ zKhHgNtUU4W55FnWMx*g-=4@TyU!@Y%kN7BRq literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json new file mode 100644 index 0000000000..6bfcfa46af --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reservoir.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reservoir 1.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1afdfec5785d2dd495ee5c75f62cb23c4cd68f GIT binary patch literal 10664 zcmbt)2V4`|*6$EP3(};BNC`+sNQDXTDSjCSvkU_q~L-o4$fXE5Af=2>4j24S-aVw;DVYcS356zxVRWxMh52T<$x`#(&e99Ug2vibjwov{ z_?h9FER)|Luo@gO{fc%0to3 z#of*I%vutEdQb!*iujk0l@twr^DyjRZpD4Z%>tCyRn%1gJUjqU13v(64$xHgbFc*f zEiHf-003eDFUkRcf;q4XzyKZqfd32+zz45*XR>FIKTAWO;s2R0KC6gZ2PAat-Mrj9 z?cLnr!U95ogo3&j^sF~9{mOIv%2JLp#ZJTnFQLmJBpGXm3c214=i*Z>F> z9zGQwt`lGZbrRtHO23+cCp-u~lz@JoAg~;OQW2bI zMaUCU>sk`A-K9Z>Cgu`fR;X^H)f?Jk7q;>UBZ1Lfpufn#!O6wV!z&^xCN3d)RZ&S< zMO97xy1v0pLnC7oQ)?TPt)0Dtqot#A0{QIq^6~3WM<{%7Zes1 zmy|w#SyNm0s{VDuoA!>*uI`?9z3+!dM#nylf1da<_icV*@%z$`<(2K9JG*=P2Zu+; zXShIn{ss#?|Ay>uxTru}5GWKMN_2(`58`_UoC-?7iXc2MuS;ZkmzoV3N=&1Wm|NXO za#>h!i`L3x2u8;)GRLuf2JIKJ{~fTf|0iUB0{a)PNk9<{tg{3GzxWUc=qh|LK|u&$ zA|NFAl?Z=NM86X8St9u};lNIQ^#FlD!7m9R0pXuz|LY8H3JgmU+!x>+J{}lM_*8%_ zfL+D%2j1EeY-7QnI#D=`_Per+(Ih8a=16Q_(B(4nS(7P9c$RqNW{ok&ewD2)98GU| zi37q|hfkzl(!}eu5O-}|PyXJ&-LBU2A+aDr8=6&#(RN5j*Qu^A&$UeC>n6$1Ri2wH z-^f3YFz@ffBhCbQo1G9@Ctf+-mn~PLoqpWD+>LvS?nW< zb>)?y$9tKG;DM8}z3hj#hvIq`3UaC_*46zy(c3$>oN+*%f5%=ktx3!5V;sO#A=!Ai z`Xa}y%WGyphxT|`nRzIR=g6T5-6p!X7*0VMczauV^y!z23{*!_!#SU7TjsvJirNg+ z*>=DI^|=Qo7uHKn0 z{@E;gJb5-MURln<(^wqf%FhOwW;|TH=gs}2KHiJw)Fj&z2gGF!ygHP`0R(1S7<6aL zH|BW1vOzUHvv`b~WzMG-bNl=+Rn>C_{@Pm(k+l-Y$IAEC2Z3vy#=Fbv`Xt>bQhlYkPi_-qbo=7_aj&t2ej$9a1OsU z--`JLwIeBVLaOwf7A1W#zyU*A78R*SXIAr_A!^emU7>Q{T3xO^rglN#fC;DT7L1bz)F-x-FWMts*)8?7o!|?H{piiZhykoz?D)!_gV8q{9~gID4ZW^14e_VZ36%bpKQTEi!ZI!R(%&^U5?v4xzX)Yyqe$5#O#2 zP1CbnDUMB6w0Kc>Bn!?csTO>5MzJmf1X6Od@fb^bZ0d2_e~G9qyAzt%^ZVDf1y6md zKrHW^Hm@FD#=>k`gL|6UnCt2AaRBGHvf?+?pRwj8rBbEn*Jwd(9kW5pSJ`wNVA`lj zf%}BbL(gXEf1JySmZcA-F%K*+bW%{#A79M+MkIj)UO60%uLcE6-qNQ1YVo-6BH znH$O5oV^Od?#*7a*4YtRE0Aa2r?Y#NpG}904$lAQK>F@>LhIQ@niu>5VShjUlXt+a zKy(d5ucYh~M_GnbWMxmwWR5H&+6f)eQgi!>=HR5(X>KXo&paNpYa1-n8UenR+5OT^ z*8?8jVgU`-L2&pO8<>MV5<&l&6+MOM-dxXUpu&w~!6(^l5t>L8eIbx{1S{+(=Rt*M9sWwJVyS6aR|$?9AOxc5pGmfiUV|g=^^%~ zcN@Q(?I{#D1$ZwOR^&SHN9;O@Q0J?%yW;cZpF>tjQOdUwworTBnli$Ylw&l$+MBkf zX-5Q$rw398_VY6`ldSl*H9CcUNJtGfQFui6yt9dEVDdR{c20@0<36S18-rd?7f*&h znrb1hL`KMq7f53G0#zHWM-4Z3-b3K;$9E}*c{2Pt@XoJex#U-L*QMCO@Tb{VwE%W& zF8l^*U_~A9uI!UNRgZ6 z_$7=E_{ig0FW=4@*jGHHcDLyGq#s?kt|yp9_tV%-l2Js5rLmtQqlA&S`qcXnJ*!Q2 zg4i<5oTVU^-wzU3uh;OSF8z|9W<8a$m~mjG?LUJ0eq+f}nZ^*s0#5!|zP?~&AoG@N zj|Fi1ZM`dZM~T(Zv#j1Ga9k&=&>{QF#Q7%a|Tk--6Lc42|uvp67{`BMEhI#iTf)LiU` z?X?(R^5RkEm5zKqpmj@5lq>cv?VRj`V8({6s7JepqFQ3xK7DTPxrtHMEA-4aBVpO{ zL|G@f+jeV+?fHH0ZKj@1?awitNd@PbcI%dRqo0X;pC!4U!K+VCm zlY2#e$=8SYz3uf@E^)B+ zPT%WZza5)15ot0ch!agx9Y_oBuFhwVFcrN<8-Cy6omB91qXn)L+B^%G12f&0QM3z( z&|&w80e?}g#i~qyOtaqI{`0yd`lASm6{kHeh3&Xh-#Lu5s&QletJg`y(_Rib_dJkc zEBEFd-W76qWkG!mjKcg{_6tv+oDjccp*|c}3;lM{K53aV!y22ZbXy@PY`p6>c&mpM z1zr=+?_dD}rAz(Bjh?KBU(tqM(LT_3`YOpX^)p>|x>U#clB|xX%dP8!UcGze9^d({ zT{A#_l-jr)C!(9wzb2RU+*)QRs;@lCEQ@K zo=3<}6kHC>@xB0cb7rZrSbv1EbEG?-S=T7bAwIlmtic>@3%TA=a@uXo=P%tM^}wH# zEI9v!?ND%Qa@Hbze#@;x8YwL^d?f6ROs*W&QDwG+4Av%oT+Zckz(nuxGRZ*ai;F1ll;`5Jn#{uvIK z5w|!AZsD{qmwuwYWVd41;RZQ53;gU8_qW@doxSrzyVA@b`3s%S;SuA-3MnMjG$7Rm zE;riT5qft-5L8|SK3-UZf!4V?ZAzyD`n4p}Zi;cSHMHpt`tWl7NeosD2UP5%kI&U% zw2b>*uCaZqEZyRY0H^uPnU}JW3nmr28c$6|65QN4FUzb_D@FY8{YifTiFj;UD|J=bj+l=`C+xYm) zHiw`R%E!SPrRrgM5B84@5xC(0Wyb@F1b40ekGop`+Vk+kTQ>`G*0Q5V_XOG$2vbd@ zWodqjxWY?XeWx3WV7X{bqKCA8po3x$)4Fm#$z|=ndfG?iYDwk8;k4;j*3SzIm1S$6 zmpf{dr8v4d1nf<0N*+w_2WJOdt6w_mN&dRC7kmb&rIJGtmaj_5UKtQ~2K@f+u(pR{v)m)Q)Jm0p~qu&554815py@PXp-&hl<)a(6tF z=oPQoklAK=^T3-Mh^D2GIhK#N>QHtI(J4=cvpD_fs->A}*5gac|Gt+k0=% zwx(h3uC;zmVOMrnPqWv~s!Qvu{Hkje5m~DnMrpLP3pRy0*OI+>1vrlfLrWB^m&YoO zp7fWESW_r7NzgM<2k>rty^r{?c5N%$Kxd7 zy-+j0UGLjLJUpyC9G4qsZBx6l4$N4hRDRrx6O@s-n7mn*2NYPu$msQt(d@aQ26+gV z(hfU;(G3gQBJPc4qku0L10!mV?_*QRbSmCWmT*nqwR`4L2ht1Yv?gA`9a zzlg+(JvBpn+uwQSQde+ZdL0J&0f9&Z?3#yUI=sYM{1=}hT6d0+TQWW06QEbE+qq9%FYXf+5Q|W+o07R#(}frvV*Du+7zk`Qj{}5> z)jksJKKQXEMmamp%|`JcZZjlV0Mh?VDDr$Tt0T>2_X}}tZc0C56d;~bE`n@I3R_CF z?i%@&?6j8w^y~`Nw>CKYgXBdP)f6-0+n#C=s=JU^sh2$Xx1NOfkxGr@ ze}xd!^gXw_3;9-)`&t_AN)@gBnGT%i*D@aXtE^>3VXvj!*omR?lA8j%4R&5#a8*qD(3SsrcA-5b+qWG!<1b95- zC9vB=`&95&%K(zO276@-XFtP~1on_PqYU!GD@it#Kgz1IbR92}?GCyWehQ8J5NM27 zxmKlTEiYGe0lDH>_@-SrAv)c&N`^+TktsspN?Y}uUf8`Y0!m}(f>Os&c^RP(zC{yZ zP-l1MQ2VA)U@LT#M@pRPPRP>!VjxjU78&nd6&$*J9$h(Cw&AYR*V^ATggX*))886WuqsXyy%*hhD*P5$u5&uHWR z(O%3bwQj8L7k)gBeD+ugzIazvSZ&rX_H^e`1sHGpAyH~Q(a}?_8iEaMll_f5&(kJP zu9W9@cIxK755B!MM0HR8qj}MsylVkRcTa;_pp|Jr`x6ppzcKQIhm{6GGr0`f=lo** z=xS#ALe4jwuBxoe^6e4gSZf~V>phwnX*^su&g6Z)fp~LRm1v?>_xiB!qw#(TS8!?k zycCxC(N1Wk0gKCx_ddh#rI31dnp@m_AN@4Cd|x+=LQfS@K72ayD&mIky=E+h7TO%k zy-$J@_3s+8$keI6Em{=(t^X zzO}`6dVYTlyx*~~i#6E2es5lRLzyn$_4eiUn@JBPN-d)UbSsT++X~Ybc_`4yK7n-CN z!9U5+-bLoa)_f59g!Y{3At#{l>V4a6 zOdh|-aU8x$!FM-H@9$4=rvwb#PpKbzuiiiZjO}vAhKub7drvv9vh57|m*$uY{5gJ_ zb>=73IFB#yA?q_%tu{}kElQ^R%Bry6cWgcGm9;PJk-_gYJlW8_p72S;ZU05@CI!i-n?^FayU1DAmh6)P zBQdxG_0(n!ey)eFI2XJmE;Uxrb?hPeyDygW(bI8~lL03z)WIT`{<%Pt_{#$A2Kd5E zQ2y-ApX=Fcrr(!adaB@CuixMOA;l2L|GtiTn&xYuKS38Y&?Me8c%BW;vCH630w2Dn zMhn%ARu9pEM22(vC=sa8Q1KYr7_{Q4MzL8d(~#Z|vl=J)NvYG_rmLj9I2G$evRN*= zGo5wXV=^mm{d zeZQN^gN#HV>2gW(Ua-w~Ryyw&f9GrL%}D25$Yn6;zxY-pJGN10I*Vg2KNgy6mccP= zmmf%kYBEsI0u~RrM@9~xXaYhsnHC?GICGt&k;*g|H==(+0OFKR$+sTlF-Ma2*??b> z-NHj?w7OLh)p&-(;*WQ>$J;gfM^*^Fln$-A2Y#9ZyS3-ygf4_sx}_=OahSMd+9$4; zGp?_jeEM#G)G{%{9ISsT{mvhAbDMK*AX`2*+hoRh?S)_y9k9=C`k1MvIrSz`>q02E zIQK$(6At_&0BWb7>@Y_<-%jfMc8-fQW^K*c6EDX}fbWMmCMV48eM_X|L1y0u#_(Fv z1=-Nc>a@Zr<;9}nA`PVvAI_1d57?X@P~zrWB^^HYc3gRq(|Tb$;>S(hA1Nf^(e{lI zQlZ8P0yeO4^w=DlUW|+AV(?QZ8hdXGASgmo=e0V~J2z=S@iIQUtE@jHX!RB)0`{)? zt$lf7rDr_SAG>tSLTdKVbxu>BP5=A;xp*57j=U=u^Jl`H+aTu?h`gS`L_!6GAXn~? zF@^}c<4?nZ@DMdh{4{(4HHd>8^rgJaX8AXs-_acy4fP*{-Ut(OCp3c^wUW7$ zo(oZxgGIJ!2;ohKIuM6#QPSqgKTn`5pvYACM0v@S_@1J?jsy*Umtu4RWs=;{AZH0Z z@BQbwiaOG}m%SL?5S!mWenvD17a=^w3ks*ofQ(p@eFk2IOjKQCBvx(jn^p3oeL{4h zb#m_dYdRV7`t}QRm$rZ_5f<&q#B%S5@rP85i7#y{DI^%P<596XC9)MjN|mz`$O|qt zJW@-%yMRv^m1~(nPuG2MKFTC^&dSj8lht*hu?*`BL(L1{#cU~sLyyA1)kJlXG1m)O z9}+RD$B+0s4e!L?xmA^3jsMwl?HVI_PwT~RjPAj&>CKR?q7~43it*USkkt;dInHgr zx4hFdn_(1fo?BLdtj#bqBbs?8o~65mD}lrm>J&!7ng(ZgW;dW@AYLLq4X0`s(G4xp z_F{{qyw_=F#Zw*kS^lj$Bj=4|8udu_3wrE4nYEz?>W*yYoYI_4tjWDsZB#wzP2_HC zSFq>6EjTEWWOY)wIcc=7Gb$@g+>pH9Aa_sho?@XMS&8eY@$-x~PffL(l!C4Y392Rw zr|+cC_m(G@B|4?9rU!6nr;MljrdtT)a9OaTuVaf&UPE--=n8RnXQD zG#0d|)ZNUL(akB(DQHn`xrKh;Itc%ACr18pTS@N2+!o7h%ltX(%g+9z%EMUNd?m3fKt5TKKu=j^3P1oi|-Q z{-8DfXvwG3rE}`D^u+0F3?GFCMWSjnPFL1QH@;$0v!D`d8VfIyrenE88^G@4QF<^ur4cp1_6;__ zAs}p)RdB?@li!SkzY3*W0ey2OD|PCc5E7ULNtO!fdkPhOc?so4LK_ z)p!@Ui`v9ipGw~&)TJ5Mhts3F&vdJr@7ULDe(zRjP|%%g;_tsj?%d@}>%2Z?TT|{h zna*~5XwRze+rw|#9AA@GXH0^Oj;22Bhp#sk?iXTwXMKo$zfLW`*)h(vGPyl5STSo} zzWCv1-p~3*qqSy3%UgHvP&mZf#MdHAUN&8?bW|NHUMW}!Wr)xE-n0@>zy9<~&*XT^ zj0<`M?-70%kqk2p<6HE*10APwd6zEBuX8Ut23GS{-n7`EEznBqYTJnesu8M%J?-({ zW7kH<#Y@Cf#M&Pvbyv^d?QsL&)F=i}mo4iE=QkWeC0Hf5zx5olY-XR6nz;8c==n0& zY0mzuLDPq(xu3p%ihflf<`AG6FtZ#o@|3BciC^|HE^s$?KQpW5y`9EDVn6MZ$C5d| z!9NwcBer9rFGO86@{)N|yD0}e;Y)K1NLBEPxH7eok%{G~bKj9>QWkQ}_6QE+Y#lqbr=$IZcm2kgVc&BogrB-U}eSXyiA!~f_8 zAuJ#!fPkBED|kCN+rW`XRbhm%84q07+tS0!9}e=*eo@-|ym&y`7s$Kwas#{2aqvSq zyZp)v3rGqe5TJrzh2X%H&ereTN>`CWNMQsL{D_K52#c8t32}j6u%4Ei%~=)Lf3ET` zQkJ z9q~7rusCSSf0s#0NdBX(h&TeI*8O`uafHO*+aiR7&Rp|v^+1_8$PfHO=H+4O;EeM4 z#eURx@JE4oL1v+wn-}~nCO{IQx~r`l{Fj5zekg(ABZUwWL0DOeNl4fVp(IhZ5~AWr rE0ndRrH~j>$VyVwRtEOptNa#zo?f7%e;FDfgp?42ad0SWtHAyT=}p<# literal 0 HcmV?d00001 diff --git a/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm b/FreeAPS/Resources/Assets.xcassets/reservoir/pod_reservoir_white.imageset/reservoir.pxm new file mode 100644 index 0000000000000000000000000000000000000000..7ac25ecfe5c34e9c3fd752bbddee454910344a9d GIT binary patch literal 107766 zcmeFa2S5`|yEZ(VP3R>QK|mlhDbhPgkxryaN6;8TfCwa*1P~Amieks!8;IQp>|L;T zMX_M-3W^m)rTWb#RF&sF=Q+OT|Ni&eXvpmB)O%)j=Pq+!p)o<;K|T>48^r-g$Vg-H z_?DJ85dumiiHS?a=w~sxJQjx?t54@LQdsaRLZ8pch|%XHjAt_VJVk&^Ur!^;2ZskR zbC`)9U5TzsNJelu9KHalB%4di*x1_HJ2*Ny4|j2Ob06X1>E-R?>*r4m43CJ3A4gBf zn84-nGxH|p3ks)9jnrpnrlsAGm6IpySVsqko2N2!c%$KOSB+8nj5IorS4k!-C@Lur zQc)eOrmitWQ%jp7AP7(aQ9u%i3B&~w0!e|CKw2OpkQK-YGWhKHN=<0O{eoc z={y!Ah{>mWviQ7ECfAFTp21-=*?cNHiGzJ1C1~Vf1LgAOFf!9&>Tp&rvnRFrK&iu+ zJWg6BAC5pI8&=no!D65ceq2swMj$;04x1MzQ`9J7gUklX;l)YgaCsSY1~ZtR-rFS0 zfzrcnr_+C1h2cP1U<0x_+{E7I8xNGyo6e_ur1xw1fN6!j#M<0j?tqPsf|HfQ{T*Ef zBz**PBLBaYL6|s*&P)A?@>TX|{k9T~7yy`vSxNo1z=Oo#!g)H{QE z(heP{K~bW`-j$FnF*?u6+R2n+W$%zrM#z9hR^WyCc~Yo8UiMZ__V#Ah=2m2+R!)9o zzV3I!eF_g3o=n}1ot?=KG-9L!Lr_%$V^I35$FhX1$qK~fx*V{sfp=q!BBw-j2k8} z#g@EE4}n6{==>zO?1SixkZ>B=py!6@SUOb^e@$l!4K%*6irFe+qC%q`6p7?$P;j0DCsvcmuc zg)t{&vbaoMSAoAYA=1X&%G?T$Lc!$t;Bapi1A9!-xjAJ8VUbqmcIH-5Hs(&|R#xHg z0;VdOMk6crOoiU$8;T0TfCNwg>OdbD18d*_s2~uG0^y(t%mNF*3Q!KVgDP+woCK%A zS#Ta)1ed{8a1GRgo8UIM1MYzb;1T!)K7(fP4YYtZ&;foR2!bLcL>!Ssq!C#}9#KG) z5Gs<5Y(ef3qzJBrWWpjsHK7UBLnF``=ppnaQI1F^Y7jMv+C&?o9nqOMoajpQBnAMa*2xR?JDvSBxqaA{He!T8t)^ zDV(f;fQWv<^se8oAF-U!0FX#q_%xRjk^4|eTwgJey%O8{5Dcc~I z_e(lF0;d2@0h|Ij1#k-B6u>EfQvjy`P63<(I0gO?1q#VTaaA21q%c(|W=X@ue>98% z>i#6*}=; zB7OR%7bP{OgalK(LV|q*sa_G3FrUys4=*2M8_p~7-h?#BhtlYoe2(y% z)>}W#sy8fFD1(Zt8XF^p;lh4&^RlAk{jZ4q`qTej-!^u2B!kX{GFMukUWyt*=hH;D zDAeExA3vWkQwl#PL)3laNr0h|Ij1#k-B z6u>EfQvjy`PJ#ab3P_M)C&VSC;9muq<3QF(?xxIfxy`cEWsk^P%Ztljm-#IFLe5(* zQ#MXMT251b#(zMc@h;#Lz$t)J0H**>0h|Ij1#k-B6u>F)|7!|Zqby_q<8;wEh#WQ} zl*>tCrFEZMQLshR2g)+waSQU_)FV3Wf*nf{S^QI>QWqX)kvBnO2dW1%@`o9^n;IbJb*$lM;VemxB4GJ5!D#TVyD8=x+=yF1R(N@0sN1Da0=iQz$t)J z0H**>0h|Ij1#k-B6u>EfQvjy`PJ#bL3XDg@3K1Yd7xL?7-cI&Tc9zz5Wf&UE( zC_rbvfGmdD|I1391oCra!ewX4osxbntt)RTQ!O`6x>)vu)Ja+0|Bc4rb>I}hDS%S| zrvOd?oB}una0=iQ_^(ocMk+)CkbkZ#`^i{VSWq8hW!Xene&io6pUR73@mSE^eU}xk z3>{Vy@`o!C*>-o;AkBg`(Ee}@RGwEFD?IRmU8DYR zT_F(Yg2m72>W)M*tRn6YR}r4UWU!K0jJ{Uu|BiX)nZ{%%Vki(@oe|4`ok{=0oe6~i z08DNclNZ6Ivmr_dbfd@UrXK0vGeCU};fX1*PhBtKy|+y{`j}x z6PZZMh%kYMnVOkf3o(j(s3U_SqoQLVHW4E+DH(zjW#!}-7SHH|O{A_rFgDTF9%Q0l zA&It%u!?ka^&mKr2zy9Ph%{s%Fcc`z$Xc{Ok652Dzp#+V&~TbhOsGe2I5i}g79Ih; zcZSnw>C0TtM}dr z^a$_DLF>BNCs#Bz*gGV;y9%Yyn6S(=h!KOKA0@&wIq>vMJS{W~y3Xv*s}UO0Jz2U> zA5kGZ5|8EUZc`AtaL`hC*UvuU}?shru(IIXH?CnxaMBq`~66X%aND^FLoM zwHVIS@6c!l03q@4^6m#>(t}I`3-a~*8N$Zb-@6;ahDKJ-%YzHRGT)SvXKf2ZR<=(0 z`LMGAR_jGQ4IZUm77~hKOqGR&L71t**g&g=#)PM_7)%~~!e+rUKt5~?Atw=%ltxzU zzSp&pfRU0I$ztPaWuxOTn5wcdVw-)w|+=U?q2i$`XF@q8^`AnWbK|r{ns3fbbIrKLx zdrLRa*v}ASTeP&bb#%4#^@UhtBD67SIGZ8j7{n0@4)^D9S-BiGpPrVM;{{2?$@ipJuQ@uo!`UWhj5k!hr^SCd=_KC=-vwAg2N*? z8KUCh)b-@>;UPNFrKGOsd?*?wkb$n}UI1z_V7C9pGI4Nn9$=Z+*}J&HdP5;xlMo55 z%+0y)>ZAgYf6;(~<3tuGtlAbcbXnTX^gQ;@mHQe+3R6FG*QMJ^$A$UV{9t_M@c zz5m+}c_kPMmqo#3I51sMQrO;YLxI3M3IZF!;EgHrQ;Vie$0kMsoyUY7Gv_iPG!z8H z699p+z=%f9#!jI+TUb~`!u=A@VthinMItlH!rGF}$+BR1goa!Aa+yr*7kd?Ea^cFi z@Zj;7e4hD41_ZQ&0Sm5huf<_;EiyQXw4N(kb_#T#Y|g?^=wQ0uWab%(NwDEFXGI2w z!v}2HOz#26EPyaVbHNg@9&84?z#gy<8~}&F5pWDtgA?G?Po%vM9)ic3 zNrXgQgsexZkWKBxJY0GvlTkLxLo?BAGzZN?1?UvC2%QeWnr5M!(ZlFb^aOemJ&j&KuZzWs#fgm* zV~cUca>N8;GsG5)EfrfXwo+VKTuog2r{SO7fB409t;JB5`~aH}xX1e4p;E^wDkNg; z)WiXD!AD+S#JhjPGj0QX!u5Hi{fdydUO=eD5E6g4x_^G3DXXY8^D;c40dLAPTs*| z=dV9`@%E=7RR3uRo2POKq(Y_X;|3t{f9J^Zzk%|brDcSmpM7@YN-Dp3XLr5j%M=u` zaVS$BBoKmw(#SufM0W33yZY6&=?a4fxx4r%8u@2<#h<-YEtv%H-r#2d@_pYcU|%-;K)8kINxi+P|zem{~`6 z0OmqRPrKj14ltOb!8ni%x$|652&Q%o=WGafctr?ycndrMufccFju7F%Dk4URsb~m$ zhE)HjA$7v|e{oa_$k#}wiETr-qFLw&c!_^-3j9At0b4SfKF|(tK)*1yw(=-zpq)&w z?5&?;7^0$tl^hx?KEPx2C*Lq0cgH$kbj>K4Rv=4EpG_Gc(|}%L{tXY{O0vAP42Gty zqYK$*jC1buELIsZ@UwWMQ0Ubw@Y<+4SV3I_B5_N@I3ZvBACIf6XJA;WFOVo5ieZoc zk8yP|(Z%mxM*ZF-Wo8yVTZCUhcZZqU+70kZvNf|9;4Q=iselXLLDRq-xQ$p0mV)Jw zEnf}FAPny&umx-bJ0OdG4tzkgA?rOGS%@r#?DleGC9)d14f(;R$XleDKp>C^as*|9 z20@#kPjD7JZhGES_Wd6}1h;AKGQ`MP&I2rfejbnhEt6hZTBfhC$j;sgiVyqD{2@jI z&;0E@;$Ar4e~UrC9WE$MO-(&511-%iJbGF9D+^^#au9-E4u+IQ^Vsx^2#z0@l^8Dy zind&F$wGHeLP6RXu2B5iwLy&+-3jC{QkjWe7yhioL?)CLsfbbrG5g8pcwHrn=ov3c z6Oxn!g$iAFJTZ7}UR*M4MOQ5nl2CHz;J98uuEk{IznhUiZ;xEu+<(~~kwKJ5N(xKC zgpa>Pg7)%p?>D;#n4#n0hBq5b7J@^s0qdYfV*?Z$Z3bH*O!Qx%QYhgN$u-XWMs)NH zd;o0_6j}w*gWF;%5(V{{93%so0L4eyNDfkf%!G5g6xoRUh3rQTBGt%gDCcnakq`n8Dq`@ZY-P`nSwzcWD_+?1{} zCUBu47ap8W8A(P#Q&Y|ZbNK-aV< z!}L)1q2Hx(F@e%qxCpeMP}u-Nuv-eO1P%g6DA{&`UsovTb`xku?epE~p<_&dSUE_nASBd z4h|}m=nCbtk>1P<kMZaTd1-IEY7TVlz10?G2R{bLl&^}=CsWQhSDze~U>xEa_6 zg~&&RjA<>n32uWs;2wAY9ziDc8F&F+fd=pfyak<5N>6|cs~94INFg$a972Yyt1^7} z4u-i;zc{PADO4By1(@heGGGP~3c(aFuY4 zaFcMGaEEY@@PP0h1*o)8?5vEcp%l~rHAIckVW=5ujoPC2s3Yo(x}ZL244RHkLJNh$ z=b7kobTwKIS?OI+{9J{eLa(E@&HF$3gCbIgHr&f!2do4mgg!ES-XY|uq_r!vWX!U=uCeC9;hP5`_(89C4=ZVI1b#4x5< zIXO8}{F&KlOg`T%l+H+{a}z1pri;$b0YKDeEEiDxyzot)rRIvGy!sll| zb#-=jwmFN*Fvkem^ZAzvdQuJ?=u@9LR$tG~gyPLiqGzV@DcG!LaMGYIoB|CC8BB`V z&y)BcXYA9gKJ73KV-#DcMa0hLJUQ0kKn zCPCf9bZCk(A6g5nguHb*5r3VCS+5r-NH zB}5HMgba{jh&AGfxFJ4BAQA?*cH@v_Xr6&>?xqT*MJpk1y%pJo970aO4c>L+E|eI( zhFiK;0!om95+hB*P=W=)k>EiHAVd(x5R&0`E|*Y5m`7MnC?o8E+qn~jON3j5Cxk{q zvv3Qig6hCcnnf=@#iF z>8qHSn2MO8n1h%il@*m1GzV$a2z#l@k$!7y=G@epykIA46a_zLkI z;??4{;xEO&OGry-OISfm|CTIC9!mBi)5!(oRpdkDI&!mul7f{&h(fx; z9EEKP7Ze&4#TADt`Y0wU7AbB}Jf-+t302Zl@={_bO;svaI-~SbSxnhbnW{WqdA9Oj z%2$;?4pJOsJ1A<<#6hbD9UJsS1yvcULRCpqDN)(2a$BWURa4bNm8m*YwL-O4_1j>L z!6ODU2hSQ@Ir!G#RyB&6k6NnQ0<{Bb57mk4ChDWqv(?wCpHY9Sp{y}ngP}1?W4Fe= zA%r0&L&ApS4cRc{@{ndtEloeo49yjqr!?Pcsc4PR8n3ljt4iy&wvx7+HcNZ4cD42! z${>mdC5^J2a+>l{XNZo!PNq(&&Q+Z@T|?bS-6^`2x)1fF^c?k)^cL%#)cdHftskU6 zNq@WkJp)MtM}riDWd`RAz6~`T8a=dl=z*aPhJy{MhPj5@4IdcE8o3)yFe)>;X)I>! zXq;-i#`u~E!Nkra#blL9%`n0+`(dnMYldAnC7C*zvQ5iO>&#@#Jj}ApwwpaQS1}JX zpJIN%{Jn*~#b}EK7UwKFE$uAREXytLTPa$Nw3=dd*s96e#F}Bf%KD~_tc|bDWSfIF zpKOQOGHut|-mz1%3$iP=J89Qp?_kfhudsjZpzkowVYNe@qq1YD;~dBHP9!H!r^!x7 zom!mjo%znYoj(jW8=g9R+wcY#Ll>q?xyy4`U01qmsp}IrirYB1^=?nxb=>LhW$w>L z=#5Amv1vrThq1?aj~yQGJuN-Cp8Gt%c{zLKdmZ;iz5Tprd0+KW^ojIY>GQ}}*EiXB zyYELoJHI@?vWCFqiRt7u^GzsJe9u6V|jSN~8 z^dQ(Em>ql|1cXpS7KJ@k`=jZWJ$jx;WM+_rJ;^bmR(y*YuJusY!*!;7(u(U>?QadF~n zrYmzHvp&f+X<<@BvTO395sqE7nEzU&F^^9Q|(=(n-aGtPa!bffZcM}icjo}^SE5psy zeb0`{-ZN2QB75TH9Fv@xIrX`|xf}C{d5pZ1lXNB(PI{W}kzZPX6eJX!oUAvwX!1*e zpI}R&RAFl2l_{1}7EbvxHG1mdBF!Q}(er73)3#5So6enHS3JCU-3;Ok){Lt&ZDy{R z**Pn5*2USDvzN|ppTn4Qajwt?TOUC&y7r_`@>f7#Hor5nUHWNmm=9#wvBqvOV{o76YW-qf*~z4^(O zuq~&zI&9s#ZOFEg?S$=_+h6a9-*N3P@4pUKm{pWks#MP233g`ge6wrZuG_lH}Vt!=vQJtf!jtx3iQYBSY zRQ01ex4QXw#__i&l21H8NjrJ}RLrTHr$?Q>dM4n^`Ln)fPo48PSAE{~{Lu@}7Ydeq8y){>ibY-cK(-3x9V1 zIpcZb3*L+Nmqo8+UoEZIuHV{V-Ej1^@9S%C;@-S$%xG+TJN=!)yVdWF-tYY|;=|>S zF&|%k;(q$kH0QJ0=gnViznp9iZGQAM{cGE|S>M&ZZ)tICIoBH9THlu4F5bSp!?@#c zXF%tJAL&1S!1up2zJl--gs-4~x`G5!dLtC?PMU0^Q>!;3>^Qcg2DM-qFonve*#ij5 z;Vm|>ya8l^9Nc=(1uKBoc4(AU0{7Hhs8L-6b*hPg36_E70&^(BwiM_?wFf2())r7O zdGL0)@m>WLu4}+r7+Mbo0}c3F4&}oRP%i?dxiI7+kPyhgUsr)CjjS0OA=DLy^K;Ue z;e0M9l^M!`5@g8M2(9sr`rh~B(i1VYMHu{{r+KgwJ=n=Cu48ZZu6 zW2V{}Sm(0nX_#h7sD-r3@0SLPuLXuM(?MVyq99WS6-9ntJ?s`L9QEJ-amVB!@FV24 zM8RMFcBk>jWEZ$(2bb*hNPBvxN)P7`aLLZ!iiCPe)>lIJ4@ETpFk7ECU_o56gG+XB z$qp{r!6iGmWas}b$qsxu$>7qR|5WLYK^9)z7B4bf?9!>z+2a?^KzJoyS@$Tem2Gu z+8AM$h(c3Xy%E^f3w}g}+y^(xp!v~5C=U%3cz5&OPr!4)Dg#f!Gl9Q=S_bWsUJ6DE z0tE1!j>d1AC2XIt(OSQ`+lQqVF^g{oViw)6*u?*MIpLlAn-1dSwl}M~8Nlvej9L6w zX>eu{Hv<5;8Gvw!<7NQ3831kufSUo}W&pSu0B#0=n*rcv0RKfZ0JwXS?J@-rNa)<($L0GzeKSsR?S!C4!ewZT~%oVCGO8=STIFS0hhYz^iu;09AR1a@#$dX$enyGVZBts8x#Dm1 za(!$RG5f=RokGZ&AvyzcW>;*+=&$u|#gtBE?H{&vb7bAWT}r3FO@ni0|8bm|oQTi( z`@g-`hxqwZ&pxEWxig$Q!?`n@JHxp%oIAt0Gn_laxwHQ+ch=2g=_AI!w?9ONfeVNk zv_Fi6_J?uM4;y9^h*(0KK*UNg8rlT9gB5k6NIPibhu9+yf_TB$9veTz8FB5a$wJ(q zjo%o|#!tjAdE)#M?yIMJOON~N>83>g-#$Ka{xQq*k2CgZN}qQ8!=qXMFk7ECV8Q>G z6J5~x6Yj4E_t%5_>%sl?;Qo4We?7Rrp8vc3^%S#J?X`LxuKvv>y9BBxpdc zW>zg#cD{5Tw9ospU;CL>xAv#|x63~7Z`0sfp#L~6&`Hl|LNTCnKZuX;_y%~kX0If|zLpwgm1X;jdXk>?B zKp6_;HzBdm>0urc4`FQ!1PRc%&RD>J-(i?~2)gM*=otGWVg9R|zV3Q{`E3wwc?s~R z=U!Lb3vuk8_zQYQMjC-40$lJ5^N7W^#NyW=;DQ_wI_|>&7d%2kF^~el=CGOAZ~sp( z-~v`w|9k)Piqs|iJ`PiI5_ybtxEq522VzkoAO`UnFy2uFz95dJQBD;C9EfA?^yK;o z&IkE1*-S2rL4jU3awuJpRxnNX=U?6LPWQLJ>1mk|5JLFDz}01Vso??e*95k?D3R`s zh4o>$fMuzFF`6eblLCkhNh3WQ;4u=tEb zrne6aLpVZoF^f-)fMHlZdX<+Ij>Ti)_S_UNtevnfqRDs&^#sEzFzn1s^TX^!Z2(z$vcJX zkHy3Gkl>6F&MkWw-p0)g!}>lHhMzFmkr)kOnPOseu8&_=*c?Q`b-;vh!3pp$1G*gT zfc@nG7F0`PmR$ zk`B{|TJ^fCOb*0IvLxET?{H!u(Us^(bOIEjJH$(JBYMMFC*p8n9xlwA1554g9oD+n zuvAe=6JWhem=fzF*7g&y$9$M44YrI8DT4Ke2V2k%@23h=_MyUj^-QCTjHUCYaA_={^a1k|y2#rN3C;x<>`0FE%P3u#aiNkxGXx!05~r_SO&Hr$egnVCypB zNMIvr*003A)Z}#ag#}Au!QT8_3unN-V|2ji+^_dZ?D^^$8DlqL)MOS1e+>pxOf7d> zzJ)IB>nz_{-m)x(p+*6?d3=Pzdn?`ZT;30rU22w>yYm(DEcp%$Z+Xq>QCr9kR& zVJqqIUvImx^~>rh4VHt*LONrm^`^n<5UqTca5ai%AqPGQ=pYjIm<547uvx-`*J5#DBlfds@u(S?s-EBNSj2ctj~JU1`~BC4As z!x1ke7>Ps@kVGU2NkPU#U^+IEhvXxZkwWO_avFrFn~7{e_CciEH%JFTl`xo~Log<6 zA#5Y;Ayg60L1dB#gy)2}g!hDxgfA$9s-S~Wb#w@-1tI2iQGIkMYJ{4g?x+XEEAc`7 zP%0XL20`SKQD`_CiL%i-=w=8jcOU%>VdM1SgK#uND#;+`5vLPp5NAQWl4Zp85V7Ph z;%;I!L@hZ>JWsqrtRY^9_$BX25+o^-5{W`GAX$^#NggCGk`KubBAEn0ER)fsc+yzX zI8p*Bk(5NrC#@juC*34HRGg|fO>v&$GR5_Z`xTEVUQ~Rl_+0U&V!h&P#YV+*Qyp`i;X1B5?mB@wkvh>ju{v=&V|0>qQgp`a zr0KAAGIWY`*6UR3JkWWm)1dQ4=dI2somO2*U9#?AT^(H$T?<_+T^n6HT~A#E?;+v?ph0P3tx)>ix`VB7BmaGMUq8|#dwP}i%b^{7flyk7Yi3>7Z(>d zmk}<}E{QIgF4-s`tq62>N%EiNZrYFw_n z+;Dl~^33Ih%O{u5F3qk4SE8$!t2}id^#JuW^$N9ydYyWMdW-sq`h@z7`hxn3+Ccq8 z{X+dp{Z8!|DK=7ir0hufkqRTVM(T|;7-=}tbfo!6%aPV2heth)dLH#LsyXUgR7+H6 zG>9fd6QgArdl>r|Rg6oFJB)jb2aHFICyZx|7mQDg&x~fqH%1GijnTpQktmVooCYzk zunz&-)xr;wDEjUGo92Vz|B1<_1No`)N^;xe{A6##3;csq0H**>0h|Ij1#k-B6u>Ef zQvjy`P63<(|1%0Ci;)VENTLuv$;{iy-pS6=+Rn_!)7Qbw*2B@s%)`pV(#+T1*2~Jy z!P3je&eF`<(%Qz#+REC@${t2J{DcuLEXXsB$xg(a2vFHc9O#;w&EckVNU)-Gi9cIW zXqPaB7r~{oAsjCTlbh33DV+!_93}Z@D-6lN@TquRRV1UZiZOq<3V%A!lf_S`XL!^3 z^lkzYU_}9Df3`2d^z`ll@`O0j$y`n*JCP!+BM*V~Ws3jV`g(iil|pAHGb32(Odg+} zp3&7wk28zMxOzVg#rS^&Ky3`Bkoli|3Lg&=7cWHOrXEfDvwaEAU@}-qEJmL(O2|lq z&gCsFZ^FhCpk{{%QH;faIFO3b&th_UaN5M`)47Zk7QBkkhyLVa^f?LRp~nxNB0#3E zr;+7@!{J(CCVF%wx()??k`Y`Ehc7@X$%#N3YV@?B3{nRQ0rj9p#{gCDWlSe>{}Gra?Jv1`t57oAQ23NpUPy>%;+=M{NcfmdI7}P_} z%4?`gc?X)ochCYl!4C+htc<84>WC&nLG%y{#0IfNoDdJh8^S7wAfXUenGvba&P+?| z(y2m)l`7DJ?(xl2nK?Yn2TB)BqVySQbRKULPymWR2|_^+0xAN602L4gB!QSfd=pfq zsR4BeGB*ThLS3t*KpHwWkrl{c4o#qQf8lUbd4U{8Dl^e5lgH0v~oE!QnJAnMQ?Zt`V_;J~Yvt zpPZ<4Lkht0lo0u*Gy=w0FB9RK4k1tKnJWkZC6dI%CI0CgxmGGEqNjv{y1ucs19c>( z)q@`d5&c3S?f#!Ifs_cWzzmp=77>{Z9|SR?Ad@#HI6NqmPfti=Vsm=~)VWvy%c$UR z>?$TWJVZEU$$*T6$NGeKkD?tI0kpOOdkE6)2%MmJdN^CU&Oo+ zXz$44=RmRwu@HoVEX3&Z<}fnTAwFO@D_4a5Ft~5Fp7)V3V?TU82(F$6*I+m3;Gn+Q z!c*vpoNQs9{_#SvLScNrYJ|-RgQW>?DfKN1^Qt3^?bn^35GQ)OLuEs4cu)0uBVt8k zcmu=;9R`htg8z7IvG8Dbp~E0y5PKp)-$5GCcMxH8UXQ~d(O}cSI5_>H=xLeEGC%{C zir6c;d-NEXqO%OsL}6f#WpHJsz!jx~0Z#PmAC>3B#wJFhuqXYz20^$)COes*0`HI$ zMO8wzWjvfVEFp2}+?+C~!s)@6oB(yMe`87kwK33?0>ZjurW8i7F~$ND_=Tnv&?{13 zy7q!!^cz(X={(aixx%LQM|KpBst`X?coSl3^b%f_F(fI8$HYcaw05TrWVhabW%XXU zH;BT--l$(f-Dz;Ub=+EfQvjy`P63<(I0bMD;1s|qfK%X)QXoYZQ#|Vk1>}Fs zJOESDbSdL{^%M*lSX1O5)}>QV2V_h|ce-i>N4(AOWizh5Xs- zy0m&-wIqfHphV@KS#0smsQfww0PO1vW7Ft4P@8V?&s!kW!G=cAs6ifnK9~|1)0B4G z9u&gxX80WePbWwy62b9o1e8*M@OL8eZjJaPXE+;9aK3LPw<^IM?=j#t=Y2G*% zcVL3++Pte3(Ir|+dEef)ocMe!?{4+?_RreQIZvmB$b5Y!9o|;;{n_UHwxf<$_J?ST z$5dD4Z@Q6sl=FSH+PpJAPW&id_vlz|fkd_I;p}w+Zs^!L^D&PaYq#FG?+E2HSEcKV zKd0S2*_yN3;i~py^s)Hk?OE^cmBd9=jxElAyzTp=L8N8Aq$Q_RpWm8_emeKz=F!+a z@86}TO?RpLt1;$u{l4hwrjzr&$HkqUtM$$`r?%X`cx$-)uaZ{X{;MOexqeuMMcmPbXOqr3ol6dE`?9{HSi9lf*?GE9YaeuXyiM;|dF#Mx74z@YS?{lve={t4@8yJ(kJow8ef2lP zJ?>4Pn+n`lugVMG{kVzCE4Xy&!l4DJJKxfz&FaM-IZV1b@6@i#Y^|%8I>t18Hf&E~ zCbrMzhH72(Y2lj>Iy1kHrq!ZRpeD^Jy*13eN+BU51 zU8Uxo>S~IaUGx3LFJAmGFc`XeR>|z)>PkxajwaUD!{AvWS6h93J4YiUtBl80cfjPy z$JSMHzCSvaH}%-jqhE90-F;rO|E<~M{I_?uT)upH$FMo~<-y|FO%t>nwX@g-dEZ+| zPbS^Xd)nFAIjZf>w{edR3-c=%fBd);eVdnb*4wXs*N1$4E1jo_Be}JAJGO4EzwveR z*x;bxDs^p*Hr_=4^V&Zm*X;=Y-n_A(Bgu8f{-x8VO*42ycUIk(^PbyQ_c-~(t&i8{ zOJ8r@VzcY|^>bfFjXI>@(n&2XE&cS?VdTZDSFfJ>Fz0bxsP)Gq%;e;kzJ7j&yC2({ z>pMDHxm;df{dVxN&KYhdO%W;nADw8N4xyhlvx+PY2?VE_oR=5Z+g%-I5q9~!O3k_-)w#`Y?EEHO zQrvsYZMCD->WkB!I@6y|Z@zB&c<7UO(x6ob4<7s;IV`$$YbEQ|)s-!SxahO^C>br= z44oy0cV(mN)*y}+Cr(XUwSD`yvze(D)CsoBA0FIQFoQ=`%WZp9*La@O7+u-A=Aviy zWjR$UDAU%Ebf%nA|Ri7=6KQQxsl)=%PuT_lyTFAaQb6ezf zP0N=>6}ikcGoL4(ou~EEhj~0^jLF^&NLF61Sa=|PkNc_x#S@27%od-2vMOD6eMtC< zyr{`l&t4Rw;&dzd&g!23wlqkCGt|JqU_*SN{r5$?E@jr|%=&cHX-|pH zd&Tl;waW`hJk5}WoMq{8B^{SW93s4X^0cava%SR$2 zxv`EDEHpL>S#LIF%9JwWvpeN#Tsnq!rC5I758n4EOjzwXwV}C{ILm5BbdA;` z@?yH~d=gn}Rx;Iq)2E9PPrHEbyE-Ix+ zUl#xL>E36HGdT^7m6aatOJYVokKcRC^>u7)^11yc&Nu4kbnf53Zb3+c&G6yFRbNW( z_45y1?=sXq_r;O-GbT^iIr+u=&y7~qYbGUJ)!@(CO}wY)TUqV9>+Dh1>Bo!BEj@lH zB<a7f=E%34eh`PH-Fo4Is?qIvdy)!fepmGg@mY(s+-j-XzFRXcE& z?z-jGbGgKO`UXxdsk53FPLsZ>(|NpNQ+e@`y~~*8HI?^inknbwWFFM`xlP~@FDj%g zDla1DtXBHQ*6m#EC$pt_!m?c1m?zrPo2n}Ic5HoIHl)yg=Iq%^7;|&p&8SvbSa9vV zhje|E=8YWI^VJ_(+GJi>HO*|Fj#W9jvSwq1&ld86Aw(?7fz0{bL z6!kOe)0+n`ZaH09xR|ED?a4abom;{-I=4(YqJOb95Q6J_pa%7IZYSLgOc77Da`vU^U-#Zpil-UNw(L*3va)2M#d0?jYiU@#4CU+)wmc35^TWCl9H0^$BJTR%jfQlz1lqP*c?uy^@TgTUxe?R@?lYd zOI*g71y@6VEU*}Sdz%OBDr|(d=dS5=Gp7c@8)L&IZttgE2~QWt?hp6GNTH_2vK3cv zyyzi5%}DHa;o|IupxVfk)C!v&nj@>mRaLpsjr`UJ?S`KvycluW!Is*&2T`hn-Q9qc z;))O9Zcm!;{$E^P!}c*6nn|ibc;}m3p9KSNcI>&Q@Wri#Z`Nj+BcTIEV$XIo5oWR|^yP$M=$X*R?i4~!pqYg}c zzog{R#CMU&O$P5DTFJ+Bw#-a$%c(sr(J=MfhnR*}yHwGXNL9VSZ_-blR9*}-ae1r# zT{UIZj#XK`zn^V^5(P3P#*jHxpxAFm#9 zKXHij7xc`74Eg1r4&|!Vs^7n|h7O`d9de?!m1_)R{WzBWc!C}+W!Wj1c1U1|#royX zTU@Upm8(tpm+s6yG_=v;Ou07Yb;{czHrba(3nq0V_>OTLg=9x)f=cpZ;kG@89 zJ>pi}yQHT5IoI^djtSMF(q9$FxpJG9ELxL~c9QPB8Zr9b0cD=cjd7zS?_ILH6JVO_ z*Sga2g!zm~FB6kH2tNqvih#?guQk8@$P!glQVb5g99`MoUjJ4xe)7|xl;Wma zJ6_+|b0NC55MB0!wmx0)+4GW7m+SuGcFHy{2t;uCr~ zRSOpIy*i3zAHQ4|H}Bc~X*|uB`@eVIyvf7JZe?Y~T}2YpjPaKmxq$DHTh=<8QJPnL zi{=)Y={zj%5v{0x%A$2Q7cb^ueM%^6&QazKZjwH`FIPkPH`qTw3=%g*AQ|b+)z8&EMji=bB>6PLG13 zg3D94ocG_5oZ}_AIC{M_|HHNKDVN3LExsDgId{tF$By{@U!+XkGc~qD2@97APnb8@;k@5PZqVA6zGSE4e^h z)uo@W=*1vnfzDg*p^`}RR0<7a@a6yX{`;mDvqqExbg5! zvdfR1ikB>=6TSSMPv%)}tFbHyDX^@N7o{8O&XKgA^BOj+(T>@1WKyB5CxygPa2@#ebbyJwr1E!taIQGL5IHh*^ejAYt!aXS5M z&GDV|=DIb5qiN-OMYr-c2P3nC1t}FSZP}U#WJZI{R=EB72xAStj4i)`KdXIb71}AvJ1v;8Ow8IxX67y)0){d zy28`_RpDs&Qqv1}%<5YyW8!INzun4dC||tJKN{ZhOYxtvpkO_E+uDAlSGnF^p4&Lz z++DO2&0Z26%e6N(>*>6n{wmo~=1CnhYx_aA%1$p`V`HoH;-=>IuL7{vFKS)DXLQKc z1zl9HST;w$YRqXl>bS#drpH3gEs|e;tt998mqngd#UA3>^FkaAp3~H*7K@kp(_WxM z;rMQ8MqT+@ryGs8FKfv%UL^Bo>vGw%ElE4~*0@=Za2q$l3bs%%+Wi_jhIajH>(C0N zi+&ND>jkGO;*((kO(i+&Z_9sK@9P@kw&>VL`|IvOZsTAMd)H(Lu86U*Dt{3rW0YZt6Bth>@IefFK+%XV$6$(LP1YksJmG}+7>8?Rk1 zEzVk3zv5);rL$|QLk=gjDtwl|A`|}k+|6&YuWX(UF+V%W+v>;N_RyMj#q9VMDj8## zAI^Q2epwnb1IcZTl97FLy zci(UFo))rG53*fW4Bgq;-aMizBWvq>HEnJ?z*#XhCFqN@>=D0(S6^YfH{SqZYkVtjuo%4*i|sQrF86MG}maP zgWZY+>>b0o56KA~MxRgJY#lY?FO9*khtf7`ILp<1&~Z=baQ;lOwmzBC;e5XEi$K39 zcUG%-$eWxaIStGk&zsg+#F@BDyBHgPvV{-Yxw##eC&wH)Sh{V@W$Tjob!wpv(oQqK z>`Rz=gW05an`S4!ykNJ{tDW26gIK&?;pp1kM-o?aQrwC=?zi(Ud9Piz)NCw&LHms6 zQ&*;z-JV=!a7AxJe)GYzu}cN&JBc@W(Z5gqNyQ_W>!8ivFaats?=)|y`Rd`L^|wm|oK?BSch zNN6&~o{alu1iey?zr;ve`{h~o{Kn!?w`yxMyGWPnTAAZ6;j^4xS$K(CFJ!-MRsHz& zT13UN1+}@?sBh=531oTg`Q8bc>5B{-nYLDMv#+arL&vA*g!9qy{4XKG7guhF z+N_qc9A3=``LA_z+oWITKKf)?7jPoBDk!=5N$#UJ0aflzYYt>DtlT;ONgS4iUaHe% z6M%_;D2s~bI9Ioy9ede&#jNkm?Uzt-a|*5M(bxl(@rSsBuuY&~U8PHs8*9oK%P-Hk za~g-vW)WJ>c--4OseI8_S;iNctQmzBHEzRaO?r3d@XIWA@VtZKfu|*~Fp@o4e=fGexM>C$%IxpT)0+c(Q;xh#LVo4IGm2RDl<%Rz^C4re-7 z^W9E7Hazws`}uSFUfPkYcjqpsnnKx&65It-{WCIj&!~TmxNncHN0|kM3*3U&zG|J& zdFx<)P>0tDCoyg1gCUo7Zde|1bzNw5+wz5cgU7=UO0y;}_CIWO%e}~6xkdV(Y6c3+ znt5c^_6ONBk`L&0UYpkJv^M!>bDb~C1r97_%(=Mp9~$^5?ac>&x9lSy4(GqRtY#%w z=~2aa`!!?P2ZyyO4sPU64wRRwH^*FTN%Zpj{B_>snkrv;rxX6bq7AkoThD+uAc2uz2)=#Mf~dBJGM)=JBDr?xn%ssw&O>$@@8c! z+s;^5S$X}iW$qDSk z?{dCQJb3AoQ0g~hc#nH4N39pJG&fhxW3Sa!grVT3R~bWvTRqm@0v8z5GKR!K@ zU3q=9WXJ)|HtBNuM=DQe#ks8m)SlOGW9g0m6zVyUN`D$(CPM8_$(e&Z?t7OSWzmwcSG|m@ZUoc(wN2ig6ex)-Y)t(%G4?ra|gFl@ezU< zWT8?=c3hmi;(hj}ns<%<=LStxw;O*m{5Iph{p1P5t*x!4>rJ-|{@&K&v&+83Wip}W zjB(VlGlKuq-kHZk_5Ocs)iW&Y5$a^FGh> zeuzVh5Z@yCOsIgV}lAb9!mL3%SpoUZXHbC#1Sw#7l!Oqs97=gNv&$^iXqD_<0 zW1kKlJg9FVnq5#((6alqcg`obS7hpxBpVI;gat~+@FpGRBZX~J(WO&t856ddqN^?`XMRS>dcW$mZ+!wV99 zpZyDdqz-A`aw>h_HPSzp%-<-T zt@h*vzB<>&?o%QoUM@U0p1();-De+Ta>&%Q{md>Qvl4QECT~c$u(fs9=RSxY1cSj5 zq0+Y6PJghv-1L!$$pxR1JzoT0E^Qg<-<3JaJ$3)f*YaX5uTkmG-_1?F!{w;`75itu zL&uKK`OJQ37;-$;?0bHj5EeIb_bxA<-2G)Bdc=ZvS%}@z-ezIm^JdELtAEISX@bPs z$-qFX#Ml`5XJ&D&{cZP;@4itJxkc#`cqKpMV){U*y>hPiTy{lH)}fQJJFdF9j37T8 zANHgMx6>Do@;lEAOPWh>hf~eDqO0CPzh5OA5Q!~we&)20(m60E?O}-=7 zlxHmMcB&3I+YkcAl7?gZ^q`BA1zK)RmgVx#1|IURe=a$6%_ho1dH`L_g_y8tXB6IV84Y`T=P^P9qk%?A`zM$*-aG9iAiCj{Vt_>|ykE zYM^WG(}&25>Q2%>A&`v4^Bn{)>3zXC-mulg*W31EH9UauJL~FxW%IMeSIo<6QBNUz z&n!-bkCpD5y$~H=cPSkk9oe=2t(D_Ia>ARzUfBJxLnn)!hJO1zc+&hfBG7|0|6Z4F zdFfEd3K`xP+5Ao;+SFYi;cQmFrqS{tT#}0RCg@7Z^Y%NId7z1Ia4eo zg+^DLdEW3HCVkdzvi?=ivM|_%^2tF*?_vY*bcGX6zWF8L_IazR}&&qup0q^JV{({h!N$k2kJNKV0C%=Q~DAmz;b~ zujqC5T+;mRB^3;rHTk%;_34%Ul;~eSuHUTfD1rR&$xYI|i1rhnH2qokrC-O8cj9nO zVWsRsp(TU-%G`G17fDfFeelH-ji;vqPS+3VmaN5$JDt^;5PN5>R2@tgZ~KbU(QDQ@ zI^eZXcg`}ZJWJV}z&ozNW^cY;Dc*=8Z#o3H|DFv@Y)%NW9x*8EFyEOhL zG;{sBaJ0w9J=59!Jwlgcyjzz(C>|mY*RI}u5@PV}^nMeI{Mp~E%HYO657p5Wg);$3UNyx*=0!Eaz+ zGDmvtweqCyn3cJ>(U;+h^SyVj*FTWi+HGw6XDa-A!@l1#0e>93M4sMDob5TUTJ>`B z$U9Kv+xgX-=1z59-{rZD6*`uq$_Wc^G+f_=>%=On$iKc*d#a0f8@1QnG#2lb%>DYMGGMl| zH203%;Ci@Q5${mP=L8L%?Rt8$IkZO0>%;bXuZ5EFxjCnLRn^nCe$)Vpw(%!9XsHsx*^&4vX zyjF63C@RlpS5T1#?+I_gh!4Hx zX~ONUPDdTR<=B~*pYwLx-D7$I@buJiIoGH#r>^|nf3a?0Wz zc3A+tfImw1wL5X;*)LfqT1WZ6LKD=KQW|DAF9r0*n};)4hIlx6nfm#8Df2RBZ1_Yf z1$(%<9yzj+|5%T3OF1&1jNJXbIbT+r+Gb$)qeUc`}PXqPeno?6a4nKT}+TPTYHYMyGthoksHkRB*zuL?)w-W+5TS zpRmHHV=14wJqhLPt7B|M3B3HI6(u~b0KlPO4lBl3xd55NV7Dq=IbJii5E^N5_~gph zR}p7k>0*1QUw>QPuOsRfKfSmX_Cx0Pm5253S0nDm%H~&%ybqPRQZWzG>vD!hNV~O9 zh3)hACML&m*(#C=RD_WXgx#Vf0p^AQ!puR0+Ax^ip%3R%qKWWxK6{_ScA_&}@SHv& zShz8Kzkj$iyzrfjjG91CNU5=9qkoA!I6I)k4PDUGnblsvYi5f-F@t{ZhAJP>t&Tag z2iYzOLL&$u16CMl7@YhwDYo*;m#v`do*fGf*Q(VTn7f`eG;3cq5zD)5aVP}By!t*c z=Q?AT0)!(=6M7j1viv*;>XuId6J=<8k5sMEg)h&PcA;}!@Y}#yPPl}=&>(9Ce^-1` zCAUak5NdCRv;m-x_Z*?Q<6_8e?IwJ(2ief*8$#D!w%<5B{Uf>-Q!M0W*BkfQy;kXC zYxAU6#I@L+?$xkKFwI(BD6T?s3Kf^1vcutJ%HHRZrAaHxex+LTqknW4(%$IG&%X~W z+^%VZ%9}n|Gj z8e5f4*Yyrf;*?Gny+d~d3^H(jJL274Uq$6~)NdtOyM?zcR6C(M)bhZ#wwTmvgVt2p zH{-UFi8O^Yxs*6rm(T0v%1^#lxV##6z+d(#3%$y~6-pjR+56;Yk@Gn@qvR9dWgU^~ z0|*YFn~?~;xmCC}C`1ZSH3|c8X zLb2RkqY!Nax-xv-(Na)a7RmsnJBkvJWR~nnqTS-3fl^Z}g)PzwGIov4eMIojA+ni@ z+Z@PKQt{rW3)zjBwz(=8V?c_(4Ha%&eMJ<^-PgXBik~&~$TW7gNJAU$>hk|2Lp4kg zp>~ry!?Mto3V1XK<;P|)QTh@=?GzMMH2XQ6yCy9%aAwQYYp)zDvqJ~1Fxw5gi}9w} zQSpvwnFI^e>no@^>G?G#5d)Ri=wP0?i080I>4#$5tzrj}E$pBNy4LV(7UPeD#Pf<94 zdq*)C7e!GAwBh7YwEk8DNCO_p#~p`syNsgt6o8HDJcPjo5_KoKsB;GdyxYReuU(AO z0Y9GFO`qBa2gDrVg9x;og0W~gl8Tx`;y5WPNdjB+uO8TO$)wLpka|cNZo42ojY>dJ z5davsC|%X)hcdj(mq1QId%DLnvsL(waJE8Vdzqou(xdO0W0G>!$AqpdYR9P}#N?>I zw=&tP-Ev=`%sHLp&rSNEC22kb=#E5{i=yu{18R@;B@4b^P=X_7h#Vk6V2mIEs~#pe zcEo9L^+n?S{X`5fjbN_2vX{SA)UlzS6LxdE7uffu#37Hf-7|K?D?G;Y5zSB(>*Y9a z6mq6J0Rqy6^AA`GlJsvp_ww&i{uQ9W1lVD3W0)v^hM}o`9w6{ zJc|Z`v4?RPb4|iqKE7bvikuW2v{!^*ZzY}`W+ICXtj+BdN1T3b0#RpJdi;rNRoH5#-qBsndI<5jZPBy7i%Wc9>|qB{T?N zL??pE#6`*!9-mMG(x;@p5V+wQV|r@=stey>2WS2SOKe`W01C&Vmu?R*Oc2DA4v z+7LhokRpA($~hZw5MtU+Z0wJ5KHna#aVjuz!*&_xnlwAtv`FA}J$SVtrNcHuOlWJ) z>m2ARhcXg5EfyJ2=JTXGtR5rR?I=9`fXtjmpxPv;5J!9PcayWSSW^jzWko22tnyCU z{2D6Y^vI(%E^$jPkj*4)ftsjka1{g)R6)7ZOgNNXfX=AP6N@v^cz^%twKR_Ht^)(J z#Q3s_Z2I=C9SmKF3{oVS`y1#&BcO~76p~gXuJ0nhSZ1DaOx1e#wFjxdjJs(n?Y!>5 z)EeP6Nsu|1ApVP@`=#t=dfHig#bolFG?Sbl2-cN{u!ww&V0<$0Ryv7};Nyk~r*kh# z#AQyblq>rP#+K~rqRdOTaN`B(hZNd=UxT+6kdbmIIE9PDQjdN)^Q!Rsa;deXK07dr zJ}iNtT$j{msY7UHf)Ew=z_!;3;5u~($NK{1##i$}&<*Y^(-RABd@Z;J%;!q7U-L6; z`PnQar4w175h zIc=*Xw@HZ7_#^uOd;#V|^2d_GAk5Lra)Qy+K-BdDIH;o))FfW#3t`DgGMWXsR}rYj zj%im6(_41#qEv4m2pof*jzC|PfwP7MY1M+9og}0#gk&wmXc3~-2>CCuEqZXIH3GPj z;4=i!Q*g`#F?I}`8z(|369ipESE8!f3X*BLLa1A!s)|k1S-9zJS#UOv;qMR3PDRkuol~I=z@^? z9o~lt_1vq2zIf&|mYNNLAf~|8m~$9Gsw|2dS6B&y(u|701Qm^d{LQi7_6lTN32}qtybLH{hiA=`>eP&Ld@yT_}1Q zF+BqRu?}!sByuhzL2XF79Y5P12D-Eh6b2`~h1Hyr%K5G~zZFMKz%e`U6(t0L3BWl` zn$&=#bt9);BN?^=afowVe;J`w*tySp#N9KuyW^-2@SHNjktN_zs1KzN$sNYRt@(j0 zfDsI*_)4>V9|rEwyv0fpR+OqyBhZWhCRYahlE@em2F9_hL%*Nq0#*zd=lOQFxA)O1 z9rxYH3WiknI)PyVBt*$jhlCm9!qW**iV-xe2nY;?F~{V&0o$HEr_61C%!!dQy-284 z1YAMV*TqDr8Ff8!Ku{5k`D`x`up<|3@UDA|8YLwhMPOS12@*2XuSI|vk%~M%)_y*= z`yHAmjM|?gVs0oA94Ziot++v;R};9_K=Qf_`>hCL5zp1+qmke1!_^qh#2Zm?<9OrX z8zEOl37HS1ggXHPh$?MPg!P4BY{W;g8)3P_NZk|cGb+J1kG$=~9%&t$zQKb{rqZ^H zf>sF~>Uz^h5*AE2G|qPBJd{%tu_3Oyx3S$Stzp!CWm_A zGx37E?dS}2kY@j~Mpo-~(20w7uWEivDM3i0NEEemiMHhk8#G9>ldAcsy;5qwm5Aw8 z!KcPZHM#=RykuGkBAaN?7zhH<__?-HsrPk59-ZFOfEjsg&$)dHg36`}N<$ACjJ$EU zuz&!VrzKbDRn@ahZ@dLY>hXSH8j7NeNIRKoH0+-d**bGUl|E{?X8?s)!Mxt-x$rhy zW3C7Y!tv7^5WWiIn#QhG>Me9nJh(}U`2Y?DQDwpg$;_|pr3f+gWHg_E@kVD;d zQ@G?-n}C{@kWu&zR(#>kKIVaO@dz#Un!((syW^%?q$)W2GstQZPR7}q+Xmxj+3}NV zqkv@dRgUir>OS2SH`+r~-U={LXcEDN?;y76B|pQ8z)p!$PxiwS0jBePdYV*4D{;3i z@Lsd(nl9kKEkK@)I3pGCO$KvZ4##Yj;*u_5}%H%c~+`iQsS>bJpn!&W)rq@;J8M|$6i z-cVPyRUv(B8|ZX3qU&KqbB#xHedO^LpaO@kkdsXk12X!d)0dyn(#^g-^I8nXkP_aF zz&>z@Vh6hAzs>O<{}_v1i484`ZT>B_1_7p}7-51tD&aBBpQ6UG%skJ+#R(bL;4gpM%57ZKl{Sdovpj-N;nwFcIlk{nS3T=S&0 zpyaSH4A^mK&At}LOtN(c!ctS%>B+X|oNaYdnO&)E!YSlRfMU&0PREU3Pg^xkCsWf4 z=xMm*r15}^mM8S_!PKjInQ@|NVXxB0XHSzO6USo{YNX>U>sN1 z6^|Fn9{-+dd-9wdJbGGAwlbcvCLVu+beb&9!2O9Hn?4V5I&W(kAHMH6UM~)>4;1c> z(f7!GE_*?v_(He>aJ)2f=2V21TZ9`Y8t-9^9eww00?03U6Mre6VVTcPEx^ZHd{2%% z6M;Sx8@4z1?eX-&m7p_95mIB}L4xF}wmlJAD8iUt@ZQ^&SQE^dBO%xVpc#U`oTr|{ z2`cO@`Top$?^xg&%fK1oGA#sX3<*$9mNa97@n5YmD}MRA{AS=jHsgC|1bi`XeDgk5 zs84&_;fMqxV8e8`NdZ!Cd4-<$novEo`p7%)i4R0@fg|ohlXR)%cUg6EjW9RE1i0CR zyS0f-gHh6n14DAK=|#C2-(8oNU(Wh!&#qcJa$qRVusU0c(of{)+DQ2-Ab`VHC2l%m zwn~L6kia0+4#aUs0f&$e4nOW38U^s7@&rfZ5(h>+3p4om=H%^%HNj_2GyP7Ff&lIh zQ4WNtU4DO0rPzVSH9<<1~-WpUHO|Ll| zK4`+~L9&N1Tq}Oy82B!VzheC5vypqxyjm;j2#p^uc8Ex)mKE)|TvQ2dWthnb)gf-V zJv{39h}!a~2?s)DNz+>dSvQ2h8uHvwL0?qpQd5^8;R#TfeIzDX$3^3 zK&{=}Qt&l^qFqC66ij>JtV1GP?U$g&SkqsBs1y-p{}9y_Rt0rSKEv@ZMSY{F%doBq zGA=2fI!Z`U7oWai%=u6Xer-Z}dW!aaw;T*%*)IwzB+^ALf@GdNxdx{`fR^6Bbw3&Y zRggG>McitTIi3Jm-Y0_fCBXZ{D)|A132$H5Q@93j&7f>UJm|u!dmpA$82xkx9<@$j z`71&MF(jHK`>iW82Hl3x281thCVeUqFSr1K@j!@ur|=~hbkkmvl(b43E2y0F#TPIPl?H=Ex!)$B z3&86eaG+a|TPsA>yv@?(qenDRDsMfAS~;`Bo0EVG-nDOM3P8`mRiucEEJ&(plV}7( z%I~G=$LHl>nrsxF)yMoP|KZb#-ikmx=VqfB6sS;G0>zxBw*G9BNoEXVl^6My`^fa~ zc$Pgu?e4CZ>x(HFlFWYMQzwT#4Km;!6cr+RTX=p(nxE?|gmOia%t#<2m?eSXb|PsV z0(zS7;1l?Yt9v+={PF8DZG!#uC^W|zLvj#tBD)=gqBw&W3q=rADM;UPl*JH!`hbt6hAlM}^z`_d*)RpZ1_&n| z-CZIdwqFK7K@~xhK27=a!40N~$n*oV=mMG%Syo5p=|?s(LjVJdr~0&g4{MQy^s?)( z=JtDN6d!pfUO2oMu2XJ4Cqa-DNj*?yncL%Hux;plsPOE;#tB-%n3sl4W7rArCI>5I zXS~&vyRM9|Qjbl}ZqMgF%_kSJQWyH?Ls~TaghTg{3gp6Hu|K;VzBDjqSc$4^ar!-u zMD%i)`FZ0c>j(iANLB0*rsebCN{>V=mdSaDPKcbpTr*coZwiJ$Dis*FOe7MktrXXQSvU{ z&IvU=53SCa*P~E~`_A$`zkxW&olxXEL<1S3;yY0}TT{WyF3N|$Lfb}govK+bgw8t+ zn49ldV(G@opMMygOQ1Lg^}j8?A(2S6%~Q*$qI!rKUZEwC;O|;=4)EQQlrpwlj`I(( za#Te5UB4xo=>ZkHu9t)n#d&K(AFQh-vYN<%7Yt7`N4Jdh~wbfmd7}9tYbjoz= zW3?lgclC?W+6s?*0!xyZGRA0nBR85uIZ}zps;XP|c+5?xOad_g_|BfUw)p|D+b?>9 z>_5`2#`3zTL!koV3~0J+e#MFlntE|D=&9Ng1(iS@AJxcw^uq{zS;5f^Cd*#a6~RLk zQsm&rjdrCwzQ=poMV(Jq?7_riOYK8*xoz%CD^HX5!z57g^`Jpec%{AanOrBvB~WT~!ns zj=v0yGZZay#7xM{O(xA6V-F05IuN#>s}`DMDA;8ZlkuHyV$Ov!GUZX!kHIGy07_kW z3q2GKrQ*Ue^(de+c4zcqncLOX=m1gr`l@PHv0`Ea z8^t%ejT>mjU(fDVkcgg^KZp%}G}+`HXFec?uQKK=MV=+8Z0o2#Kr~44&$#j$gy*fn zY}A6IQ=qK#R$F%G@{6nvAz;_b!{@pkGb}Uq8oPg#=6YYwVu5%8niYGNMgs#R2W6zJ z#!>eBC7>86nXLjESp^Qw%xnC`voTu~Q=-lqCT-IvbBTOWP6lmi=h-PT!lY`=^nqQN z)2Vpy(~FT93$l7awgDW0LfqJ zwk;j#pwHE^?^N<1PLW4AUj{QQFRi>gB5R}IUxU9$+qs|V`(i#R6uUuWv&>3sjv;2uYWS>_CCTA!3>QP3@Yei!i3bnnUdA|b14LAN;IDD(Hm?T) z$>4J1w2B!SgQ6M?mx0np1)rbZZ^+oWbT8!z?=fD0k3mffpr#-xlt&N=Rc(30rTa1l zeUVT#btV3m+oB%_>=D~D54Mj-iM9vs0JkajgZ#h484E-al_Q>xQ_cQL&=cuY_dU+I zUx?&75U9;lJt=!YvaP@>P31n&HLO_kW&j1z27H5{E54RBQC_Yc6$5*=S%PxGP}Nr9(LcO=qx+6tlfw$pIF zU=OkuXKp{7@le7s`GMYh?kzmuR+qB{4g76a2^h#dn`Cr?N)jlWsqq?;e11+7R3HH< zP)`E$BH(cDQ9a3xc5F zM#(~cF^~soNdr?-d=^So)~pY0Re(oU{rEmgnhs1uX-1q`tpO{R$Kck_=&RnZ$10gZ zSh-shSa|>^Oc_S9xi?msB>$FTMQ}3p5d4`Y)y@dQi`#jFgiR4$J7)xTd0>&Xv_0Ma zQ%9X%M?=nc=zz}Y=<}6$36UIkwHFT(W@Zz$6)pHVCPs*9KsO#lL&iPC%2#!Sodx#* zhM?$1acxDWg=tPZcl4(AaN^m31)T$58U<-#Vxd26Jf0NZ8maOR+MzlMQnC2X7oHHw zERoQ8yfn+GQgIOC1d>|jhA=SYs=h^>0CjvHoO!V>-v6OG==8qr1s&$8pUIMB)R5$m zx?&=$MS;ruPp88&1vupG`ax&}Ekz^Jf5g-0AoZnFj82yQxQ;lDKig?RfB}Mlm;!Ja zK={-71xJI;mFYq}3p8ipDxM zEKr0#<+^I6xDQVIAQhKwnTSx5cIRW*CCDQ%Y_grJA zW7w3U_VKmoz^)y-c*j1MZ=K^~IjeE_#ThZl7M!HEo5={5q%Q|x;;l)bGi0(~Tdt0KXEjXU&ZxbKv z)8*M*VdRsVYkFLt* zAdV)gaU}*K;lT{46b1tXLi3J~d^{8Y%*+12ksbao&C7KF-Y_fRSwHg*pAW!%|CrCu zn-BYk=A}Xa3;sj%DgmQ6%JS;rWk>*v{cXPFKQwPC81oOkQ9t%S%gfG!iGM4v@DIIF zzs}#Z)!)h-{SUp-w$9`ro|ys&X~NU}yzl0H`#&ZyuPqxBZ<(owuO9^Umm9j3u|Du0 zZs`5I9bSNE#h?lTZMdNyIcl`wpba{BzyJv17244MeEri6-NXU_{yG2uNTL67JqKIx zO7Hp0-5i|2)82nMpo5oqTEfxGKbU8KxzUFbfxHItG|v?rB;od#<~eNh%KW7%8`{~& z*O^ylqs{)#KF%AugQrtMLtJ>8ZzJD-(gxDO)5AQy)jPz;gQwScTEfSL9>m+U$c_2I zE>7+|t-{ktp0T$9PxGue5lFYcX~)0m|IyV}!D$Dex_2)bFmXBK?GhZk+k$5sLJxEX z4E%ij>AvA0(BB;0#WwmD;B~U5>RwIF-D*m_?*FgXzg_rWrT)Fx*tUO__-eVa^*57f z|J56tNwhbUXm2Lb-b|vsnMC{l*Cg5&@)iLWcP(L-7M8`9Z>?0VqO7`(it`MMt{q*q z*0(-uJ$X#wSje$98&Mm3o2xe8jvF4&InK3JwvD#!JwZ6(aiYZzZf9e6*>2_Jfs+?b zzOmP^PqH69C4VaH)ME#NgSW%|)1s&8r*F~tX~${TXzO%ydL@0u@t|XgOGdtLGR<9*!w zrVql0=5xna%-74e!%xO9%x}^@Z;YPYr(;VH9yG5*q0g*%n2LVn$6zQ==$f?Y@%`E^(2v`z@)L{eaYo1&=il9{?t9G zg{i;OoYQ*JRnqg)*E5_ldNNfr3o`#?xn}jB)jV644a@e;9zCabt~v*u6Ol7}{>b^J zTp%|sclpBU3y<^E^UCuD^F#8v1*Qcpgi$;p|i*J??OHxa|l{%LWl~KxS z%caZH%YU#uSmPDO6-|}fEAy&gRiRaHFWOw}x+?74Zw%BJ*0j{_uC2I~{h1A7Nr2lo#?7}6W!JTrXOIec)qcf@RDaP-*d_?Z0|ciee=?z#8#&l8~& zKPMSe{8MQ!P%rXc5?@xn+VScpSCe~x+HksW=IG4itkdj=*Fmq>-z2;hew+7B_TAMv zwYhuqM)L#jPriTi!T-b0g`|(@k0px=i;bTspZb<;m)?91{QT!j##j8;E6eK3Z7UWl zFIRn5e|}3_!>?6;Cx7qyas0=-pJ&$L>jl4d{A&Gu`1jNwpFe;8*Ch4EY5G4&YHRlp zA4gxhhxaB+y~$EzEcGT! zy~$EzEH#f@<$(p8EcIXb z>VJN2veYg?PXFkPe~U~1+lBwxoBx}?n=G|I-N^;m{og+ju*p(yvecU_^(ITb$x?5! z)SE2zCQH4^Qvctw)L@7NNaA15J^|k44(~1eFLUd8&vrWdIfeMR_y#L`_`3R89R43y z{d-F5f3A%_2>u(E{r3dd|E`V=nERivlc9gF<6qJ4|5+`Az&{ + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg new file mode 100644 index 0000000000..c17a7abafc --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial.imageset/vial_stroke_light.svg @@ -0,0 +1,80 @@ + + + + + + + +image/svg+xml + + + + + diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json new file mode 100644 index 0000000000..2bce0295cb --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Mediamodifier-Design.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg new file mode 100644 index 0000000000..dfa2d38c40 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/vial_color.imageset/Mediamodifier-Design.svg @@ -0,0 +1,22 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeAPS/Resources/Info.plist b/FreeAPS/Resources/Info.plist index 1a9865d4ef..b844affde8 100644 --- a/FreeAPS/Resources/Info.plist +++ b/FreeAPS/Resources/Info.plist @@ -44,6 +44,8 @@ $(CURRENT_PROJECT_VERSION) ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + LSApplicationQueriesSchemes gcm-ciq @@ -70,6 +72,8 @@ Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices NSBluetoothPeripheralUsageDescription Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices + NSCalendarsFullAccessUsageDescription + To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay NSCalendarsUsageDescription Calendar is used to create a new glucose events. NSFaceIDUsageDescription @@ -110,10 +114,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - NSCalendarsFullAccessUsageDescription - To create events with BG reading values, so that they can be viewed on Apple Watch and CarPlay - LSApplicationCategoryType - UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 83f064eb03..05e85190c9 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -25,6 +25,7 @@ "carbsRequiredThreshold" : 10, "animatedBackground" : false, "useFPUconversion" : true, + "tins": false, "individualAdjustmentFactor" : 0.5, "timeCap" : 8, "minuteInterval" : 30, diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index f264e23539..7ec6521575 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -120,7 +120,7 @@ final class OpenAPS { func oref2() -> RawJSON { coredataContext.performAndWait { - let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) + let preferences = self.storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) var hbt_ = preferences?.halfBasalExerciseTarget ?? 160 let wp = preferences?.weightPercentage ?? 1 let smbMinutes = (preferences?.maxSMBBasalMinutes ?? 30) as NSDecimalNumber @@ -207,6 +207,12 @@ final class OpenAPS { saveToCoreData.duration = 0 saveToCoreData.indefinite = false saveToCoreData.percentage = 100 + let saveToHistory = OverrideHistory(context: self.coredataContext) + let d: Double = -1 * date.addingTimeInterval(addedMinutes.minutes.timeInterval).timeIntervalSinceNow.minutes + print("Duration: \(d) minutes") + saveToHistory.duration = d + saveToHistory.target = Double(overrideTarget) + saveToHistory.date = overrideArray.first?.date ?? Date() try? self.coredataContext.save() } } diff --git a/FreeAPS/Sources/APS/Storage/OverrideStorage.swift b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift new file mode 100644 index 0000000000..672578e49e --- /dev/null +++ b/FreeAPS/Sources/APS/Storage/OverrideStorage.swift @@ -0,0 +1,79 @@ +import CoreData +import Foundation +import SwiftDate +import Swinject + +/* + protocol OverrideStorage { + func fetchOverrides(interval: NSDate) -> [Override] + func fetchLatestOverride() -> [Override] + } + */ +protocol OverrideObserver { + func overrideHistoryDidUpdate(_: [OverrideHistory]) +} + +final class OverrideStorage { + private let processQueue = DispatchQueue(label: "BaseOverrideStorage.processQueue") + + @Injected() private var broadcaster: Broadcaster! + + let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // newBackgroundContext() + + func fetchLatestOverride() -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.fetchLimit = 1 + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrides(interval: NSDate) -> [Override] { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func fetchOverrideHistory(interval: NSDate) -> [OverrideHistory] { + var overrideArray = [OverrideHistory]() + coredataContext.performAndWait { + let requestOverrides = OverrideHistory.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.predicate = NSPredicate( + format: "date > %@", interval + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + return overrideArray + } + + func cancelProfile() { + let scheduled = fetchLatestOverride().first + coredataContext.perform { [self] in + let profiles = Override(context: self.coredataContext) + let history = OverrideHistory(context: self.coredataContext) + if let latest = scheduled { + history.duration = -1 * (latest.date ?? Date()).timeIntervalSinceNow.minutes + print("History duration: \(history.duration) min") + history.date = latest.date ?? Date() + history.target = Double(latest.target ?? 100) + } + profiles.enabled = false + profiles.date = Date() + try? self.coredataContext.save() + } + } +} diff --git a/FreeAPS/Sources/Helpers/Color+Extensions.swift b/FreeAPS/Sources/Helpers/Color+Extensions.swift index 1b66ad90d2..cd4c0a4ba4 100644 --- a/FreeAPS/Sources/Helpers/Color+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Color+Extensions.swift @@ -59,8 +59,15 @@ extension Color { static let tempBasal = Color("TempBasal") static let basal = Color("Basal") static let darkerBlue = Color("DarkerBlue") + static let lightBlue = Color("LightBlue") static let loopPink = Color("LoopPink") static let lemon = Color("Lemon") static let minus = Color("minus") static let darkGray = Color("darkGray") + static let darkRed = Color("DarkRed") + static let darkGreen = Color("DarkGreen") + static let blueComplicationBackground = Color(red: 0.1176470588, green: 0.2352941176, blue: 0.3725490196) + static let header = Color("Header") + static let homeBackground = Color("HomeBackground") + static let popUpGray = Color("PopUpGray") } diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift new file mode 100644 index 0000000000..ca1f1c9445 --- /dev/null +++ b/FreeAPS/Sources/Models/Configs.swift @@ -0,0 +1,42 @@ +import Foundation +import SwiftUI + +struct DateFilter { + var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate + var today = Calendar.current.startOfDay(for: Date()) as NSDate + var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate + var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate + var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate + var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate +} + +public enum IAPSconfig { + static let padding: CGFloat = 60 + static let iconSize: CGFloat = 20 + static let backgroundOpacity: Double = 0.2 + static let buttonSize: CGFloat = 26 + static let shadowOpacity: CGFloat = 0.75 + static let glassShadowOpacity: CGFloat = 0.6 + static let shadowFraction: CGFloat = 2 +} + +extension Font { + static let buttonFont = Font.custom("TimeButtonFont", fixedSize: 14) // Same as Eventual BG size + static let loopFont = Font.custom("LoopFont", fixedSize: 18) // Loop min ago + static let statusFont = Font.custom("StatusFont", fixedSize: 16) // IOB, COB etc. + static let pumpFont = Font.custom("StatusFont", fixedSize: 15) + static let previewSmall = Font.custom("PreviewSmallFont", fixedSize: 12) + static let previewNormal = Font.custom("PreviewNormalFont", fixedSize: 18) + static let previewHeadline = Font.custom("PreviewHeadlineFont", fixedSize: 20) + static let extraSmall = Font.custom("ExtraSmallFont", fixedSize: 14) + + static let suggestionHeadline = Font.custom("SuggestionHeadlineFont", fixedSize: 20) + static let suggestionError = Font.custom("SuggestionErrorFone", fixedSize: 18) + static let suggestionParts = Font.custom("SuggestionPartsFont", fixedSize: 17) + static let suggestionSmallParts = Font.custom("SuggestionSmallPartsFont", fixedSize: 16) + + static let glucoseFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 45) + static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 24) + static let bolusProgressStopFont = Font.custom("BolusProgressStop", fixedSize: 24) + static let bolusProgressFont = Font.custom("BolusProgress", fixedSize: 20) +} diff --git a/FreeAPS/Sources/Models/DateFilter.swift b/FreeAPS/Sources/Models/DateFilter.swift deleted file mode 100644 index 466b699f98..0000000000 --- a/FreeAPS/Sources/Models/DateFilter.swift +++ /dev/null @@ -1,11 +0,0 @@ - -import Foundation - -struct DateFilter { - var twoHours = Date().addingTimeInterval(-2.hours.timeInterval) as NSDate - var today = Calendar.current.startOfDay(for: Date()) as NSDate - var day = Date().addingTimeInterval(-24.hours.timeInterval) as NSDate - var week = Date().addingTimeInterval(-7.days.timeInterval) as NSDate - var month = Date().addingTimeInterval(-30.days.timeInterval) as NSDate - var total = Date().addingTimeInterval(-90.days.timeInterval) as NSDate -} diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 0c85e089ad..c56d70700e 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -51,6 +51,7 @@ struct FreeAPSSettings: JSON, Equatable { var fattyMealFactor: Decimal = 0.7 var displayPredictions: Bool = true var useLiveActivity: Bool = false + var useTargetButton: Bool = false } extension FreeAPSSettings: Decodable { @@ -264,6 +265,10 @@ extension FreeAPSSettings: Decodable { settings.useLiveActivity = useLiveActivity } + if let useTargetButton = try? container.decode(Bool.self, forKey: .useTargetButton) { + settings.useTargetButton = useTargetButton + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index b76d833526..9a1aa13978 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -108,7 +108,6 @@ extension Bolus { deltaBG = delta } - // CALCULATIONS FOR THE BOLUS CALCULATOR func calculateInsulin() -> Decimal { var conversion: Decimal = 1.0 if units == .mmolL { diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 6c3e983600..a28006c364 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -20,6 +20,7 @@ extension Bolus { } @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -125,11 +126,12 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: false, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(exceededMaxBolus ? "😵" : " U").foregroundColor(.secondary) } + .focused($isFocused) .onChange(of: state.amount) { newValue in if newValue > state.maxBolus { exceededMaxBolus = true @@ -138,7 +140,21 @@ extension Bolus { } } - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { @@ -162,8 +178,10 @@ extension Bolus { label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } + + // Section {} footer: {}.padding(.bottom, 30) } - .blur(radius: showInfo ? 3 : 0) + .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) .navigationBarItems( diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 8329f93ec3..0af99e7106 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -16,6 +16,7 @@ extension Bolus { @State private var keepForNextWiew: Bool = false @Environment(\.colorScheme) var colorScheme + @FocusState private var isFocused: Bool @FetchRequest( entity: Meals.entity(), @@ -81,7 +82,6 @@ extension Bolus { } }.contentShape(Rectangle()) } - HStack { Text("Amount") Spacer() @@ -89,13 +89,28 @@ extension Bolus { "0", value: $state.amount, formatter: formatter, - autofocus: true, - cleanInput: true + cleanInput: true, + useButtons: false ) Text(!(state.amount > state.maxBolus) ? "U" : "😵").foregroundColor(.secondary) } + .focused($isFocused) - } header: { Text("Bolus") } + } header: { + HStack { + Text("Bolus") + if isFocused { + Button { isFocused = false } label: { + HStack { + Text("Hide").foregroundStyle(.gray) + Image(systemName: "keyboard") + .symbolRenderingMode(.monochrome).foregroundStyle(colorScheme == .dark ? .white : .black) + }.frame(maxWidth: .infinity, alignment: .trailing) + } + .controlSize(.mini) + } + } + } if state.amount > 0 { Section { diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 8b8ac87a84..fc160f3c73 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -83,10 +83,9 @@ extension CGM { Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose) } } - .onAppear(perform: configureView) .navigationTitle("CGM") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $setupCGM) { if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm { CGMSettingsView( diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index 9e3fe377c1..b3f1dcd231 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -192,7 +192,7 @@ extension DataTable { } .onAppear(perform: configureView) .navigationTitle("Add Glucose") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: { showManualGlucose = false })) } } diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 35bce423c9..1094544a48 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -67,16 +67,16 @@ extension Dynamic { Toggle("Adjust basal", isOn: $state.tddAdjBasal) } } header: { Text("Settings") } - - Section { - HStack { - Text("Threshold Setting") - Spacer() - DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) - Text(state.unit.rawValue) - } - } header: { Text("Safety") } } + + Section { + HStack { + Text("Threshold Setting") + Spacer() + DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) + Text(state.unit.rawValue) + } + } header: { Text("Safety") } } .onAppear(perform: configureView) .navigationBarTitle("Dynamic ISF") diff --git a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift index e0ea9544c3..3b8f5af42f 100644 --- a/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift +++ b/FreeAPS/Sources/Modules/Home/HomeDataFlow.swift @@ -20,4 +20,5 @@ protocol HomeProvider: Provider { func pumpReservoir() -> Decimal? func tempTarget() -> TempTarget? func announcement(_ hours: Int) -> [Announcement] + func overrides() -> [Override] } diff --git a/FreeAPS/Sources/Modules/Home/HomeProvider.swift b/FreeAPS/Sources/Modules/Home/HomeProvider.swift index fb846a2fd0..8ab9f613d2 100644 --- a/FreeAPS/Sources/Modules/Home/HomeProvider.swift +++ b/FreeAPS/Sources/Modules/Home/HomeProvider.swift @@ -15,6 +15,14 @@ extension Home { storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) } + func overrides() -> [Override] { + OverrideStorage().fetchOverrides(interval: DateFilter().day) + } + + func overrideHistory() -> [OverrideHistory] { + OverrideStorage().fetchOverrideHistory(interval: DateFilter().day) + } + var enactedSuggestion: Suggestion? { storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 3f32ab5680..e2473e5440 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -60,7 +60,14 @@ extension Home { @Published var displayYgridLines: Bool = false @Published var thresholdLines: Bool = false @Published var timeZone: TimeZone? - @Published var hours: Int16 = 6 + @Published var hours: Int = 6 + @Published var totalBolus: Decimal = 0 + @Published var isStatusPopupPresented: Bool = false + @Published var readings: [Readings] = [] + @Published var standing: Bool = false + @Published var preview: Bool = true + @Published var useTargetButton: Bool = false + @Published var overrideHistory: [OverrideHistory] = [] let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -77,8 +84,10 @@ extension Home { setupReservoir() setupAnnouncements() setupCurrentPumpTimezone() + setupOverrideHistory() suggestion = provider.suggestion + overrideHistory = provider.overrideHistory() uploadStats = settingsManager.settings.uploadStats enactedSuggestion = provider.enactedSuggestion units = settingsManager.settings.units @@ -98,6 +107,8 @@ extension Home { displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours broadcaster.register(GlucoseObserver.self, observer: self) broadcaster.register(SuggestionObserver.self, observer: self) @@ -110,7 +121,7 @@ extension Home { broadcaster.register(EnactedSuggestionObserver.self, observer: self) broadcaster.register(PumpBatteryObserver.self, observer: self) broadcaster.register(PumpReservoirObserver.self, observer: self) - + broadcaster.register(OverrideObserver.self, observer: self) animatedBackground = settingsManager.settings.animatedBackground timer.eventHandler = { @@ -209,12 +220,8 @@ extension Home { } func cancelProfile() { - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } + OverrideStorage().cancelProfile() + setupOverrideHistory() } private func setupGlucose() { @@ -222,6 +229,7 @@ extension Home { guard let self = self else { return } self.isManual = self.provider.manualGlucose(hours: self.filteredHours) self.glucose = self.provider.filteredGlucose(hours: self.filteredHours) + self.readings = CoreDataStorage().fetchGlucose(interval: DateFilter().today) self.recentGlucose = self.glucose.last if self.glucose.count >= 2 { self.glucoseDelta = (self.recentGlucose?.glucose ?? 0) - (self.glucose[self.glucose.count - 2].glucose ?? 0) @@ -311,6 +319,13 @@ extension Home { } } + private func setupOverrideHistory() { + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.overrideHistory = self.provider.overrideHistory() + } + } + private func setupAnnouncements() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } @@ -403,7 +418,8 @@ extension Home.StateModel: EnactedSuggestionObserver, PumpBatteryObserver, PumpReservoirObserver, - PumpTimeZoneObserver + PumpTimeZoneObserver, + OverrideObserver { func glucoseDidUpdate(_: [BloodGlucose]) { setupGlucose() @@ -413,6 +429,11 @@ extension Home.StateModel: self.suggestion = suggestion carbsRequired = suggestion.carbsReq setStatusTitle() + setupOverrideHistory() + } + + func overrideHistoryDidUpdate(_: [OverrideHistory]) { + setupOverrideHistory() } func settingsDidChange(_ settings: FreeAPSSettings) { @@ -429,8 +450,10 @@ extension Home.StateModel: displayXgridLines = settingsManager.settings.xGridLines displayYgridLines = settingsManager.settings.yGridLines thresholdLines = settingsManager.settings.rulerMarks - + useTargetButton = settingsManager.settings.useTargetButton + hours = settingsManager.settings.hours setupGlucose() + setupOverrideHistory() } func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) { @@ -459,6 +482,7 @@ extension Home.StateModel: func enactedSuggestionDidUpdate(_ suggestion: Suggestion) { enactedSuggestion = suggestion setStatusTitle() + setupOverrideHistory() } func pumpBatteryDidChange(_: Battery) { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index d574d535d6..679d34895d 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -20,17 +20,23 @@ struct AnnouncementDot { let note: String } +struct OverrideStruct { + let start: Date + let end: Date + let glucose: Int +} + typealias GlucoseYRange = (minValue: Int, minY: CGFloat, maxValue: Int, maxY: CGFloat) struct MainChartView: View { private enum Config { static let endID = "End" - static let basalHeight: CGFloat = 80 + static let basalHeight: CGFloat = 50 static let topYPadding: CGFloat = 20 - static let bottomYPadding: CGFloat = 80 + static let bottomYPadding: CGFloat = 20 static let minAdditionalWidth: CGFloat = 150 static let maxGlucose = 270 - static let minGlucose = 45 + static let minGlucose = 0 // 45 static let yLinesCount = 5 static let glucoseScale: CGFloat = 2 // default 2 static let bolusSize: CGFloat = 8 @@ -72,10 +78,12 @@ struct MainChartView: View { @Binding var smooth: Bool @Binding var highGlucose: Decimal @Binding var lowGlucose: Decimal - @Binding var screenHours: Int16 + @Binding var screenHours: Int @Binding var displayXgridLines: Bool @Binding var displayYgridLines: Bool @Binding var thresholdLines: Bool + @Binding var triggerUpdate: Bool + @Binding var overrideHistory: [OverrideHistory] @State var didAppearTrigger = false @State private var glucoseDots: [CGRect] = [] @@ -86,23 +94,22 @@ struct MainChartView: View { @State private var unSmoothedGlucoseDots: [CGRect] = [] @State private var predictionDots: [PredictionType: [CGRect]] = [:] @State private var bolusDots: [DotInfo] = [] + @State private var bolusPath = Path() @State private var tempBasalPath = Path() @State private var regularBasalPath = Path() @State private var tempTargetsPath = Path() + @State private var overridesPath = Path() @State private var suspensionsPath = Path() @State private var carbsDots: [DotInfo] = [] + @State private var carbsPath = Path() @State private var fpuDots: [DotInfo] = [] + @State private var fpuPath = Path() @State private var glucoseYRange: GlucoseYRange = (0, 0, 0, 0) + @State private var offset: CGFloat = 0 @State private var cachedMaxBasalRate: Decimal? - private var zoomScale: Double { - 1.0 / Double(screenHours) - } + @State private var legends: Bool = false - private let calculationQueue = DispatchQueue( - label: "MainChartView.calculationQueue", - qos: .userInteractive, - attributes: .concurrent - ) + private let calculationQueue = DispatchQueue(label: "MainChartView.calculationQueue") private var dateFormatter: DateFormatter { let formatter = DateFormatter() @@ -149,14 +156,21 @@ struct MainChartView: View { return formatter } + private var fetchedTargetFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + if units == .mmolL { + formatter.maximumFractionDigits = 1 + } else { formatter.maximumFractionDigits = 0 } + return formatter + } + @Environment(\.horizontalSizeClass) var hSizeClass @Environment(\.verticalSizeClass) var vSizeClass - // MARK: - Views - var body: some View { GeometryReader { geo in - ZStack(alignment: .leading) { + ZStack { yGridView(fullSize: geo.size) mainScrollView(fullSize: geo.size) glucoseLabelsView(fullSize: geo.size) @@ -167,6 +181,9 @@ struct MainChartView: View { .onChange(of: vSizeClass) { _ in update(fullSize: geo.size) } + .onChange(of: screenHours) { _ in + update(fullSize: geo.size) + } .onReceive( Foundation.NotificationCenter.default .publisher(for: UIDevice.orientationDidChangeNotification) @@ -174,35 +191,93 @@ struct MainChartView: View { update(fullSize: geo.size) } } + .onTapGesture { + legends.toggle() + } + } + + var legendPanel: some View { + ZStack { + HStack { + if legends { + Group { + Circle().fill(Color.insulin).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("IOB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Circle().fill(Color.zt).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("ZT") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Circle().fill(Color.loopYellow).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("COB") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Circle().fill(Color.uam).frame(width: 8, height: 8) + .padding(.leading, 8) + Text("UAM") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } else { + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + } + Group { + Text(".") + .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + } + } + } + .padding(.bottom, 20) + } } private func mainScrollView(fullSize: CGSize) -> some View { - ScrollViewReader { scroll in - ScrollView(.horizontal, showsIndicators: false) { + ScrollView(.horizontal, showsIndicators: false) { + ScrollViewReader { scroll in ZStack(alignment: .top) { tempTargetsView(fullSize: fullSize).drawingGroup() + overridesView(fullSize: fullSize).drawingGroup() basalView(fullSize: fullSize).drawingGroup() + legendPanel.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, legends ? 20 : 70).padding(.bottom, 20) mainView(fullSize: fullSize).id(Config.endID) .drawingGroup() - } - } - .onChange(of: glucose) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: suggestion) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: tempBasals) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onChange(of: screenHours) { _ in - scroll.scrollTo(Config.endID, anchor: .trailing) - } - .onAppear { - // add trigger to the end of main queue - DispatchQueue.main.async { - scroll.scrollTo(Config.endID, anchor: .trailing) - didAppearTrigger = true + .onChange(of: glucose) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: suggestion) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: tempBasals) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + .onChange(of: screenHours) { _ in + scroll.scrollTo(Config.endID, anchor: .trailing) + } + + .onAppear { + // add trigger to the end of main queue + DispatchQueue.main.async { + scroll.scrollTo(Config.endID, anchor: .trailing) + didAppearTrigger = true + } + } } } } @@ -261,18 +336,16 @@ struct MainChartView: View { private func basalView(fullSize: CGSize) -> some View { ZStack { - tempBasalPath.scale(x: zoomScale, anchor: .zero).fill(Color.basal.opacity(0.5)) - tempBasalPath.scale(x: zoomScale, anchor: .zero).stroke(Color.insulin, lineWidth: 1) - regularBasalPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) - suspensionsPath.scale(x: zoomScale, anchor: .zero) - .stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) - suspensionsPath.scale(x: zoomScale, anchor: .zero).fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) + tempBasalPath.fill(Color.basal.opacity(0.5)) + tempBasalPath.stroke(Color.insulin, lineWidth: 1) + regularBasalPath.stroke(Color.insulin, style: StrokeStyle(lineWidth: 0.7, dash: [4])) + suspensionsPath.stroke(Color.loopGray.opacity(0.7), style: StrokeStyle(lineWidth: 0.7)).scaleEffect(x: 1, y: -1) + suspensionsPath.fill(Color.loopGray.opacity(0.2)).scaleEffect(x: 1, y: -1) } .scaleEffect(x: 1, y: -1) - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) .frame(maxHeight: Config.basalHeight) - .background(Color.secondary.opacity(0.1)) + .background(Color.clear) .onChange(of: tempBasals) { _ in calculateBasalPoints(fullSize: fullSize) } @@ -291,51 +364,24 @@ struct MainChartView: View { } private func mainView(fullSize: CGSize) -> some View { - VStack { - ZStack { - xGridView(fullSize: fullSize) - carbsView(fullSize: fullSize) - fpuView(fullSize: fullSize) - bolusView(fullSize: fullSize) - if smooth { unSmoothedGlucoseView(fullSize: fullSize) } - glucoseView(fullSize: fullSize) - manualGlucoseView(fullSize: fullSize) - manualGlucoseCenterView(fullSize: fullSize) - announcementView(fullSize: fullSize) - predictionsView(fullSize: fullSize) + Group { + VStack { + ZStack { + xGridView(fullSize: fullSize) + carbsView(fullSize: fullSize) + fpuView(fullSize: fullSize) + bolusView(fullSize: fullSize) + if smooth { unSmoothedGlucoseView(fullSize: fullSize) } + glucoseView(fullSize: fullSize) + manualGlucoseView(fullSize: fullSize) + manualGlucoseCenterView(fullSize: fullSize) + announcementView(fullSize: fullSize) + predictionsView(fullSize: fullSize) + } + timeLabelsView(fullSize: fullSize) } - timeLabelsView(fullSize: fullSize) } - .frame(width: glucoseAndAdditionalWidth(fullSize: fullSize)) - } - - /// returns the width of the full chart view including predictions for the current `screenHours` - private func glucoseAndAdditionalWidth(fullSize: CGSize) -> CGFloat { - // fullGlucoseWidth returns the width scaled to 1h screen hours. Scale it down to screenHours - fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(screenHours) - + additionalWidthScaled(viewWidth: fullSize.width) - } - - /// returns the additional width for predictions, scaled to `screenHours` - private func additionalWidthScaled(viewWidth: CGFloat) -> CGFloat { - guard let predictions = suggestion?.predictions, - let deliveredAt = suggestion?.deliverAt, - let last = glucose.last - else { - return Config.minAdditionalWidth - } - - let iob = predictions.iob?.count ?? 0 - let zt = predictions.zt?.count ?? 0 - let cob = predictions.cob?.count ?? 0 - let uam = predictions.uam?.count ?? 0 - let max = [iob, zt, cob, uam].max() ?? 0 - - let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) - let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) - let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) / CGFloat(screenHours) - - return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) + .frame(width: fullGlucoseWidth(viewWidth: fullSize.width) + additionalWidth(viewWidth: fullSize.width)) } @Environment(\.colorScheme) var colorScheme @@ -345,19 +391,20 @@ struct MainChartView: View { return ZStack { Path { path in for hour in 0 ..< hours + hours { - let x = ( - firstHourPosition(viewWidth: fullSize.width) + + if screenHours < 12 || hour % 2 == 0 { + // only show every second line if screenHours is too big + let x = firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale - path.move(to: CGPoint(x: x, y: 0)) - path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + path.move(to: CGPoint(x: x, y: 0)) + path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) + } } } .stroke(useColour, lineWidth: 0.15) Path { path in // vertical timeline - let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) * zoomScale + let x = timeToXCoordinate(timerDate.timeIntervalSince1970, fullSize: fullSize) path.move(to: CGPoint(x: x, y: 0)) path.addLine(to: CGPoint(x: x, y: fullSize.height - 20)) } @@ -371,19 +418,21 @@ struct MainChartView: View { private func timeLabelsView(fullSize: CGSize) -> some View { let format = screenHours > 6 ? date24Formatter : dateFormatter return ZStack { - // X time labels - ForEach(0 ..< hours + hours, id: \.self) { hour in - Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) - .font(.caption) - .position( - x: ( - firstHourPosition(viewWidth: fullSize.width) + + ForEach(0 ..< hours + hours) { hour in + if screenHours >= 12 && hour % 2 == 1 { + // only show every second time label if screenHours is too big + EmptyView() + } else { + Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) + .font(.caption) + .position( + x: firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * - CGFloat(hour) * CGFloat(1.hours.timeInterval) - ) * zoomScale, - y: 10.0 - ) - .foregroundColor(.secondary) + CGFloat(hour) * CGFloat(1.hours.timeInterval), + y: 10.0 + ) + .foregroundColor(.secondary) + } } }.frame(maxHeight: 20) } @@ -391,7 +440,7 @@ struct MainChartView: View { private func glucoseView(fullSize: CGSize) -> some View { Path { path in for rect in glucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.loopGreen) @@ -409,7 +458,7 @@ struct MainChartView: View { private func manualGlucoseView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDots { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.gray) @@ -427,9 +476,7 @@ struct MainChartView: View { private func announcementView(fullSize: CGSize) -> some View { ZStack { ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in - let scaledRect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: scaledRect.midX + 5, y: scaledRect.maxY - Config.owlOffset) + let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) let type: String = info.note.contains("true") ? Command.open : @@ -458,7 +505,7 @@ struct MainChartView: View { private func manualGlucoseCenterView(fullSize: CGSize) -> some View { Path { path in for rect in manualGlucoseDotsCenter { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } } .fill(Color.red) @@ -481,9 +528,8 @@ struct MainChartView: View { Path { path in var lines: [CGPoint] = [] for rect in unSmoothedGlucoseDots { - let scaled = scaleCenter(rect: rect) - lines.append(CGPoint(x: scaled.midX, y: scaled.midY)) - path.addEllipse(in: scaled) + lines.append(CGPoint(x: rect.midX, y: rect.midY)) + path.addEllipse(in: rect) } path.addLines(lines) } @@ -501,21 +547,13 @@ struct MainChartView: View { private func bolusView(fullSize: CGSize) -> some View { ZStack { - let bolusPath = Path { path in - for dot in bolusDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - bolusPath .fill(Color.insulin) bolusPath .stroke(Color.primary, lineWidth: 0.5) ForEach(bolusDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.maxY + 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.maxY + 8) return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -531,21 +569,13 @@ struct MainChartView: View { private func carbsView(fullSize: CGSize) -> some View { ZStack { - let carbsPath = Path { path in - for dot in carbsDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - carbsPath .fill(Color.loopYellow) carbsPath .stroke(Color.primary, lineWidth: 0.5) ForEach(carbsDots, id: \.rect.minX) { info -> AnyView in - let rect = scaleCenter(rect: info.rect) - - let position = CGPoint(x: rect.midX, y: rect.minY - 8) + let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.caption2) .position(position) .asAny() @@ -561,12 +591,6 @@ struct MainChartView: View { private func fpuView(fullSize: CGSize) -> some View { ZStack { - let fpuPath = Path { path in - for dot in fpuDots { - path.addEllipse(in: scaleCenter(rect: dot.rect)) - } - } - fpuPath .fill(.orange.opacity(0.5)) fpuPath @@ -583,10 +607,8 @@ struct MainChartView: View { private func tempTargetsView(fullSize: CGSize) -> some View { ZStack { tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .fill(Color.tempBasal.opacity(0.5)) tempTargetsPath - .scale(x: zoomScale, anchor: .zero) .stroke(Color.basal.opacity(0.5), lineWidth: 1) } .onChange(of: glucose) { _ in @@ -600,37 +622,53 @@ struct MainChartView: View { } } - private func scale(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.origin.x * zoomScale, y: rect.origin.y), size: rect.size) - } - - private func scaleCenter(rect: CGRect) -> CGRect { - CGRect(origin: CGPoint(x: rect.midX * zoomScale - rect.width / 2, y: rect.origin.y), size: rect.size) + private func overridesView(fullSize: CGSize) -> some View { + ZStack { + overridesPath + .fill(Color.purple.opacity(0.4)) + overridesPath + .stroke(Color.purple.opacity(0.7), lineWidth: 0.5) + } + .onChange(of: glucose) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: suggestion) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: overrideHistory) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: triggerUpdate) { _ in + calculateOverridesRects(fullSize: fullSize) + } + .onChange(of: didAppearTrigger) { _ in + calculateOverridesRects(fullSize: fullSize) + } } private func predictionsView(fullSize: CGSize) -> some View { Group { Path { path in for rect in predictionDots[.iob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.insulin) Path { path in for rect in predictionDots[.cob] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.loopYellow) Path { path in for rect in predictionDots[.zt] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.zt) Path { path in for rect in predictionDots[.uam] ?? [] { - path.addEllipse(in: scaleCenter(rect: rect)) + path.addEllipse(in: rect) } }.fill(Color.uam) } @@ -642,8 +680,6 @@ struct MainChartView: View { // MARK: - Calculations -/// some of the calculations done here can take quite long (100ms+) and are not able to update data at a fast rate -/// therefore we stick to the 1h screen window for these calculations and scale the results as needed to `screenHours` which has little extra overhead and enables changing the screen hours with no lag extension MainChartView { private func update(fullSize: CGSize) { calculatePredictionDots(fullSize: fullSize, type: .iob) @@ -659,6 +695,7 @@ extension MainChartView { calculateCarbsDots(fullSize: fullSize) calculateFPUsDots(fullSize: fullSize) calculateTempTargetsRects(fullSize: fullSize) + calculateOverridesRects(fullSize: fullSize) calculateBasalPoints(fullSize: fullSize) calculateSuspensions(fullSize: fullSize) } @@ -760,8 +797,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.amount ?? 0) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { bolusDots = dots + bolusPath = path } } } @@ -780,8 +824,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { carbsDots = dots + carbsPath = path } } } @@ -800,8 +851,15 @@ extension MainChartView { return DotInfo(rect: rect, value: value.carbs) } + let path = Path { path in + for dot in dots { + path.addEllipse(in: dot.rect) + } + } + DispatchQueue.main.async { fpuDots = dots + fpuPath = path } } } @@ -876,8 +934,9 @@ extension MainChartView { path.addLine(to: CGPoint(x: lastPoint.x, y: Config.basalHeight)) path.addLine(to: CGPoint(x: 0, y: Config.basalHeight)) } - let endDateTime = dayAgoTime + 12.hours - .timeInterval + 12.hours + let adjustForOptionalExtraHours = screenHours > 12 ? screenHours - 12 : 0 + let endDateTime = dayAgoTime + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours + .timeInterval + min(max(Int(screenHours - adjustForOptionalExtraHours), 12), 24).hours .timeInterval let autotunedBasalPoints = findRegularBasalPoints( timeBegin: dayAgoTime, @@ -937,7 +996,8 @@ extension MainChartView { .map { self.timeToXCoordinate($0.timestamp.timeIntervalSince1970, fullSize: fullSize) } let x0 = self.timeToXCoordinate(event.timestamp.timeIntervalSince1970, fullSize: fullSize) - let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + 275 + let x1 = tbrTimeX ?? self.fullGlucoseWidth(viewWidth: fullSize.width) + self + .additionalWidth(viewWidth: fullSize.width) return CGRect(x: x0, y: 0, width: x1 - x0, height: Config.basalHeight * 0.7) } @@ -1001,17 +1061,85 @@ extension MainChartView { return res } } - let path = Path { path in path.addRects(rects) } - DispatchQueue.main.async { tempTargetsPath = path } } } + private func calculateOverridesRects(fullSize: CGSize) { + calculationQueue.async { + let latest = OverrideStorage().fetchLatestOverride().first + let rects = overrideHistory.compactMap { each -> CGRect in + let duration = each.duration + let xStart = timeToXCoordinate(each.date!.timeIntervalSince1970, fullSize: fullSize) + let xEnd = timeToXCoordinate( + each.date!.addingTimeInterval(Int(duration).minutes.timeInterval).timeIntervalSince1970, + fullSize: fullSize + ) + let y = glucoseToYCoordinate(Int(each.target), fullSize: fullSize) + return CGRect( + x: xStart, + y: y - 3, + width: xEnd - xStart, + height: 6 + ) + } + if latest?.enabled ?? false { + var old = Array(rects) + if (latest?.duration ?? 0) != 0 { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(Int(latest?.duration ?? 0).minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate( + Int(Double(latest?.target ?? 100)), + fullSize: fullSize + ), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } else { + let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let plusNow = (latest?.date ?? Date.now).addingTimeInterval(60.minutes.timeInterval) + let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) + + let oneMore = CGRect( + x: x1, + y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), + width: x2 - x1, + height: 6 + ) + old.append(oneMore) + let path = Path { path in + path.addRects(old) + } + return DispatchQueue.main.async { + overridesPath = path + } + } + } + let path = Path { path in + path.addRects(rects) + } + DispatchQueue.main.async { + overridesPath = path + } + } + } + private func findRegularBasalPoints( timeBegin: TimeInterval, timeEnd: TimeInterval, @@ -1083,11 +1211,32 @@ extension MainChartView { } private func fullGlucoseWidth(viewWidth: CGFloat) -> CGFloat { - viewWidth * CGFloat(hours) + viewWidth * CGFloat(hours) / CGFloat(min(max(screenHours, 2), 24)) + } + + private func additionalWidth(viewWidth: CGFloat) -> CGFloat { + guard let predictions = suggestion?.predictions, + let deliveredAt = suggestion?.deliverAt, + let last = glucose.last + else { + return Config.minAdditionalWidth + } + + let iob = predictions.iob?.count ?? 0 + let zt = predictions.zt?.count ?? 0 + let cob = predictions.cob?.count ?? 0 + let uam = predictions.uam?.count ?? 0 + let max = [iob, zt, cob, uam].max() ?? 0 + + let lastDeltaTime = last.dateString.timeIntervalSince(deliveredAt) + let additionalTime = CGFloat(TimeInterval(max) * 5.minutes.timeInterval - lastDeltaTime) + let oneSecondWidth = oneSecondStep(viewWidth: viewWidth) + + return Swift.min(Swift.max(additionalTime * oneSecondWidth, Config.minAdditionalWidth), 275) } private func oneSecondStep(viewWidth: CGFloat) -> CGFloat { - viewWidth / CGFloat(1.hours.timeInterval) + viewWidth / (CGFloat(min(max(screenHours, 2), 24)) * CGFloat(1.hours.timeInterval)) } private func maxPredValue() -> Int? { @@ -1154,15 +1303,6 @@ extension MainChartView { return x } - /// inverse of `timeToXCoordinate` - private func xCoordinateToTime(x: CGFloat, fullSize: CGSize) -> TimeInterval { - let stepXFraction = fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(hours.hours.timeInterval) - let xx = x / stepXFraction - let xOffset = -Date().addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970 - let time = xx - xOffset - return time - } - private func glucoseToYCoordinate(_ glucoseValue: Int, fullSize: CGSize) -> CGFloat { let topYPaddint = Config.topYPadding + Config.basalHeight let bottomYPadding = Config.bottomYPadding diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 584c8b467d..1c2844b6a7 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -9,6 +9,14 @@ struct CurrentGlucoseView: View { @Binding var lowGlucose: Decimal @Binding var highGlucose: Decimal + @State private var rotationDegrees: Double = 0.0 + + enum Config { + static let size: CGFloat = 100 + } + + @Environment(\.colorScheme) var colorScheme + private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -45,47 +53,54 @@ struct CurrentGlucoseView: View { } var body: some View { - VStack(alignment: .center) { - HStack { - Text( - (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose - .map { - glucoseFormatter - .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } - ?? "--" - ) - .font(.title).fontWeight(.bold) - .foregroundColor(alarm == nil ? colorOfGlucose : .loopRed) - - image - } - HStack { - let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 - let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" - Text( - minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : ( - text + " " + - NSLocalizedString("min", comment: "Short form for minutes") + " " + ZStack { + VStack(alignment: .center) { + // HStack { + ZStack { + Text( + (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose + .map { + glucoseFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } + ?? "--" ) - ) - .font(.caption2).foregroundColor(.secondary) + .font(.glucoseFont) + .foregroundColor(alarm == nil ? .primary : .loopRed) + .frame(maxWidth: .infinity, alignment: .center) - Text( - delta - .map { - deltaFormatter.string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! - } ?? "--" - ) - .font(.caption2).foregroundColor(.secondary) - }.frame(alignment: .top) + HStack(spacing: 20) { + image + .font(.system(size: 25)) + VStack { + Text( + delta + .map { + deltaFormatter + .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! + } ?? "--" + ) + HStack { + let minutesAgo = -1 * (recentGlucose?.dateString.timeIntervalSinceNow ?? 0) / 60 + let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? "" + Text( + minutesAgo <= 1 ? "" : ( + text + " " + + NSLocalizedString("min", comment: "Short form for minutes") + " " + ) + ) + }.offset(x: 7, y: 0) + } + .font(.extraSmall).foregroundStyle(.secondary) + }.frame(maxWidth: .infinity, alignment: .trailing).padding(.trailing, 50) + } + } } } - var image: Image { + var image: some View { guard let direction = recentGlucose?.direction else { return Image(systemName: "arrow.left.and.right") } - switch direction { case .doubleUp, .singleUp, @@ -101,28 +116,10 @@ struct CurrentGlucoseView: View { .singleDown, .tripleDown: return Image(systemName: "arrow.down") - case .none, .notComputable, .rateOutOfRange: return Image(systemName: "arrow.left.and.right") } } - - var colorOfGlucose: Color { - let whichGlucose = recentGlucose?.glucose ?? 0 - - guard lowGlucose < highGlucose else { return .primary } - - switch whichGlucose { - case 0 ..< Int(lowGlucose): - return .loopRed - case Int(lowGlucose) ..< Int(highGlucose): - return .loopGreen - case Int(highGlucose)...: - return .loopYellow - default: - return .loopYellow - } - } } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index b92a98eb40..e1211201f4 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -21,38 +21,37 @@ struct LoopView: View { return formatter } - private let rect = CGRect(x: 0, y: 0, width: 28, height: 28) + @Environment(\.colorScheme) var colorScheme var body: some View { - VStack(alignment: .center) { - ZStack { - Circle() - .strokeBorder(color, lineWidth: 5) - .frame(width: rect.width, height: rect.height, alignment: .bottom) - .mask(mask(in: rect).fill(style: FillStyle(eoFill: true))) - if isLooping { - ProgressView() + VStack { + LoopEllipse() + .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) + .overlay { + let textColor: Color = .secondary + HStack { + ZStack { + if !isLooping, actualSuggestion?.timestamp != nil { + if minutesAgo > 1440 { + Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) + } else { + let timeString = "\(minutesAgo) " + + NSLocalizedString("min", comment: "Minutes ago since last loop") + Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + } + } + if isLooping { + ProgressView() + } + } + } } - } - if isLooping { - Text("looping").font(.caption2) - } else if manualTempBasal { - Text("Manual").font(.caption2) - } else if actualSuggestion?.timestamp != nil { - Text(timeString).font(.caption2) - .foregroundColor(.secondary) - } else { - Text("--").font(.caption2).foregroundColor(.secondary) - } } } - private var timeString: String { + private var minutesAgo: Int { let minAgo = Int((timerDate.timeIntervalSince(lastLoopDate) - Config.lag) / 60) + 1 - if minAgo > 1440 { - return "--" - } - return "\(minAgo) " + NSLocalizedString("min", comment: "Minutes ago since last loop") + return minAgo } private var color: Color { @@ -64,26 +63,18 @@ struct LoopView: View { } let delta = timerDate.timeIntervalSince(lastLoopDate) - Config.lag - if delta <= 5.minutes.timeInterval { + if delta <= 8.minutes.timeInterval { guard actualSuggestion?.deliverAt != nil else { return .loopYellow } return .loopGreen - } else if delta <= 10.minutes.timeInterval { + } else if delta <= 12.minutes.timeInterval { return .loopYellow } else { return .loopRed } } - func mask(in rect: CGRect) -> Path { - var path = Rectangle().path(in: rect) - if !closedLoop || manualTempBasal { - path.addPath(Rectangle().path(in: CGRect(x: rect.minX, y: rect.midY - 5, width: rect.width, height: 10))) - } - return path - } - private var actualSuggestion: Suggestion? { if closedLoop, enactedSuggestion?.recieved == true { return enactedSuggestion ?? suggestion diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift new file mode 100644 index 0000000000..383a796539 --- /dev/null +++ b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift @@ -0,0 +1,255 @@ +import Charts +import SwiftUI + +struct PreviewChart: View { + @Binding var readings: [Readings] + @Binding var lowLimit: Decimal + @Binding var highLimit: Decimal + + @Environment(\.colorScheme) var colorScheme + + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 0 + return formatter + } + + var body: some View { + let fetched = previewTir() + + struct TIRinPercent: Identifiable { + let type: String + let group: String + let percentage: Decimal + let id: UUID + } + + let separator: Decimal = 4 + + var data: [TIRinPercent] = [ + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very Low", + comment: "" + ), + percentage: fetched[4].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Low", + comment: "" + ), + percentage: fetched[0].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString("In Range", comment: ""), + percentage: fetched[1].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "High", + comment: "" + ), + percentage: fetched[2].decimal, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: "Separator", + percentage: separator, + id: UUID() + ), + TIRinPercent( + type: "TIR", + group: NSLocalizedString( + "Very High", + comment: "" + ), + percentage: fetched[3].decimal, + id: UUID() + ) + ] + + for index in 0 ..< 3 { + if data[index].percentage == 0 { + data.remove(at: index + 1) + } + } + + return HStack { + VStack { + Chart(data) { item in + BarMark( + x: .value("TIR", item.type), + y: .value("Percentage", item.percentage), + width: .fixed(60) + ) + .foregroundStyle(by: .value("Group", item.group)) + .annotation(position: .trailing) { + if item.group == NSLocalizedString("In Range", comment: ""), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + }.font(.previewNormal) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Low", + comment: "" + ), item.percentage > 0.0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very High", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: -5) + .font(.previewSmall) + .padding(.leading, 20) + } else if item.group == NSLocalizedString( + "Very Low", + comment: "" + ), item.percentage > 0 { + HStack { + if item.percentage < 1 { + Text("< 1%") + } else { + Text((tirFormatter.string(from: item.percentage as NSNumber) ?? "") + "%") + } + Text(item.group) + } + .offset(x: 0, y: 5) + .font(.previewSmall) + .padding(.leading, 20) + } + } + } + .chartForegroundStyleScale([ + NSLocalizedString( + "Low", + comment: "" + ): .red, + NSLocalizedString("In Range", comment: ""): .darkGreen, + NSLocalizedString( + "High", + comment: "" + ): .yellow, + NSLocalizedString( + "Very High", + comment: "" + ): .red, + NSLocalizedString( + "Very Low", + comment: "" + ): .darkRed, + "Separator": colorScheme == .dark ? .black : .white + ]) + .chartXAxis(.hidden) + .chartYAxis(.hidden) + .chartLegend(.hidden) + .padding(.bottom, 15) + .frame(maxWidth: UIScreen.main.bounds.width / 5, alignment: .leading) + }.frame(maxHeight: 200) + + }.padding(.top, 20).padding(.leading, 20) + } + + private func previewTir() -> [(decimal: Decimal, string: String)] { + let hypoLimit = Int(lowLimit) + let hyperLimit = Int(highLimit) + + let glucose = readings + + let justGlucoseArray = glucose.compactMap({ each in Int(each.glucose as Int16) }) + let totalReadings = justGlucoseArray.count + + let hyperArray = glucose.filter({ $0.glucose >= hyperLimit }) + let hyperReadings = hyperArray.compactMap({ each in each.glucose as Int16 }).count + var hyperPercentage = Double(hyperReadings) / Double(totalReadings) * 100 + + let hypoArray = glucose.filter({ $0.glucose <= hypoLimit }) + let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count + var hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + + let veryHighArray = glucose.filter({ $0.glucose > 197 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 60 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + + hypoPercentage -= veryLowPercentage + hyperPercentage -= veryHighPercentage + + let tir = 100 - (hypoPercentage + hyperPercentage + veryHighPercentage + veryLowPercentage) + + var array: [(decimal: Decimal, string: String)] = [] + array.append((decimal: Decimal(hypoPercentage), string: "Low")) + array.append((decimal: Decimal(tir), string: "NormaL")) + array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) + + return array + } +} diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index e809049b82..148af785e9 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -6,7 +6,10 @@ struct PumpView: View { @Binding var name: String @Binding var expiresAtDate: Date? @Binding var timerDate: Date - @Binding var timeZone: TimeZone? + + @State var state: Home.StateModel + + @Environment(\.colorScheme) var colorScheme private var reservoirFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -21,99 +24,123 @@ struct PumpView: View { return formatter } + private var numberFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 2 + return formatter + } + + private var dateFormatter: DateFormatter { + let dateFormatter = DateFormatter() + dateFormatter.timeStyle = .short + return dateFormatter + } + var body: some View { - VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 10) { + if let battery = battery, expiresAtDate == nil { + let percent = (battery.percent ?? 100) > 80 ? 100 : (battery.percent ?? 100) < 81 && + (battery.percent ?? 100) > + 60 ? 75 : (battery.percent ?? 100) < 61 && (battery.percent ?? 100) > 40 ? 50 : 25 + Image(systemName: "battery.\(percent)") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 15) + .foregroundColor(batteryColor) + } + if let reservoir = reservoir { + let fill = CGFloat(min(max(Double(reservoir) / 200.0, 0.15), Double(reservoir) / 200.0, 0.9)) * 12 HStack { - Image(systemName: "drop.fill") + Image("vial") .resizable() .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) + .frame(maxWidth: 10) .foregroundColor(reservoirColor) + .offset(x: 0, y: -3) + .overlay { + UnevenRoundedRectangle(cornerRadii: .init(bottomLeading: 2, bottomTrailing: 2)) + .fill(Color.insulin) + .frame(maxWidth: 8.8, maxHeight: fill) + .frame(maxHeight: .infinity, alignment: .bottom) + .offset(x: -0.09, y: -3.22) + } if reservoir == 0xDEAD_BEEF { - Text("50+ " + NSLocalizedString("U", comment: "Insulin unit")).font(.footnote) - .fontWeight(.bold) + HStack(spacing: 0) { + Text("50+ ").font(.statusFont).bold() + Text(NSLocalizedString("U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } else { - Text( - reservoirFormatter - .string(from: reservoir as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - } - - if let timeZone = timeZone, timeZone.secondsFromGMT() != TimeZone.current.secondsFromGMT() { - Image(systemName: "clock.badge.exclamationmark.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 13) - .symbolRenderingMode(.palette) - .foregroundStyle(.red, Color(.warning)) - .padding(.bottom, 10) + HStack(spacing: 0) { + Text( + reservoirFormatter + .string(from: reservoir as NSNumber)! + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } } - }.frame(alignment: .top) - } - if let battery = battery, battery.display ?? false, expiresAtDate == nil { - HStack { - Image(systemName: "battery.100") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(batteryColor) - Text("\(Int(battery.percent ?? 100)) %").font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + }.offset(x: 0, y: 4) + } else { + Text("No Pump").font(.statusFont).foregroundStyle(.secondary) } if let date = expiresAtDate { - HStack { - Image(systemName: "stopwatch.fill") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 10) - .foregroundColor(timerColor) - Text(remainingTimeString(time: date.timeIntervalSince(timerDate))).font(.footnote) - .fontWeight(.bold) - }.frame(alignment: .bottom) + HStack(spacing: 2) { + Image("pod_reservoir") + .resizable(resizingMode: .stretch) + .frame(width: IAPSconfig.iconSize * 1.15, height: IAPSconfig.iconSize * 1.6) + .foregroundColor(colorScheme == .dark ? .secondary : .white) + remainingTime(time: date.timeIntervalSince(timerDate)) + .font(.pumpFont) + } } } } - private func remainingTimeString(time: TimeInterval) -> String { - guard time > 0 else { - return NSLocalizedString("Replace pod", comment: "View/Header when pod expired") - } - - var time = time - let days = Int(time / 1.days.timeInterval) - time -= days.days.timeInterval - let hours = Int(time / 1.hours.timeInterval) - time -= hours.hours.timeInterval - let minutes = Int(time / 1.minutes.timeInterval) - - if days >= 1 { - return "\(days)" + NSLocalizedString("d", comment: "abbreviation for days") + " \(hours)" + - NSLocalizedString("h", comment: "abbreviation for hours") - } - - if hours >= 1 { - return "\(hours)" + NSLocalizedString("h", comment: "abbreviation for hours") + private func remainingTime(time: TimeInterval) -> some View { + VStack { + if time > 0 { + let days = Int(time / 1.days.timeInterval) + let hours = Int(time / 1.hours.timeInterval) + let minutes = Int(time / 1.minutes.timeInterval) + if days >= 1 { + HStack(spacing: 0) { + Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("d", comment: "abbreviation for days")) // .foregroundStyle(.secondary) + } + HStack(spacing: 0) { + Text(" \(hours - days * 24)") + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else if hours >= 1 { + HStack(spacing: 0) { + Text("\(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + } + } else { + HStack(spacing: 0) { + Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(NSLocalizedString("m", comment: "abbreviation for minutes")) // .foregroundStyle(.secondary) + } + } + } else { + Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) + } } - - return "\(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes") } private var batteryColor: Color { guard let battery = battery, let percent = battery.percent else { return .gray } - switch percent { case ...10: - return .loopRed + return .red case ...20: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } @@ -124,11 +151,11 @@ struct PumpView: View { switch reservoir { case ...10: - return .loopRed + return .red case ...30: - return .loopYellow + return .yellow default: - return .insulin + return .blue } } @@ -141,11 +168,11 @@ struct PumpView: View { switch time { case ...8.hours.timeInterval: - return .loopRed + return .red case ...1.days.timeInterval: - return .loopYellow + return .yellow default: - return .loopGreen + return .green } } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 5802528dac..9027f25469 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -11,24 +11,7 @@ extension Home { @StateObject var state = StateModel() @State var isStatusPopupPresented = false @State var showCancelAlert = false - - struct Buttons: Identifiable { - let label: String - let number: String - var active: Bool - let hours: Int16 - var id: String { label } - } - - @State var timeButtons: [Buttons] = [ - Buttons(label: "2 hours", number: "2", active: false, hours: 2), - Buttons(label: "4 hours", number: "4", active: false, hours: 4), - Buttons(label: "6 hours", number: "6", active: false, hours: 6), - Buttons(label: "12 hours", number: "12", active: false, hours: 12), - Buttons(label: "24 hours", number: "24", active: false, hours: 24) - ] - - let buttonFont = Font.custom("TimeButtonFont", size: 14) + @State var triggerUpdate = false @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme @@ -98,45 +81,6 @@ extension Home { return scene } - @ViewBuilder func header(_ geo: GeometryProxy) -> some View { - HStack(alignment: .bottom) { - Spacer() - cobIobView - Spacer() - glucoseView - Spacer() - pumpView - Spacer() - loopView - Spacer() - } - .frame(maxWidth: .infinity) - .padding(.top, 10 + geo.safeAreaInsets.top) - .padding(.bottom, 10) - .background(Color.gray.opacity(0.3)) - } - - var cobIobView: some View { - VStack(alignment: .leading, spacing: 12) { - HStack { - Text("IOB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" U", comment: "Insulin unit") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .top) - HStack { - Text("COB").font(.footnote).foregroundColor(.secondary) - Text( - (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") + - NSLocalizedString(" g", comment: "gram of carbs") - ) - .font(.footnote).fontWeight(.bold) - }.frame(alignment: .bottom) - } - } - var glucoseView: some View { CurrentGlucoseView( recentGlucose: $state.recentGlucose, @@ -172,7 +116,7 @@ extension Home { name: $state.pumpName, expiresAtDate: $state.pumpExpiresAtDate, timerDate: $state.timerDate, - timeZone: $state.timeZone + state: state ) .onTapGesture { if state.pumpDisplayState != nil { @@ -190,8 +134,9 @@ extension Home { isLooping: $state.isLooping, lastLoopDate: $state.lastLoopDate, manualTempBasal: $state.manualTempBasal - ).onTapGesture { - isStatusPopupPresented = true + ) + .onTapGesture { + state.isStatusPopupPresented.toggle() }.onLongPressGesture { let impactHeavy = UIImpactFeedbackGenerator(style: .heavy) impactHeavy.impactOccurred() @@ -212,209 +157,59 @@ extension Home { comment: "Manual Temp basal" ) } - return rateString + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString + return rateString + " " + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString } var tempTargetString: String? { guard let tempTarget = state.tempTarget else { return nil } - let target = tempTarget.targetBottom ?? 0 - let unitString = targetFormatter.string(from: (tempTarget.targetBottom?.asMmolL ?? 0) as NSNumber) ?? "" - let rawString = (tirFormatter.string(from: (tempTarget.targetBottom ?? 0) as NSNumber) ?? "") + " " + state.units - .rawValue - - var string = "" - if sliderTTpresets.first?.active ?? false { - let hbt = sliderTTpresets.first?.hbt ?? 0 - string = ", " + (tirFormatter.string(from: state.infoPanelTTPercentage(hbt, target) as NSNumber) ?? "") + " %" - } - - let percentString = state - .units == .mmolL ? (unitString + " mmol/L" + string) : (rawString + (string == "0" ? "" : string)) - return tempTarget.displayName + " " + percentString - } - - var overrideString: String? { - guard fetchedPercent.first?.enabled ?? false else { - return nil - } - var percentString = "\((fetchedPercent.first?.percentage ?? 100).formatted(.number)) %" - var target = (fetchedPercent.first?.target ?? 100) as Decimal - let indefinite = (fetchedPercent.first?.indefinite ?? false) - let unit = state.units.rawValue - if state.units == .mmolL { - target = target.asMmolL - } - var targetString = (fetchedTargetFormatter.string(from: target as NSNumber) ?? "") + " " + unit - if tempTargetString != nil || target == 0 { targetString = "" } - percentString = percentString == "100 %" ? "" : percentString - - let duration = (fetchedPercent.first?.duration ?? 0) as Decimal - let addedMinutes = Int(duration) - let date = fetchedPercent.first?.date ?? Date() - var newDuration: Decimal = 0 - - if date.addingTimeInterval(addedMinutes.minutes.timeInterval) > Date() { - newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes) - } - - var durationString = indefinite ? - "" : newDuration >= 1 ? - (newDuration.formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " min") : - ( - newDuration > 0 ? ( - (newDuration * 60).formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + " s" - ) : - "" - ) - - let smbToggleString = (fetchedPercent.first?.smbIsOff ?? false) ? " \u{20e0}" : "" - var comma1 = ", " - var comma2 = comma1 - var comma3 = comma1 - if targetString == "" || percentString == "" { comma1 = "" } - if durationString == "" { comma2 = "" } - if smbToggleString == "" { comma3 = "" } - - if percentString == "", targetString == "" { - comma1 = "" - comma2 = "" - } - if percentString == "", targetString == "", smbToggleString == "" { - durationString = "" - comma1 = "" - comma2 = "" - comma3 = "" - } - if durationString == "" { - comma2 = "" - } - if smbToggleString == "" { - comma3 = "" - } - - if durationString == "", !indefinite { - return nil - } - return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + return tempTarget.displayName } var infoPanel: some View { - HStack(alignment: .center) { - if state.pumpSuspended { - Text("Pump suspended") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGray) - .padding(.leading, 8) - } else if let tempBasalString = tempBasalString { - Text(tempBasalString) - .font(.system(size: 12, weight: .bold)) - .foregroundColor(.insulin) - .padding(.leading, 8) - } - - if let tempTargetString = tempTargetString { - Text(tempTargetString) - .font(.caption) - .foregroundColor(.secondary) - } - - Spacer() - - if let overrideString = overrideString { - Text("👤 " + overrideString) - .font(.system(size: 12)) - .foregroundColor(.secondary) - .padding(.trailing, 8) - } - - if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { - Text("Max IOB: 0").font(.callout).foregroundColor(.orange).padding(.trailing, 20) - } - - if let progress = state.bolusProgress { + HStack(spacing: 10) { + ZStack { HStack { - Text("Bolusing") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - ProgressView(value: Double(progress)) - .progressViewStyle(BolusProgressViewStyle()) - .padding(.trailing, 8) - } - .onTapGesture { - state.cancelBolus() - } - } - } - .frame(maxWidth: .infinity, maxHeight: 30) - } - - var timeInterval: some View { - HStack(alignment: .center) { - ForEach(timeButtons) { button in - Text(button.active ? NSLocalizedString(button.label, comment: "") : button.number).onTapGesture { - state.hours = button.hours - } - .foregroundStyle(button.active ? .primary : .secondary) - .frame(maxHeight: 20).padding(.horizontal) - .background(button.active ? Color(.systemGray5) : .clear, in: .capsule(style: .circular)) - } - Image(systemName: "ellipsis.circle.fill") - .foregroundStyle(.secondary) - .padding(.leading) - .onTapGesture { - state.showModal(for: .statisticsConfig) - } - } - .font(buttonFont) - .padding(.top, 20) - .padding(.bottom, 40) - } - - var legendPanel: some View { - ZStack { - HStack(alignment: .center) { - Group { - Circle().fill(Color.loopGreen).frame(width: 8, height: 8) - Text("BG") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopGreen) - } - Group { - Circle().fill(Color.insulin).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("IOB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin) - } - Group { - Circle().fill(Color.zt).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("ZT") - .font(.system(size: 12, weight: .bold)).foregroundColor(.zt) - } - Group { - Circle().fill(Color.loopYellow).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("COB") - .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow) + if state.pumpSuspended { + Text("Pump suspended") + .font(.custom("TempBasal", fixedSize: 13)).bold().foregroundColor(.loopGray) + } else if let tempBasalString = tempBasalString { + Text(tempBasalString) + .font(.custom("TempBasal", fixedSize: 13)).bold() + .foregroundColor(.insulin) + } + if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { + Text("Check Max IOB Setting").font(.extraSmall).foregroundColor(.orange) + } } - Group { - Circle().fill(Color.uam).frame(width: 8, height: 8) - .padding(.leading, 8) - Text("UAM") - .font(.system(size: 12, weight: .bold)).foregroundColor(.uam) + .padding(.leading, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + if let tempTargetString = tempTargetString, !(fetchedPercent.first?.enabled ?? false) { + Text(tempTargetString) + .font(.buttonFont) + .foregroundColor(.secondary) + } else { + profileView } if let eventualBG = state.eventualBG { - Text( - "⇢ " + numberFormatter.string( - from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber - )! - ) - .font(.system(size: 12, weight: .bold)).foregroundColor(.secondary) + HStack { + Image(systemName: "arrow.forward") + Text( + fetchedTargetFormatter.string( + from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber + )! + ).font(.statusFont).foregroundColor(colorScheme == .dark ? .white : .black) + Text(state.units.rawValue).font(.system(size: 12)).foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .trailing) + .padding(.trailing, 8) } } - .frame(maxWidth: .infinity) - .padding([.bottom], 20) } + .frame(maxWidth: .infinity, maxHeight: 30, alignment: .bottom) } var mainChart: some View { @@ -424,7 +219,6 @@ extension Home { .ignoresSafeArea() .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) } - MainChartView( glucose: $state.glucose, isManual: $state.isManual, @@ -447,52 +241,15 @@ extension Home { screenHours: $state.hours, displayXgridLines: $state.displayXgridLines, displayYgridLines: $state.displayYgridLines, - thresholdLines: $state.thresholdLines + thresholdLines: $state.thresholdLines, + triggerUpdate: $triggerUpdate, + overrideHistory: $state.overrideHistory ) } - // .padding(.bottom) + .padding(.bottom, 5) .modal(for: .dataTable, from: self) } - @ViewBuilder private func profiles(_: GeometryProxy) -> some View { - let colour: Color = colorScheme == .dark ? .black : .white - // Rectangle().fill(colour).frame(maxHeight: 1) - ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(maxHeight: 40) - let cancel = fetchedPercent.first?.enabled ?? false - HStack(spacing: cancel ? 25 : 15) { - Text(selectedProfile().name).foregroundColor(.secondary) - if cancel, selectedProfile().isOn { - Button { showCancelAlert.toggle() } - label: { - Image(systemName: "xmark") - .foregroundStyle(.secondary) - } - } - Button { state.showModal(for: .overrideProfilesConfig) } - label: { - Image(systemName: "person.3.sequence.fill") - .symbolRenderingMode(.palette) - .foregroundStyle( - !(fetchedPercent.first?.enabled ?? false) ? .green : .cyan, - !(fetchedPercent.first?.enabled ?? false) ? .cyan : .green, - .purple - ) - } - } - } - .alert( - "Return to Normal?", isPresented: $showCancelAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.cancelProfile() - } - }, message: { Text("This will change settings back to your normal profile.") } - ) - Rectangle().fill(colour).frame(maxHeight: 1) - } - private func selectedProfile() -> (name: String, isOn: Bool) { var profileString = "" var display: Bool = false @@ -519,24 +276,32 @@ extension Home { return (name: profileString, isOn: display) } - func highlightButtons() { - for i in 0 ..< timeButtons.count { - timeButtons[i].active = timeButtons[i].hours == state.hours - } - } - - @ViewBuilder private func bottomPanel(_ geo: GeometryProxy) -> some View { + @ViewBuilder private func buttonPanel(_ geo: GeometryProxy) -> some View { ZStack { - Rectangle().fill(Color.gray.opacity(0.3)).frame(height: 50 + geo.safeAreaInsets.bottom) - + addHeaderBackground() + // Rectangle().fill(colorScheme == .light ? .gray.opacity(0.15) : Color.header.opacity(0.15)) + .frame(height: 50 + geo.safeAreaInsets.bottom) + let isOverride = fetchedPercent.first?.enabled ?? false HStack { + Button { state.showModal(for: .dataTable) } + label: { + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "book.pages") + .symbolRenderingMode(.hierarchical) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .foregroundColor(.secondary) + .padding(8) + } + }.buttonStyle(.borderless) + Spacer() Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image("carbs") + Image(systemName: "fork.knife") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .foregroundColor(.loopYellow) .padding(8) if let carbsReq = state.carbsRequired { @@ -549,16 +314,41 @@ extension Home { } }.buttonStyle(.borderless) Spacer() - Button { state.showModal(for: .addTempTarget) } + Button { + if isOverride { + state.cancelProfile() + triggerUpdate.toggle() + } else { + state.showModal(for: .overrideProfilesConfig) + } + } label: { - Image("target") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: "person.fill") + .symbolRenderingMode(.palette) + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundStyle(.purple) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .padding(8) + .background(isOverride ? .blue.opacity(0.3) : .clear) + .clipShape(RoundedRectangle(cornerRadius: 10)) + } + }.buttonStyle(.borderless) + + if state.useTargetButton { + Spacer() + Button { state.showModal(for: .addTempTarget) } + label: { + Image("target") + .renderingMode(.template) + .resizable() + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize) + .padding(8) + } + .foregroundColor(.loopGreen) + .buttonStyle(.borderless) } - .foregroundColor(.loopGreen) - .buttonStyle(.borderless) Spacer() Button { state.showModal(for: .bolus( @@ -570,11 +360,11 @@ extension Home { Image("bolus") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.insulin) .buttonStyle(.borderless) + .foregroundColor(.insulin) Spacer() if state.allowManualTemp { Button { state.showModal(for: .manualTempBasal) } @@ -582,80 +372,209 @@ extension Home { Image("bolus1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } .foregroundColor(.insulin) - .buttonStyle(.borderless) Spacer() } - Button { state.showModal(for: .statistics) - } - label: { - Image(systemName: "chart.xyaxis.line") - .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) - .padding(8) - } - .foregroundColor(.purple) - .buttonStyle(.borderless) - Spacer() Button { state.showModal(for: .settings) } label: { Image("settings1") .renderingMode(.template) .resizable() - .frame(width: 24, height: 24) + .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) } - .foregroundColor(.loopGray) .buttonStyle(.borderless) + .foregroundColor(.gray) } .padding(.horizontal, 24) .padding(.bottom, geo.safeAreaInsets.bottom) } } + var chart: some View { + addColouredBackground() + .overlay { + VStack { + infoPanel + mainChart + } + } + .frame( + minHeight: UIScreen.main.bounds.height / 1.46 + ) + .addShadows() + } + + var carbsAndInsulinView: some View { + HStack(spacing: 10) { + if let settings = state.settingsManager { + let opacity: CGFloat = colorScheme == .dark ? 0.2 : 0.6 + let materialOpacity: CGFloat = colorScheme == .dark ? 0.25 : 0.10 + HStack { + let substance = Double(state.suggestion?.cob ?? 0) + let max = max(Double(settings.preferences.maxCOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .loopYellow, materialOpacity: materialOpacity) + .frame(width: 13.8, height: 40) + .offset(x: 0, y: -6) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" g", comment: "gram of carbs")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + HStack { + let substance = Double(state.suggestion?.iob ?? 0) + let max = max(Double(settings.preferences.maxIOB), 1) + let fraction: Double = 1 - (substance / max) + let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) + TestTube(opacity: opacity, amount: fill, colourOfSubstance: .insulin, materialOpacity: materialOpacity) + .frame(width: 11, height: 36) + .offset(x: 0, y: -2.5) + HStack(spacing: 0) { + Text( + numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0" + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + }.offset(x: 0, y: 5) + } + } + } + } + + var preview: some View { + addBackground() + .frame(maxWidth: .infinity, minHeight: 170, alignment: .topLeading) + .overlay(alignment: .topLeading) { + PreviewChart(readings: $state.readings, lowLimit: $state.lowGlucose, highLimit: $state.highGlucose) + } + .clipShape(RoundedRectangle(cornerRadius: 15)) + .addShadows() + .padding(.horizontal, 10) + .onTapGesture { + state.showModal(for: .statistics) + } + } + + var profileView: some View { + HStack(spacing: 0) { + if let override = fetchedPercent.first { + if override.enabled { + if override.isPreset { + let profile = fetchedProfiles.first(where: { $0.id == override.id }) + if let currentProfile = profile { + if let name = currentProfile.name, name != "EMPTY", name.nonEmpty != nil, name != "", + name != "\u{0022}\u{0022}" + { + Text(name).font(.statusFont).foregroundStyle(.secondary) + } + } + } else if override.percentage != 100 { + Text(override.percentage.formatted() + " %").font(.statusFont).foregroundStyle(.secondary) + } else if override.smbIsOff, !override.smbIsAlwaysOff { + Text("No ").font(.statusFont).foregroundStyle(.secondary) // "No" as in no SMBs + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else if override.smbIsOff { + Image(systemName: "clock").font(.statusFont).foregroundStyle(.secondary) + Image(systemName: "syringe") + .font(.previewNormal).foregroundStyle(.secondary) + } else { + Text("Override").font(.statusFont).foregroundStyle(.secondary) + } + } + } + } + } + + func bolusProgressView(progress: Decimal) -> some View { + ZStack { + HStack { + Text("Bolusing") + .foregroundColor(.primary).font(.bolusProgressFont) + ProgressView(value: Double(progress)) + .progressViewStyle(BolusProgressViewStyle()) + Image(systemName: "xmark.square.fill") + .symbolRenderingMode(.palette) + .foregroundStyle(.white, .blue) + .font(.bolusProgressStopFont) + .onTapGesture { + state.cancelBolus() + } + } + } + } + + @ViewBuilder private func headerView(_ geo: GeometryProxy) -> some View { + addHeaderBackground() + .frame(minHeight: 120 + geo.safeAreaInsets.top) + .overlay { + VStack { + ZStack { + glucoseView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top).padding(.top, 10) + loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 5) + carbsAndInsulinView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading) + .padding(.leading, 10) + pumpView + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) + .padding(.trailing, 7).padding(.bottom, 5) + }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 5) + } + } + .clipShape(Rectangle()) + } + var body: some View { GeometryReader { geo in - VStack(spacing: 0) { - header(geo) - infoPanel - mainChart - timeInterval - legendPanel - profiles(geo) - bottomPanel(geo) + VStack { + ScrollView { + VStack(spacing: 0) { + headerView(geo) + chart + preview.padding(.top, 15) + } + } + .scrollIndicators(.hidden) + buttonPanel(geo) } + .background(.gray.opacity(IAPSconfig.backgroundOpacity)) .edgesIgnoringSafeArea(.vertical) - } - .onChange(of: state.hours) { _ in - highlightButtons() - } - .onAppear { - configureView { - highlightButtons() + .overlay { + if let progress = state.bolusProgress { + ZStack { + RoundedRectangle(cornerRadius: 15) + .fill(.gray.opacity(0.8)) + .frame(width: 300, height: 50) + bolusProgressView(progress: progress) + }.frame(maxWidth: .infinity, alignment: .center) + } } } + .onAppear(perform: configureView) .navigationTitle("Home") .navigationBarHidden(true) .ignoresSafeArea(.keyboard) - .popup(isPresented: isStatusPopupPresented, alignment: .top, direction: .top) { + .popup(isPresented: state.isStatusPopupPresented, alignment: .bottom, direction: .bottom) { popup .padding() .background( RoundedRectangle(cornerRadius: 8, style: .continuous) - .fill(Color(UIColor.darkGray)) + .fill(Color.popUpGray) ) .onTapGesture { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } .gesture( DragGesture(minimumDistance: 10, coordinateSpace: .local) .onEnded { value in if value.translation.height < 0 { - isStatusPopupPresented = false + state.isStatusPopupPresented = false } } ) @@ -664,27 +583,26 @@ extension Home { private var popup: some View { VStack(alignment: .leading, spacing: 4) { - Text(state.statusTitle).font(.headline).foregroundColor(.white) + Text(state.statusTitle).font(.suggestionHeadline).foregroundColor(.white) .padding(.bottom, 4) if let suggestion = state.suggestion { TagCloudView(tags: suggestion.reasonParts).animation(.none, value: false) - Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.caption).foregroundColor(.white) - + Text(suggestion.reasonConclusion.capitalizingFirstLetter()).font(.suggestionSmallParts) + .foregroundColor(.white) } else { - Text("No sugestion found").font(.body).foregroundColor(.white) + Text("No sugestion found").font(.suggestionHeadline).foregroundColor(.white) } - if let errorMessage = state.errorMessage, let date = state.errorDate { Text(NSLocalizedString("Error at", comment: "") + " " + dateFormatter.string(from: date)) .foregroundColor(.white) - .font(.headline) + .font(.suggestionError) .padding(.bottom, 4) .padding(.top, 8) - Text(errorMessage).font(.caption).foregroundColor(.loopRed) + Text(errorMessage).font(.buttonFont).foregroundColor(.loopRed) } else if let suggestion = state.suggestion, (suggestion.bg ?? 100) == 400 { - Text("Invalid CGM reading (HIGH).").font(.callout).bold().foregroundColor(.loopRed).padding(.top, 8) - Text("SMBs and High Temps Disabled.").font(.caption).foregroundColor(.white).padding(.bottom, 4) + Text("Invalid CGM reading (HIGH).").font(.suggestionError).bold().foregroundColor(.loopRed).padding(.top, 8) + Text("SMBs and High Temps Disabled.").font(.suggestionParts).foregroundColor(.white).padding(.bottom, 4) } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index 953bdfcdd1..3d92c1b662 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -26,7 +26,9 @@ extension OverrideProfilesConfig { @Published var uamMinutes: Decimal = 0 @Published var defaultSmbMinutes: Decimal = 0 @Published var defaultUamMinutes: Decimal = 0 + @Published var emoji: String = "" + @Injected() var broadcaster: Broadcaster! var units: GlucoseUnits = .mmolL override func subscribe() { @@ -46,18 +48,19 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.enabled = true saveOverride.smbIsOff = self.smbIsOff + if self.isPreset { saveOverride.isPreset = true saveOverride.id = id } else { saveOverride.isPreset = false } saveOverride.date = Date() if override_target { - if units == .mmolL { - target = target.asMgdL - } - saveOverride.target = target as NSDecimalNumber - } else { saveOverride.target = 0 } - + saveOverride.target = ( + units == .mmolL + ? target.asMgdL + : target + ) as NSDecimalNumber + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -77,6 +80,11 @@ extension OverrideProfilesConfig { } try? self.coredataContext.save() } + DispatchQueue.main.async { + self.broadcaster.notify(OverrideObserver.self, on: .main) { + $0.overrideHistoryDidUpdate(OverrideStorage().fetchOverrideHistory(interval: DateFilter().today)) + } + } } func savePreset() { @@ -87,6 +95,7 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.smbIsOff = self.smbIsOff saveOverride.name = self.profileName + saveOverride.emoji = self.emoji id = UUID().uuidString self.isPreset.toggle() saveOverride.id = id @@ -97,7 +106,7 @@ extension OverrideProfilesConfig { ? target.asMgdL : target ) as NSDecimalNumber - } else { saveOverride.target = 0 } + } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true @@ -137,9 +146,14 @@ extension OverrideProfilesConfig { saveOverride.smbIsOff = profile.smbIsOff saveOverride.isPreset = true saveOverride.date = Date() - saveOverride.target = profile.target saveOverride.id = id_ + if let tar = profile.target, tar == 0 { + saveOverride.target = 6 + } else { + saveOverride.target = profile.target + } + if profile.advancedSettings { saveOverride.advancedSettings = true if !isfAndCr { @@ -238,14 +252,9 @@ extension OverrideProfilesConfig { override_target = false smbIsOff = false advancedSettings = false - coredataContext.perform { [self] in - let profiles = Override(context: self.coredataContext) - profiles.enabled = false - profiles.date = Date() - try? self.coredataContext.save() - } smbMinutes = defaultSmbMinutes uamMinutes = defaultUamMinutes + OverrideStorage().cancelProfile() } } } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 76d51be136..16a28b3ac4 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -12,6 +12,7 @@ extension OverrideProfilesConfig { @State private var showingDetail = false @State private var alertSring = "" @State var isSheetPresented: Bool = false + @State var index: Int = 1 @Environment(\.dismiss) var dismiss @Environment(\.managedObjectContext) var moc @@ -44,15 +45,18 @@ extension OverrideProfilesConfig { var presetPopover: some View { Form { Section { - TextField("Name Of Profile", text: $state.profileName) - } header: { Text("Enter Name of Profile") } + TextField("Name", text: $state.profileName) + } header: { Text("Profile Name").foregroundStyle(.primary) } Section { Button("Save") { state.savePreset() isSheetPresented = false } - .disabled(state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }).isNotEmpty) + .disabled( + state.profileName.isEmpty || fetchedProfiles.filter({ $0.name == state.profileName }) + .isNotEmpty + ) Button("Cancel") { isSheetPresented = false @@ -257,20 +261,21 @@ extension OverrideProfilesConfig { "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." ) } - - Button("Return to Normal") { - state.cancelProfile() - dismiss() - } - .frame(maxWidth: .infinity, alignment: .center) - .buttonStyle(BorderlessButtonStyle()) - .disabled(!state.isEnabled) - .tint(.red) + Section { + Button("Return to Normal") { + state.cancelProfile() + dismiss() + } + .frame(maxWidth: .infinity, alignment: .center) + .buttonStyle(BorderlessButtonStyle()) + .disabled(!state.isEnabled) + .tint(.red) + } footer: { Text("").padding(.bottom, 150) } } .onAppear(perform: configureView) .onAppear { state.savedSettings() } .navigationBarTitle("Profiles") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: Button("Close", action: state.hideModal)) } @@ -279,6 +284,9 @@ extension OverrideProfilesConfig { .asMmolL : (preset.target ?? 0) as Decimal let duration = (preset.duration ?? 0) as Decimal let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name! + let identifier = ((preset.emoji ?? "") == "") || (preset.emoji?.isEmpty ?? true) || + (preset.emoji ?? "") == "\u{0022}\u{0022}" ? + "" : preset.emoji! let percent = preset.percentage / 100 let perpetual = preset.indefinite let durationString = perpetual ? "" : "\(formatter.string(from: duration as NSNumber)!)" @@ -294,11 +302,8 @@ extension OverrideProfilesConfig { if name != "" { HStack { - VStack { - HStack { - Text(name) - Spacer() - } + VStack(alignment: .leading) { + Text(name) HStack(spacing: 5) { Text(percent.formatted(.percent.grouping(.never).rounded().precision(.fractionLength(0)))) if targetString != "" { diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index 18e06eee91..e1405b8c55 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -22,13 +22,12 @@ extension PreferencesEditor { var body: some View { Form { - Section(header: Text("iAPS").textCase(nil)) { + Section { Picker("Glucose units", selection: $state.unitsIndex) { Text("mg/dL").tag(0) Text("mmol/L").tag(1) } - } - + } header: { Text("iAPS").textCase(nil) } ForEach(state.sections.indexed(), id: \.1.id) { sectionIndex, section in Section(header: Text(section.displayName)) { ForEach(section.fields.indexed(), id: \.1.id) { fieldIndex, field in @@ -75,6 +74,7 @@ extension PreferencesEditor { } } } + Section {} footer: { Text("").padding(.bottom, 300) } } .onAppear(perform: configureView) .navigationTitle("Preferences") @@ -82,7 +82,7 @@ extension PreferencesEditor { .navigationBarItems( trailing: Button { - let lang = Locale.current.languageCode ?? "en" + let lang = Locale.current.language.languageCode?.identifier ?? "en" if lang == "en" { UIApplication.shared.open( URL( diff --git a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift index 45ae196ba1..77c35c244f 100644 --- a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift +++ b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift @@ -33,7 +33,7 @@ extension PumpConfig { } .onAppear(perform: configureView) .navigationTitle("Pump config") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $state.setupPump) { if let pumpManager = state.provider.apsManager.pumpManager { PumpSettingsView( diff --git a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift index 9634afa5f4..27889b538c 100644 --- a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift @@ -51,7 +51,7 @@ extension PumpSettingsEditor { } .onAppear(perform: configureView) .navigationTitle("Pump Settings") - .navigationBarTitleDisplayMode(.automatic) + .navigationBarTitleDisplayMode(.inline) } } } diff --git a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift index 63386f5e4f..1c7c87128e 100644 --- a/FreeAPS/Sources/Modules/Stat/StatStateModel.swift +++ b/FreeAPS/Sources/Modules/Stat/StatStateModel.swift @@ -10,6 +10,8 @@ extension Stat { @Published var overrideUnit: Bool = false @Published var layingChart: Bool = false @Published var units: GlucoseUnits = .mmolL + @Published var preview: Bool = false + @Published var readings: [Readings] = [] override func subscribe() { highLimit = settingsManager.settings.high diff --git a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift index d8ffe216c9..c1dc330334 100644 --- a/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/ChartsView.swift @@ -12,10 +12,16 @@ struct ChartsView: View { @Binding var overrideUnit: Bool @Binding var standing: Bool - @State var headline: Color = .secondary - private let conversionFactor = 0.0555 + private var tirFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .none + return formatter + } + + @Environment(\.colorScheme) var colorScheme + var body: some View { glucoseChart Rectangle().fill(.cyan.opacity(0.2)).frame(maxHeight: 3) @@ -284,12 +290,22 @@ struct ChartsView: View { let hypoReadings = hypoArray.compactMap({ each in each.glucose as Int16 }).count let hypoPercentage = Double(hypoReadings) / Double(totalReadings) * 100 + let veryHighArray = glucose.filter({ $0.glucose > 198 }) + let veryHighReadings = veryHighArray.compactMap({ each in each.glucose as Int16 }).count + let veryHighPercentage = Double(veryHighReadings) / Double(totalReadings) * 100 + + let veryLowArray = glucose.filter({ $0.glucose < 59 }) + let veryLowReadings = veryLowArray.compactMap({ each in each.glucose as Int16 }).count + let veryLowPercentage = Double(veryLowReadings) / Double(totalReadings) * 100 + let tir = 100 - (hypoPercentage + hyperPercentage) var array: [(decimal: Decimal, string: String)] = [] array.append((decimal: Decimal(hypoPercentage), string: "Low")) array.append((decimal: Decimal(tir), string: "NormaL")) array.append((decimal: Decimal(hyperPercentage), string: "High")) + array.append((decimal: Decimal(veryHighPercentage), string: "Very High")) + array.append((decimal: Decimal(veryLowPercentage), string: "Very Low")) return array } diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index a9632db0d1..a0bc86aadb 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -11,6 +11,9 @@ extension StatConfig { @Published var rulerMarks: Bool = false @Published var skipBolusScreenAfterCarbs: Bool = false @Published var useFPUconversion: Bool = true + @Published var useTargetButton: Bool = false + @Published var hours: Decimal = 6 + var units: GlucoseUnits = .mmolL override func subscribe() { @@ -22,6 +25,7 @@ extension StatConfig { subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } + subscribeSetting(\.useTargetButton, on: $useTargetButton) { useTargetButton = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 } @@ -40,6 +44,13 @@ extension StatConfig { guard units == .mmolL else { return $0 } return $0.asMgdL }) + + subscribeSetting(\.hours, on: $hours.map(Int.init), initial: { + let value = max(min($0, 24), 2) + hours = Decimal(value) + }, map: { + $0 + }) } } } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index fe7a0528db..76d19c4a5c 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -31,8 +31,19 @@ extension StatConfig { Toggle("Display Chart Y - Grid lines", isOn: $state.yGridLines) Toggle("Display Chart Threshold lines for Low and High", isOn: $state.rulerMarks) Toggle("Standing / Laying TIR Chart", isOn: $state.oneDimensionalGraph) + HStack { + Text("Horizontal Scroll View Visible hours") + Spacer() + DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) + Text("hours").foregroundColor(.secondary) + } } header: { Text("Home Chart settings ") } + Section { + Toggle("Display Temp Targets Button", isOn: $state.useTargetButton) + } header: { Text("Home View Button Panel ") } + footer: { Text("In case you're using both profiles and temp targets") } + Section { HStack { Text("Low") diff --git a/FreeAPS/Sources/Router/Screen.swift b/FreeAPS/Sources/Router/Screen.swift index 55a634de8f..a69b55ccf8 100644 --- a/FreeAPS/Sources/Router/Screen.swift +++ b/FreeAPS/Sources/Router/Screen.swift @@ -1,3 +1,4 @@ +import Combine import SwiftUI import Swinject @@ -34,7 +35,6 @@ enum Screen: Identifiable, Hashable { case statisticsConfig case bolusCalculatorConfig case dynamicISF - var id: Int { String(reflecting: self).hashValue } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 6cf5018595..f05e082b99 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -45,7 +45,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P static let healthCarbObject = HKObjectType.quantityType(forIdentifier: .dietaryCarbohydrates) static let healthInsulinObject = HKObjectType.quantityType(forIdentifier: .insulinDelivery) - // Meta-data key of FreeASPX data in HealthStore + // Meta-data key of iAPS data in HealthStore static let freeAPSMetaKey = "From iAPS" } @@ -203,6 +203,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P start: $0.actualDate ?? $0.createdAt, end: $0.actualDate ?? $0.createdAt, metadata: [ + HKMetadataKeyExternalUUID: $0.id ?? "_id", HKMetadataKeySyncIdentifier: $0.id ?? "_id", HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true diff --git a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift index a0049c3092..33e3e1eac5 100644 --- a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift +++ b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift @@ -1,23 +1,14 @@ import SwiftUI public struct BolusProgressViewStyle: ProgressViewStyle { + @Environment(\.colorScheme) var colorScheme + public func makeBody(configuration: LinearProgressViewStyle.Configuration) -> some View { + @State var progress = CGFloat(configuration.fractionCompleted ?? 0) ZStack { - Circle() - .stroke(lineWidth: 4.0) - .opacity(0.3) - .foregroundColor(.secondary) - .frame(width: 22, height: 22) - - Rectangle().fill(Color.insulin) - .frame(width: 8, height: 8) - - Circle() - .trim(from: 0.0, to: CGFloat(configuration.fractionCompleted ?? 0)) - .stroke(style: StrokeStyle(lineWidth: 4.0, lineCap: .butt, lineJoin: .round)) - .foregroundColor(.insulin) - .rotationEffect(Angle(degrees: -90)) - .frame(width: 22, height: 22) - }.frame(width: 30, height: 30) + VStack { + ProgressView(value: progress) + } + }.frame(width: 80, height: 30) } } diff --git a/FreeAPS/Sources/Views/DecimalTextField.swift b/FreeAPS/Sources/Views/DecimalTextField.swift index 9cf67e8a5e..2441f5d1ff 100644 --- a/FreeAPS/Sources/Views/DecimalTextField.swift +++ b/FreeAPS/Sources/Views/DecimalTextField.swift @@ -7,19 +7,22 @@ struct DecimalTextField: UIViewRepresentable { private var formatter: NumberFormatter private var autofocus: Bool private var cleanInput: Bool + private var useButtons: Bool init( _ placeholder: String, value: Binding, formatter: NumberFormatter, autofocus: Bool = false, - cleanInput: Bool = false + cleanInput: Bool = false, + useButtons: Bool = true ) { self.placeholder = placeholder _value = value self.formatter = formatter self.autofocus = autofocus self.cleanInput = cleanInput + self.useButtons = useButtons } func makeUIView(context: Context) -> UITextField { @@ -30,6 +33,34 @@ struct DecimalTextField: UIViewRepresentable { textfield.text = cleanInput ? "" : formatter.string(for: value) ?? placeholder textfield.textAlignment = .right + let toolBar = UIToolbar(frame: CGRect( + x: 0, + y: 0, + width: textfield.frame.size.width, + height: 44 + )) + let clearButton = UIBarButtonItem( + title: NSLocalizedString("Clear", comment: "Clear button"), + style: .plain, + target: self, + action: #selector(textfield.clearButtonTapped(button:)) + ) + let doneButton = UIBarButtonItem( + title: NSLocalizedString("Done", comment: "Done button"), + style: .done, + target: self, + action: #selector(textfield.doneButtonTapped(button:)) + ) + let space = UIBarButtonItem( + barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, + target: nil, + action: nil + ) + if useButtons { + toolBar.setItems([clearButton, space, doneButton], animated: true) + textfield.inputAccessoryView = toolBar + } + if autofocus { DispatchQueue.main.async { textfield.becomeFirstResponder() diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index df49349aaa..98ad0779e0 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -77,7 +77,7 @@ struct TagCloudView: View { return ZStack { Text(textTag) .padding(.vertical, 2) .padding(.horizontal, 4) - .font(.subheadline) + .font(.suggestionParts) .background(colorOfTag.opacity(0.8)) .foregroundColor(Color.white) .cornerRadius(2) } diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 8351e69226..9d44aa90f6 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -37,6 +37,102 @@ struct CapsulaBackground: ViewModifier { } } +struct AddShadow: ViewModifier { + @Environment(\.colorScheme) var colorScheme + func body(content: Content) -> some View { + content + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.shadowOpacity : IAPSconfig.shadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 3 : 2.5 + ) + } +} + +struct TestTube: View { + let opacity: CGFloat + let amount: CGFloat + let colourOfSubstance: Color + let materialOpacity: CGFloat + @Environment(\.colorScheme) var colorScheme + + var body: some View { + UnevenRoundedRectangle.testTube + .fill( + LinearGradient( + gradient: Gradient(stops: [ + Gradient.Stop(color: .white.opacity(opacity), location: amount), + Gradient.Stop(color: colourOfSubstance, location: amount) + ]), + startPoint: .top, + endPoint: .bottom + ) + ) + .overlay { + FrostedGlass(opacity: materialOpacity) + } + .shadow( + color: Color.black + .opacity( + colorScheme == .dark ? IAPSconfig.glassShadowOpacity : IAPSconfig.glassShadowOpacity / IAPSconfig + .shadowFraction + ), + radius: colorScheme == .dark ? 2.2 : 3 + ) + } +} + +struct FrostedGlass: View { + let opacity: CGFloat + var body: some View { + UnevenRoundedRectangle.testTube + .fill(.ultraThinMaterial.opacity(opacity)) + } +} + +struct ColouredRoundedBackground: View { + @Environment(\.colorScheme) var colorScheme + + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct ColouredBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill( + colorScheme == .dark ? .black : + Color.white + ) + } +} + +struct LoopEllipse: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) + } +} + +struct HeaderBackground: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle() + .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header.opacity(1)) + // .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.darkerBlue.opacity(1)) + } +} + private let navigationCache = LRUCache(capacity: 10) struct NavigationLazyView: View { @@ -126,8 +222,24 @@ extension View { modifier(RoundedBackground()) } - func buttonBackground() -> some View { - modifier(RoundedBackground(color: .accentColor)) + func addShadows() -> some View { + modifier(AddShadow()) + } + + func addBackground() -> some View { + ColouredRoundedBackground() + } + + func addColouredBackground() -> some View { + ColouredBackground() + } + + func addHeaderBackground() -> some View { + HeaderBackground() + } + + func frostedGlassLayer(_ opacity: CGFloat) -> some View { + FrostedGlass(opacity: opacity) } func navigationLink(to screen: Screen, from view: V) -> some View { @@ -146,3 +258,13 @@ extension View { func asAny() -> AnyView { .init(self) } } + +extension UnevenRoundedRectangle { + static let testTube = + UnevenRoundedRectangle( + topLeadingRadius: 1.5, + bottomLeadingRadius: 50, + bottomTrailingRadius: 50, + topTrailingRadius: 1.5 + ) +} From 84da3ac122cdb477e27728de8eae79b3316c3a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 20:30:00 +0100 Subject: [PATCH 284/405] Fix buttons fro iphone 12? --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 9027f25469..d74bf73a39 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -285,7 +285,7 @@ extension Home { HStack { Button { state.showModal(for: .dataTable) } label: { - ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + ZStack(alignment: Alignment(horizontal: .leading, vertical: .bottom)) { Image(systemName: "book.pages") .symbolRenderingMode(.hierarchical) .resizable() From 1918f1f669f80b9de1d8d4305bcedc738bde88c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 20:39:05 +0100 Subject: [PATCH 285/405] Support for previous iOS --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index d74bf73a39..9aded753e5 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -286,7 +286,7 @@ extension Home { Button { state.showModal(for: .dataTable) } label: { ZStack(alignment: Alignment(horizontal: .leading, vertical: .bottom)) { - Image(systemName: "book.pages") + Image(systemName: "book") .symbolRenderingMode(.hierarchical) .resizable() .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) From 6f5543b2eba08f0f7837419084cad7db5744bb67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:23:24 +0100 Subject: [PATCH 286/405] Crowdin updates (#401) --- .../CGMBLEKitUI/fr.lproj/Localizable.strings | 2 +- .../zh-Hans.lproj/Localizable.strings | 6 +- .../fr.lproj/Localizable.strings | 52 +- .../tr.lproj/Localizable.strings | 4 +- .../G7SensorKit/fr.lproj/Localizable.strings | 66 +- .../Resources/fr.lproj/Localizable.strings | 2 +- .../Resources/fr.lproj/Localizable.strings | 12 +- .../zh-Hans.lproj/Localizable.strings | 8 +- .../fr.lproj/Localizable.strings | 256 ++++---- .../nl.lproj/Localizable.strings | 8 +- .../zh-Hans.lproj/Localizable.strings | 204 +++---- .../Resources/fr.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 4 +- .../zh-Hans.lproj/Localizable.strings | 28 +- .../Resources/fr.lproj/Localizable.strings | 32 +- .../Resources/nl.lproj/Localizable.strings | 6 +- .../zh-Hans.lproj/Localizable.strings | 102 ++-- FreeAPS/Resources/fr.lproj/InfoPlist.strings | 4 +- .../Main/de.lproj/Localizable.strings | 4 +- .../Main/fr.lproj/Localizable.strings | 570 +++++++++--------- .../Main/it.lproj/Localizable.strings | 8 +- .../Main/nl.lproj/Localizable.strings | 10 +- .../Main/zh-Hans.lproj/Localizable.strings | 2 +- 23 files changed, 700 insertions(+), 694 deletions(-) diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings index 37755d838a..e7ec3a1135 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings @@ -1,5 +1,5 @@ /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/min"; +"%@/min" = "%@min"; /* Confirmation message for deleting a CGM */ "Are you sure you want to delete this CGM?" = "Voulez-vous vraiment supprimer ce CGM?"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings index 8554882047..7606ebf3c8 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings @@ -27,7 +27,7 @@ Title text for the button to remove a CGM from Loop */ "Latest Reading" = "最新血糖值"; /* Section title for latest connection date */ -"Latest Connection" = "Latest Connection"; +"Latest Connection" = "上一次连接"; /* Button title to open CGM app */ "Open App" = "打开软件"; @@ -36,13 +36,13 @@ Title text for the button to remove a CGM from Loop */ "Session Age" = "传感器启动天数"; /* Section title for remote data synchronization */ -"Remote Data Synchronization" = "Remote Data Synchronization"; +"Remote Data Synchronization" = "远程数据同步"; /* Title describing sensor expiration */ "Sensor Expires" = "Sensor Expires"; /* Title describing past sensor expiration */ -"Sensor Expired" = "Sensor Expired"; +"Sensor Expired" = "传感器已过期"; /* Title describing CGM calibration and battery state */ "Status" = "状态"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings index eaae1154aa..40d1c0cccd 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings @@ -2,10 +2,10 @@ "– – –" = "– – –"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/min"; +"%@/min" = "%@min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Voulez-vous vraiment supprimer ce CGM?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -39,79 +39,79 @@ "Glucose" = "Glycémie"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Fin de la Période de Grâce"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Période de grâce restante"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "HAUT"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Dernière Connexion"; /* No comment provided by engineer. */ -"Last Reading" = "Last Reading"; +"Last Reading" = "Dernière lecture"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS peut lire les données G7 de la CGM mais vous devez toujours utiliser l'application Dexcom G7 pour associer, calibrer et gérer les capteurs."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "BAS"; /* title for g7 settings row showing BLE Name */ "Name" = "Nom"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Rechercher un nouveau capteur"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Balayage"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Recherche d'un\ncapteur"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Recherche d’un capteur"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Capteur\n expiré"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Capteur\na échoué"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Capteur\nproblème"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Capteur\nRéchauffement"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Capteur expiré"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Capteur expiré"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Capteur expiré"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Capteura échoué"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Démarrer le capteur"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Signal\nPerte"; /* Field label */ "Time" = "Heure"; /* Field label */ -"Trend" = "Trend"; +"Trend" = "Tendance"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Envoyer les données"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "L'échauffement est terminé"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings index 54bf4b59ea..74e2d7d3ab 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings @@ -5,7 +5,7 @@ "%@/min" = "%@/dak"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Bu CGM'i silmek istediğinizden emin misiniz?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; @@ -99,7 +99,7 @@ "Sensor failed" = "Sensör arızalı"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Sensörü başlatın"; /* G7 Status highlight text for signal loss */ "Signal\nLoss" = "Sinyal\nKaybı"; diff --git a/Dependencies/G7SensorKit/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/fr.lproj/Localizable.strings index bb87ec115a..f29a561068 100644 --- a/Dependencies/G7SensorKit/fr.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/fr.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS peut lire les données G7 de la CGM mais vous devez toujours utiliser l'application Dexcom G7 pour associer, calibrer et gérer les capteurs."; /* Button title for starting setup */ "Continue" = "Continuer"; @@ -11,43 +11,43 @@ "Cancel" = "Annuler"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Glucose data is unavailable"; +"Glucose data is unavailable" = "Les données de glycémie ne sont pas disponibles"; /* The description of sensor algorithm state when sensor is ok. */ -"Sensor is OK" = "Sensor is OK"; +"Sensor is OK" = "Capteur est OK"; /* The description of sensor algorithm state when sensor is stopped." */ -"Sensor is stopped" = "Sensor is stopped"; +"Sensor is stopped" = "Le capteur est arrêté"; /* The description of sensor algorithm state when sensor is warming up. */ -"Sensor is warming up" = "Sensor is warming up"; +"Sensor is warming up" = "Capteur est en période de réchauffement"; /* The description of sensor algorithm state when sensor is expired. */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Capteur expiré"; /* The description of sensor algorithm state when sensor failed. */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Capteura échoué"; /* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */ -"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d"; +"Sensor is in unknown state %1$d" = "Le capteur est dans un état inconnu %1$d"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensor Start"; +"Sensor Start" = "Capteur démarré"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Capteur expiré"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Fin de la Période de Grâce"; /* Field label */ "Glucose" = "Glycémie"; -"Last Reading" = "Last Reading"; +"Last Reading" = "Dernière lecture"; "Time" = "Heure"; -"Trend" = "Trend"; +"Trend" = "Tendance"; "Bluetooth" = "Bluetooth"; @@ -55,7 +55,7 @@ "Name" = "Nom"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Balayage"; /* title for g7 settings connection status when connected */ "Connected" = "Connecté"; @@ -64,16 +64,16 @@ "Connecting" = "De liaison"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Dernière Connexion"; /* Configuration */ "Configuration" = "Configuration"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Envoyer les données"; /* Button */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Rechercher un nouveau capteur"; /* Button label for removing CGM */ "Delete CGM" = "Supprimer CGM"; @@ -81,49 +81,49 @@ /* No glucose value representation (3 dashes for mg/dL) */ "– – –" = "– – –"; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "BAS"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "HAUT"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ -"%@/min" = "%@/min"; +"%@/min" = "%@min"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Recherche d’un capteur"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Capteur expiré"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "L'échauffement est terminé"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "L'échauffement est terminé"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Capteura échoué"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Capteur expiré"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Période de grâce restante"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Recherche d'un\ncapteur"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Capteur\n expiré"; /* G7 Status highlight text for signal loss */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Capteur\na échoué"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Signal\nPerte"; /*G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Capteur\nproblème"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Capteur\nRéchauffement"; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/fr.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/fr.lproj/Localizable.strings index ebc95760c7..bf1582bb9c 100644 --- a/Dependencies/MinimedKit/MinimedKit/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKit/Resources/fr.lproj/Localizable.strings @@ -2,7 +2,7 @@ "A bolus is already in progress" = "Un bolus est déjà en cours"; /* The description of AlarmClockReminderPumpEvent */ -"AlarmClockReminder" = "AlarmClockReminder"; +"AlarmClockReminder" = "Alarme de rappel"; /* The description of AlarmSensorPumpEvent */ "AlarmSensor" = "AlarmSensor"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/fr.lproj/Localizable.strings index ce2732f2cd..c7a1b7abf4 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/fr.lproj/Localizable.strings @@ -123,14 +123,20 @@ "No, Keep Pump As Is" = "Non, garder la pompe telle quelle"; /* Pump find device instruction */ -"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device"; +"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "User +vertaal naar Frans inclusief codes: Key: On your pump, go to the Find Device screen and select \\\"Find Device\\\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device +On your pump, go to the Find Device screen and select \\\"Find Device\\\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device +Pump find device instruction + +ChatGPT +Clé : Sur votre pompe, allez à l'écran Rechercher un appareil et sélectionnez\\ \"Rechercher un appareil\\\".\n\nMenu principal >\nUtilitaires >\nConnecter les appareils >\nAutres appareils >\nActivé >\nRechercher un appareil\n\nSur votre pompe, allez à l'écran Rechercher un appareil et sélectionnez \\ \"Rechercher un appareil\\\".\n\nMenu principal >\nUtilitaires >\nConnecter les appareils >\nAutres appareils >\nActivé >\nRechercher un appareil\n\nInstructions de recherche d'appareil de la pompe"; /* navigation title for pump battery type selection Text for medtronic pump preferred data source */ "Preferred Data Source" = "Source de données préférée"; /* Text for medtronic pump battery percent remaining */ -"Pump Battery Remaining" = "Pump Battery Remaining"; +"Pump Battery Remaining" = "Batterie Pompe restante"; /* navigation title for pump battery type selection Text for medtronic pump battery type */ @@ -203,7 +209,7 @@ "U/hr" = "U/h"; /* Text to indicate battery percentage is unknown */ -"unknown" = "unknown"; +"unknown" = "inconnu"; /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Inconnu"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/zh-Hans.lproj/Localizable.strings index 452b995c5e..6db74af697 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -96,13 +96,13 @@ "Insulin\nSuspended" = "Insulin\nSuspended"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "胰岛素输注"; /* Instructions on selecting an insulin data source */ "Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option." = "可以通过解释事件历史记录或比较随时间推移的储存容量来确定胰岛素输注总量。阅读事件历史记录可以获得更精确的胰岛素输注量并将最新的数据上传到Nightscout,但该方式会造成更快的电池消耗以及可能造成Rileylink通信失败概率增大。如果选中的方式无法正常工作,系统将自动尝试运行另一个方案。"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "胰岛素余量"; /* Text for confidence reminders navigation link */ "Insulin Type" = "Insulintyp"; @@ -161,7 +161,7 @@ "Retry" = "重试"; /* Title of insulin delivery section */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "预设基础率"; /* Title text for insulin type confirmation page */ "Select the type of insulin that you will be using in this pump." = "Select the type of insulin that you will be using in this pump."; @@ -191,7 +191,7 @@ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; /* Title for pod sync time action sheet. */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "检测到时间变化"; /* The label indicating the results of each frequency trial */ "Trials" = "尝试"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 63c4206702..75afbac176 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -48,52 +48,52 @@ "Suspend In Progress Reminder" = "Suspendre le rappel en cours"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "La période de suspension de l'insuline est terminée. \n\nVous pouvez relancer l'administration à partir de la bannière sur l'écran d'accueil ou à partir de l'écran des paramètres de votre pompe. Vous recevrez un nouveau rappel dans 15 minutes."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Veuillez finir d'appairer votre Pod."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "L'heure de votre pompe est différente de l'heure actuelle. Vous pouvez vérifier l'heure de la pompe et la synchroniser avec l'heure actuelle dans les paramètres."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "La période de suspension est terminée. Ouvrez l'application et reprenez."; /* Action button default text for PodAlerts */ -"Ok" = "Ok"; +"Ok" = "OK"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Activation inachevée"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Péremption du Pod dans"; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Péremption du Pod"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod activé"; /* */ "Notification Settings" = "Paramètres des notifications"; /* */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Rappels de confiance"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Suspendre l'administration d'insuline"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod expiré"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Désactivation inachevée"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Aucun Pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Appairer le Pod"; /* Pairing action button accessibility label while ready to pair */ "Pair pod." = "Appairer le Pod."; @@ -108,19 +108,19 @@ "Pod paired successfully. Continue." = "Pod appairé avec succès. Continuer."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Terminer la désactivation"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "Remplacer le pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "jour"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "jours"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "heure"; /* Unit for plural hours in pod life remaining */ "hours" = "heures"; @@ -132,25 +132,25 @@ "minutes" = "minutes"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Administration de l'insuline"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "Basal programmé"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insuline restante"; /* Section header for activity section */ "Activity" = "Activité"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Détails de l'appareil"; /* Section header for configuration section */ "Configuration" = "Configuration"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Terminer la désactivation"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "Remplacer le pod"; @@ -159,19 +159,19 @@ "Replace Pod" = "Remplacer le pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Activation inachevée"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Péremption du Pod dans"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod expiré"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Désactivation inachevée"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Aucun Pod"; /* Pod life HUD view label */ "Fault" = "Erreur"; @@ -186,61 +186,61 @@ "Replace Pod" = "Remplacer le pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "Aucun pod appairé"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod déjà appairé"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Type d'insuline non configuré"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; +"Pod is not in a state ready for cannula insertion." = "Le Pod n’est pas dans un état prêt pour l’insertion de la canule."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Paramètre invalide"; /* Recovery suggestion shown when no pod is paired */ -"Please pair a new pod" = "Please pair a new pod"; +"Please pair a new pod" = "Veuillez appairer un nouveau pod"; /* Generic title of the OmniBLE pump manager */ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Problème de com."; /* */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Finir l'appariement"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Terminer la désactivation"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Aucun Pod"; /* Status highlight message for emptyReservoir alarm. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Pas d'insuline"; /* Status highlight message for podExpired alarm. */ "Pod Expired" = "Pod expiré"; /* Status highlight message for occlusion alarm. */ -"Pod Occlusion" = "Pod Occlusion"; +"Pod Occlusion" = "Occlusion du Pod"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Erreur du Pod"; /* Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Pas d'insuline"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Insuline suspendue"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Perte de signal"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Débit basal manuel"; /* */ "Insert Cannula" = "Insérer la canule"; @@ -249,46 +249,46 @@ "Inserting..." = "Insertion en cours"; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "Réessayer"; /* Cannula insertion button text while checking insertion */ "Checking..." = "Vérification en cours..."; /* */ -"Check cannula insertion finished" = "Check cannula insertion finished"; +"Check cannula insertion finished" = "Vérification de l'insertion de canule terminée"; /* */ -"Get pod status" = "Get pod status"; +"Get pod status" = "Obtenir l'état du Pod"; /* */ -"Save Basal Profile" = "Save Basal Profile"; +"Save Basal Profile" = "Définir profil de basal"; /* */ -"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; +"Save basal profile failed: %{public}@" = "Échec de l'enregistrement du profil de basal : %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; +"Skipping Play Test Beeps due to bolus still in progress." = "Ignorer les bips de test en raison du bolus en cours."; /* */ "Play Test Beeps" = "Jouer des bips de test"; /* */ -"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; +"Skipping Read Pulse Log due to bolus still in progress." = "Ignorer les bips de test en raison du bolus en cours."; /* */ "Read Pulse Log" = "Lecture journal d'impulsion"; /* */ -"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; +"Set Confirmation Beeps to %s" = "Définir les bips de confirmation à %s"; /* */ -"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; +"Set Confirmation Beeps Preference" = "Définir la préférence des bips de confirmation"; /* */ "Suspend" = "Suspendre"; /* */ -"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; +"Failed to suspend: %{public}@" = "Échec de la suspension : %{public}@"; /* */ "Resume" = "Reprendre"; @@ -297,28 +297,28 @@ "Bolus" = "Bolus"; /* */ -"Cancel Bolus" = "Cancel Bolus"; +"Cancel Bolus" = "Annuler bolus"; /* Alert acknowledgment OK button */ "OK" = "OK"; /* The title for Empty Reservoir alarm notification */ -"Empty Reservoir" = "Empty Reservoir"; +"Empty Reservoir" = "Réservoir vide"; /* The title for Occlusion alarm notification */ -"Occlusion Detected" = "Occlusion Detected"; +"Occlusion Detected" = "Occlusion détectée"; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Erreur critique du Pod"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "L'administration d'insuline s'est arrêtée. Changez de Pod maintenant."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insuline restante"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Régler basal temporaire"; /* Section header for activity section */ "Activity" = "Activité"; @@ -327,104 +327,104 @@ "Configuration" = "Configuration"; /* Title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Pod précédent"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Heure de la pompe"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Ajustement de l'heure de la pompe..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Définir sur l'heure actuelle"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Basculer vers un autre dispositif de distribution d'insuline"; /* Title for pod sync time action sheet. */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "L'heure de votre pompe est différente de l'heure actuelle. Voulez vous mettre à jour l'heure de votre pompe avec l'heure actuelle ?"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Oui, synchroniser avec l'heure actuelle"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Non, garder la pompe telle quelle"; /* Title for Omnipod DASH PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Retirer la pompe"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; +"Are you sure you want to stop using Omnipod DASH?" = "Voulez-vous vraiment arrêter d’utiliser Omnipod ?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Delete Omnipod DASH"; +"Delete Omnipod DASH" = "Supprimer Omnipod DASH"; /* Text for confidence reminders navigation link" */ "Insulin Type" = "Type d'Insuline"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Définir sur l'heure actuelle"; /* Title for suspend duration selection action sheet */ "Suspend Delivery" = "Suspendre la distribution"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "L'administration d'insuline sera interrompue jusqu'à ce que vous la repreniez manuellement. Quand voulez-vous que Loop vous rappelle de reprendre l'administration ?"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 minutes"; /* Button text for 1 hour suspend duration" */ -"1 hour" = "1 hour"; +"1 hour" = "1 heure"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 heure 30 minutes"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 heures"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Échec de la suspension de l'administration d'insuline"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Échec de la reprise de l’administration d’insuline"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Échec de réglage de l'heure de la pompe"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Échec d'annulation du basal manuel"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Veuillez désactiver le pod. Une fois la désactivation terminée, vous pouvez le retirer et appairer un nouveau pod."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Veuillez désactiver le pod. Une fois la désactivation terminée, vous pouvez appairer un nouveau Pod."; /* Deactivate pod action button */ "Deactivate Pod" = "Désactiver le pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Désactivation."; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod désactivé avec succès. Continuez."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "Réessayer"; /* Action button description when deactivated */ "Continue" = "Continuer"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Il y a eu un problème de communication avec le Pod. Si ce problème persiste, appuyez sur Jeter le pod. Vous pourrez ensuite activer un nouveau Pod."; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Jeter le Pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Retirer le Pod du corps"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Votre Pod peut encore délivrer de l'insuline.\nRetirez-le de votre corps, puis appuyez sur \"Continuer\""; /* Insulin Unit */ "U" = "U"; @@ -433,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Changez de Pod maintenant. La fourniture d'insuline s'arrêtera 8 heures après l'expiration du Pod ou quand il n'y aura plus d'insuline."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Écoutez deux bips."; @@ -571,7 +571,7 @@ "Critical Alerts" = "Alertes critiques"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Les rappels ci-dessus ne sonneront pas si votre appareil est en mode silencieux ou Ne pas déranger.\n\nIl y a d'autres alertes et alarmes de Pod critiques qui sonneront même si votre appareil est réglé sur mode Silencieux ou Ne pas déranger."; /* navigation title for notification settings */ "Notification Settings" = "Paramètres des notifications"; @@ -602,10 +602,10 @@ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentissent pour les commandes que vous initiez, comme le bolus, l'annulation du bolus, la suspension, la reprise, l'enregistrement des rappels de notification, etc. Lorsque l'application ajuste automatiquement l'administration, aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentissent lorsque l'application ajuste automatiquement la livraison ainsi que pour les commandes que vous lancez."; /* Label text for temporary basal rate summary */ "Rate" = "Taux"; @@ -670,7 +670,7 @@ "BLE Firmware Version" = "Version Firmware BLE"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod activé"; /* description label for active time pod details row */ "Active Time" = "Heure d’activation"; @@ -721,19 +721,19 @@ "Cancel Manual Basal" = "Annuler le basal manuel"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insuline\nSuspendue"; /* Text for suspend resume button when insulin delivery is suspended */ "Resume Insulin Delivery" = "Reprendre l'injection d'insuline"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Assurez-vous que votre iPhone est à proximité et réessayez."; /* Error message shown when the pod is not connected */ -"Pod not connected" = "Pod not connected"; +"Pod not connected" = "Pod non connecté"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Suspendu à"; /* Text for suspend resume button when insulin delivery is resuming */ "Resuming insulin delivery..." = "Reprendre l'injection d'insuline..."; @@ -742,81 +742,81 @@ "Suspending insulin delivery..." = "Suspension de la distribution d'insuline..."; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Aucun Pod trouvé"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Trop de Pods trouvés"; /* Recovery suggestion when no response is received from pod */ -"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; +"Make sure iPhone is nearby the active pod" = "Assurez-vous que l'iPhone est à proximité du pod actif"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Réessayer"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Déplacez-vous vers un nouvel endroit éloigné de tout autre Pod et réessayez."; /* Recovery suggestion for PodCommsError.noPodsFound */ -"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; +"Make sure your pod is filled and nearby." = "Assurez-vous que votre pod est rempli et à proximité."; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; +"Please reposition iPhone further from the pod" = "Veuillez repositionner l'iPhone plus loin que le pod"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; +"Please reposition iPhone relative to the pod" = "Veuillez repositionner l'iPhone plus loin que le pod"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Veuillez rapprocher le Pod original ou désactiver le Pod d'origine"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Interférences possibles. Veuillez vous déplacer vers un nouvel emplacement"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Assurez-vous que votre iPhone est à proximité et réessayez."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Attendez que le bolus en cours se termine, ou annulez le bolus"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Attendez que le bolus en cours se termine, ou annulez le bolus"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Attendez que le débit basal temporaire se termine pour quitter, ou mettez en suspens pour annuler"; /* DASH Pod time ago since last status */ "%@ ago" = "Il y a %@"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Réduit au silence"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Mode de fonctionnement normal où les bips audio Pod sont utilisés pour toutes les alertes de Pod et quand les rappels de confiance sont activés."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Toutes les alertes de Pod n'utilisent aucun bip et les bips de rappel de confirmation sont supprimés. Le Pod ne sera disponible que pour les défauts fataux du Pod et lors de la lecture des bips de test.\n\n⚠️Attention - Chaque fois que le Pod est réduit au silence, il doit être maintenu à portée Bluetooth de cet appareil pour recevoir des notifications pour les alertes de Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Le mode Pod silencieux supprime tous les bips d'alerte et de rappel de confirmation."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Pod silencieux"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Détails du Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Détails du Pod précédent"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Détails du Gestionnaire de Pompes"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Récupération des détails du gestionnaire de pompe..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Actualiser les détails du Gestionnaire de Pompe"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostiques"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Lire l’état de la pompe"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 096143cd95..1449d7ec74 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -24,7 +24,7 @@ "Resume Insulin" = "Insuline hervatten"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Koppeling Pod onvolledig"; +"Pod Pairing Incomplete" = "Pod koppeling onvolledig"; /* Alert content title for timeOffsetChangeDetected pod alert */ "Time Change Detected" = "Wijziging in tijd gedetecteerd"; @@ -517,10 +517,10 @@ "Deactivated" = "Uitgeschakeld"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Je Pod is klaar voor gebruik.\n\n%1$@ zal je eraan herinneren om je Pod te vervangen voordat deze verloopt. Je kunt dit veranderen in een tijdstip dat je beter uitkomt."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Je Pod is klaar voor gebruik.\n\niAPS (%1$@) zal je eraan herinneren om je Pod te vervangen voordat deze verloopt. Je kunt dit veranderen in een tijdstip dat je beter uitkomt."; /* */ -"Scheduled Reminder" = "Geplande herinnering"; +"Scheduled Reminder" = "Geplande melding"; /* Label for expiration reminder row */ "Time" = "Tijd"; @@ -562,7 +562,7 @@ "This is a reminder that you scheduled when you paired your current Pod." = "Dit is een herinnering die je hebt gepland toen je je huidige Pod koppelde."; /* */ -"Scheduled Reminder" = "Geplande herinnering"; +"Scheduled Reminder" = "Geplande melding"; /* Footer text for low reservoir value row */ "The App notifies you when the amount of insulin in the Pod reaches this level." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt."; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 32f9c63cca..3cbedef6ab 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -6,151 +6,151 @@ */ /* Alert content title for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "多个命令警报"; /* Alert content title for userPodExpiration pod alert */ -"Pod Expiration Reminder" = "Pod Expiration Reminder"; +"Pod Expiration Reminder" = "Pod到期提醒"; /* Alert content title for podExpiring pod alert */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod已到期"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "低药量"; /* Alert content title for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "泵暂停中 的提醒"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "恢复输注"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod 配对未完成"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "检测到时间变化"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "多个命令警报"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod 将于 %1$@到期"; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "立即更换 Pod ,Pod 已使用72小时"; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "请立刻更改Pod ,胰岛素输注将在 1 小时后停止"; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ 或更少胰岛素剩余,请即刻更换Pod"; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "泵暂停中 的提醒"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "胰岛素输注暂停期已经结束,\n\n您可以从屏幕上方的横幅或者从您的泵设置屏幕上恢复输注,您将在 15 分钟内再次被提醒"; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "请完成配对您的pod"; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "您泵上的时间不同于当前时间。您可以在设置里将泵时间并同步到当前时间。"; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "输注暂停已经结束,打开应用程序并恢复输注"; /* Action button default text for PodAlerts */ "Ok" = "Ok"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "未完成启用"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod将过期于 "; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod有效期限"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod 已激活"; /* */ "Notification Settings" = "通知设置"; /* */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "二次确认提醒"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "暂停胰岛素输注"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod已到期"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "尚未完成停用"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "无Pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "配对Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "配对Pod."; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "配对中."; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "准备中,请稍候"; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod配对成功,继续"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "完成停用"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "更换Pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "天"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "天"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "小时"; /* Unit for plural hours in pod life remaining */ "hours" = "小时"; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "分钟"; /* Unit for plural minutes in pod life remaining */ "minutes" = "分钟"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "胰岛素输注"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "预设基础率"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "胰岛素余量"; /* Section header for activity section */ "Activity" = "活动"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "设备详情"; /* Section header for configuration section */ "Configuration" = "配置"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "完成停用"; /* Settings page link description when next lifecycle action is to replace pod */ "Replace Pod" = "更换Pod"; @@ -159,19 +159,19 @@ "Replace Pod" = "更换Pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "未完成启用"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod将过期于 "; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod已到期"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "尚未完成停用"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "无Pod"; /* Pod life HUD view label */ "Fault" = "错误"; @@ -186,10 +186,10 @@ "Replace Pod" = "更换Pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "没有找到可配对的Pod"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod已经配对了"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ "Insulin type not configured" = "Insulin type not configured"; @@ -216,13 +216,13 @@ "Finish Deactivation" = "Finish Deactivation"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "无Pod"; /* Status highlight message for emptyReservoir alarm. */ "No Insulin" = "No Insulin"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod已到期"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pod Occlusion"; @@ -315,7 +315,7 @@ "Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "胰岛素余量"; /* Button title to set temporary basal rate */ "Set Temporary Basal Rate" = "Set Temporary Basal Rate"; @@ -379,169 +379,169 @@ /* Button text for 1 hour 30 minute suspend duration */ "1 hour 30 minutes" = "1 hour 30 minutes"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2小时"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "暂停胰岛素输注失败"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "恢复胰岛素输注失败"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "设置泵时间失败"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "取消手动基础率失败"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "请先停用Pod,停用完成后将Pod从身体上摘除并配对新的Pod"; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "请先停用Pod, 停用完成后您可以配对一个新的Pod"; /* Deactivate pod action button */ "Deactivate Pod" = "解除Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "停用中"; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod已成功停用,继续"; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "重试"; /* Action button description when deactivated */ "Continue" = "继续"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "与Pod通讯时出现问题。如果这个问题无法解决,请弃用此Pod,并激活一个新Pod。"; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "丢弃Pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "从身体上取下Pod"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "您的Pod 可能仍在输注胰岛素。\n将其从您的身体中取下,然后点击“继续”。"; /* Insulin Unit */ "U" = "U"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "现在更换Pod 。Pod 过期后的8小时后胰岛素输注将完全停止。"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "用至少100个单位的胰岛素填充一个新的pod (不要取下Pod的针头盖)。"; /* Label text for step 2 of pair pod instructions */ -"Listen for 2 beeps." = "Listen for 2 beeps."; +"Listen for 2 beeps." = "注意听两声哔声"; /* Label text indicating pairing finished.*/ -"Paired" = "Paired"; +"Paired" = "已配对"; /* Cancel button text in navigation bar on pair pod UI */ "Cancel" = "取消"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "您确定要取消Pod安装吗?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "如果您现在取消Pod 设置,当前Pod将被停用并报废。"; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "是的,解除Pod"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "否,继续设置 Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "将注射部位做好准备"; /* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "检查Pod,贴在注射部位上,确保pod已经贴牢"; /* Action button title for attach pod view */ "Continue" = "继续"; /* */ -"Attach Pod" = "Attach Pod"; +"Attach Pod" = "粘贴Pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "确认Pod粘贴牢固"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "请确认Pod 已经安全地粘贴到到你的身体.\n\n每个Pod只能插入一次软管。当Pod被贴牢后,点击\"确认\""; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "确认"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "点击下面的按钮开始插入软管"; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "等待,直到插入完成"; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "插入完毕"; /* Check Cannula */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "检查出药口软管"; /* */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "软管是否成功插入?"; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "当软管被正确插入皮肤时,Pod顶部的透明窗口应该有粉红色"; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "是"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "否"; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "配对中..."; /* Pod pairing action button text while priming */ -"Priming..." = "Priming..."; +"Priming..." = "充盈中..."; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "停用中......"; /* Pod state when pod has been deactivated */ -"Deactivated" = "Deactivated"; +"Deactivated" = "已停用"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "您的Pod 已准备好。\n\n%1$@ 将会在Pod到期前发出提醒。 您也可以自行设定到期提醒时间"; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "预约提醒"; /* Label for expiration reminder row */ "Time" = "时间"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "完成安装"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "安装已完成"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "无提醒"; /* Error message description for PeripheralManagerError.notReady */ -"Peripheral Not Ready" = "Peripheral Not Ready"; +"Peripheral Not Ready" = "外围设备尚未准备好"; /* Error message description for PeripheralManagerError.incorrectResponse */ -"Incorrect Response" = "Incorrect Response"; +"Incorrect Response" = "错误的响应"; /* Error message description for PeripheralManagerError.timeout */ -"Timeout" = "Timeout"; +"Timeout" = "超时"; /* Error message description for PeripheralManagerError.emptyValue */ "Empty Value" = "Empty Value"; @@ -670,7 +670,7 @@ "BLE Firmware Version" = "BLE Firmware Version"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod 已激活"; /* description label for active time pod details row */ "Active Time" = "Pod启动时间"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings index a01deeeaa8..eba55ebb3d 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/fr.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Problème de communication : Commande en attente sans accusé de réception."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentissent pour les commandes que vous initiez, comme le bolus, l'annulation du bolus, la suspension, la reprise, l'enregistrement des rappels de notification, etc. Lorsque l'application ajuste automatiquement l'administration, aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentissent lorsque l'application ajuste automatiquement la livraison ainsi que pour les commandes que vous lancez."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Erreur critique du Pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings index f97fe8000a..f65092072d 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings @@ -175,7 +175,7 @@ /* Alert content body for multiCommand pod alert Alert content title for multiCommand pod alert */ -"Multiple Command Alert" = "Melding meerdere commando's"; +"Multiple Command Alert" = "Waarschuwing voor meerdere commando's"; /* Pod alert state when no alerts are active */ "No alerts" = "Geen waarschuwingen"; @@ -282,7 +282,7 @@ "Pod Occlusion" = "Pod verstopping"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Koppeling Pod onvolledig"; +"Pod Pairing Incomplete" = "Koppeling pod onvolledig"; /* Error message shown when pod sends ack instead of response */ "Pod sent ack instead of response" = "Pod heeft een bevestiging gestuurd in plaats van een antwoord"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings index 91d00da528..a7ed35da1e 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/zh-Hans.lproj/Localizable.strings @@ -8,7 +8,7 @@ "%@ dB" = "%@ dB"; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ 或更少胰岛素剩余,请即刻更换Pod"; /* Format string for activation time exceeded Pod state when activation not completed in the time allowed */ @@ -48,10 +48,10 @@ "Certain" = "Certain"; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "请立刻更改Pod ,胰岛素输注将在 1 小时后停止"; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "立即更换 Pod ,Pod 已使用72小时"; /* Format string for invalid message error code (1: error code number) */ "Command error %1$u" = "Command error %1$u"; @@ -175,7 +175,7 @@ /* Alert content body for multiCommand pod alert Alert content title for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "多个命令警报"; /* Pod alert state when no alerts are active */ "No alerts" = "运行正常"; @@ -191,7 +191,7 @@ "No Insulin" = "No Insulin"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "无Pod"; /* Error message shown when no pod is paired */ "No pod paired" = "未配对Pod"; @@ -234,7 +234,7 @@ "Please bring your pod closer to the RileyLink and try again" = "请确保Rileylink与Pod保持近距离并重试"; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "请完成配对您的pod"; /* Recover suggestion shown when no pod is paired */ "Please pair a new pod" = "请配对一个新的Pod"; @@ -264,7 +264,7 @@ "Pod expired" = "Pod已到期"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod 将于 %1$@到期"; /* Format string for pod fault code */ "Pod Fault: %1$@" = "Pod错误: %1$@"; @@ -282,7 +282,7 @@ "Pod Occlusion" = "Pod Occlusion"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod 配对未完成"; /* Error message shown when pod sends ack instead of response */ "Pod sent ack instead of response" = "Pod sent ack instead of response"; @@ -319,7 +319,7 @@ "Resume delivery" = "Resume delivery"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "恢复输注"; /* The format string describing a resume. (1: Time)(2: Scheduled certainty */ "Resume: %1$@ %2$@" = "恢复输注: %1$@ %2$@"; @@ -344,7 +344,7 @@ /* Alert content body for suspendInProgress pod alert Alert content title for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "泵暂停中 的提醒"; /* Description for suspend time expired */ "Suspend time expired" = "Suspend time expired"; @@ -359,7 +359,7 @@ "Suspended" = "暂停"; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "输注暂停已经结束,打开应用程序并恢复输注"; /* Pod tank fill completed */ "Tank fill completed" = "已向Pod注入胰岛素"; @@ -380,13 +380,13 @@ "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "临时基础率: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "胰岛素输注暂停期已经结束,\n\n您可以从屏幕上方的横幅或者从您的泵设置屏幕上恢复输注,您将在 15 分钟内再次被提醒"; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "您泵上的时间不同于当前时间。您可以在设置里将泵时间并同步到当前时间。"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "检测到时间变化"; /* The format string for pod expiration notification body (1: time until expiration) */ "Time to replace your pod! Your pod will expire in %1$@" = "Pod将在%1$@后到期,请准备更换Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index 86a6813a3f..30a0f36da6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -66,7 +66,7 @@ "2 hours" = "2 heures"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 minutes"; /* The title of the cell showing the pod activated at time */ "Active Time" = "Heure d’activation"; @@ -153,7 +153,7 @@ "Confidence Reminders" = "Rappels de confiance"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; /* The title of the configuration section in settings */ "Configuration" = "Configuration"; @@ -547,7 +547,7 @@ "Remove Pump" = "Retirer la pompe"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Retirez le capuchon transparent de l'aiguille du Pod et vérifiez la canule. Retirer ensuite le support papier. Retirer le capuchon de l'aiguille du pod et vérifier la canule. Retirer ensuite le support papier. Texte de l'étiquette pour la deuxième étape des instructions de fixation du pod."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -681,7 +681,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level." = "L'application vous avertit quand la quantité d'insuline restante dans le pod atteint cette limite"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Les rappels ci-dessus ne sonneront pas si votre appareil est en mode silencieux ou Ne pas déranger.\n\nIl y a d'autres alertes et alarmes de Pod critiques qui sonneront même si votre appareil est réglé sur mode Silencieux ou Ne pas déranger."; /* Message for pod sync time action sheet */ "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "L'heure de votre pompe est différente de l'heure actuelle. Voulez vous mettre à jour l'heure de votre pompe avec l'heure actuelle ?"; @@ -766,39 +766,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Votre Pod peut encore délivrer de l'insuline.\nRetirez-le de votre corps, puis appuyez sur \"Continuer\"."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Réduit au silence"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Mode de fonctionnement normal où les bips audio Pod sont utilisés pour toutes les alertes de Pod et quand les rappels de confiance sont activés."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Toutes les alertes de Pod n'utilisent aucun bip et les bips de rappel de confirmation sont supprimés. Le Pod ne sera disponible que pour les défauts fataux du Pod et lors de la lecture des bips de test.\n\n⚠️Warning - Chaque fois que le Pod est réduit au silence, il doit être maintenu à portée Bluetooth de cet appareil pour recevoir des notifications pour les alertes de Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Pod silencieux"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Détails du Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Détails du Pod précédent"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Détails du Gestionnaire de Pompes"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Récupération des détails du gestionnaire de pompe..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Actualiser les détails du Gestionnaire de Pompe"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Impossible de mettre à jour les préférences de rappel de confiance."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostiques"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Lire l’état de la pompe"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index a8e3cc2dde..072d2830c2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -597,7 +597,7 @@ Scheduled reminder card title on NotificationSettingsView Title for scheduled expiration reminder edit page Title of SetupCompleteView */ -"Scheduled Reminder" = "Geplande herinnering"; +"Scheduled Reminder" = "Geplande melding"; /* Title text for insulin type confirmation page */ "Select the type of insulin that you will be using in this pod." = "Selecteer het type insuline dat je in deze pod gaat gebruiken."; @@ -654,7 +654,7 @@ "Sync With Pod" = "Synchroniseer met pod"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tik hieronder om het inbrengen van de cannule te starten."; +"Tap below to start cannula insertion." = "Tik hieronder om het inbrengen van de canule te starten."; /* Navigation Title for ManualTempBasalEntryView */ "Temporary Basal" = "Tijdelijke basaal"; @@ -760,7 +760,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Je begint nu met het configureren van je herinneringen, het vullen van je Pod met insuline, het koppelen van je apparaat en het op je lichaam plaatsen."; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Je Pod is klaar voor gebruik.\n\n%1$@ zal je eraan herinneren je pod te vervangen voordat deze verloopt. Je kunt dit wijzigen naar een tijdstip dat beter uitkomt."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Je Pod is klaar voor gebruik.\n\niAPS (%1$@) zal je eraan herinneren je pod te vervangen voordat deze verloopt. Je kunt dit wijzigen naar een tijdstip dat beter uitkomt."; /* Alert message body for confirm pod attachment */ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Je Pod kan nog steeds insuline toedienen.\nVerwijder de Pod van je lichaam en tik vervolgens op \"Ga Verder\"."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 180ddff2ed..61c57edcb8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -63,7 +63,7 @@ "1 hour 30 minutes" = "1 hour 30 minutes"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2小时"; /* Button text for 30 minute suspend duration */ "30 minutes" = "30 minutes"; @@ -81,7 +81,7 @@ "Alarms" = "提醒"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "您确定要取消Pod安装吗?"; /* Confirmation message for shutting down a pod */ "Are you sure you want to shutdown this pod?" = "确定要停止这个Pod吗?"; @@ -123,7 +123,7 @@ "Cannula inserted successfully. Continue." = "Cannula inserted successfully. Continue."; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "现在更换Pod 。Pod 过期后的8小时后胰岛素输注将完全停止。"; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; @@ -138,7 +138,7 @@ "Check Cannula" = "Check Cannula"; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "检查Pod,贴在注射部位上,确保pod已经贴牢"; /* Insert cannula action button accessibility label checking insertion */ "Checking Insertion" = "Checking Insertion"; @@ -159,10 +159,10 @@ "Configuration" = "配置"; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "确认"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "确认Pod粘贴牢固"; /* The title of the continue action in an action sheet */ "Continue" = "继续"; @@ -171,7 +171,7 @@ "Critical Alerts" = "Critical Alerts"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "天"; /* Unit for plural days in pod life remaining */ "days" = "days"; @@ -187,7 +187,7 @@ "Deactivated" = "已解除"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "停用中"; /* Action button description while deactivating */ "Deactivating..." = "Deactivating..."; @@ -200,7 +200,7 @@ /* Text for device details disclosure row title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "设备详情"; /* The title of the device information section in settings */ "Device Information" = "设备信息"; @@ -213,7 +213,7 @@ /* Pairing interface navigation bar button text for discard pod action Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "丢弃Pod"; /* No comment provided by engineer. */ "Done" = "完成"; @@ -249,13 +249,13 @@ "Expires" = "Pod即将到期"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "取消手动基础率失败"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "恢复胰岛素输注失败"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "设置泵时间失败"; /* Alert title for suspend error */ "Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; @@ -276,25 +276,25 @@ "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "完成停用"; /* The title of the command to finish pod setup */ "Finish pod setup" = "完成设置"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "完成安装"; /* Accessibility format string for (1: localized volume)(2: time) */ "Greater than %1$@ units remaining at %2$@" = "Greater than %1$@ units remaining at %2$@"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "小时"; /* Unit for plural hours in pod life remaining */ "hours" = "小时"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "如果您现在取消Pod 设置,当前Pod将被停用并报废。"; /* Instructions when deactivating pod that has been paired, but not attached. */ "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Pod设置失败,请解除该从身体移除Pod,然后配对新Pod"; @@ -306,7 +306,7 @@ "Insert Cannula" = "植入Pod"; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "插入完毕"; /* Insert cannula action button accessibility label while pairing */ "Inserting. Please wait." = "Inserting. Please wait."; @@ -321,7 +321,7 @@ "Insulin Delivered" = "已输注胰岛素"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "胰岛素输注"; /* The action string on pod status page when pod faulted */ "Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; @@ -330,7 +330,7 @@ "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "胰岛素余量"; /* Text for confidence reminders navigation link Title for insulin type selection screen */ @@ -340,7 +340,7 @@ "Invalid entry" = "无效输入"; /* Question to confirm the cannula is inserted properly */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "软管是否成功插入?"; /* Label text for step 2 of pair pod instructions */ "Keep the RileyLink about 6 inches from the pod during pairing." = "Keep the RileyLink about 6 inches from the pod during pairing."; @@ -370,7 +370,7 @@ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "分钟"; /* Unit for plural minutes in pod life remaining */ "minutes" = "分钟"; @@ -397,13 +397,13 @@ /* Label for pod life state when no pod paired Text shown in insulin remaining space when no pod is paired */ -"No Pod" = "No Pod"; +"No Pod" = "无Pod"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "否,继续设置 Pod"; /* Button text to cancel pump time sync */ "No, Keep Pump As Is" = "No, Keep Pump As Is"; @@ -434,16 +434,16 @@ "Pair Pod" = "Pair Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "配对Pod."; /* Label text indicating pairing finished. */ "Paired" = "已配对"; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "配对中."; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "配对中..."; /* No comment provided by engineer. */ "Percent = %lf" = "Percent = %lf"; @@ -458,26 +458,26 @@ "Play Test Beeps…" = "提示音测试中"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "请确认Pod 已经安全地粘贴到到你的身体.\n\n每个Pod只能插入一次软管。当Pod被贴牢后,点击\"确认\""; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "请先停用Pod, 停用完成后您可以配对一个新的Pod"; /* Instructions for deactivate pod when pod is on body */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "请先停用Pod,停用完成后将Pod从身体上摘除并配对新的Pod"; /* The title of the cell showing the pod pm version */ "PM Version" = "PM版本号"; /* description label for activated at time pod details row Label for pod insertion row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod 已激活"; /* Label describing pod age view */ "Pod Age" = "Pod使用天数"; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod已成功停用,继续"; /* Error message for reservoir view during general pod fault */ "Pod Error" = "Pod Error"; @@ -487,13 +487,13 @@ /* Error message for reservoir view when pod expired Label for pod expiration row, past tense */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod已到期"; /* Label for pod expiration row */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod有效期限"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod将过期于 "; /* description label for pod fault details */ "Pod Fault Details" = "Pod Fault Details"; @@ -502,7 +502,7 @@ "Pod Occlusion" = "Pod Occlusion"; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod配对成功,继续"; /* Title of the pod settings view controller */ "Pod Settings" = "Pod设置"; @@ -511,7 +511,7 @@ "Pod Setup" = "Pod Setup"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "将注射部位做好准备"; /* title for previous pod page */ "Previous Pod" = "Previous Pod"; @@ -523,10 +523,10 @@ "Primed" = "已充盈"; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "准备中,请稍候"; /* Pod pairing action button text while priming */ -"Priming..." = "Priming..."; +"Priming..." = "充盈中..."; /* The text of the loading label when priming */ "Priming…" = "正在充盈"; @@ -541,7 +541,7 @@ "Remaining" = "剩余"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "从身体上取下Pod"; /* Title for Omnipod PumpManager deletion action sheet. */ "Remove Pump" = "Remove Pump"; @@ -630,7 +630,7 @@ "Suspend Delivery" = "暂停输注"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "暂停胰岛素输注"; /* The detail text of the basal row when pod is suspended */ "Suspended" = "暂停"; @@ -654,7 +654,7 @@ "Sync With Pod" = "同步配置到Pod"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "点击下面的按钮开始插入软管"; /* Navigation Title for ManualTempBasalEntryView */ "Temporary Basal" = "Temporary Basal"; @@ -690,10 +690,10 @@ "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump."; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "当软管被正确插入皮肤时,Pod顶部的透明窗口应该有粉红色"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "与Pod通讯时出现问题。如果这个问题无法解决,请弃用此Pod,并激活一个新Pod。"; /* Footer text for scheduled reminder area */ "This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; @@ -708,7 +708,7 @@ /* Title for pod sync time action sheet. title for time change detected notice */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "检测到时间变化"; /* No comment provided by engineer. */ "Toggle sign" = "Toggle sign"; @@ -736,22 +736,22 @@ "Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "未完成启用"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "尚未完成停用"; /* The detail text for delivered insulin when no measurement is available */ "Unknown" = "未知"; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "等待,直到插入完成"; /* Button label for user to answer cannula was properly inserted */ "Yes" = "Yes"; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "是的,解除Pod"; /* Button text to confirm pump time sync */ "Yes, Sync to Current Time" = "Yes, Sync to Current Time"; @@ -760,10 +760,10 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "您的Pod 已准备好。\n\n%1$@ 将会在Pod到期前发出提醒。 您也可以自行设定到期提醒时间"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "您的Pod 可能仍在输注胰岛素。\n将其从您的身体中取下,然后点击“继续”。"; /* Title string for SilencePodPreference.enabled */ "Silenced" = "Silenced"; diff --git a/FreeAPS/Resources/fr.lproj/InfoPlist.strings b/FreeAPS/Resources/fr.lproj/InfoPlist.strings index c9ccf9bfc8..a0c4949de2 100644 --- a/FreeAPS/Resources/fr.lproj/InfoPlist.strings +++ b/FreeAPS/Resources/fr.lproj/InfoPlist.strings @@ -14,7 +14,7 @@ "NSCalendarsUsageDescription" = "Le calendrier est utilisé pour créer un nouvel événement de glycémie."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthUpdateUsageDescription" = "L'application Santé est utilisée pour stocker la glycémie, l'insuline et les glucides"; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthShareUsageDescription" = "L'application Santé est utilisée pour stocker la glycémie, l'insuline et les glucides"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index f406e8f1a5..f12e6d8d12 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -47,7 +47,7 @@ "Agree and continue" = "Zustimmen und fortfahren"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Letze Berechnung um"; +"Enacted at" = "Letzte Berechnung um"; /* Headline in suggested pop up (at: at what time) */ "Suggested at" = "Vorgeschlagen um"; @@ -137,7 +137,7 @@ "Cancel Temp Target" = "Temporäres Ziel abbrechen"; /* Custom temp target */ -"Custom" = "Benutzerdefiniertes"; +"Custom" = "Benutzerdefiniert"; /* */ "Date" = "Datum"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 2cf149aeea..c1e7e92280 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Continuer sans bonus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLe montant est supérieur à votre paramètre de Bolus Max ! \nÊtes-vous sûr de vouloir ajouter "; /* Header */ "Enact Bolus" = "Injecter bolus"; @@ -47,46 +47,46 @@ "Agree and continue" = "Accepter et continuer"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Enacted at"; +"Enacted at" = "Activé à"; /* Headline in suggested pop up (at: at what time) */ -"Suggested at" = "Suggested at"; +"Suggested at" = "Suggéré à"; /* Headline in enacted pop up (at: at what time) */ -"Error at" = "Error at"; +"Error at" = "Erreur à"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Résumé du repas"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Modifier Repas"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Entrer un repas"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Récapitulatif du bolus"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Calculs"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Repas gras"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Bolus entier"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Fractions"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Facteur de farine grasse"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Résultat"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Le montant que vous avez saisi a été limité par votre Bolus maximum %d%@"; /* Bolus View Continue Button */ "Continue" = "Continuer"; @@ -122,7 +122,7 @@ "Carbs required" = "Glucides requis"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Nourriture sauvée"; /* */ "Are you sure?" = "Êtes-vous sûr ?"; @@ -155,19 +155,19 @@ "Enact Temp Target" = "Activer la cible temporaire"; /* */ -"Target" = "Target"; +"Target" = "Cible"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Insuline Basale et Sensibilité ratio"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "Un réglage plus bas de la « cible semi-basale » réduira le basal et augmentera la SI plus tôt à une cible de glucose plus faible."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Vos paramètres: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limite l'extrémité maximale"; /* */ "Enter preset name" = "Entrer le nom du préréglage"; @@ -185,19 +185,19 @@ "Save" = "Sauvegarder"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Enregistrer en tant que préréglage"; /* Delete Meal Preset */ -"Delete Preset" = "Delete Preset"; +"Delete Preset" = "Supprimer le préréglage"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Delete preset '%@'?"; +"Delete preset '%@'?" = "Effacer le préréglage '%@'?"; /* Button */ -"No" = "No"; +"No" = "Non"; /* Button */ -"Yes" = "Yes"; +"Yes" = "Oui"; /* + Button */ "[ +1 ]" = "[ +1 ]"; @@ -354,43 +354,43 @@ Enact a temp Basal or a temp target */ "Remote control" = "Contrôle à distance"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nVeuillez maintenant vérifier soigneusement tous vos nouveaux paramètres:\n\n* Paramètres basaux\n * Ratios glucidiques\n * Objectifs glycémiques\n * Sensibilité à l'insuline\n * DIA\n\n dans iAPS Paramètres > Configuration.\n\nDes paramètres de profil incorrects ou invalides peuvent avoir des effets désastreux."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Cette opération remplacera tout ou partie des paramètres actuels de la pompe. Êtes-vous sûr de vouloir importer les paramètres de profil de Nightscout ?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nParamètres de base Nightcsout non valides. \n\nL'importation a été interrompue. Veuillez vérifier les paramètres de base de votre profil Nightscout !"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nLes réglages ont été importés mais les valeurs basales n'ont pas pu être enregistrées sur la pompe (pas de pompe). Vérifiez vos réglages de base et appuyez sur \"Enregistrer sur la pompe\" pour synchroniser les nouveaux réglages de base"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Erreur d'importation"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Oui, importer"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importer les paramètres depuis Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Importer les paramètres?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importer les paramètres depuis Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Paramètres importés"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nLes unités de glucose ne correspondent pas dans les réglages de Nightscout et de la pompe. L'importation des paramètres a été interrompue."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Impossible de trouver le profil Nightscout par défaut."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Test de glycémie"; /* Add Medtronic pump */ "Add Medtronic" = "Ajouter une pompe Medtronic"; @@ -423,7 +423,7 @@ Enact a temp Basal or a temp target */ "Max Bolus" = "Bolus max"; /* Max setting */ -"Max Carbs" = "Max Carbs"; +"Max Carbs" = "Glucides max"; /* */ "Pump Settings" = "Paramètres de la pompe"; @@ -486,37 +486,37 @@ Enact a temp Basal or a temp target */ "Watch" = "Watch"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Configuration du Watch"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Afficher sur Watch"; /* */ "Garmin Watch" = "Garmin Watch"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Ajouter des appareils"; /* */ -"Glucose Target" = "Glucose Target"; +"Glucose Target" = "Cible de glucose"; /* */ -"Heart Rate" = "Heart Rate"; +"Heart Rate" = "Fréquence Cardiaque"; /* */ -"Steps" = "Steps"; +"Steps" = "Nombre de pas"; /* */ "ISF" = "ISF"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "L'application Garmin Connect doit être installée pour utiliser iAPS.\n Allez sur l'App Store pour la télécharger"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin n'est pas disponible"; /* */ "Services" = "Services"; @@ -525,7 +525,7 @@ Enact a temp Basal or a temp target */ "Settings" = "Paramètres"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Pourcentage de Bolus recommandé"; /* 2 log files to share */ "Share logs" = "Partager les logs"; @@ -552,7 +552,7 @@ Enact a temp Basal or a temp target */ "Upload" = "Upload"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Autoriser les uploads"; /* Type of CGM or glucose source */ "Type" = "Type"; @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Cibles temporaires"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Supprimer les glucides ?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Reprendre l'insuline?"; /* Treatments list */ "Treatments" = "Traitements"; @@ -600,16 +600,16 @@ Enact a temp Basal or a temp target */ "Calibrations" = "Étalonnages"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Créer des événements dans le calendrier"; /* */ "Calendar" = "Calendrier"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatique"; /* External insulin treatments */ -"External" = "External"; +"External" = "Externe"; /* */ "Other" = "Autre"; @@ -1047,7 +1047,7 @@ Enact a temp Basal or a temp target */ "Bolus failed" = "Échec du Bolus"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Bolus max dépassé!"; /* */ "Bolus failed or inaccurate. Check pump history before repeating." = "Bolus échoué ou imprécis. Vérifier l’historique de la pompe avant recommencer."; @@ -1077,7 +1077,7 @@ Enact a temp Basal or a temp target */ " day(s)" = " jour(s)"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Display HR on Watch"; +"Display HR on Watch" = "Affichage du rythme cardiaque sur Watch"; /* Headers for settings ----------------------- */ @@ -1096,10 +1096,10 @@ Enact a temp Basal or a temp target */ "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Etat Bluetooth restoré (APS relancé ?). Trouvé %d périphériques, et connectés à %@ avec ID %@"; /* Shared app group xDrip4iOS */ -"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; +"Using shared app group with external CGM app xDrip4iOS" = "Utilisation d'un groupe d'applications partagées avec une application CGM externe xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Utilisation d'un groupe d'applications partagées avec une application CGM GlucoseDirect"; /* Dexcom G6 app */ "Dexcom G6 app" = "App G6 native"; @@ -1122,67 +1122,67 @@ Enact a temp Basal or a temp target */ /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Developer"; +"Developer" = "Développeur"; /* Debug option view NS Upload Profile */ -"NS Upload Profile" = "NS Upload Profile"; +"NS Upload Profile" = "Profil NS Upload"; /* Debug option view NS Uploaded Profile */ -"NS Uploaded Profile" = "NS Uploaded Profile"; +"NS Uploaded Profile" = "Profil NS Uploaded"; /* Debug option view Autosense */ "Autosense" = "Autosense"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Sensibilité dynamique"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Insuline Basale Autotune seulement"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Enregistrez vos taux Basal Normaux"; /* */ "Save on Pump" = "Enregistrer sur la pompe"; /* Debug option view Pump History */ -"Pump History" = "Pump History"; +"Pump History" = "Historique pompe"; /* Debug option view Target Ranges */ -"Target ranges" = "Target ranges"; +"Target ranges" = "Fourchette cible"; /* Debug option view Temp targets */ -"Temp targets" = "Temp targets"; +"Temp targets" = "Cibles temporaires"; /* Debug option view Meal */ -"Meal" = "Meal"; +"Meal" = "Repas"; /* Debug option view Pump profile */ -"Pump profile" = "Pump profile"; +"Pump profile" = "Profil de pompe"; /* Debug option view Profile */ -"Profile" = "Profile"; +"Profile" = "Profil"; /* Debug option view Enacted */ -"Enacted" = "Enacted"; +"Enacted" = "Activé"; /* Debug option view Announcements (from NS) */ -"Announcements" = "Announcements"; +"Announcements" = "Annonces"; /* Debug option view Enacted announcements announcements (from NS) */ -"Enacted announcements" = "Enacted announcements"; +"Enacted announcements" = "Annonces émises"; /* Debug option view Autotune */ "Autotune" = "Autotune"; /* Debug option view Target presets */ -"Target presets" = "Target presets"; +"Target presets" = "Présélections cibles"; /* Debug option view */ -"Loop Cycles" = "Loop Cycles"; +"Loop Cycles" = "Cycles de boucle"; /* Debug option view Glucose Data used for statistics */ -"Glucose Data used for statistics" = "Glucose Data used for statistics"; +"Glucose Data used for statistics" = "Données Glycémie utilisées pour les statistiques"; /* --------------- HealthKit intergration --------------------*/ /* */ @@ -1195,7 +1195,7 @@ Enact a temp Basal or a temp target */ "For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Pour écrire des données sur Apple Santé, vous devez donner les autorisations dans Paramètres > Santé > Accès aux données"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Cela permet à iAPS de lire et d'écrire sur Apple Heath. Vous devez également donner des autorisations dans Paramètres > Santé > Accès aux données. Si vous entrez une valeur de glucose dans Apple Health, ouvrez iAPS pour confirmer qu'elle apparaît."; /* New ALerts ------------------------- */ /* Info title */ @@ -1208,22 +1208,22 @@ Enact a temp Basal or a temp target */ "Error" = "Erreur"; /* Manual temp basal mode */ -"Manual" = "Manual"; +"Manual" = "Manuel"; /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Insuline externe"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Débit basal manuel"; /* Current Manual Temp basal */ -" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; +" - Manual Basal ⚠️" = " - Débit basal manuel ⚠️"; /* Total AT / Scheduled basal insulin */ -" U/day" = " U/day"; +" U/day" = " U/jour"; /* Total AT / Scheduled basal insulin */ "Total" = "Total"; @@ -1231,242 +1231,242 @@ Enact a temp Basal or a temp target */ /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ /* Enable FPU */ -"Enable" = "Enable"; +"Enable" = "Activer"; /* Header */ -"Conversion settings" = "Conversion settings"; +"Conversion settings" = "Paramètres de la conversation"; /* Delay */ -"Delay In Minutes" = "Delay In Minutes"; +"Delay In Minutes" = "Délai a minutes"; /* Duration */ -"Maximum Duration In Hours" = "Maximum Duration In Hours"; +"Maximum Duration In Hours" = "Durée maximale en heures"; /* Interval */ -"Interval In Minutes" = "Interval In Minutes"; +"Interval In Minutes" = "Intervalle en Minutes"; /* Override */ -"Override With A Factor Of " = "Override With A Factor Of "; +"Override With A Factor Of " = "Remplacer par un facteur de "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Permet de convertir les graisses et les protéines en équivalents glucides futurs en utilisant la formule de Varsovie (kilocalories divisées par 10).\n\nCela répartit les équivalents glucides sur une durée maximale qui peut être configurée de 5 à 12 heures.\n\nLe délai est le temps écoulé entre le moment présent et la première entrée de glucides futurs.\n\nL'intervalle en minutes est le nombre de minutes séparant les entrées. Plus l'intervalle est court, plus le résultat est doux. 10, 15, 20, 30 ou 60 sont des choix raisonnables.\n\nLe facteur d'ajustement est l'effet des graisses et des protéines sur les entrées. 1,0 correspond à un effet complet (méthode originale de Varsovie) et 0,5 à un demi-effet. Notez que vous pouvez constater que votre ratio normal de glucides doit être augmenté si vous commencez à ajouter des graisses et des protéines. Pour cette raison, il est préférable de commencer avec un facteur d'environ 0,5 pour se faciliter la tâche.\n\nPar défaut : Time Cap : 8 h, Interval : 30 min, Facteur : 0.5, Délai 60 min"; /* FPU Settings Title */ -"Fat and Protein" = "Fat and Protein"; +"Fat and Protein" = "Graisses et protéines"; /* Display fat and protein entities */ -"Fat & Protein" = "Fat & Protein"; +"Fat & Protein" = "Graisses et protéines"; /* */ -"Hide Fat & Protein" = "Hide Fat & Protein"; +"Hide Fat & Protein" = "Masquer les graisses et protéines"; /* Add Fat */ -"Fat" = "Fat"; +"Fat" = "Graisses"; /* Add Protein */ -"Protein" = "Protein"; +"Protein" = "Protéines"; /* Service Section */ -"Fat And Protein Conversion" = "Fat And Protein Conversion"; +"Fat And Protein Conversion" = "Conversion de graisses et de protéines"; /* Service Section */ -"Profile Override" = "Profile Override"; +"Profile Override" = "Remplacer le profil"; /* */ -"Override Profiles" = "Override Profiles"; +"Override Profiles" = "Préréglages de surcharge"; /* */ "Normal " = "Normal "; -"Currently no Override active" = "Currently no Override active"; +"Currently no Override active" = "Actuellement aucune Surcharge active"; /* */ -"Total Insulin Adjustment" = "Total Insulin Adjustment"; +"Total Insulin Adjustment" = "Ajustement total de l'insuline"; /* */ -"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; +"Override your Basal, ISF, CR and Target profiles" = "Remplacer les profils Basal, ISF, CR et Target"; /* */ -"Enable indefinitely" = "Enable indefinitely"; +"Enable indefinitely" = "Activer indéfiniment"; /* */ -"Override Profile target" = "Override Profile target"; +"Override Profile target" = "Remplacer la cible du profil"; /* */ -"Disable SMBs" = "Disable SMBs"; +"Disable SMBs" = "Désactiver les SMBs"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Normal Profile"; +"Normal Profile" = "Profil normal"; /* Custom but unsaved Profile */ -"Custom Profile" = "Custom Profile"; +"Custom Profile" = "Profil personnalisé"; /* */ -"Profiles" = "Profiles"; +"Profiles" = "Profils"; /* */ -"More options" = "More options"; +"More options" = "Plus d'options"; /* */ -"Schedule when SMBs are Off" = "Schedule when SMBs are Off"; +"Schedule when SMBs are Off" = "Planifier quand les SMB sont désactivés"; /* */ -"Change ISF and CR" = "Change ISF and CR"; +"Change ISF and CR" = "Changer ISF et CR"; /* */ -"Change ISF" = "Change ISF"; +"Change ISF" = "Changer ISF"; /* */ -"Change CR" = "Change CR"; +"Change CR" = "Changer CR"; /* */ -"SMB Minutes" = "SMB Minutes"; +"SMB Minutes" = "Minutes SMB"; /* */ "UAM SMB Minutes" = "UAM SMB Minutes"; /* */ -"Start new Profile" = "Start new Profile"; +"Start new Profile" = "Commencer un nouveau profil"; /* */ -"Save as Profile" = "Save as Profile"; +"Save as Profile" = "Enregistrer comme profil"; /* */ -"Return to Normal" = "Return to Normal"; +"Return to Normal" = "Revenir à la normale"; /* Alert */ -"Return to Normal?" = "Return to Normal?"; +"Return to Normal?" = "Revenir à la normale?"; /* */ -"This will change settings back to your normal profile." = "This will change settings back to your normal profile."; +"This will change settings back to your normal profile." = "Cela changera les paramètres à votre profil normal."; /* Start Profile Alert */ -"Start Profile" = "Start Profile"; +"Start Profile" = "Profil de démarrage"; /* */ -"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "L'insuline basale de votre profil sera ajustée en fonction du pourcentage d'annulation et l'ISF et la CR de votre profil seront inversement ajustés en fonction de ce pourcentage.\n\nSi vous désactivez l'annulation, tous les paramètres du profil reviendront à la normale."; /* */ -"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile."; +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Commencer cette substitution changera vos Profils et/ou votre Glycémie cible utilisé pour boucler pendant toute la durée sélectionnée. Tapez sur \"Démarrer le profil\" pour démarrer votre nouveau profil ou modifier votre profil actif actuel."; /* Change Target glucose in profile settings */ -"Override Profile Target" = "Override Profile Target"; +"Override Profile Target" = "Remplacer la cible du profil"; /* Alert string. Keep spaces. */ -" SMBs are disabled either by schedule or during the entire duration." = " SMBs are disabled either by schedule or during the entire duration."; +" SMBs are disabled either by schedule or during the entire duration." = " Les SMB sont désactivés soit par horaire, soit pendant toute la durée."; /* Alert strings. Keep spaces */ -" infinite duration." = " infinite duration."; +" infinite duration." = " durée infinie."; /* Service Section */ -"App Icons" = "App Icons"; +"App Icons" = "Icône de l’app"; /* */ -"iAPS Icon" = "iAPS Icon"; +"iAPS Icon" = "Icône iAPS"; /* Service Section */ -"Statistics and Home View" = "Statistics and Home View"; +"Statistics and Home View" = "Statistiques et Vue Accueil"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Supprimer les équivalents de glucides ?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Tous les FPUs du repas seront supprimés."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Supprimer Glucose?"; /* */ -"Meal Presets" = "Meal Presets"; +"Meal Presets" = "Préréglages des repas"; /* */ -"Empty" = "Empty"; +"Empty" = "Vide"; /* */ -"Delete Selected Preset" = "Delete Selected Preset"; +"Delete Selected Preset" = "Supprimer le préréglage"; /* */ -"Enter Meal Preset Name" = "Enter Meal Preset Name"; +"Enter Meal Preset Name" = "Entrez le nom du préréglage du repas"; /* */ -"Name Of Dish" = "Name Of Dish"; +"Name Of Dish" = "Nom du plat"; /* Save Carbs and continue to bolus recommendation */ -"Save and continue" = "Save and continue"; +"Save and continue" = "Enregistrer et continuer"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Enregistrer en tant que préréglage"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Prédictions"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Afficher les protéines et graisses"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ -"Warning!" = "Warning!"; +"Warning!" = "Attention!"; /* Alert to confirm bolus amount to add */ -"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; +"\n\nTap 'Add' to continue with selected amount." = "\n\nAppuyez sur 'Ajouter' pour continuer avec le montant sélectionné."; /* */ -"Eventual Glucose" = "Eventual Glucose"; +"Eventual Glucose" = "Glucose éventuel"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Patientez s''il vous plait"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Glycémie, "; /* */ -"Target Glucose" = "Target Glucose"; +"Target Glucose" = "Glycémie cible"; /* */ -"Percentage setting" = "Percentage setting"; +"Percentage setting" = "% Charge Utilisation"; /* */ -"Insulin Sensitivity" = "Insulin Sensitivity"; +"Insulin Sensitivity" = "Facteur de sensibilité à l’insuline"; /* Formula displayed in Bolus info pop-up. Make translation short! */ -"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; +"(Eventual Glucose - Target) / ISF" = "(Glycémie ventuelle - Cible) / ISF"; /* */ -"Formula:" = "Formula:"; +"Formula:" = "Formule:"; /* Bolus pop-up footer */ -"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Les glucides et l'insuline précédente sont inclus dans la prédiction du glucose, mais si la glycémie éventale est inférieure à la glycémie cible, un bolus ne sera pas recommandé."; /* Hide pop-up */ -"Hide" = "Hide"; +"Hide" = "Masquer"; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Glycémie Eventuelle > Glycémie Cible, mais le glucose est prévu pour la première fois dans la liste déroulante à "; /* Bolus pop-up / Alert string. Make translations concise! */ -"which is below your Threshold (" = "which is below your Threshold ("; +"which is below your Threshold (" = "qui est inférieur à votre seuil ("; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Glycémie Eventuelle > Glycémie Cible, mais le glucose monte plus lentement que prévu. Attendu : "; //* Bolus pop-up / Alert string. Make translations concise! */ -". Climbing: " = ". Climbing: "; +". Climbing: " = ". Montée : "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Glycémie Eventuelle > Glycémie Cible, mais le glucose monte plus lentement que prévu. Attendu : "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Falling: " = ". Falling: "; +". Falling: " = ". Diminue: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Glycémie Eventuelle > Glycémie Cible, mais le glucose monte plus lentement que prévu. Attendu : "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Changing: " = ". Changing: "; +". Changing: " = ". - Changement: "; /* Add insulin without bolusing alert */ -" without bolusing" = " without bolusing"; +" without bolusing" = " ajouter sans injection de bolus"; /* ------------------------------------------------------------------------------------------- DASH strings @@ -1478,15 +1478,15 @@ Enact a temp Basal or a temp target */ /* */ "Deactivating..." = "Désactivation en cours"; -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Appairer le Pod"; /* Text for previous pod information row */ "Previous Pod Information" = "Informations du Pod précédent"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Rappels de confiance"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Les rappels de confiance sont des bips émis par le Pod qui peuvent être utilisés pour confirmer l'exécution des commandes sélectionnées."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Sauvegarde..."; @@ -1516,10 +1516,10 @@ Enact a temp Basal or a temp target */ "No confidence reminders are used." = "Aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Les rappels de confiance retentissent pour les commandes que vous initiez, comme le bolus, l'annulation du bolus, la suspension, la reprise, l'enregistrement des rappels de notification, etc. Lorsque l'application ajuste automatiquement l'administration, aucun rappel de confiance n'est utilisé."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Des rappels de confiance retentissent lorsque l'application ajuste automatiquement la livraison ainsi que pour les commandes que vous lancez."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Rappel d'expiration activé"; @@ -1592,7 +1592,7 @@ Enact a temp Basal or a temp target */ "Setup Complete" = "Mise en place terminée"; /* */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Insuline suspendue"; /* Text for suspend resume button when insulin delivery is suspending */ "Suspending insulin delivery..." = "Suspension de la distribution d'insuline..."; @@ -1604,32 +1604,32 @@ Enact a temp Basal or a temp target */ "Resuming insulin delivery..." = "Reprendre l'injection d'insuline..."; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Échec de la suspension de l'administration d'insuline"; //* -----------------------------------------------------------------------*/ /* ----------------------Statistics strings -------------------------------*/ /* */ -"Today" = "Today"; +"Today" = "Aujourd'hui"; /* */ -"Day" = "Day"; +"Day" = "Jour"; /* */ -"Week" = "Week"; +"Week" = "Semaine"; /* */ -"Month" = "Month"; +"Month" = "Mois"; /* */ "Total" = "Total"; /* Headline Statistics */ -"Statistics" = "Statistics"; +"Statistics" = "Statistiques"; /* Option in preferences */ -"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; +"Allow Upload of Statistics to NS" = "Autoriser le téléchargement de statistiques vers NS"; /* Low Glucose Threshold in Statistics settings */ "Low" = "Faible"; @@ -1638,64 +1638,64 @@ Enact a temp Basal or a temp target */ "High" = "Élevée"; /* In Range */ -"In Range" = "In Range"; +"In Range" = "À portée"; /* Display % */ -"Change HbA1c Unit" = "Change HbA1c Unit"; +"Change HbA1c Unit" = "Changer l'unité HbA1c"; /* */ -"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; +"Display Chart X - Grid lines" = "Affichage Graphique X - Lignes de la grille"; /* */ -"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; +"Display Chart Y - Grid lines" = "Graphique d'affichage Y - Lignes de la grille"; /* */ -"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; +"Display Chart Threshold lines for Low and High" = "Afficher les lignes de seuil du graphique pour les lignes basse et haute"; /* */ -"Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; +"Standing / Laying TIR Chart" = "Graphique TIR debout / Mise en page"; /* */ -"Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +"Hours X-Axis (6 default)" = "Heures X Axis (6 par défaut)"; /* */ -"2 hours" = "2 hours"; +"2 hours" = "2 heures"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 heures"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 heures"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 heures"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 heures"; /* Average BG = */ -"Average" = "Average"; +"Average" = "Moyenne"; /* Median BG */ -"Median" = "Median"; +"Median" = "Médiane"; /* CGM readings in statView */ -"Readings" = "Readings"; +"Readings" = "Données"; /* CGM readings in statView */ -"Readings / 24h" = "Readings / 24h"; +"Readings / 24h" = "Lectures / 24h"; /* Days of saved readings*/ -"Days" = "Days"; +"Days" = "Jours"; /* Normal BG (within TIR) */ "Normal" = "Normal"; /* Title High BG in statPanel */ -"High (>" = "High (>"; +"High (>" = "Haut (>"; /* Title Low BG in statPanel */ -"Low (<" = "Low (<"; +"Low (<" = "Bas (<"; /* SD */ "SD" = "SD"; @@ -1707,78 +1707,78 @@ Enact a temp Basal or a temp target */ "HbA1c" = "HbA1c"; /* Total number of days of data for HbA1c estimation, part 1/2*/ -"All" = "All"; +"All" = "Toutes"; /* Total number of days of data for HbA1c estimation, part 2/2*/ -"days" = "days"; +"days" = "jours"; /* Nr of Loops in statPanel */ -"Loops" = "Loops"; +"Loops" = "Boucles"; /* Loop Errors in statPanel */ -"Errors" = "Errors"; +"Errors" = "Erreurs"; /* Average loop interval */ -"Interval" = "Interval"; +"Interval" = "Intervalle"; /* Median loop interval */ "Duration" = "Durée"; /* "Display SD */ -"Display SD instead of CV" = "Display SD instead of CV"; +"Display SD instead of CV" = "Afficher la SD au lieu du CV"; /* Description for display SD */ -"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Afficher la déviation standard (SD) au lieu du coefficient de variation (CV) dans le panneau d'état"; /* How often to update the statistics */ -"Update every number of minutes:" = "Update every number of minutes:"; +"Update every number of minutes:" = "Mettre à jour chaque nombre de minutes :"; /* Description for update interval for statistics */ -"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "La valeur par défaut est de 20 minutes. Combien de fois mettre à jour et enregistrer les statistiques.json et télécharger le dernier tableau, une fois activé, sur Nightscout."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "Past 24 Hours "; +"Past 24 Hours " = "Dernières 24 Heures "; /* Duration displayed in statPanel */ -"Past Week " = "Past Week "; +"Past Week " = "Cette semaine "; /* Duration displayed in statPanel */ -"Past Month " = "Past Month "; +"Past Month " = "Mois passé "; /* Duration displayed in statPanel */ -"Past 90 Days " = "Past 90 Days "; +"Past 90 Days " = "Les 90 derniers jours "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "All Past Days of Data "; +"All Past Days of Data " = "Tous les derniers jours de données "; /* "Display Loop statistics in statPanel */ -"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; +"Display Loop Cycle statistics" = "Afficher les statistiques du cycle de boucle"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; +"Displays Loop statistics in the statPanel in Home View" = "Affiche les statistiques en boucle dans le panneau d'état dans la vue d'accueil"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Changer l'unité HbA1c par défaut dans statPanlel. L'unité dans le panneau d'état sera mise à jour avec la prochaine mise à jour statistics.json"; /* HbA1c for all glucose storage days */ -"all" = "all"; +"all" = "toutes"; /* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ -"CGM Configuration" = "CGM Configuration"; +"CGM Configuration" = "Configuration du CGM"; -"Heartbeat" = "Heartbeat"; +"Heartbeat" = "Battement de coeur"; -"CGM address :" = "CGM address :"; +"CGM address :" = "Adresse CGM :"; -"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; +"CGM is not used as heartbeat." = "La CGM n'est pas utilisée comme battements de cœur."; -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Voulez-vous vraiment supprimer ce CGM?"; /* New Experimental feature */ -"Experimental" = "Experimental"; +"Experimental" = "Expérimental"; /* Smoothing of CGM readings */ -"Smooth Glucose Value" = "Smooth Glucose Value"; +"Smooth Glucose Value" = "Valeur Glycémie lisse"; /* ----------------------------------------------------------------------------------------------------------- @@ -1787,112 +1787,112 @@ Enact a temp Basal or a temp target */ */ /* Headline Rewind Resets Autosens */ -"Rewind Resets Autosens" = "Rewind Resets Autosens"; +"Rewind Resets Autosens" = "Rembobinage Réinitialisation Autosens"; /* ”Rewind Resets Autosens” */ "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "Cette fonctionnalité, activée par défaut, réinitialise le ratio autosens à neutre lorsque vous changez votre pompe/site en se basant sur l'hypothèse que cela correspond à un changement probable de site. L’Autosens reprendra l’apprentissage de la sensibilité à partir du changement de site, ce qui peut prendre jusqu’à 6 heures. Si vous ré-initialisez votre pompe indépendamment d'un changement de site, vous pouvez envisager de désactiver cette fonctionnalité."; /* Headline "High Temptarget Raises Sensitivity" */ -"High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; +"High Temptarget Raises Sensitivity" = "Une cible élevée augmente la sensibilité"; /* ”High Temptarget Raises Sensitivity" */ "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Valeur par défaut à faux. Lorsqu'elle est définie à vrai, augmente la sensibilité (ratio de sensibilité inférieure) pour les cibles temporaires à >= 111. Synonyme du mode exercice. Plus votre cible temporaire est élevée, plus les ratios (inférieurs) seront sensibles, par ex. la cible temp de 120 résulte en un ratio de sensibilité de 0,75 tandis que 140 donne 0,6 (avec halfBasalTarget par défaut de 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ -"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; +"Low Temptarget Lowers Sensitivity" = "Une cible faible réduit la sensibilité"; /* ”Low Temptarget Lowers Sensitivity" */ "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Valeur par défaut à faux. Lorsqu'elle est définie à vrai, augmente la sensibilité (ratio de sensibilité inférieur) pour les cibles temporaires à <= 99. Plus votre cible temporaire est élevée, plus les ratios (inférieurs) seront sensibles, par ex. la cible temp de 95 résulte en un ratio de sensibilité de 1,09 tandis que 85 donne 1,33 (avec halfBasalTarget par défaut de 160)."; /* Headline ”Sensitivity Raises Target" */ -"Sensitivity Raises Target" = "Sensitivity Raises Target"; +"Sensitivity Raises Target" = "Sensibilité augmente la cible"; /* ”Sensitivity Raises Target" */ "When true, raises BG target when autosens detects sensitivity" = "Quand vrai, augmente la cible Glycémie lorsque l'autosens détecte une plus grande sensibilité"; /* Headline ”Resistance Lowers Target" */ -"Resistance Lowers Target" = "Resistance Lowers Target"; +"Resistance Lowers Target" = "Résistance diminue la cible"; /* ”Resistance Lowers Target" */ "Defaults to false. When true, will lower BG target when autosens detects resistance" = "Faux par défaut. Quand vrai, réduira la cible de glycémie lorsque l'autosens détecte une résistance à l'insuline"; /* Headline ”Advanced Target Adjustments" */ -"Advanced Target Adjustments" = "Advanced Target Adjustments"; +"Advanced Target Adjustments" = "Ajustements de la cible avancés"; /* ”Advanced Target Adjustments" */ "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Cette fonctionnalité a été précédemment activée par défaut, mais sera maintenant par défaut à false (ne sera PAS activée automatiquement) dans oref0 0.6.0 et au-delà. Cette fonctionnalité réduit automatiquement la glycémie cible d’oref0 lorsque la glycémie actuelle et éventuellement la glycémie sont élevées. Cela aide à prévenir et à atténuer la glycémie élevée, mais passe automatiquement à la glycémie basse pour s'assurer que la glycémie descend en douceur vers votre cible réelle. Si vous trouvez ce comportement trop agressif, vous pouvez désactiver cette fonctionnalité. Si vous le faites, faites-le nous savoir afin que nous puissions mieux comprendre les paramètres qui conviennent le mieux à tout le monde."; /* Headline "Exercise Mode" */ -"Exercise Mode" = "Exercise Mode"; +"Exercise Mode" = "Mode exercice"; /* "Exercise Mode" */ "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "La valeur par défaut est désactivé. Quand activé, toute cible glycemique temporaire avec une valeur > 105 mg/dL entraine une augmentation de l'Isf (sensibilité à l'insuline). Synonyme de la préférence high_temptarget_raises_sensibilité"; /* Headline "Wide BG Target Range" */ -"Wide BG Target Range" = "Wide BG Target Range"; +"Wide BG Target Range" = "Portée de la cible Glycémie large"; /* "Wide BG Target Range" */ "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "La valeur par défaut est désactivé, ce qui signifie par défaut que seule la valeur basse de la plage cible de glycémie de la pompe est utilisée comme cible OpenAPS. Il s'agit d'une caractéristique de sécurité qui permet d'éviter des cibles trop larges et des résultats moins optimaux. Par conséquent, la valeur supérieure de la cible glycemique n'est utilisée que pour éviter les surcorrections de l'assistant de bolus. Activez cette option pour forcer l'utilisation de l'ensemble de la plage de cible glycemique dans l'algorithme."; /* Headline "Skip Neutral Temps" */ -"Skip Neutral Temps" = "Skip Neutral Temps"; +"Skip Neutral Temps" = "Sauter le temps neutre"; /* "Skip Neutral Temps" */ "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "La valeur par défaut est faux, de sorte que iAPS définisse une valeur basal dès qu'il le peut, donc il sera plus facile de voir si le système fonctionne, même lorsque vous êtes hors ligne. Cela signifie qu'OpenAPS définira une valeur basale « neutre » (identique à votre basal par défaut) si aucun ajustement n'est nécessaire. Ceci est un ancien paramètre d'OpenAPS afin de minimiser les sons et les notifications de la 'rig', qui pouvaient vous réveiller pendant la nuit. "; /* Headline "Unsuspend If No Temp” */ -"Unsuspend If No Temp" = "Unsuspend If No Temp"; +"Unsuspend If No Temp" = "Annuler la suspension si aucune température"; /* "Unsuspend If No Temp” */ "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "De nombreuses personnes oublient parfois de reprendre / désuspendre leur pompe après la reconnexion. Si vous êtes l'un d'eux, et que vous êtes définissez un basal temporaire à zéro chaque fois que vous suspendez ou débranchez votre pompe, cette fonction peut être pertinente. Si cette option est activée, elle reprendra automatiquement le basal en cours si vous oubliez de reprendre votre pompe. Tant que la valeur temporaire de basal est de zéro, elle laissera la pompe suspendue."; /* Headline "Enable UAM" */ -"Enable UAM" = "Enable UAM"; +"Enable UAM" = "Activer UAM"; /* "Enable UAM" */ "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Avec cette option activée, l'algorithme SMB peut reconnaître les repas non annoncés. Ceci est utile, si vous oubliez d'indiquer à iAPS un apport glucidique ou une mauvaise estimation de l'apport de glucides ou si un repas contenant beaucoup de gras et de protéines a un impact sur une duree d'absorption plus longue que prévu. Sans aucune entrée de glucides, UAM peut reconnaître des augmentations rapides de glucemie causées par des glucides, l'adrénaline, etc, et tente de l'ajuster avec les SMB. Cela fonctionne également dand le sens inverse : s'il y a une réduction rapide de glycémie, il peut arrêter les SMB plus tôt."; /* Headline "Enable SMB With COB" */ -"Enable SMB With COB" = "Enable SMB With COB"; +"Enable SMB With COB" = "Activer SMB avec COB"; /* Enable SMB With COB" */ "This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Cela permet l'activation de micro bolus (SMB) alors que des glucides à bord (COB) sont presents. ."; /* Headline "Enable SMB With Temptarget” */ -"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; +"Enable SMB With Temptarget" = "Activer SMB avec les cibles temporaires"; /* "Enable SMB With Temptarget” */ "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Active les Micro bolus (SMB) lorsqu'une cible temporaire est activé, notamment pour les cibles type \"repas bientôt\". Avec cette fonctionnalité activée, toute cible temporaire inférieure à 100mg/dL, comme une cible temp de 99 (ou 80, la cible conseillée pour \"repas bientôt\") activera les SMB."; /* Headline "Enable SMB Always" */ -"Enable SMB Always" = "Enable SMB Always"; +"Enable SMB Always" = "Activer en permanence les SMB"; /* "Enable SMB Always" */ "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "La valeur par défaut est désactivé. Quand activé, les micro bolus sont toujours utilisés par l'algorithme (sauf pour des cibles glycémies haute )."; /* Headline "Enable SMB After Carbs" */ -"Enable SMB After Carbs" = "Enable SMB After Carbs"; +"Enable SMB After Carbs" = "Activer les SMB après les glucides"; /* "Enable SMB After Carbs" */ "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Desactivé par défaut. Quand vrai, active les micro bolus (SMB) pendant 6h après les glucides, même avec 0 glucides à bord (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Autoriser le SMB avec une cible temporaire élevée"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Autoriser le SMB avec une cible temporaire élevée"; /* "Allow SMB With High Temptarget" */ "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Desactivé par défaut. Quand vrai, autorise les Micro bolus (si activé) même avec des cibles temporaires élevées."; /* Headline "Use Custom Peak Time” */ -"Use Custom Peak Time" = "Use Custom Peak Time"; +"Use Custom Peak Time" = "Utiliser le temps maximal personnalisé"; /* "Use Custom Peak Time” */ "Defaults to false. Setting to true allows changing insulinPeakTime" = "Faux par défaut. Le paramètre à vrai permet de changer le paramètre \"duree du pic d'insuline\""; /* Headline "Suspend Zeros IOB” */ -"Suspend Zeros IOB" = "Suspend Zeros IOB"; +"Suspend Zeros IOB" = "Suspendre les zéros IOB"; /* "Suspend Zeros IOB” */ "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "La valeur par défaut est desactivé. Tout basal temporaire existant pendant les périodes de suspension de la pompe sera supprimé et basal temporaire à zéro pour annuler le débit de basal du profil lors de la suspension de la pompe sera ajouté."; @@ -1904,31 +1904,31 @@ Enact a temp Basal or a temp target */ "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB est la quantité maximale d'insuline à bord de toutes les sources – à la fois l'insuline basale (ou les corrections SMB) et l'insuline bolus – que votre boucle est autorisée à accumuler pour traiter la glycémie plus élevée que la cible. Contrairement aux deux autres paramètres de sécurité OpenAPS (max_daily_safety_multiplier et current_basal_safety_multiplier), max_iob est défini comme un nombre fixe d'unités d'insuline.Les bolus manuels ne sont PAS limités par ce paramètre. \n\n Pour tester vos débits de basal pendant la nuit, vous pouvez modifier le paramètre max IA à zéro en boucle fermée. Cela activera le mode de suspension de glycémie faible lors du test de vos paramètres de débit de basal\n\n(Conseils de https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ -"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; +"Max Daily Safety Multiplier" = "Multiplicateur max quotidien de sécurité"; /* "Max Daily Safety Multiplier" */ "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Ceci est une limite de sécurité importante pour OpenAPS. Le paramètre par défaut ( peu susceptible d'avoir besoin d'être ajusté) est 3. Cela signifie qu’OpenAPS ne sera jamais autorisé à définir un débit basal temporaire supérieur à 3 fois le taux de basal horaire le plus élevé programmé dans la pompe d’un utilisateur, ou, si activé, déterminé par autotune."; /* Headline "Current Basal Safety Multiplier" */ -"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; +"Current Basal Safety Multiplier" = "Multiplicateur de sécurité basale courante"; /* "Current Basal Safety Multiplier" */ "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Ceci est une autre limite de sécurité importante pour OpenAPS. Le paramètre par défaut (qui est également peu susceptible d'avoir besoin d'être ajusté) est 4. Cela signifie qu’OpenAPS ne sera jamais autorisé à définir un débit de base temporaire supérieur à 4 fois le débit de base horaire actuel programmé dans la pompe d’un utilisateur, ou, si activé, déterminé par autotune."; /* Headline "Autosens Max" */ -"Autosens Max" = "Autosens Max"; +"Autosens Max" = "Autosens Maximal"; /* "Autosens Max" */ "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "Il s'agit d'une limite de multiplicateur pour autosens (et autotune) pour définir une limite maximale de 20% du ratio autosens qui détermine à son tour à quel point une glycémie élevée peut ajuster les bases, à quel niveau il peut ajuster l'ISF et à quel point il peut modifier la cible de glycémie."; /* Headline "Autosens Min" */ -"Autosens Min" = "Autosens Min"; +"Autosens Min" = "Autosens Minimal"; /* "Autosens Min" */ "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "L'autre paramètre de sécurité de l'autosens, mettant un plafond sur la manière dont l'autosens faible peut ajuster les basals, et à quelle hauteur il peut ajuster les cibles ISF et Glycémie."; /* Headline "Half Basal Exercise Target" */ -"Half Basal Exercise Target" = "Half Basal Exercise Target"; +"Half Basal Exercise Target" = "Demi-exercice basal Objectif"; /* "Half Basal Exercise Target" */ "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Définit la valeur de glycémie à 50 % du niveau basal. Par ex. 160 signifie que lorsque la cible temporaire est de 160 mg/dL et exercise_mode=true, oref0 fixe la valeur basale à 50% de la valeur normale (120 = 75%; 140 = 60%). Cela peut être ajusté, pour vous donner plus de contrôle sur vos modes d'exercice."; @@ -1937,164 +1937,164 @@ Enact a temp Basal or a temp target */ "Max COB" = "Max COB"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "La valeur par défaut de maxCOB est 120. (Si quelqu'un entre plus de glucides dans une ou plusieurs entrées, iAPS plafonnera le COB au maxCOB et le conservera au maxCOB jusqu'à ce que les glucides inscrits au-dessus du maxCOB aient été absorbés. Essentiellement, cela limite simplement l'UAM comme un plafond de sécurité contre les calculs bizarres de COB en raison de données fluide.)"; /* Headline "Bolus Snooze DIA Divisor" */ -"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; +"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Diviseur"; /* "Bolus Snooze DIA Divisor" */ "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze est activé apres votre bolus de repas, la boucle ne réagira pas avec des valeurs basses temporaire quand vous venez juste de manger. L’exemple ici et la valeur par défaut est 2 ; donc avec une Durée d'Action (DIA) de 3 heures signifie que snooze bolus sera graduellement éliminé après 1,5 heures (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ -"Min 5m Carbimpact" = "Min 5m Carbimpact"; +"Min 5m Carbimpact" = "Impact des glucides de 5 m au minimum"; /* "Min 5m Carbimpact" */ "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Il s'agit d'un paramètre définissant l'absorption par défaut des glucides sur 5 minutes. La valeur par défaut est de 8 mg/dL/5min. Cela affecte la vitesse de dégradation des COB dans les situations où l'absorption de glucides n'est pas visible dans les écarts de glycémie. La valeur par défaut de 8 mg/dL/5min correspond à un taux d'absorption minimale de glucides de 24g/h à un CSF de 4 mg/dL/g."; /* Headline "Autotune ISF Adjustment Fraction" */ -"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; +"Autotune ISF Adjustment Fraction" = "Ajustement automatique de la fraction d'ajustement de la ISF"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "La valeur par défaut de 0,5 rapproche l'ISF de l'autocalibrage de l'ISF de la pompe par le biais d'une moyenne pondérée de fullNewISF et pumpISF. La valeur 1.0 permet un ajustement complet, la valeur 0 ne permet pas d'ajuster l'ISF de la pompe."; /* Headline "Remaining Carbs Fraction" */ -"Remaining Carbs Fraction" = "Remaining Carbs Fraction"; +"Remaining Carbs Fraction" = "Fraction de glucides restante"; /* "Remaining Carbs Fraction" */ "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Il s’agit de la fraction des glucides que nous supposons absorber plus de 4h si nous ne voyons pas encore d’absorption des glucides."; /* Headline "Remaining Carbs Cap" */ -"Remaining Carbs Cap" = "Remaining Carbs Cap"; +"Remaining Carbs Cap" = "Plafond de Glucides restant"; /* "Remaining Carbs Cap" */ "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Il s’agit de la quantité maximale de glucides que nous supposons absorber sur 4h si nous ne voyons pas encore d’absorption de glucides."; /* Headline ”Max SMB Basal Minutes" */ -"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; +"Max SMB Basal Minutes" = "Minutes de Basal max SMB"; /* ”Max SMB Basal Minutes" */ "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Par défaut, il faut démarrer à 30 minutes. Il s'agit de la durée maximale en minutes du niveau basal qui peuvent être livrées en tant que simple SMB avec des COB non couverts. Cela permet de rendre SMB plus agressif si vous le souhaitez. Il est recommandé que la valeur soit définie au départ à 30, conformément à la valeur par défaut, et si vous choisissez d'augmenter cette valeur, le faire par pas de 15 minutes et en gardant un œil attentif sur les effets des changements. Il n'est pas recommandé de définir cette valeur supérieure à 90 mins, car cela peut affecter la capacité de l'algorithme."; /* Headline "Max UAM SMB Basal Minutes" */ -"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; +"Max UAM SMB Basal Minutes" = "Max UAM SMB Minutes basales"; /* "Max UAM SMB Basal Minutes" */ "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "La valeur par défaut est à 30. Il s'agit de la durée maximale en minutes du niveau basal qui peuvent être délivrées par UAM en tant que SMB unique lorsque l'IOB dépasse COB. Cela donne la possibilité de rendre UAM plus ou moins agressif si vous le souhaitez. Il est recommandé que la valeur commence à 30, conformément à la valeur par défaut, et si vous choisissez d'augmenter cette valeur, le faire par pas de 15 minutes, en gardant un œil attentif sur les effets des changements. La réduction de la valeur entraînera à injecter moins d'insuline pour chaque SMB. Il n'est pas recommandé de définir cette valeur supérieure à 60 mins, car cela peut affecter la capacité de l'algorithme."; /* Headline "SMB Interval" */ -"SMB Interval" = "SMB Interval"; +"SMB Interval" = "Intervalle SMB"; /* "SMB Interval" */ -"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Durée minimale en minutes pour une nouvelle SMB depuis le dernier bolus SMB ou manuellement"; /* Headline "Bolus Increment" */ -"Bolus Increment" = "Bolus Increment"; +"Bolus Increment" = "Incrément de Bolus"; /* "Bolus Increment" */ -"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "La plus petite quantité de SMB promulguée. La quantité minimale pour les pompes Omnipod est de 0,05 U, tandis que pour les pompes Medtronic, elle varie selon les modèles, de 0,025 U à 0,10 U. Veuillez vérifier la quantité minimale de bolus qui peut être délivrée par votre pompe. La valeur par défaut est de 0,1."; /* Headline "Insulin Peak Time" */ -"Insulin Peak Time" = "Insulin Peak Time"; +"Insulin Peak Time" = "Durée du pic d'insuline"; /* "Insulin Peak Time" */ "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Temps de réduction maximale de l'effet de glycémie de l'insuline, en minutes. Attention : Oref suppose pour les courbes ultra-rapides (Lyumjev) et à action rapide (Fiasp) un minimum (35 & 50 min) et un maximum (100 & 120 min) applicable. Utiliser une valeur personnalisée en dehors de ces limites entraînera des problèmes avec iAPS, des calculs de boucle plus longs et d'éventuelles boucles rouges."; /* Headline "Carbs Req Threshold" */ -"Carbs Req Threshold" = "Carbs Req Threshold"; +"Carbs Req Threshold" = "Seuil de glucides requis"; /* "Carbs Req Threshold" */ "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Quantité de glucides requis pour déclencher une alerte. Par défaut à 1 g de glucides. Peut être augmenté si vous voulez seulement obtenir une alerte au seuil X."; /* Headline "Noisy CGM Target Multiplier" */ -"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; +"Noisy CGM Target Multiplier" = "Multiplicateur de cible CGM avec bruit"; /* "Noisy CGM Target Multiplier" */ "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "La valeur par défaut est 1.3. Augmente la cible de ce ratio lorsque le bouclage s'appuie sur des données brutes/non filtrées"; /* Headline "SMB DeliveryRatio" */ -"SMB DeliveryRatio" = "SMB DeliveryRatio"; +"SMB DeliveryRatio" = "Ratio de livraison pour les SMB"; /* SMB DeliveryRatio */ -"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Valeur par défaut : 0.5 Ceci est une autre limite de sécurité OpenAPS, et spécifie quelle part de l'insuline totale requise peut être délivrée en tant que SMB. Augmentez cette valeur expérimentale lentement et avec prudence."; // Dynamic ISF + CR Settings: /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Enable Dynamic ISF, Headline */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Activer ISF dynamique"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Activer ISF dynamique"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculer une nouvelle SI à chaque cycle de boucle. Le nouveau FSI sera basé sur la glycémie actuelle, le TDD d'insuline (après 24 heures ou une moyenne pondérée) et un facteur d'ajustement (valeur par défaut est 1).\n\nLes ratios ISF et CR dynamiques seront limités par vos limites autosens.min/max.\n\nRatio dynamique remplace le ratio autosens.ratio : Nouveau SI = FI statique / Ratio dynamique,\nRatio dynamique = profil. fr * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; /* Headline "Enable Dynamic CR" */ -"Enable Dynamic CR" = "Enable Dynamic CR"; +"Enable Dynamic CR" = "Activer CR dynamique"; /* Enable Dynamic CR */ -"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Utiliser le CR. dynamique. Le ratio dynamique sera utilisé pour CR comme suit:\n\n Quand ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nRatio < 1 : dynCR = CR/dynCR.\n\nN'utilisez pas de toghether avec une fraction d'insuline élevée (> 2)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Ajuster les ratios dynamiques par une constante. La valeur par défaut est de 0,5. Plus la valeur est élevée, plus la correction de votre SI sera grande ou faible glycémie. La correction maximale est déterminée par les paramètres min/max d'Autosens. Pour la fonction Sigmoid un facteur de réglage de 0.4 - 0.5 est recommandé pour commencer. Pour la formule logaritmique threre est moins consensuel, mais commencer avec 0.5 - 0.8 est plus approprié pour la plupart des utilisateurs"; /* Headline "Use Sigmoid Function" */ -"Use Sigmoid Function" = "Use Sigmoid Function"; +"Use Sigmoid Function" = "Utiliser la fonction Sigmoid"; /* Use Sigmoid Function */ -"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Utilisez une fonction sigmoid pour ISF (et pour CR, quand activé), au lieu de la formule logarithmique par défaut. Nécessite que le paramètre ISF dynamique soit activé dans les paramètres\n\nLe paramètre Ajustement ajuste la pente de la courbe (Y : ratio dynamique, X: Glucose de sang). Une valeur inférieure ==> moins raide, == moins agressive.\n\nL'autosens. Les paramètres in/max déterminent à la fois les limites max/min pour le ratio dynamique ET combien le rapport dynamique est ajusté. Si AF est la pente de la courbe, l’autosens. in/max est la hauteur du graphique, l'intervalle Y, où le rapport dynamique, la courbe aura toujours une forme sigmoïde, peu importe l'autosens. Les paramètres in/max sont utilisés, ce qui signifie que ces paramètres ont de grandes conséquences sur le résultat de la SI dynamique calculée. Soyez prudent en définissant une valeur autosens.max trop élevée. Avec un réglage correct du profil ISF, vous n'aurez probablement jamais besoin qu'il soit supérieur à 1.\n\nUne limite Autosens.max > 1.5 n'est pas recommandée lors de l'utilisation de la fonction sigmoid."; /* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +"Threshold Setting (mg/dl)" = "Réglage du seuil (mg/dl)"; /* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Le seuil par défaut du iAPS dépend de votre cible de glycémie minimale actuelle, comme suit :\n\nSi votre cible de glycémie minimale = 90 mg/dl -> seuil = 65 mg/dl,\n\nsi cible Glycémie minimale = 100 mg/dl -> seuil = 70 mg/dl,\n\nobjectif minimum de glycémie = 110 mg/dl -> seuil = 75 mg/dl,\n\net si l'objectif de glycémie minimum = 130 mg/dl -> seuil = 85 mg/dl.\n\nCe paramètre vous permet de changer le seuil par défaut pour la boucle avec dynISF. Les valeurs valides sont 65 mg/dl<= Seuil <= 120 mg/dl."; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ -"Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; +"Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; /* Weight of past 24 hours of insulin */ -"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Doit être > 0 et <= 1.\nLa valeur par défaut est 0.65 (65 %) * TDD. Le reste sera de la moyenne des données totales (jusqu'à 14 jours) de tous les calculs TDD (35 %). Pour utiliser uniquement les dernières 24 heures, réglez ceci à 1.\n\nPour éviter les fluctuations soudaines, par exemple après un grand repas, une moyenne des 2 dernières heures de calculs TDD est utilisée au lieu de la TDD actuelle (24 heures en ce moment)."; /* Headline "Adjust basal" */ -"Adjust basal" = "Adjust basal"; +"Adjust basal" = "Ajuster le Basal"; /* Enable adjustment of basal profile */ -"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Activer l'ajustement de la base en fonction du ratio TDD / TDD moyenne de 7 jours"; /* Headline "Max Delta-BG Threshold SMB" */ -"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; +"Max Delta-BG Threshold SMB" = "Seuil max Delta-BG SMB"; /* Max Delta-BG Threshold SMB */ -"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "La valeur par défaut est de 0,2 (20%). Le pourcentage maximal positif de changement de niveau de glycémie à utiliser SMB, au dessus de cela désactivera SMB. La limite de 40 % codée en dur. Pour UAM en boucle fermée 30% est conseillé. Observez dans le journal et popup (maxDelta 27 > 20% de BG 100 - désactivant le SMB!)."; /* Headline "... When Blood Glucose Is Over (mg/dl):" */ -"... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; +"... When Blood Glucose Is Over (mg/dl):" = "... Quand la glycémie est dépassée (mg/dl) :"; /* ... When Blood Glucose Is Over (mg/dl): */ -"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Définir la valeur enableSMB_high_bg comparera avec pour activer SMB. Si la glycémie > que cette valeur, les SMBs devraient être activés."; /* Headline "Enable SMB With High BG" */ -"Enable SMB With High BG" = "Enable SMB With High BG"; +"Enable SMB With High BG" = "Activer SMB avec glycémie élevée"; /* "Enable SMB With High BG" */ -"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Activer les SMBs lorsqu'une glycémie élevée est détectée, en fonction de la cible de glycémie élevée (ajustée ou profil)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Dynamic settings"; +"Dynamic settings" = "Paramètres dynamiques"; /* Insulin curve */ -"Insulin curve" = "Insulin curve"; +"Insulin curve" = "Courbe de l'insuline"; /* Headline "Adjustment Factor" */ -"Adjustment Factor" = "Adjustment Factor"; +"Adjustment Factor" = "Facteur appliqué"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 82cbe579e1..e10788db86 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Obiettivi Temporanei"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Cancella carboidrati?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Cancella l'insulina?"; /* Treatments list */ "Treatments" = "Trattamenti"; @@ -1246,7 +1246,7 @@ Enact a temp Basal or a temp target */ "Interval In Minutes" = "Intervallo in minuti"; /* Override */ -"Override With A Factor Of " = "Regolazione con fattore di"; +"Override With A Factor Of " = "Fattore di Regolazione"; /* Description */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Consenti di convertire grassi e proteine in futuri equivalenti di carboidrati utilizzando la formula di Varsavia di chilocalorie divisi per 10.\n\nQuesto diffonde gli equivilanti del carb per un'impostazione di durata massima che può essere configurata da 5-12 ore.\n\nIl ritardo è tempo da ora fino al primo ingresso futuro del carb.\n\nL'intervallo in pochi minuti è il numero di minuti tra le voci. Più breve è l'intervallo, più liscia il risultato. 10, 15, 20, 30 o 60 sono scelte ragionevoli.\n\nIl fattore di aggiustamento è il peso che il grasso e la proteina hanno sulle voci. 1.0 è effetto pieno (metodo di Varsavia originale) e 0. è a metà effetto. Nota che potresti scoprire che il tuo normale rapporto carboidrati deve aumentare ad un numero maggiore se inizi ad aggiungere voci di grasso e proteine. Per questo motivo, è meglio iniziare con un fattore di circa 0,5 per facilitare in esso.\n\nImpostazioni predefinite: Limite temporale: 8 h, Intervallo: 30 min, Fatto: 0.5, Ritardo 60 min"; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistiche e Vista Iniziale"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Cancella i carb equivalenti?"; /* */ "All FPUs of the meal will be deleted." = "Tutti gli indici insulinici del pasto verranno eliminati."; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 022b2297d8..fefb9842b1 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -576,10 +576,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Tijdelijk streefdoel"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Koolhydraten verwijderen?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Insuline verwijderen?"; /* Treatments list */ "Treatments" = "Behandelingen"; @@ -1481,7 +1481,7 @@ Enact a temp Basal or a temp target */ "Pair Pod" = "Koppel Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Vorige Pod informatie"; +"Previous Pod Information" = "Informatie vorige Pod"; /* Text for confidence reminders navigation link */ "Confidence Reminders" = "Bevestigingsmeldingen"; @@ -1534,7 +1534,7 @@ Enact a temp Basal or a temp target */ "No Reminder" = "Geen herinnering"; /* */ -"Scheduled Reminder" = "Geplande herinnering"; +"Scheduled Reminder" = "Geplande melding"; /* */ "Low Reservoir Reminder" = "Laag reservoir herinnering"; @@ -1583,7 +1583,7 @@ Enact a temp Basal or a temp target */ "Add Omnipod Dash" = "Omnipod Dash toevoegen"; /* */ -"Insert Cannula" = "Plaats canule"; +"Insert Cannula" = "Plaats canulle"; /* */ "Check Cannula" = "Check canule"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index b525731d44..b6a0214d60 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1659,7 +1659,7 @@ Enact a temp Basal or a temp target */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; /* */ -"2 hours" = "2 hours"; +"2 hours" = "2小时"; /* */ "4 hours" = "4 hours"; From d89fa2d8d94ae3be5de87a1088d87e8ad44319e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 22:40:20 +0100 Subject: [PATCH 287/405] Prevent G7 crash when deleting CGM ? --- .../Modules/CGM/View/CGMRootView.swift | 6 +++-- .../Modules/Home/View/HomeRootView.swift | 26 ------------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index fc160f3c73..45dad02ad9 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -87,9 +87,11 @@ extension CGM { .navigationTitle("CGM") .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $setupCGM) { - if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm { + if let cgmFetchManager = state.cgmManager, cgmFetchManager.glucoseSource.cgmType == state.cgm, + let cmgManager = cgmFetchManager.glucoseSource.cgmManager + { CGMSettingsView( - cgmManager: cgmFetchManager.glucoseSource.cgmManager!, + cgmManager: cmgManager, bluetoothManager: state.provider.apsManager.bluetoothManager!, unit: state.settingsManager.settings.units, completionDelegate: state diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 9aded753e5..a4cb4165d0 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -250,32 +250,6 @@ extension Home { .modal(for: .dataTable, from: self) } - private func selectedProfile() -> (name: String, isOn: Bool) { - var profileString = "" - var display: Bool = false - - let duration = (fetchedPercent.first?.duration ?? 0) as Decimal - let indefinite = fetchedPercent.first?.indefinite ?? false - let addedMinutes = Int(duration) - let date = fetchedPercent.first?.date ?? Date() - if date.addingTimeInterval(addedMinutes.minutes.timeInterval) > Date() || indefinite { - display.toggle() - } - - if fetchedPercent.first?.enabled ?? false, !(fetchedPercent.first?.isPreset ?? false), display { - profileString = NSLocalizedString("Custom Profile", comment: "Custom but unsaved Profile") - } else if !(fetchedPercent.first?.enabled ?? false) || !display { - profileString = NSLocalizedString("Normal Profile", comment: "Your normal Profile. Use a short string") - } else { - let id_ = fetchedPercent.first?.id ?? "" - let profile = fetchedProfiles.filter({ $0.id == id_ }).first - if profile != nil { - profileString = profile?.name?.description ?? "" - } - } - return (name: profileString, isOn: display) - } - @ViewBuilder private func buttonPanel(_ geo: GeometryProxy) -> some View { ZStack { addHeaderBackground() From 4a89dc774100e72ee73a9b2e474f765c7b5e9ab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 20 Dec 2023 23:28:28 +0100 Subject: [PATCH 288/405] Make Overrides more discrete. Align pod time left at bottom. Fix colours. --- .../Modules/Home/View/Chart/MainChartView.swift | 4 ++-- .../Modules/Home/View/Header/PumpView.swift | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 679d34895d..396f6bb25b 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -625,9 +625,9 @@ struct MainChartView: View { private func overridesView(fullSize: CGSize) -> some View { ZStack { overridesPath - .fill(Color.purple.opacity(0.4)) + .fill(Color.purple.opacity(0.1)) overridesPath - .stroke(Color.purple.opacity(0.7), lineWidth: 0.5) + .stroke(Color.purple.opacity(0.7), lineWidth: 1) } .onChange(of: glucose) { _ in calculateOverridesRects(fullSize: fullSize) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index 148af785e9..8cfc71d8b5 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -107,22 +107,24 @@ struct PumpView: View { if days >= 1 { HStack(spacing: 0) { Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("d", comment: "abbreviation for days")) // .foregroundStyle(.secondary) + Text(NSLocalizedString("d", comment: "abbreviation for days")) } HStack(spacing: 0) { Text(" \(hours - days * 24)") - Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) + Text(NSLocalizedString("h", comment: "abbreviation for hours")) } } else if hours >= 1 { HStack(spacing: 0) { Text("\(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("h", comment: "abbreviation for hours")) // .foregroundStyle(.secondary) - } + Text(NSLocalizedString("h", comment: "abbreviation for hours")) + .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + }.offset(x: 0, y: 6) } else { HStack(spacing: 0) { Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("m", comment: "abbreviation for minutes")) // .foregroundStyle(.secondary) - } + Text(NSLocalizedString("m", comment: "abbreviation for minutes")) + .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + }.offset(x: 0, y: 6) } } else { Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) From f5e2ec6f260df204acbd7e558c3d6988410f5d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 00:36:50 +0100 Subject: [PATCH 289/405] Fix Shadows (bug). Fix open loop (display when open). --- .../Modules/Home/View/Header/LoopView.swift | 24 +++++++++++-------- .../Modules/Home/View/HomeRootView.swift | 6 ++--- FreeAPS/Sources/Views/ViewModifiers.swift | 9 +++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index e1211201f4..6ff8f33403 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -31,17 +31,21 @@ struct LoopView: View { let textColor: Color = .secondary HStack { ZStack { - if !isLooping, actualSuggestion?.timestamp != nil { - if minutesAgo > 1440 { - Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) - } else { - let timeString = "\(minutesAgo) " + - NSLocalizedString("min", comment: "Minutes ago since last loop") - Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + if closedLoop { + if !isLooping, actualSuggestion?.timestamp != nil { + if minutesAgo > 1440 { + Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) + } else { + let timeString = "\(minutesAgo) " + + NSLocalizedString("min", comment: "Minutes ago since last loop") + Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + } } - } - if isLooping { - ProgressView() + if isLooping { + ProgressView() + } + } else if !isLooping { + Text("Open") } } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index a4cb4165d0..213a1402ca 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -379,7 +379,6 @@ extension Home { .frame( minHeight: UIScreen.main.bounds.height / 1.46 ) - .addShadows() } var carbsAndInsulinView: some View { @@ -491,13 +490,13 @@ extension Home { VStack { ZStack { glucoseView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top).padding(.top, 10) - loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 5) + loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 3) carbsAndInsulinView .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading) .padding(.leading, 10) pumpView .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) - .padding(.trailing, 7).padding(.bottom, 5) + .padding(.trailing, 7).padding(.bottom, 2) }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 5) } } @@ -510,6 +509,7 @@ extension Home { ScrollView { VStack(spacing: 0) { headerView(geo) + RaisedRectangle() chart preview.padding(.top, 15) } diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 9d44aa90f6..67ec91dbab 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -52,6 +52,15 @@ struct AddShadow: ViewModifier { } } +struct RaisedRectangle: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + Rectangle().fill(colorScheme == .dark ? .black : .white) + .frame(height: 1) + .addShadows() + } +} + struct TestTube: View { let opacity: CGFloat let amount: CGFloat From 41de6ad69000389ee9f520abdad189e9813e9a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 02:01:01 +0100 Subject: [PATCH 290/405] Revert to old arrow --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 213a1402ca..09db0b4d7d 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -196,7 +196,9 @@ extension Home { if let eventualBG = state.eventualBG { HStack { - Image(systemName: "arrow.forward") + Text("⇢").font(.statusFont).foregroundStyle(.secondary) + + // Image(systemName: "arrow.forward") Text( fetchedTargetFormatter.string( from: (state.units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber From 243c058010bb9920cc6f55f64a9cfd2c087819c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 13:09:42 +0100 Subject: [PATCH 291/405] Color loop button --- FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift | 4 ++-- FreeAPS/Sources/Views/ViewModifiers.swift | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index 6ff8f33403..4c45e64862 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -25,7 +25,7 @@ struct LoopView: View { var body: some View { VStack { - LoopEllipse() + LoopEllipse(color: color) .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) .overlay { let textColor: Color = .secondary @@ -38,7 +38,7 @@ struct LoopView: View { } else { let timeString = "\(minutesAgo) " + NSLocalizedString("min", comment: "Minutes ago since last loop") - Text(timeString).font(.extraSmall).foregroundColor(minutesAgo > 12 ? .red : textColor) + Text(timeString).font(.extraSmall).foregroundColor(textColor) } } if isLooping { diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 67ec91dbab..5178c20a85 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -127,9 +127,14 @@ struct ColouredBackground: View { struct LoopEllipse: View { @Environment(\.colorScheme) var colorScheme + let color: Color var body: some View { RoundedRectangle(cornerRadius: 15) - .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) + .stroke(color, lineWidth: 1) + .background( + RoundedRectangle(cornerRadius: 15) + .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) + ) } } From 659e3ae49bb1e9507341ad1f7ab3e255eb753ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 13:19:44 +0100 Subject: [PATCH 292/405] Clarify --- FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift | 2 +- FreeAPS/Sources/Views/ViewModifiers.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index 4c45e64862..897ecb1625 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -25,7 +25,7 @@ struct LoopView: View { var body: some View { VStack { - LoopEllipse(color: color) + LoopEllipse(stroke: color) .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) .overlay { let textColor: Color = .secondary diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 5178c20a85..fbf5dc2f1e 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -127,10 +127,10 @@ struct ColouredBackground: View { struct LoopEllipse: View { @Environment(\.colorScheme) var colorScheme - let color: Color + let stroke: Color var body: some View { RoundedRectangle(cornerRadius: 15) - .stroke(color, lineWidth: 1) + .stroke(stroke, lineWidth: 1) .background( RoundedRectangle(cornerRadius: 15) .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) From e3f42e280bb09b573aec0fa20f9c55f941d0e1db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 13:48:12 +0100 Subject: [PATCH 293/405] Add option to always color the current glucose --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 +++++ .../Sources/Modules/Home/HomeStateModel.swift | 3 +++ .../Home/View/Header/CurrentGlucoseView.swift | 19 ++++++++++++++++++- .../Modules/Home/View/HomeRootView.swift | 3 ++- .../StatConfig/StatConfigStateModel.swift | 2 ++ .../StatConfig/View/StatConfigRootView.swift | 5 +++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index c56d70700e..1ed2b9cadd 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -52,6 +52,7 @@ struct FreeAPSSettings: JSON, Equatable { var displayPredictions: Bool = true var useLiveActivity: Bool = false var useTargetButton: Bool = false + var alwaysUseColors: Bool = false } extension FreeAPSSettings: Decodable { @@ -269,6 +270,10 @@ extension FreeAPSSettings: Decodable { settings.useTargetButton = useTargetButton } + if let alwaysUseColors = try? container.decode(Bool.self, forKey: .alwaysUseColors) { + settings.alwaysUseColors = alwaysUseColors + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index e2473e5440..b4d0409ade 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -68,6 +68,7 @@ extension Home { @Published var preview: Bool = true @Published var useTargetButton: Bool = false @Published var overrideHistory: [OverrideHistory] = [] + @Published var alwaysUseColors: Bool = false let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -109,6 +110,7 @@ extension Home { thresholdLines = settingsManager.settings.rulerMarks useTargetButton = settingsManager.settings.useTargetButton hours = settingsManager.settings.hours + alwaysUseColors = settingsManager.settings.alwaysUseColors broadcaster.register(GlucoseObserver.self, observer: self) broadcaster.register(SuggestionObserver.self, observer: self) @@ -452,6 +454,7 @@ extension Home.StateModel: thresholdLines = settingsManager.settings.rulerMarks useTargetButton = settingsManager.settings.useTargetButton hours = settingsManager.settings.hours + alwaysUseColors = settingsManager.settings.alwaysUseColors setupGlucose() setupOverrideHistory() } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 1c2844b6a7..466f71287b 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -8,6 +8,7 @@ struct CurrentGlucoseView: View { @Binding var alarm: GlucoseAlarm? @Binding var lowGlucose: Decimal @Binding var highGlucose: Decimal + @Binding var alwaysUseColors: Bool @State private var rotationDegrees: Double = 0.0 @@ -65,7 +66,7 @@ struct CurrentGlucoseView: View { ?? "--" ) .font(.glucoseFont) - .foregroundColor(alarm == nil ? .primary : .loopRed) + .foregroundColor(alwaysUseColors ? colorOfGlucose : alarm == nil ? .primary : .loopRed) .frame(maxWidth: .infinity, alignment: .center) HStack(spacing: 20) { @@ -122,4 +123,20 @@ struct CurrentGlucoseView: View { return Image(systemName: "arrow.left.and.right") } } + + var colorOfGlucose: Color { + let whichGlucose = recentGlucose?.glucose ?? 0 + guard lowGlucose < highGlucose else { return .primary } + + switch whichGlucose { + case 0 ..< Int(lowGlucose): + return .loopRed + case Int(lowGlucose) ..< Int(highGlucose): + return .loopGreen + case Int(highGlucose)...: + return .loopYellow + default: + return .loopYellow + } + } } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 09db0b4d7d..9557af88d7 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -89,7 +89,8 @@ extension Home { units: $state.units, alarm: $state.alarm, lowGlucose: $state.lowGlucose, - highGlucose: $state.highGlucose + highGlucose: $state.highGlucose, + alwaysUseColors: $state.alwaysUseColors ) .onTapGesture { if state.alarm == nil { diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index a0bc86aadb..200e47fa2b 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -13,6 +13,7 @@ extension StatConfig { @Published var useFPUconversion: Bool = true @Published var useTargetButton: Bool = false @Published var hours: Decimal = 6 + @Published var alwaysUseColors: Bool = false var units: GlucoseUnits = .mmolL @@ -24,6 +25,7 @@ extension StatConfig { subscribeSetting(\.xGridLines, on: $xGridLines) { xGridLines = $0 } subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } + subscribeSetting(\.alwaysUseColors, on: $alwaysUseColors) { alwaysUseColors = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } subscribeSetting(\.useTargetButton, on: $useTargetButton) { useTargetButton = $0 } subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs) { skipBolusScreenAfterCarbs = $0 } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index 76d19c4a5c..a947858e76 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -44,6 +44,11 @@ extension StatConfig { } header: { Text("Home View Button Panel ") } footer: { Text("In case you're using both profiles and temp targets") } + Section { + Toggle("Always Color Glucose Value (green, yellow etc)", isOn: $state.alwaysUseColors) + } header: { Text("Header settings") } + footer: { Text("Normally glucose is colored red only when over or under your notification limits for high/low") } + Section { HStack { Text("Low") From a453fd065d941b3fbf31ffb01f5fab053a8b931e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 19:49:09 +0100 Subject: [PATCH 294/405] Use colors as default --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 2 +- FreeAPS/Sources/Modules/Home/HomeStateModel.swift | 2 +- FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 1ed2b9cadd..1f9feff7ea 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -52,7 +52,7 @@ struct FreeAPSSettings: JSON, Equatable { var displayPredictions: Bool = true var useLiveActivity: Bool = false var useTargetButton: Bool = false - var alwaysUseColors: Bool = false + var alwaysUseColors: Bool = true } extension FreeAPSSettings: Decodable { diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index b4d0409ade..ba49eafd21 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -68,7 +68,7 @@ extension Home { @Published var preview: Bool = true @Published var useTargetButton: Bool = false @Published var overrideHistory: [OverrideHistory] = [] - @Published var alwaysUseColors: Bool = false + @Published var alwaysUseColors: Bool = true let coredataContext = CoreDataStack.shared.persistentContainer.viewContext diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index 200e47fa2b..d28df1e9f2 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -13,7 +13,7 @@ extension StatConfig { @Published var useFPUconversion: Bool = true @Published var useTargetButton: Bool = false @Published var hours: Decimal = 6 - @Published var alwaysUseColors: Bool = false + @Published var alwaysUseColors: Bool = true var units: GlucoseUnits = .mmolL From 6f7196b401e80eaa5a156afa448d43353f2cebdf Mon Sep 17 00:00:00 2001 From: MikePlante1 <82073483+MikePlante1@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:50:27 -0500 Subject: [PATCH 295/405] minor typo fixes in comments (#430) --- FreeAPS/Sources/APS/Storage/CarbsStorage.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 28dfab832c..d9a65ebf58 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -37,14 +37,14 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { if fat > 0 || protein > 0 { // -------------------------- FPU-------------------------------------- - let interval = settings.settings.minuteInterval // Interval betwwen carbs + let interval = settings.settings.minuteInterval // Interval between carbs let timeCap = settings.settings.timeCap // Max Duration let adjustment = settings.settings.individualAdjustmentFactor let delay = settings.settings.delay // Tme before first future carb entry let kcal = protein * 4 + fat * 9 let carbEquivalents = (kcal / 10) * adjustment let fpus = carbEquivalents / 10 - // Duration in hours used for extended boluses with Warsaw Method. Here used for total duration of the computed carbquivalents instead, excluding the configurable delay. + // Duration in hours used for extended boluses with Warsaw Method. Here used for total duration of the computed carb equivalents instead, excluding the configurable delay. var computedDuration = 0 switch fpus { case ..<2: @@ -99,7 +99,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { storage.save(Array(uniqEvents), as: file) } } - } // ------------------------- END OF TPU ---------------------------------------- + } // ------------------------- END OF FPU ---------------------------------------- // Store the actual (normal) carbs if let entry = entries.last, entry.carbs > 0 { // uniqEvents = [] From 518d1a144700d1e165626fb43faddd86e97ce8c6 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Thu, 21 Dec 2023 10:51:04 -0800 Subject: [PATCH 296/405] More Omnipod pump manager related fixes and improvements (#429) + Fix implementation bug in PodInfoPulseLogPlus limiting pod time to 9 bits + Fix pod pump managers not to crash if an incorrect response type is returned + Add safeguards for possible edge cases to prevent 0x31 faults before pod is set up + Adjust activationTimeString to better match pulseLogPlusString's output --- .../MessageBlocks/PodInfoActivationTime.swift | 6 +-- .../MessageBlocks/PodInfoPulseLogPlus.swift | 4 +- .../PumpManager/OmniBLEPumpManager.swift | 44 +++++++++++++++---- .../MessageBlocks/PodInfoActivationTime.swift | 6 +-- .../MessageBlocks/PodInfoPulseLogPlus.swift | 4 +- .../PumpManager/OmnipodPumpManager.swift | 30 ++++++++++++- 6 files changed, 74 insertions(+), 20 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift index d34a2c04d0..7fabe7f0bd 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift @@ -36,7 +36,7 @@ public struct PodInfoActivationTime : PodInfo { self.day = Int(encodedData[13]) self.hour = Int(encodedData[15]) self.minute = Int(encodedData[16]) - self.data = Data(encodedData) + self.data = Data(encodedData) } } @@ -51,8 +51,8 @@ func activationTimeString(podInfoActivationTime: PodInfoActivationTime) -> Strin result.append(String(format: "Minute: %u", podInfoActivationTime.minute)) // pod fault info - result.append(String(format: "\n%@", String(describing: podInfoActivationTime.faultEventCode))) - result.append(String(format: "Fault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + result.append(String(format: "\nFault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + result.append(String(describing: podInfoActivationTime.faultEventCode)) return result.joined(separator: "\n") } diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift index db8c059450..21ba29d474 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift @@ -44,8 +44,8 @@ public struct PodInfoPulseLogPlus : PodInfo { self.nEntries = nEntries self.maxEntries = maxEntries self.faultEventCode = FaultEventCode(rawValue: encodedData[1]) - self.timeFaultEvent = TimeInterval(minutes: Double((Int(encodedData[2] & 0b1) << 8) + Int(encodedData[3]))) - self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[4] & 0b1) << 8) + Int(encodedData[5]))) + self.timeFaultEvent = TimeInterval(minutes: Double((Int(encodedData[2]) << 8) + Int(encodedData[3]))) + self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[4]) << 8) + Int(encodedData[5]))) self.pulseLog = createPulseLog(encodedData: encodedData, logStartByteOffset: logStartByteOffset, nEntries: self.nEntries) self.data = encodedData } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift index d20dc916a3..df1623f844 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -32,6 +32,7 @@ public enum OmniBLEPumpManagerError: Error { case insulinTypeNotConfigured case notReadyForCannulaInsertion case invalidSetting + case setupNotComplete case communication(Error) case state(Error) } @@ -47,6 +48,10 @@ extension OmniBLEPumpManagerError: LocalizedError { return LocalizedString("Insulin type not configured", comment: "Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured") case .notReadyForCannulaInsertion: return LocalizedString("Pod is not in a state ready for cannula insertion.", comment: "Error message when cannula insertion fails because the pod is in an unexpected state") + case .invalidSetting: + return LocalizedString("Invalid Setting", comment: "Error description for invalid setting") + case .setupNotComplete: + return LocalizedString("Pod setup is not complete", comment: "Error description when pod setup is not complete") case .communication(let error): if let error = error as? LocalizedError { return error.errorDescription @@ -59,8 +64,6 @@ extension OmniBLEPumpManagerError: LocalizedError { } else { return String(describing: error) } - case .invalidSetting: - return LocalizedString("Invalid Setting", comment: "Error description for OmniBLEPumpManagerError.invalidSetting") } } @@ -1079,6 +1082,12 @@ extension OmniBLEPumpManager { return } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + completion(.state(OmniBLEPumpManagerError.setupNotComplete)) + return + } + guard state.podState?.unfinalizedBolus?.isFinished() != false else { completion(.state(PodCommsError.unfinalizedBolus)) return @@ -1113,6 +1122,11 @@ extension OmniBLEPumpManager { return .success(false) } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + return .failure(PumpManagerError.deviceState(OmniBLEPumpManagerError.setupNotComplete)) + } + guard state.podState?.unfinalizedBolus?.isFinished() != false else { return .failure(.deviceState(PodCommsError.unfinalizedBolus)) } @@ -1250,9 +1264,8 @@ extension OmniBLEPumpManager { let beepBlock = self.beepMessageBlock(beepType: .bipBeeeeep) let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .pulseLogRecent, beepBlock: beepBlock) guard let podInfoPulseLogRecent = podInfoResponse.podInfo as? PodInfoPulseLogRecent else { - self.log.error("Unable to decode PulseLogRecent: %s", String(describing: podInfoResponse)) - completion(.failure(PodCommsError.unexpectedResponse(response: .podInfoResponse))) - return + self.log.error("Unable to decode Pulse Log: %s", String(describing: podInfoResponse)) + throw PodCommsError.unexpectedResponse(response: .podInfoResponse) } let lastPulseNumber = Int(podInfoPulseLogRecent.indexLastEntry) let str = pulseLogString(pulseLogEntries: podInfoPulseLogRecent.pulseLog, lastPulseNumber: lastPulseNumber) @@ -1285,7 +1298,10 @@ extension OmniBLEPumpManager { case .success(let session): let beepBlock = self.beepMessageBlock(beepType: .bipBeeeeep) let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .pulseLogPlus, beepBlock: beepBlock) - let podInfoPulseLogPlus = podInfoResponse.podInfo as! PodInfoPulseLogPlus + guard let podInfoPulseLogPlus = podInfoResponse.podInfo as? PodInfoPulseLogPlus else { + self.log.error("Unable to decode Pulse Log Plus: %s", String(describing: podInfoResponse)) + throw PodCommsError.unexpectedResponse(response: .podInfoResponse) + } let str = pulseLogPlusString(podInfoPulseLogPlus: podInfoPulseLogPlus) completion(.success(str)) case .failure(let error): @@ -1310,7 +1326,10 @@ extension OmniBLEPumpManager { case .success(let session): let beepBlock = self.beepMessageBlock(beepType: .beepBeep) let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .activationTime, beepBlock: beepBlock) - let podInfoActivationTime = podInfoResponse.podInfo as! PodInfoActivationTime + guard let podInfoActivationTime = podInfoResponse.podInfo as? PodInfoActivationTime else { + self.log.error("Unable to decode Activation Time: %s", String(describing: podInfoResponse)) + throw PodCommsError.unexpectedResponse(response: .podInfoResponse) + } let str = activationTimeString(podInfoActivationTime: podInfoActivationTime) completion(.success(str)) case .failure(let error): @@ -1335,7 +1354,10 @@ extension OmniBLEPumpManager { case .success(let session): let beepBlock = self.beepMessageBlock(beepType: .beepBeep) let podInfoResponse = try session.readPodInfo(podInfoResponseSubType: .triggeredAlerts, beepBlock: beepBlock) - let podInfoTriggeredAlerts = podInfoResponse.podInfo as! PodInfoTriggeredAlerts + guard let podInfoTriggeredAlerts = podInfoResponse.podInfo as? PodInfoTriggeredAlerts else { + self.log.error("Unable to decode Read Triggered Alerts: %s", String(describing: podInfoResponse)) + throw PodCommsError.unexpectedResponse(response: .podInfoResponse) + } let str = triggeredAlertsString(podInfoTriggeredAlerts: podInfoTriggeredAlerts) completion(.success(str)) case .failure(let error): @@ -1795,6 +1817,12 @@ extension OmniBLEPumpManager: PumpManager { return } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + completion(.failure(PumpManagerError.deviceState(OmniBLEPumpManagerError.setupNotComplete))) + return + } + self.podComms.runSession(withName: "Cancel Bolus") { (result) in let session: PodCommsSession diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift index 5d60c78244..a45c76dc81 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoActivationTime.swift @@ -35,7 +35,7 @@ public struct PodInfoActivationTime : PodInfo { self.day = Int(encodedData[13]) self.hour = Int(encodedData[15]) self.minute = Int(encodedData[16]) - self.data = Data(encodedData) + self.data = Data(encodedData) } } @@ -50,8 +50,8 @@ func activationTimeString(podInfoActivationTime: PodInfoActivationTime) -> Strin result.append(String(format: "Minute: %u", podInfoActivationTime.minute)) // pod fault info - result.append(String(format: "\n%@", String(describing: podInfoActivationTime.faultEventCode))) - result.append(String(format: "Fault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + result.append(String(format: "\nFault Time: %@", podInfoActivationTime.faultTime.timeIntervalStr)) + result.append(String(describing: podInfoActivationTime.faultEventCode)) return result.joined(separator: "\n") } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift index ff7837c3d8..78a5c1157f 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/PodInfoPulseLogPlus.swift @@ -43,8 +43,8 @@ public struct PodInfoPulseLogPlus : PodInfo { self.nEntries = nEntries self.maxEntries = maxEntries self.faultEventCode = FaultEventCode(rawValue: encodedData[1]) - self.timeFaultEvent = TimeInterval(minutes: Double((Int(encodedData[2] & 0b1) << 8) + Int(encodedData[3]))) - self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[4] & 0b1) << 8) + Int(encodedData[5]))) + self.timeFaultEvent = TimeInterval(minutes: Double((Int(encodedData[2]) << 8) + Int(encodedData[3]))) + self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[4]) << 8) + Int(encodedData[5]))) self.pulseLog = createPulseLog(encodedData: encodedData, logStartByteOffset: logStartByteOffset, nEntries: self.nEntries) self.data = encodedData } diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift index a7dc839c01..777d324250 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/OmnipodPumpManager.swift @@ -44,6 +44,7 @@ public enum OmnipodPumpManagerError: Error { case insulinTypeNotConfigured case notReadyForCannulaInsertion case invalidSetting + case setupNotComplete case communication(Error) case state(Error) } @@ -59,6 +60,10 @@ extension OmnipodPumpManagerError: LocalizedError { return LocalizedString("Insulin type not configured", comment: "Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured") case .notReadyForCannulaInsertion: return LocalizedString("Pod is not in a state ready for cannula insertion.", comment: "Error message when cannula insertion fails because the pod is in an unexpected state") + case .invalidSetting: + return LocalizedString("Invalid Setting", comment: "Error description for invalid setting") + case .setupNotComplete: + return LocalizedString("Pod setup is not complete", comment: "Error description when pod setup is not complete") case .communication(let error): if let error = error as? LocalizedError { return error.errorDescription @@ -71,8 +76,6 @@ extension OmnipodPumpManagerError: LocalizedError { } else { return String(describing: error) } - case .invalidSetting: - return LocalizedString("Invalid Setting", comment: "Error description for OmniBLEPumpManagerError.invalidSetting") } } @@ -1021,6 +1024,12 @@ extension OmnipodPumpManager { return } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + completion(.state(OmnipodPumpManagerError.setupNotComplete)) + return + } + guard state.podState?.unfinalizedBolus?.isFinished() != false else { completion(.state(PodCommsError.unfinalizedBolus)) return @@ -1055,6 +1064,11 @@ extension OmnipodPumpManager { return .success(false) } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + return .failure(PumpManagerError.deviceState(OmnipodPumpManagerError.setupNotComplete)) + } + guard state.podState?.unfinalizedBolus?.isFinished() != false else { return .failure(PumpManagerError.deviceState(PodCommsError.unfinalizedBolus)) } @@ -1799,6 +1813,12 @@ extension OmnipodPumpManager: PumpManager { return } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + completion(.failure(PumpManagerError.deviceState(OmnipodPumpManagerError.setupNotComplete))) + return + } + let rileyLinkSelector = self.rileyLinkDeviceProvider.firstConnectedDevice self.podComms.runSession(withName: "Cancel Bolus", using: rileyLinkSelector) { (result) in @@ -1864,6 +1884,12 @@ extension OmnipodPumpManager: PumpManager { return } + guard state.podState?.setupProgress == .completed else { + // A cancel delivery command before pod setup is complete will fault the pod + completion(.deviceState(OmnipodPumpManagerError.setupNotComplete)) + return + } + // Legal duration values are [virtual] zero (to cancel current temp basal) or between 30 min and 12 hours guard duration < .ulpOfOne || (duration >= .minutes(30) && duration <= .hours(12)) else { completion(.deviceState(OmnipodPumpManagerError.invalidSetting)) From 6963e05a80cc021d5e60f4de729349572a023073 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Thu, 21 Dec 2023 11:07:44 -0800 Subject: [PATCH 297/405] Provide a comment for enabling statistics in Nightscout (#421) * Provide a comment for enabling statistics in Nightscout, as well as a pointer to the Statistics / Demographics * Fix broken localizations. --- .../Main/ar.lproj/Localizable.strings | 3 +++ .../Main/ca.lproj/Localizable.strings | 3 +++ .../Main/da.lproj/Localizable.strings | 3 +++ .../Main/de.lproj/Localizable.strings | 3 +++ .../Main/el.lproj/Localizable.strings | 3 +++ .../Main/en.lproj/Localizable.strings | 3 +++ .../Main/es.lproj/Localizable.strings | 3 +++ .../Main/fi.lproj/Localizable.strings | 3 +++ .../Main/fr.lproj/Localizable.strings | 3 +++ .../Main/he.lproj/Localizable.strings | 3 +++ .../Main/it.lproj/Localizable.strings | 3 +++ .../Main/nb.lproj/Localizable.strings | 3 +++ .../Main/nl.lproj/Localizable.strings | 3 +++ .../Main/pl.lproj/Localizable.strings | 3 +++ .../Main/pt-BR.lproj/Localizable.strings | 3 +++ .../Main/pt-PT.lproj/Localizable.strings | 3 +++ .../Main/pt.lproj/Localizable.strings | 3 +++ .../Main/ru.lproj/Localizable.strings | 3 +++ .../Main/sk.lproj/Localizable.strings | 3 +++ .../Main/sv.lproj/Localizable.strings | 3 +++ .../Main/tr.lproj/Localizable.strings | 3 +++ .../Main/uk.lproj/Localizable.strings | 3 +++ .../Main/zh-Hans.lproj/Localizable.strings | 3 +++ .../View/NightscoutConfigRootView.swift | 15 +++++++++++++++ 24 files changed, 84 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 2ef0efa18e..5ff771b9ca 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings index 4867ce3d37..f41e0bf139 100644 --- a/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings @@ -293,6 +293,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 8f799fbd8e..d47555ef96 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Brug lokal server som glukosekilde"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Rediger indstillingsjson"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index f12e6d8d12..6a6e94155a 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Lokalen BZ-Server verwenden"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Einstellungen bearbeiten json"; diff --git a/FreeAPS/Sources/Localizations/Main/el.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/el.lproj/Localizable.strings index f3f49d61fa..07b21866d8 100644 --- a/FreeAPS/Sources/Localizations/Main/el.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/el.lproj/Localizable.strings @@ -249,6 +249,9 @@ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 886d42ee87..e10ba6d7e9 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index a7c0563fc7..1bd4a5800a 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Usar servidor local de glucosa"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Editar configuración json"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 7f17ced838..f7e562b0ea 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index c1e7e92280..1a9540ab06 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Utiliser le serveur de glucose local"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Modifier les paramètres json"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 2ef0efa18e..5ff771b9ca 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index e10788db86..f796edc04d 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Usa server locale come sorgente glicemia"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Modifica impostazioni json"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index aa9d70c980..07b76786bc 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Bruk lokal glukoseserver"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Rediger \"freeaps_settings.json\""; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index fefb9842b1..9bfdf8a435 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Lokale glucose server gebruiken"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Bewerk instellingen json"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 7eb2ed0404..053d7b2b69 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -337,6 +337,9 @@ Połączono z Nightscout!"; /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 9a25f84900..1d6d80cb26 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Usar servidor de glicose local"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Editar json de configurações"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 549fce9b59..fc8bbe429f 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Usar servidor de glicose local"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Editar json de configurações"; diff --git a/FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings index 43c144372b..f6e2676cf9 100644 --- a/FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings @@ -254,6 +254,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index c172878722..6380cd55d2 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Использовать локальный сервер глюкозы"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Редактировать json настроек"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 21bdc245b9..b407b7bfcc 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Use local glucose server"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Edit settings json"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 2963b127cc..65fb45edbd 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Använd lokal server som glukoskälla"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Ändra debug-inställningar"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 778b4b165c..befbedbb68 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Yerel glikoz sunucusu kullan"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Json ayarlarını düzenle"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 32a6e7daec..2ef6f10a62 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "Використовувати локальний сервер"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "Редагувати json налаштувань"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index b6a0214d60..25f7866225 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -335,6 +335,9 @@ Enact a temp Basal or a temp target */ /**/ "Use local glucose server" = "使用本地端口获取血糖"; +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + /* */ "Edit settings json" = "编辑设置文件"; diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 6c07ccdea4..dadbc848a4 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -58,6 +58,21 @@ extension NightscoutConfig { Toggle("Upload", isOn: $state.isUploadEnabled) if state.isUploadEnabled { Toggle("Statistics", isOn: $state.uploadStats) + HStack(alignment: .top) { + Image(systemName: "pencil.circle.fill") + VStack { + Text( + "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" + ) + .font(.caption) + Text( + "https://iaps-stats.hub.org" + ) + .font(.caption) + .multilineTextAlignment(.center) + } + } + .foregroundColor(Color.secondary) Toggle("Glucose", isOn: $state.uploadGlucose) } } header: { From 2677c05763ea951f0e1f17d18614af96c3b4245f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 21:22:27 +0100 Subject: [PATCH 298/405] Fix stat commit PR --- .../View/NightscoutConfigRootView.swift | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index dadbc848a4..4676f16ec5 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -9,6 +9,7 @@ extension NightscoutConfig { @State var importAlert: Alert? @State var isImportAlertPresented = false @State var importedHasRun = false + @State var displayPopUp = false @FetchRequest( entity: ImportError.entity(), @@ -57,23 +58,31 @@ extension NightscoutConfig { Section { Toggle("Upload", isOn: $state.isUploadEnabled) if state.isUploadEnabled { - Toggle("Statistics", isOn: $state.uploadStats) - HStack(alignment: .top) { - Image(systemName: "pencil.circle.fill") + Toggle("Glucose", isOn: $state.uploadGlucose) + Toggle(isOn: $state.uploadStats) { + HStack { + Text("Statistics") + Image(systemName: "info.bubble") + .symbolRenderingMode(.palette) + .foregroundStyle(.primary, .blue) + .onTapGesture { + displayPopUp.toggle() + } + } + } + if displayPopUp { VStack { Text( "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" ) - .font(.caption) - Text( - "https://iaps-stats.hub.org" - ) - .font(.caption) - .multilineTextAlignment(.center) + Text("https://iaps-stats.hub.org") + .multilineTextAlignment(.center) + } + .font(.extraSmall) + .onTapGesture { + displayPopUp.toggle() } } - .foregroundColor(Color.secondary) - Toggle("Glucose", isOn: $state.uploadGlucose) } } header: { Text("Allow Uploads") From e316c4c4f702faa0958c10220d34150fe420b61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 21 Dec 2023 23:40:44 +0100 Subject: [PATCH 299/405] Various UI/UX updates Revert to old icons. Add alert for canceling aan ctive profile. Use non-filled buttons for every action in button panel. Change carbs button colour to darker (orange) when in light mode for improved readability. --- .../icons/bolus.imageset/bolus_fill_white.pxm | Bin 0 -> 109761 bytes FreeAPS/Sources/Models/Configs.swift | 2 +- .../Modules/Home/View/HomeRootView.swift | 33 +++++++++++------- FreeAPS/Sources/Views/ViewModifiers.swift | 1 - 4 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 FreeAPS/Resources/Assets.xcassets/icons/bolus.imageset/bolus_fill_white.pxm diff --git a/FreeAPS/Resources/Assets.xcassets/icons/bolus.imageset/bolus_fill_white.pxm b/FreeAPS/Resources/Assets.xcassets/icons/bolus.imageset/bolus_fill_white.pxm new file mode 100644 index 0000000000000000000000000000000000000000..b4cff3f8b7bb631c04e18c98039231124cc51df4 GIT binary patch literal 109761 zcmeFa1wfPQ+c5q-D;h?F2#ipX?(P)nE^&@AVG_fQ6p`88T_9LkU?+%TV58W_0J{YP zL82P9nXDraCCrYfLFNNRuKeA$Vg>!GEGfyp*TE& zND>i`*3D+HIZRf1j4q8$PiDeXxNasZBU+c0Fo8kOnyN9Qjx6deF|FH1rG2>_n857x@%&h#$ z1>C9ArbpGlH3(z>G~ij2OW_(($ri!kzG<{1hHsEJi=9Txbf|sB#Xx8n_F8LQsAqAjFJ&5S(X#(<4*DQ@~}3uv$i%eH#Q@q_0lq<{Wft`>jMIV zf@Ar+GaY6nnjd6v#s-E3WM$G4QW3+ z+@VmJOiXNC4D5PNCYza_#8sz~$?i0IN)jyZ^h62|)X-r3Sl-zqs6LFBcXK>76zb(a zkO?}j>{AH#!HyI<(|l_pV|-FFSBtC7)#2)Lhi#pZl9-mx9nRHfnlCZI(AIa*mLL48^jm!M?#P=WCk)1S&FPhwjjHZlgKHg204qIM=l_j zkSoYFRVL0XaTNITMrbfYMWM~SEiDuzm+Qm70ni^`+E zXbxJ2{(%$6IpLCU%W>7X&v+etIDQWP82$x8nm{I~5!4Bq1Pg){!Jgnia3Z)90tk@= z27yVKNSH(@B+MYpBFrJoBP=GYC9Efu6Alp05iSzy3AYH32+s*`3GWFX3C)Dhgs+4j zgbqR%5h3D;@Gd245`Bm{#9hQ^#J9xv#E-;g;%DMlk}=7WWJmHQ`I3T2k)&7>m6XL> ztOyR}|01&lzk(l9Ua%jYpwJtcmOic$L9omyA_d=xg4c@)6W&B&A^yxv1_fKdv`mTx zLPk&&aivgrxe<8m``{r+=zHYV*zfU|K@>5js!PeVAw;Ryh>VL&mGoYz*V6gF%qxr( zLO=)sAq0dF5JEr*0U-p05D-E@2mv7kgb?@*5SU6Ph$w4mp;J?MWR_Hn{71zQz`hXC zBh5Hf6@xxhJ%tT7KS9G``1tZ=Fg4wjxEC$8hKgivX5)tSd65-W9 zKR@e8N>CuhBPh_@-`69Y66zJ~@8;n((t=1*_R&HSW_ltcmoqUH@K7o(E0e{0ruMZ@ zHR}tLrb^;Plt+$4r-t#y(SytKvk!bC3>eSAwEle*3?zfb2AV6i-zfPVp=DC}Nfh6} za4#RPP(w;)UIu^oBPXLG$|FXgQ*8$J1_NwwgV+P^*L}f~D0=?^nppC$A!vsqDF=)g z41xnXKs6iih~e_0*s>zRA5P{Q78H|d=LfI{;YSDoAq0dF5JEr*0U-p05D-E@2mv7k zgb)xyKnMXL1pWs=Kon!`i-?KCx2)tTL`qNkmgFhv?NYO(PRN+ch{)WK{37*S+EY49 zDo!R!T3u$&|9~+IhaiN25CTF72q7SZfDi&g2nZn{gn$qN|E(clj%T8S2&eP)Ao9}b z!EDxeW@?Y#imW9*ZLlJPs#}o%q8+}r3#OLBm-zPurY@+n$mru^25Scs@`nOFU6THb zE_p-G1@idy5j38=mOy{KoZ7C1x+JHqCZaqOHcqmiZE4vuxcZjj2zH#3Ch5< zCwditdRKjqst8X31!s(>i}fZAR6*gl=+8_~f!YKOV+sMN%nAhl3qL{#2q7SZfDi&g z2nZn{gn$qNLI?;UAcTMr0zwD~A@KhY0uxZuR1^`V@$hvcHw!aQPYYWwBRdakHzP}P zGj}65Z)!UL`U zqcKmN!Z?9vqy@wOrNl%Kndvg}(mSPnr0z(iNlcbd5#J&1B6de?A|wevLI?;UAcTMr z0zwD~As~dn|3nBROA)7{ep>(h#`P1+g;!BOmRG)+ohevJvob57OF~N#V!yW~Urr>G z!vynb0x8Di+!+jP!QxFM66468`h!&!a=zy8FVaRYqA29=C zZ5D_n7;6ha0+Apj7>u@sg4wokBm#*Cm4C#jqE|nkqYDhau7L!97Rrm*|%yi`*sGY19NXTz~I|W z!z~oy8ilR7F2~|diplYZFs)=f&I_Pk81gei(qxPr+ z>WYp+{m?Kp5{*KW&^H<6cMHVmPWTBDu^na zn&L?$SX2>&-#gjvsf_eQ%+jM^S*3$1Hx>~ZO8d>*G8hc~G1%D*PB@#E4%R?HU7p^v zmT3fRyZq);Z6L!t2@g%g|K=t}(Kvl)Ko0LuI2nZn{gn$qNLI?;UAcTMr0{?v>K*etBzZp^QN4b$og!&_X zbNxTlYb0sVNYHO?WB|QJf(b29e{&1JB-DtfKuh%B+)^JpGeE{(ECJg3cd0a@Nzg>x zZywGs2s9%9#yb0%HbBaN!KD4>!Tc3nfcWoBP=7&qLNbgg{x^^5S9AgVzj4y^qYL0T zFp#X@OyKC-IKQR?VElhEWHcgeBxx&tM?6bxjF=wK)n-D}-~8B#;Tc*#k-{w&{wp-LdcSI5khuZOr1TapU0vhx`R^?cl7!z>Q6r8J1W}2_h6)@ ztphHL_#TN=dH#onaYt}vsbmeRzgvt~s8486L~t0@D>~RMFw8e7kQx>aHa)|rRI(yJ zLl`yEH_R6-d{RTbJi;Mfmg*Vg5fR`O7)}iX`<%SIN`H#;4fGCz%tQJT{N2I?C8&bL zex;&(13iPHdYX_Ajt95VBz9&* zs6RM;F)=GK1xHPCm~RpbYu!>yE6izAsf{h)Z&MV1m{h3FlPXFj+y8T7T0Q1{>Q_E$ z260W|=HWTOwMnnP8mP$I=V!+@-lIHw9NSRI3i5Hhp0D=2`$`k8Iw zk2Ekuw=^gi^E_1=8Vb&*RIrIw4UP^=WzrcOICrx_Gsr6)^P7_hAf=M!deQ{!Acz#h zKo&EGS{fUNIj<^>9}CWN)VUf_6SHVwauo`Z1%>!;RwzPFgjF#ha&)kl4~)lyQR?AI zC9CA;+gO+xQY>xEvA$bl+t|{=vY-HKDmhJeOVETAtk;+W9px>dtPHI0m?s@x|A+J~ z1{x=e&A>ceVOyIw0O$)}ca7)!2kQ$00Lj4sQa?#1e=@drumuz(i<|MUY-%|PNm+IXVOwr^E?1V3^pS%J}@klnUtIv zKx2c}9`wSWF<$Th`@6RcEj5^iY4u@mNmylpVW2;l$)pb&-Pb@|U|2XSgI_%?U3XR{ zsMhfx#kAd*fIk=<8PRq>h#>WtySBfvO>FG!2iYc8){ailZZJ4;;`v7_b++&SIEde$ zWF#HoAd`SaG#8nVEJM~ITY)XK7ugSNp~JuyI*wEVW2hFnh+Ial0&D07u!U{|W9UBe z8AZU?&oI;x*gRA;9c7`JXf~RQ7NFD6h3G1DH@X+CLeHa@(Yxp${C8llryZAp??m(^ zcQ|Z|DTOdG0tZtV%Wd-%u4g2;JA&ZNX)@Di%$$WSj075o0RuB;Gr(aKxXI%p+>u;8 zDw&4qrrMjBm_z_~g<~=yAnA-(KF~dv=+UH zUPo`Dw=oc+57EbHBl;TsfPTao;7oB2I8R(GZY(YZmx;^6&A~0et-$TV?ZxfG9l#yO zRe{5$)3~#^^SBGROSqS~c3cM@k0;?p@#1(XybN9zFOOHl8{ARg9BCXWox~>Pk+`Heq!px9 zq&1{h}cgPJ%8Xti%6Q2@JyLOt{ZU2`jt|t?KCAKA!d5wAf@1N>+kXIUpUP+ z!&%nv@cOfd#7$gWJ?0_tSNr(qH+K2uR=kQTfk4Hl7Duu_*0Qs7AvhcuWEiiwsH+AM%K2yS14HK1qC`TAL>8tXn&Pf zk2x&;)w~XPjh1RqdUxX>2YVa{SR{jBMLvjC%;dc<7a)s}CGgHXhkSxJp%REf3`b4i zeJFUl^}g-222MIUYI-nApw9{%WX^eaZq7jU@_%7&w@FAUDydTXO|6{5;8R-yx3dy? zxO@@+Yr9NZMp@ zV%+Z23~oj5O`bVLijX#+GDx98Eynx{hj9g2MnV$vtgWRDNHc~n_dA!Bh7Nu%Z{?A? z`p8^cl~rVisDW2*35eri!~f%b?CJ~~QKHKgEg6paA^$J?*u@AIzj`qZc&n5ene<*4 z{_KF)z|hiakk^x?k;x!$BnC)svf+I+6XZ0PAuEto$QnS#Hz1|pl6MDL z&vcO_M9i}vWCIMae)O*_dIbr|{v;wRYdats_FMTw^#))0yLySdu-<>^kA4?yD0Ovp z9gSfc>H^>NQt&GUlqP9#M=uQ_`B+XmEhC)e!)7Lq;RpHGuecaWMUEq=nGeq~{5(P9#{+Rekm8QH+UCS1K`#WY zh>8Kd&c=2Vmt2og#DBFSf4(X?I=lSoszgR2`Lt1}1tU5B(krxwm&<_FJ;(~30GHn! zq>$$*dLvSdlpvddShOAFiFbi4aRras!KZPY`vt-1DM$~ugM(-#kQ82d9=L+hcMHNL2w7`92U)>AB=BFF z<@#4vw3CD+M(o6>dUiZkhKp-xSUASZ059uf;uF(Z857yS&zL$5qh~E!zGCI7wHr&e zmhITL|G>dR{gyt(bnvAQZ;O75A470{y#WM^o(%bc-=V8JoJWz>2Z}6g0Sz808Qiji zLv};1HBhr{;Libw+m2lI$oz0$Z|{Q0d<=30RI+}GhmS8t5c34-R{=@XpT*(id9czl z*bEK_NTeZrLU>#-rZ78-fe~0^dEqE#VrFtQumasuGm>eM`J=skv8sK8!#xV(1V-gB z{#~?ZurDufM1F9fPeBYk3aa6mpu=RdQ{!Mtfr`tc$wqiGGBT4fV!4~I>2`MyPcLtc zQLwT3TpcAK0V{7G?PnaIZ>$d_b5)FN49`{OXvvEoaj7=NnR(ICfE>>Vpw-cyk==>V+FqggMM&Su3oc=YYxy|xBlm2aoq-b z&#_ovBvZTz+g2FsV|3rlaV?=_>E@rP&!t=F0_roA+qTJ@KfPQ_m~>94k2}TJ%fs5t z&f40@+}I2oZMk-(<>g#^_@@rAj^;Ik(KUf-2fhNyGBE>VWQ}#gpgOYX zAjj@-c*7UHnV@Tl{ByE54f`PLL$X5;O@q1bu=D!J1%8 z@F#>3A_>uiSVBC3N}v(wge<~r!aTyFpI$462fkJaOH9P^A%ijD`w2DWn_F9eI-0db z0nh#)emVmGg&!dVgb?_D4}mq4WC_fDLkGDE4r0X?K_o{3sg(u%SR^eylZ_qha8;v- zTm$t!F@yw~cL6{Ra;3+Z|8`gwIW*QNa|-z_kDPBumd=XM*+6 zV903!=4R;-o&n+1oXiX?z8S&_2`N|@N5H~t=pckKc9236Ka9~Q6%zPiS1g>EmYxWC zus&xbrX^zGvk;z>oyCAK-XFrVFsTO!--57iYE~K(!fg;%NCWf*K?ssqd?tgQ3}I6U zOR~d5Js|7|E>9(s`h^qvg)n{`g<@>83Hn;rrFCn}+LzS-d#r2i!i({1{ zh;0kNW=UUM!de75G7~{m{^*O--Gm@AGZ5r(UBB@tVe2J1GcyAi(>Xag#!Lp?7z1eU z=RaoX%{h3WUwg(_d%d?3iYH?{Eh{yXf~{&gD;2oj6i_&%GblzsFXDe(uwS?O^}{ff zF&-o>(xE8{wP1*$PZu2VqpAFdz- zc?kqRrU+8d-g)yEiv(?21c}mo#b5UjhIHQdfG^x)c*Jp-Nfa#FBQ%^s&thj|Vb~Mc z7ZDK$kK-oq>qx>y3z z0_y;u-U66(IS5`H0g;Q-$axUBxDKKg58#6L0<>?Nk#B%Mqo@dQB;-+5paKm;4N!B` z7Ij9wP=7QOjX}qOu5CJ+g-%AN^C(2?0H5B0?n95kvbB;gvT zjvJ0M!P&w^&JP!ki^nD5CgLXHX5bd#*5FEUyK#p>g5WalHm(u(4%dQ5@Dgx!)506U zMa=^r#Ji@k@l!xTU=_X;Uk*|NwfLL(M*MsHcLIqZPoNNt2o8i%gb28HO(aYqEFi2S zlo1XS&Ju1Co)DS|T|_D3P@)0Rp6E-ACMFSch_i^Rh}(#Vi06p6i7$xXNFDBX77-BP23Nw24ZH zYKoeRdW*)2ri)G!T_w6x^rUFL=qu57F|yb&F?+Efu|%;vvBhFr#Ey&AiMPoNJwZ)*hz#)FeSJWYb5qcT#$Go@m*3*QeV-EY&70FKsOCE1f7^D7{|#uynojM;S4h zVKQzqV`V1Etdcn(Qz!GDEJhwq_8`;9Q^@Pd$H;fdEwb{mX0k!DX|fAscgkLreJv*< zH(bt3E>UiV+-A8ma?j-P@;dS!@^ty>@>}H3$-ht_DU49?RhXbKUty2JHHBtHIYmpw zNX1;m^@>%BjY@c>;Yz+rsY;8L_AA{{`k}0@?5506o~vB0T(8`!qNd`i!cdu~QlWBN z<%cRo)k`%+b*btR)ki}JL-dD)49OW%H00cn_i74i4r+9@d20LB{uqiIsy{SzX#UX6 zL$3^NQP)uSQO{6ctA0lPy@ry8tHuP46&fcs-e}5eI%_gDS7=sizNIKq+$gD(HI%cI zX04%GqqMTLO0=$NwQG;ij?kW_U7`I*M_k8NXS~h|of@5HT}|Bp-O0MUbpIG8Hq3Td z^03vzYKOHBA2B>?`0U|FhQA)6GQxMnq!GJDJk*oYbJ3fqSE_ewBx$7W$dr*AM_$** z>09Y1>#x_ZGr$>G8!!zv8r(1>8rm7A87f zS;<=kSk1PovFfz8v1VJBTfecS$iRM(|)aXoc9_PHtxzR<-h2~P~^3+wwHPLmO>npdB zZWG*gyM1&wb!WRDa&Psp_bBi<<%#$7@to&*%}dTJ!fTz^V{dKmB=23`%|2E>`97yc z5l8urS~}{kuevYYcZYBDXq(XmqtE(D`i1$e^Ly&A@6Yx>9)JrN9k4v$Vc@X9^uQxQ zNRV&P@}Nh-BZ4Oep9mp^1c$5-c^PUJIytm9Og@YnwlnNoxO@2G@COlk5m^y6kus5E zB6mc#MtMdpi)xHEi7tq~95W<_8FMsNBsMa3TWm|5SKP|D7h|l(%o=kienfn3{Kc_D z#-@&~qRLQd)C1#)Ix7lq)kA_WJC$oXDI5xw5(G zxmWV^^XBHgn&drcYd#^Lo?kOrYx2~|PYT=$N~WMw5~kD?>J-i>e8KhMmQ59(nlkn3 zG}CFzrhT0rHU0Pu^%>k5&u03}+%-#j7JJs+*$%Ud=Md&F=Ukg>F?a3Uu6c>`F3mTc zziNKR0{VhW3(Xd;S=ha3{Gw}%trr(9AuUN?a%ZW_(z0c;%O)**wme|@;T4n>^HzLa zNnLqymF249)#9tORyVHkUvqS=?%E}5JJuzyyS?6heZ_{M8|H3k-I%zszR0zxyjZ<> ze({e@%uV-7d`b?N4liA`nY1~3^UE!fTWYu3Zr!nM$hP_0I=829Z!8NfJG;YX$Bvyt zcP`$A+m*HJ&F(R~ukZ2PbF|#3yre>@V*XxaZ`R(o`^N3Nv)^xj%>mm3LV8PtG{mT|KF~#fJ9^#j`tci%H%`{O)StfTdGq`&-&>b&2j0GMC*sb%yJPM)-b=jq z`hM#DPk&_p(f)w@koa)kBl4qFkB2@kZ5Y{5(P-UR^~CeZm8W4(A3UQ!d-t64yyL}; zmr^fRz0!QOtT0VcQ?HM zC6FPA8Zs17=LwoiaQU*RhEy`3Bs`{qFNe=G;EUA@gjmK1M6NyE!reeHTvw16ghhe9 z;Km7Oq-B7dBV$0Bc%FzlH3(3hpujL7no)gWpN7YPFgiblN>&!s6PB5m$_N7<2Pc_@ zi3W?-BO~CJqKAy^p@RjHC;vlF zAe#wdDj>`C5<|%d84Zi^3cD#VFk%IFE{&atHC(@J5j(^lE@6&{6XJ}xU}C{Q`|hI= zD|1zLB5sH~;(>U=Jt97{t4QNN&Up<%V;UxXE0YOQrsB71*Hx5Kzf# z{S$g*mM~HgFIA;~YOgjCFG;n35?q@xuNDA#UYcV6w6J7aA}i+?@tJH^$}gJXtvO7z zidRIwe^tQRPUXc87>H)2NiPM#XVac0CnC9s#x}T> zCnA|h7Ltuvb9JF{j5RWXE3*yBgHGhbg*_jc0t9hUj3f?!2H1j7=-(wCk%0%l0kg^n zoqK8)`_HiDr@5skrShk6z&he5@>zvYl)rapA|r!jB};*O;^WbasNnl=s-MCxulW%? zEaj)Pp2wa%qcE&rND~p#M0)8YJu3u3dU0k%NE7)>VoD##`qQ@lA#vj$7VFmsEGVRj z2x%fhnuw4lBBY53X(B?J$nU3#z$;c#NEi7tU4$#H<0^N5a-oG*y^d?>DeNi&rbRJ? ze;zV_5TPeX>W7;x1o;<@U7%{S7&s+tkd0jq(y@RXBCC-#d}$)U)y%l&AW8)2BG-~@ zwF}rO>p^sOBT@vRO@O4`ktEtmyrx8_tb2$S>hZXVsGCo3?R88kL8i`jq90<{dl zzWE*ERmejh|8IK(O%23Cc>}|w=y=r(K$v@a3MpjJ@ZHP9>-Pa(Z;q+jW?+K@#2#du zhJq|$zLBZ1nXR3rjfJ%>_|X9G8P*o&pmuKzLT`4amKL_=mNuqlW_DHuJvAM|Y65|% zzgL=%?jHNw=q|=EhtFT4yMjDIbXO<>fCxnZc>6^t0w5Ft5Q+c@MF4~%074M}p$LFb z1VAVP@Ha#N;07fHVgOw69+an&hw?c6O_Zmn^eJ9xm%m+_?_lFBm}}D50(L3RgCgDq zt{c~#>%sNh0!Z*>P$9VrXs;J{6xSC+ePx5gdvL$-ybL~O2v}oJTmUnXhy3|7Iea!U z$TIY#^+*-`#5V3p=IbDV(14(9JS8AsQ+~LxpIl5DonsXebW_)y6JTJy_8vh#|MorJE+(EA&967>DAe)`!< z`p1~zKQ7p>WBvN^50wr7VX=OFz=A>@MWK$OP)AXyqbSr-6zV7nbrgTUj-pUM@mKnZ zJ$Ru3YWi!TNz@#-I&V|suXThOfAefkl2`2LKC0`-FB(!nca}^faxb1<&z~6p2%0EVV{&B&6UFp}4 ze~9$_!(#pVfCYuP(*M73C72Sj(9W&U&aKeStem$)DRHKLc)AK73Ed0wnLN1U{UrMMi#YYK* zSdCDqP$*O=6e<)775;xIREV9$Lhl_y?;S$#9seD@cYu}39`vIJy@^Jtf8`PY9f!FD zK)@zR8sVAk#~c;91qbtdZltr)8Ca=-pFT&0SX~3t{^Ju-K>R)h zIa!GudK&okFhvkjB;SFd$Q+2bG}Mp^qzcw`J0xSMHghygkMQcN|+z~>O-GrB+@*wur7ql=`^n}2pdAUKARaC zC@| zPIed;kA*uXC3|4~gtiF!6Tp!%gq0v{&q(#b+J$-u!5NvsSe>>I&P-1Y#M*+f6LvE= zyz%Nm_)cbW_$WdCu1xUm2w~72Bx;Xmdiz2c`b_jpW{<++p+7`eF}$^94dI>atWa$1 z!y(+rNRPl^2z8Q3G`5$IAZ(08qBJnn%0d$0n+`@@J7K&Wgb5Bduuukw-m)-fA4n>= zU12~v17aBPL_v}u^a3#&kSCaz&d*QbnSkZzV?v!+2&>^Wlw(3$9vWN0kp~5w?Y)QC zWC#U-BRwo87kL5>_$c7;B^jR6q1?cFJ)nF#G6|tU9)7Rh2d4)mY{(o=Xj`$1~SkSx87j8%)Kv8haY-Qwoj$(1VoTBY1393690vUYMmh+=J| z2-7|M@Tc+B`1AM*{0VqE0I{d>$9`H#{1w@|dZ3?}*f;lTyVjX?#A z?O7WWAgyoiv7Iq+t@f;-9tiZdCG9S)CaojwDXl3zOxj;sU)oCARa#lv9RAFtM@f%> z6t!L`Vfzi60c^hd!?L+G4x3f3Khvf1KFv95_-2$&2JkaziL2eUcr?j5Hbx^I*cu3r;9KA$|l2PT)T~ zxHUI5wV}Ad;mDx)rqhiLDYVp73eWc~hr(uX80>6DqH#axDSbMzeGWvyLDp3S!LA|S zwc5iyjZ_d(@FS`XN3a%ev4ad;WL zE`B&(53i3m#2fc>#vTAZK11+f_y~LyJ_a9$kH=H-G&~(Y8NUv;!VUZz0!kQ4FbA+F z^Za|xC9EKHq_et)HT#H<*+;_QlxlXxmc@(^266J@=YsgdNwdHl?hs*29>&qL;8_S!@o6B3u zhszhrmx8yoO4=&gTG~3=!@z6hNNodc7wtIhN!qKmH)(Iy-m1M_d$;x> z?X%jKwQp)a)PAA;R{Op7N9|_qP92;ML5HLxp(CXuqa&+hq7$qWW72JknvzWAO;t>X zm<~17GSx91W;(*u)bWnvJ;z6mZyj44TOGeUwmZo?QJl=2ES#*IY@FzwUe=r_!7grB9Klb?&9o1cfDmtUY?uwSTOxL>4Sv>(kc(Qmw8vR|5CwqL$qfnTBD zRKG=j%l%gRt@hjCSLCbVzhq^tfn7bW$`kIz2ignjM`PUBJ*`3}YBG92lb* zqZ$5;Kt?bllo8ILG3X2iBZ6y2e>EM`CI)r~ z?vnnXf9uYjqV*O@fmd}FJDQ^n3>E5&>N#fg^OZ-Ybp9}DOv`C|yQ|_Le73bWRd?6f zDxGPQTX9};qeD(QzS8i_lQXj&^lbDiU#?3jKQ~eJ{M(L>S1y`s*ROwXLX|bN6p(DO-=lF}uhIK#ZaQEpK{P-$%Za9W=ciXx8vWxygG7fbJ1{ndwZGci>8rN9gpE2elN`m*VGkFk@7 z7R|7!B0i!PS9bk)SGb@dN#%ejh0SKiKJjHOU$f?@Dr20=fjNs8Q>9JTo&NN!_R#g~ z*P~ZVr&R`w8Z|1K!}&tYyf-s}(ivTq*zY`nsImHO0P5*RO9k zxi(#8rDI3)nL1jf@2piDcO6>!jAhgDc;o1W_y6OADlFWXwAr$?x$yO5K&QVsv$!Ti*2{ zx2Dq`5}R(XShZ?&-Lpq4WmDSzP+wW4{_)EC#Mf7*mj-LjdNVS&nACLpl!v)xTHW2x zo4ab851!Z=(=|j|hxo#+_=eM!fHLJXUuUdYvnD*(XV%M?!(V+F`slKDtli0qWl5!T z=g!><=|{C~ZQDXBgYXR(f;*q=nzfh_{<+oX(5msrq5_us+^F)$y{$Ek(&k>ccyVb_ z?c+-N*24)8(`L=b-&EmUyeB_uW`^;T4a;VJ zWJ*7MOv+-c@e_kj?H9Q=Pf|o)P}GhK(~(CHwv?Qd+OoP2#D1hy8W=V|*htJX>wA9=+@KNVR*orKP2J_6D)WD)mR( zi&pG(obxfu*|k%(+v~Q9$>Y1H^Bs=+I2kGCksrNl9)r4&>fGvY-fTTBVIFP^04-2| zwEpoD3z^by?~qrdS6*1(T(sz;A4|M-$h?>03KWe6-J2#XP;PqldWxlo z_$zV8sYgw}iQLVHtnZ>;6`yXmJFa|n$ zm5Q;ODTqv>LH2M0b{K*p+M1||0 zpEYu+Tt$BTwIYrYn1ih^p>+jJ=wMmHr|A!Z<45v~Yn`us zg%#hPT6Ax%2n>7qr&fSi$;th}8Z(aJT-+Q?AJ1k7S8F~~RD3&s(&ZWs@yc{|uwVJ@ z_XeS6)(afxy%NvWyyTR(AZlv(0;w-!&?a|gom4Jq_PxvFwnI&JwX+l}b!s`pN|B-} zt(WHacmVxOImID5%Dix*M?81RRtGT5b1dVOpW2)}!rLkLj(1+&$g{B|hsB@fjgHVb z3t4><5}x|Z*(cd$dfq@kB9HuHyJM8ASxHIB-2L=bZ6~W2Ku#|W&+jAa6oW5pa+{9( zv_NX#%F_)n2hXoyFkqarIP~@FSC2V6B)e>(jv|9`>M(Ok+Awq5z0!9bF}ZvQvVA9r zh%65Nl&;2(t%{FvlCM)VRi3B%IL%>}%B55E%BMA){o;?KPATY(uWvdWBK__Pqvc!T zF_W1b;`!2e)w{vFSG*57O|P7=WkNX;UthT38>3wET$%E@ol<7Yr`G1)7OT5@r{bE+ z{G*p#?|!|SOn-SPctNC2q&X$&h1u9c08#(DnG4H5)Rk^rd%5JE=cSiUj_2Rm?NCwM zmeS5Ve*Vjbi^jqJ>09n?@LZ7CXg0P^tnNnmdjr?IxkVQDiSsUcpY-=e35LZwk0>J;`C8;|Q<3>#s7eHZAknr>?_MIZ zV+~Z)A(wlqxI`t@%`nk5Zd1V5Z?wFz;$JA$1sa}Nnss@Ln?{FdWQyA%9gRW38w;=G zEoS-AG!BXtHIFE}rWTx|YTIN+-I%xJ)|!AMjjxuIpU7+~4^P^$X5wSI`p8Su{}?&q zHL>uX>MhwUuZ@hx%3Ax-H6nYsKJO)Ohu8;iXpIhnqiNf=ZHpQk$33{Ve*1B!S@xyn zr5TUu@o=8)-@iZhWY8&-Y+P39ao@UEPb+JWhprR}SYvuR`<-6s#x1SMPbzDFyuC90 z`k0#V$jG7(4b|OF%?s6CgN>`!;lu{l!x-rcquRa3R?y zrDkm?*Y$}}CLK~XUvfihTM_KW`}gnfaiKKoPzj9f_M_Gof6-`&Xqg>$V@Bxpf@kiz z7nMu)o4Bhdx=Oa>?w{;uaK7bsY_?LV>dgCxQdS2&mIzxryYzk8biFz131zj*U*!K` z|1PNhoyd*O&G@3v!^*CNrnKmcpR-ZJXI0aL?n_5*Y^k~4Nf&wK<9#aXB(kzaY=tUA znP_(NS?%XE#aa=jRm6!c9j>iQ1CAEYsNOAkX%r*PbFG)#ZnA~blL$j2SZwbFa<|zHc7l9kQXdQbEUQ zZ1&Cd2gYw&XMEajiK0e^TX)gM%yG9;%dD7t(UHj;@2aPV4oX`2NC2Ous@@(n%9#%7bM~{w`s)Isd&XT&o3}TKxoo23 z39-7Gb(dch%?_Zxq){WV?V-}O+uMv}-%5YHJCAy@uB@VZPG;#hoH;aJIv zNz>-c5#6!c`kP`U?bglWvt3QcGNfD=8H%^m6_*sxqDCxVyLM#9({FR(8Xgd)Y5n$1 zP(t^K5zjA}2fJ)Us(0#|nl|4xPq81`sdu@oxO#49Q_&I~ohYT5Ki+sW?;gF)f33Dv z_11(g+s#wDhJUMWcP}>-|G|7)Q7F-{bCXTT*s)!9i;QYMsz10^J}I3WVpAyJ-cXW)Gb5g?DQ#>2f8@+ps|0es2Z7 z_3NaK9U+iKD{0l#A0L>_6_R+8q)I52+Hhc|#PQSA;=Hl?->TP$7i*S9eAr3;rqS{s zt9h^F(xpqAohIp6hFV6cbB^k$3hOJ9>WYjhcYtKMLmt$S%d<8tg1 zhOAzzY>I8^n`DpKE+^mJ+<32>z3iCG`JrDnZQA5=s_vuvvAXIENm;mutGsB<+1LHz zR-Wc$4KrEV=jRu_nh!VxfBb^HaBe$Je$nJYU(wKTu50z(#}AA4s6SNKEcklkjhblN z@$JDMbq*(s+?aB-KJVIF2Cte!%(otY%$0xo?DU!0GC3(Gv`YmuY*^=x?OeV7Tvyaq zZy)Iz?Xw4&Hzzr|tYH`Ddlk1g4#iT}VyTyA-VmKnPPwz&u1g))l}&u%Ttgpg>(lai zzwx}z3h#3!-JvPz3MWRK<7_JNnB67bm3^+%Yrb@&gLdQ4+m|mN*K?GRpITfJU;ebR zP_%lsWA^)d3T^EZ9tPgJeOv59+@o8$;RbLHtb7Ee(sG{7CX`{Gi;+uVRyaYR^7Z8uD2?RJ-Vff zsdJw{PkhpH#Xvd0^3uiQWmj)%+;HxGE?V=x1U>&Q*mJ$C}1=TWPAuN!cGUA!UWtPlv?d=dN0%RARO9 zNUGt-3!Rr2daGWQ`?l`Pl(>5w(f0CjO=7!s79Cpg$?@FH8YhF#uFs82JEuft3>_*{ zd+t+9!{-fpkqQ>?UAR_nTMd2LAI~MO?7VQjuC!Wl>W|j(U%xcxN7dBS6xB4$$=KAa zzIpO^vHS()@l}^TRJ~kN6cQG;d28MJv>%UmzfQW*Q0o72T9*nVEpDN z8$W!j%`Ux6tGaQf;I`_a_c8Vt4;H+=(J)U=O)dYv?Wxu|%a$$6?l^H`g~RAW9ot#f zmtF=0OtK#1kQ11zHpF|{AAiK&JfCmvKP5PYrM!Qab^f>ap}Ae5B>6pi_P94iKP&P# zS#7h@;w5PhCC6^wsWoR8-AY>ct$CaH`NyRZk*Pki4~H8V?2;|2R=6}*yP2gu?&{d8 zF^_K@KTBl>1O({e=yLgAuH@g%>D-xG;xq?NuWEPR{+R0~^@;;ub=k8@ksoj`{9#FzwoMy=mkXO;@Hj zWtp3s&mbAZ>Ca#Ac}>ZOCa=$5G?$xx`7U$N`OV#$l;_vhn9;2!SA+!zXW)uYT)wgY zg?HW+IhSr55y$Sk4^ByHHMw?a)tqQL`HtIkx={YX5tj1t)zK-R+C1L9&J@A^E$H4_(tp8<|(CPl@3HWo6KwI{zPe?kaCd0SfLKs%H5%e?p~6+3IuRPg`9gF8t9{I9C6x#|)qVDdlQjugWlYmPbF;U#|J# z-O*K@qdSE9xqC#j^QQbKl9Pwy+PmLQ%kiqf3%1CyMimo;}YvBsK7Se*@rJezJb zJ9Vn;{y6MOcNjF*{dhs0=eX_@tCH0wrpEhO9)6yu(_PYSd^$-xL+w~!?DuS_rI7V= zbl$V?GB3K-phFM6%ZL5pJv8pF+(M)84Y^&#%a&<><1T8nW*gnGetPfts<#&ou$?Xjm_D5q=FCIR8*m@zmiwXYgPjb3VV`ytu12Unbr+FwnTBVea+U7tAhQ_~HG&Fw1?>)G;12 zri;iFo%nG0!H=3(Q39=%Gf7g z@C!fhztH`hF1xquBy0$-#Szy#T(?GJS}KG<9)v~{@#3F!h5?dnr9kjZg5|5?cpmoxD60Uq%NiQv(MVK z-%~$r3&}22{-(pp337gKm2|H2@Rem(EDA3bEINJjDuQf*0<%FN7=UL0i)D`$$xnsHIBkP=QJWD~o-91#V zv3b12u^DdRBdU_xjO1&Oit)VtJ`ghswM0Q zY_SknLJJF~c+HtVUw)nP?we!wxf{&+u{K1rQ0d!#ze#qH4^HHmxN}qw9Xj+!(bnaL z`znq{%oyrEtGT(^w|Spl&f~mSr*`htZ%u!Ee6NAdwK5q4*SOUg)!#ZSf|z03PwuR8 zPT6M7`4OJx^Y%bTSE{mB4mrL-YQ@Tx8{MVxnwOWXSaEPjt^A9dv-J1aI$tPLp8sO> z1=S@E7hI2BPH2l-1;liz9Xoc|&8E+rW=5$>H(X_)m9%6kdzHnC6JMtnM!4SPx(|&~ zxN`SCprziO(Ypjy_?yp{QWU*p}SnswKT3ynK2JQDkEsWv4->gBcY z@bFQJM&(gYJiRU=U1x>+P_t)PiY}Mt6f|?vtemTUafxG zi`;9|qZ{;GK9ApX(lb}h9{)K>eDd3oCxa3h46$nEEnx>btTul%jBJ@*QKJ-^n3Po9 zhN8ujmNhmuhQRALwDnc4M)x-WgYrt;z4%@N}yXnVJH@1>n7n(9*JHhFT# zkdAW6TA6gtqM2_ej{9D09n`+@8?#g6p4+@PH@CB9n^bwZx}K6ccI;U3(<2PmYqK8) zEf%?4c#t-F&Yj~dgH+17Ya1P^Ki;iqh;QC%1N7Iqsp;vfE=@<+E>6P@yUBMb1^n&Eq=QnKFuv~Ax zWW))BjmI`==&W+uTHhXbB)xM&xx$nl#&qyFB~%ob&GIoU{Kq z=Ut0CD=S|nGjmTS+;?WKx#n{zD4hAI?rwMT5>{~9b)e;?%D5G6I2;7mu|0$@m%K9N!5#gR7bty@!m*Z zzec^&lJHUEhwt>I*yiHew|QrRKuJeO$BWJU#);b|r4Pfy!+&eNwj^vpxcKh2Z*ox# zZckd>i9MS7xoW;3>gcjL|2RrpTl+R1$%t)8lzb%Vrn;c2!}#^^CccwP;dR_?vL9(LVIe)`f?jmXuvn^}^w!K)LK0|NtQ7e78QTM+8* z*+Gsne%N&8%K3B!i7yQ=K6>WZb2^mpEb8>*cDD^>XRRuBcR** zrw&Q;nL%TG32(K(*=Mg1-H~T6Y=s-eml>UZvehk2PEDmwh$bBUJiD!*vA4FZUF~lY zvB=TW27E@hlv8ffAFyZVL4qg#zkvi{9UBcD7r`6f3B!Y_vcBCM@^0MR2vo}>akCj7?_y2XvoPUP=4d~u@X_QCfk}= z#xHb1_RI#aF3y-c?nj+Qe>{Bz*+t4+uIr%qcJalZ8v&W$GkagcAQ?UX8N_`Uc38tUVzXO|1Rr?nL$c2^HcD=)1+=vLW_?yIv0LJoYVHRrnYFS=^# zYOWz?pTQ*+FFL=KeONd5Xs+6?fUa)C_DA+h()2g{;pH2o3(X`tCZ=zq-Ef@f!~X?+ zp7ykCPbXoH7&NKnN19FD&ImTKu{kt(Usqqc%U=KEXY*`S@1@py_7ur5(cA0fFLhEf zG9)Qcs17c_ryaa3wky@AW^2ah+TGvU9H1Ze7LP_Z-($HcYXEl*2#JU! z4f~77ML!$ldp#I2kR*0_)W2f?BG34g-&l(NmjOQ1cCC|KQc{2O>#l^NG@!x?D6Phl29>Qg} z3-3gQJgym+ELZ!DXyvRxte^U`?iZeym*&Gfww++Y3)Ydq@85OQp zOz5P3WL5B;p(mM1#S>4vQqNqBJ}T#&7PJXfd&z0y-t?G;G_q2Jn9Sbj&%UIA@C@BA5S zHQc##cfF(KO!du=H4hVN-tE*Jwc9u*XDx-g?5<8Ok*v)WDapy{ZLO{L1jj3!(=nf( z>wKHl`<9}sYU&u@N%#H)f|^5-v_>taAT51?apes6_1xSmle4qr1~yD0j>xeI+-VU+HPVV=;Ga3+s>g-%+8fUs~)^-i&(_RXE6kn;Najp)7w#ge?d7gD6@ zY|G5djN$eX1!?g3kYYtEoOSSdkI!=FV?Nz<%2LG(i*~Xeqe5Y%yCrAAQW0r&{(64? zORe*KB_~P*LNX;XpJi?S9?yJ;E#Ym;vDF`|?5q44occDnPDc5It@57CQJUNK;qS?C z#pMLp)1Kk&`hcIOXAeBs{=2Wlrz}}C$pMb!&hR&nSzsFC?doF~5a1(e;T7WN;_vM3 zD-rDN;bCO-$AMM$Apv0Viu_De$XE?$e21F?CrzT3i>YGeS#jo69aqzi(L zpSk@HM_=2|Y30rV_Y6Ew+I4@}k9<@I!fVChe)6XTHH8NVSaHK^)__gg<&Vjf&x6GZ78xxzqt~oyXxHret1I_#m$#p5F z{7}8z$`C+{@k+nYi&*-J?#-+dr>G7DwnCW`YxomdK!#|hm7w^IK4Bti2(3x$>%crn zn=D4F6V=JgUI5JvhKXWK#r(SZGHt)BP3ETYJ)tw$?S*JvDfXkHOH^p0mZ`DVGk_N7 ziH~HjcipF^M>`ABE=CLojv){F$%$bbrq^>AEOTM9pP0{+XYeu&7+4^o?D|%jb zB1->_W(j>gqxNL(c{j8f$dc7BTC5VIkf2rEbFyPF;Ju7G3pDL z0t*RNssznNT9#a6Va62gCE9|_Gm3OZy0ZdGm>_w99Q{T8*XH(b#o1JE(Rgb;^OnD1 z^pU=B`b)TKsmUq>8zXg+c7^GJ;CZtsdLzjx5qjA?BbkglY$EbSFZ??l8m-ou*csEG zxR+=8!3L=6ojC7-^_QNEV@FO87_9d5N(K)jA31Kaa4^xJ<9f(0fa!PQH?4+HpPzlK zSOv{)9X-@m!NVHN2m<+1(*Zz{fmbhzuG5xUOJDMNJL8u>?%nprZ=bzndi_PWPE{CE zWXF4S8}M3=IYFP~E`!shUpIjm1_qcC%1QeG>VyGQg>mOmnqKk_^QEh$R*kPW_AmdU zcQzS4SMgm2aV=BZd*LUbjuUPIj2|?m;!B4Xc9oNz11VL=)omXJX?SivqM(59%2+;> zT0TXixdqdt71a_u<3eMK3vI+y*;E7Cfvkq)XhI-0pp7BXK?JfS6%PW^`@@wAo>dD90L$#4<(}W3dw!>p z<%^X{KmN9$@lOAas>#L07*Qx;O3jFEF^wE4s_RY%sQ7o?9N9cI&dVi{_8VwWIA0M! zmu@yal++a1(pQ@f5il^f*qOttGH(f!V@3O~xEg5J4AYTGz;InG1nB%#%$;qBZRoJ8 z6n=&?PdmrmCe*#CC+Q_&Igh^5_g8(9AmkmOf_3Hs#dMi4h8RK^&`csm{oqPaZ-O-% z3v{gt*u1LxeEHmduRoKcbD8)x7M?FqxM*LEh9`h+h51*P>$y<@7~wuWfvKepU7Wit zCOZv#yOZI1h|r9PvcWRwyM1sP$~*OR9W_b~+bRHD37rSk)VyAJKoi|$=cI>BoGgRO z>CaqTw$;h0^1gssx=qg?S}rR(#Bl;pRdF#n7Y&)Uqan@B98yE3%U2p+=&;hXA!j|_ z-1GY$gJ?zZMyWqwBh*m=I-T+p3-nY(qcdUn^3=62q2($Of39R@*m3;d$+K%lX zL$YH+s8xQ$oe!BclNV~&+}u0+a=QTMdeNdnQdl7ngFih?c*9M#I?Y{FveG@a{|gzj z!1ENpZYf-;SKFu&^sdPtAecHHMPr?)m{ZjYfS_*e&s)A#6@hLAx6W~o>|8l=iu*?4 zW20fZ<+S{+A>hGpvd2wxV$bxqIILJ2^Q4wfJZ;K2A5cz)3&XVJ95B&iqp0_E8t>+oVl$=OXmVzLA2$4P}`8n;VMMJ{lGjcd^oteyQ z|Iu~oMSHtSV`QrNZCo4ul7&xNTvlZCz|o@_l&X_^uo)%oLqOJ3&N>e+XOtZ!IK6%o z(%CmvSAIVMYT+D|CGQaj;5Q6bvf zWt-Bx%NbX_5BfT#1z-3!Fiv$@jsA2N!^MO8NE(6ET`vrs7=XmPb9MJWk=vm@Z9N zm^&3ut73wQewO^MFK@IpnmbBMAlAI@^`xe^Ur78TtKBRH&FJT}yQ}pBiEYfhI{~RQ zU!+g3V9JYAa)R2SBQ_VGvp+8SMb}5JG-TGvN%C6AX#R!kOhT-eROW|%S$X^5jkK>{ z79pFmSYKbkQsB(`^&A<0<0pq2UspJTAezgh8V1FCd1h5vGysj)M@8Xy0=CbBOs?K+RVgPG@R=zMa|w9dnVCTMCirp z-HH0imaj8EXk=XFy!txsF=K2kzEjwJy%5|}_grv8wz2JwXq^LjnNv$O{H)~g_3{eb zY_?vlT~$q+8pR7?_gHt)**pfev;0a9@huW|E#K0aHOZe-Id>@~1S>e7h@HMcAHqYu zBer8W*I9g?-!$2+R-`JZ+l6<|;m%HyfpDC>(nOP!1vEv;EBrP4QewUnC92U@=o>fR zF5%8D42b51Hd_9)CazJ(79BB{%QN`3*Od*o^mYdDPZ#G*MUR>`0p7`BfW(#x4C24) zjmry6N9+lX*!c4`%BDXs+XMz{QQ>QMF)oJYDvU*8x4jP@Rx5w^QM>#~J|NuTp=@Zt z;%xP^*Bb~gaTKGRLr&Yi`SqTQBhba{yU|V!RHX-@9cOf&#E~y~`Dt*r`#%J4-iZzg zH;QtlpApsGlCbOlx*x`HiQ8?C*b+2{Op#u9`F^2dOLS(j$j>))!_T|BZOQcgg{$~l z)G8xh^BhWDtPmb_h4s~p4z|0~?Cck3@y`Cf+@0N{E$s)xXx8|)55~+rVSWpu6VPp( zan!V#p9tl6tD)JC9j1$KQ$A@?WcKl{I>Z2r*yz57y^D*bJuh@u`ja$=ytXR+Byu-6 z-k^7~+v3V~Sml3KJmM-El=>{Cl0D^W`R1p?`{9!YEo_UjH@%)Oc4fsU^Q?F$`cRq) zyc~SZWf&jwi&{zgz;Rf}ljrcODf{)AlXqjFN~PVM3VYvnzwwI-pYgqOTc*QfM0J1m z`*v21R_1t+h(*I!G3IWmYdt)LH(fkxGH%EQCO_kr{mj66UeLeErC;(CooQ)T4A$%3ft?_ck1d4)YJnD?~&g*$>YK#^(r@&L#-*DP^OLz%K~?FA0$u76+Q1o z<($0V3G^cGH1QHd72t=;PzFIY=f$|PWvE?mJpP*aCPV@zp42y}7*@g30T@;l7{Qso zQ;%x!(xqNT_j~HPX1|;?R6@U*5HQ6ei@DNb)igg7P^%QV7+)*_B^mQtvRIQGx)5!< z*r2?8*U34j;#z+SflKHd7mnw4?d62UNMr|8D%hBuK`wbtfnimV5$FvVmBrj}pw!gEgb7ubG(@@dP0<~y3fin_|HHF&vFF9YrV5JiKpLxD{?pq>d8 zu7kZKvU^1oq!S*iBSt+G*FBp@2`QB4m3p>lSRCmq@x!)_H-#K-;&`z);GBkVy|P{o znIYtnbaSixkPQWyFdnv?A>@)r#zg=1z3Cvm^=e8o`X{u5`q=Waa<)nhI#rdr zGSklJ$9r*7_ta9nw4Z;~uWU)ny^)+~F;X2ABi04c3m=&YA4%G!)El6*_N5FI?NRYO zBjz=-*>}d!hdfb!G|Z@O$$8XtzGT=i9h@00s2gIttt%>INSxKxtBd!YLe5BxDRRVj zy`cLs!O?LTrN^4lWEwB^BdYMTfp6h`!PMH;MN*24hrf+ss^jeUka!uB zFuH`?LuSfdCNHE(2NJgY6EQC`zRqvd?=aMLl(~A6lK{w$z9%ma#aNq&%}Y;TK^apHquTQJp*QR4(taJrt2pp?v zohbRRE#0I9Y^{(ocW3ef4HUyfxGx?Oq?fB^vor*38t$zE^&$o%JYxrk*rS_&%kP^K8~e5;mM zT2fbeqUJBt$6p#cFe}EI>ut-^;GB;vG3)xD?jKA)81ZexH7bzf1wI^&5Oyf#J84xkVLOt988O?i_opoV(kpBI^W?}-jV z%9>e=Oga46hiIP`Fz7~^nsXPH1;=K~RYrOE0vM|$m9Ci&-3h4Fq?#TEz|=9-x^k_6 zN`S20g>7A{M7q`)uZ$$XhPyBTg2&U#EzK?4W!`qse`i>u@>yaHHn zP*CaGyv(aD<$^<^EFB7+{UY^STP)=H^cmYy(~*zyVt`ST7@SS0i>~x8YQo(&W}k-) zhH|}B?MjZtcCY|?O+0C!uZ|H=e5SqpNfXunb0z#;V(O79Q!9jAKyL6t*CjwEE#^i* z98N`?>o~(EgCb2hv{D|Y(23IyVu5|(M>WRSR1LN;?NoBOxg~d-R~_d|mJ=uQR^L5;% zgrjq9^<7q-evxSLn(R5M<t0v|O-YB)(aJKSyBW?9T9xDvkLJxvaeDt!r+N ze>$i5cS%y#x_^6ZdG6J^8zL0fq(Tqh+}mQ4igyA%JTOCjMTb_`PA$*vc2yGwZ7Zie zm$wTa4PNb`yT91Ix0p`h`x4~oYDe40EF+ny@@WdsJd*gqq_F#~r>qfd;*kQJM`eC6 zU=D7}brx|tZ{vGnTp-Jq&RO>&=@XqT8>s_S^xBgTH*|FOdqDSmvjF;PN4nO2&c20a z=FN$|84E8eQzc6HJB;HpI+SA0rm^yix0X;H8v*E2&^AKzZfstZ99v+D()#(#{3r&! zP7fh+bV4_|C2;kO-8yMLpsH;{?>HwHD@Phz(<1`TNSmQ_)A&I8)dC%Qua zX;5qCa$zM<^wTo5pD1^{M?f;{DER%&pr&Mmz`*xE&n z$n*YbP{Z6D6||VOS^VyF;t9gL%?^->B=rEl&YPj%SN487{4tx^EiZG z8Z!`R;!HghV3$Y5F|S+v?Nm!Ayn@YQ8uFx)r&+g$Z2*Lme{wz4YLxP+cVwUO#|Nq( z_TqFZ&1!N##S2#qMKT_0?2RjYe7G7M;h>o4S;u-d)V88wUYFsOZ+j0y?#EioN_dFs zxsI!^kR8Qen$^Z{zeHyYFK>6c-us5r?jfVtfb?XF3`?k!mFdE>e4AOU*?J(}5#&oH?QzX|TUB~2s_<@2+{Y4S&DE)Ef;>{oKtb>WBn(Rg8yTOdoy3RA9 z1n7c@7Xd-C4C=HPs8TkiT)s&C#4LqLNd|zur?S24ttz?MYqY|K^c1()N29hpWeY&v zbams3eqtbj%v8qR(EN^9fx^`JCxZ7bw*F{{ouA?)((c zZ(Q0Cv%**mmyb~K_pe&A+>H}9t)_FG?;CFuu*l2cEjSCPqhrGcI74cFop=S6&T+V& z=Md>wL3|ramDeuZEQ6SLWpFL@2;Y-o(8ZDmb0G(!e9H6WPFkpi4s^xGmtju;h8XK} z07|GD9H4pS9i;vas{JVZ9Rb|CoDsC9ryEk9h=1+GHRqx$!Q3`DoxQ~Qs#&Ok)nhK}!MVbgAvI4G?Plwt zJil`T>_15TauL#8KUP?LNoAFR6a82><#7Ag*@BN4AWJuBayoj;fSL8xo5uw@XaE-< z1xC0ECfP7J?a76dpSM%Tz02@{wukXj>L15aHW!U=56}`y!uIxEn)a@aH5pJIVH&uC zM-Gj4N~}8CDZaly|GkUh)N4gaX zh{grVU8rc>G`VDDcliOz&Kl-;7c$HP|X>z8*o7a^$2@QI3>;zCvP1s5~2c>k7 znD{}vJn9sVo#Ljfj@~t3JFN%tJ;SeFkhOB=YPx%<@x&O*30CY=m2cE{02`90l z0rY+LQsWlJjuUI0H_?fD@i?zc^#dNsrXU&(l(yP)kV%eJjDSy6(!MmkM!9Qfm{cpq zCZstCYxSk;TezbOgs*V$C0-yPcVl&Wmapx)3q3^kA5whsH%32EHtR2E7D9p2yFUih zojX-E$&+tA3%e8N^wL&aFIU>)iQ;YL_-ukA{CxQpg_y!AO59{5GoQ*u0DAcc6#+Nj z`ZbGPH=+g0Eh@e33sF-?3ZDr-&>^FYR^$sdMXy;geOJTtoIKU2@7y)Gbe#R-(sj-Q8NX)zhTq=7Yh?hgwR-`vzG_i>yig4(~R#X&PoIjCaj$>4=J)Dq>u-W3^A=B zqxmp&#)};6Pq3W|1n64_EKo{o1Sryg;MgsJaErA776y{jG3SXm_!M0#aXl_uF4Sy< zIcG`*SvSJ%y4RAi@Z<-j{-kOH21#Me^6lPL%(K>4jVwzdfE45YS?@ePe3?cGC~!V z0R+njlLC;7gAQ^0klRooY3)md{+#Cn(rjOvU>baMNdvsiUR^G-Y-vM$L?A@6wd1ct z1GbeY36Kl}z6P7in;9}J@*edzzKa)?OU4E7uKk3@Xyo7Ys^yo*KF};FoLbL>Hm5FD zy%4!e4CE&VvPtYjvgV0J0I?By>7!cy{CwLR@#gFDJ>Z7(DS*~~;01nNJH7Gh6YD{P zIADJgo$|x_cCw^sbFGSwCSUfG72dVc2e_dk=4FS%d59@?9LUW{QZ|&!g)nvCkSU1U zt}U-O6k25$^N7Hp{*B~3K#a6MWkjmaL*1rMPIHFW=wK+1VF6K z8F&xAsAM>(Hxomt@bKwNm4k$xyWrSYKeh zhmRE*!+{L3wD1e+-|swKS^o;6Fl zdTIJhrTX2$Too_na|OByBEH#t-V1GcEJ?B)K+LcryU>^{vzQT(H;;`#eMD}x)_a!g zwJHE8tVZs$+k6~T9{^r-(6f4E5@*Sma%cLc48 zV@8wL6j6nAGh>9fDcs=bq`H=3PEu5{T%=;lW_&jrz*{c`acoW<)ZRg{uDn$VpI*>4l3*+QeJxAZb-(olG$h949*&PA3c^#SZBKl#oA|Bxf7G z)&6<9yM)FO9#PQLiUKXIXxubE3}=tvbna5tB?5NWLNXf2r~aXtpC`X87@o=mr{50$ zNOA%ZTtuKelz0Hhu7qgu)G1CkEpf)oQqfBDva;#fBj;nEpgZ0vY03q;Z51hJRVi@9 zirl0v`-E246G!m1qQN{v78%e8gAS{bcIHdOqGo+>wurisSSnOoa{xK~{p2?KTM`(Y zatqFsq3tqCFIZ+J^q1th8EQUVz;OvAI%Z6qrFdLu!%Di@M@0X**+Xb}wz3jw(HR6t zwn9o>M~sGwv;ejXV>6kRThU@6^7^_+fAK66Pm6!-nm1OUYbG)qlZD=#eHyJOeRWXF zK6U3AizP>4&c$@t=<8BB*Wdsyx-$5<_4)}R)IGxEVt!+^-|6{@e9HM567(r7-!QR; zCB9W2oxh>s=(Z2&HN4O0y;E7y;;)eMUPNbI5`hXJGv%_r4JN)|r_3qW&hXFgx_?sF zbK(YxmM|v^ z+*6uQs&=*Jiy17*C5k@m`86R0kDi*o6=9D&AM^s|_+m54`p%8W`uH=g_~hNUpO>Gf z?VMFIx(wcXOLgVZ6hF24ROZ6w7cIl2R%yc&=QgTUmAm!S(k65gr`6LzjNZKFX=NB;z7v`>msr-rXld6^z4e)TAo0Zi z!KKIHr<%l0zdbk|_mygq3YpHv;rGoYQ%VZAWi9yiDw(a-aQk~hrut$T1IiZZfjU{< zrGDZ-ka{bZGXlD!etA4X(&$rnAlUP6;C`HctM=t(8#ig&!t)#M2;$xY`&3P5rnJlx zO9C?=?4RG@G!ElXtDrS}dqQOB({n`rD0dD6y8xLlkyEDK`o!z7bjsJ-p^Xc(*Q2xM z{i%k*$urW|EuI;Rhil5+CQQ?*O970t_j0lJ9*5Ot=GaKOSz6B%BFZMyGxd<@Ir<{S z$8UC!$xgGX889&q`=NbihU>Dq?m~r5+Ok&YiexcXBZSAOJFSN)Z?ORAaIwe*j!5t2 zt)h{$elJ${X7t{;RagWbn(+ux)L4qwGa805Os!qDON>ipEcTubO&@5(&6-yu=L!OL@e(`tke~~Z|JL16d8_Os+YHY zqoN*=CDDs&t=2Pd>zZ`u8Grvsu_>vJ1D1$y2}y>DCEr|qa0nyORkL}~J*PVR@6P3j zpW_MAWU&{hr2tdx{b*bw`%F=(irG)(ptv)EN4AWO#achtH@dqiPBK5ghkF*djC@HK z5BE#WL)CLTJ-rg0u>DBbvn*I4;hpRWhHHrzn7E&-{;F)}xi;KJ4;af`^|TpclA5YbeEC~y>Lt)jf% zfS=5zoOr8Ga75FqQwM&f2|LfIJ0T!A=2hm8?s*V3afzI#BB4x^4973OS%r99EdN1? zd2>Dq3!(^0R9@FZs}uMp?2>wd$n{E5lPw;XsywWV7%++Or8ERy8>&H1A#)!kRV%uB zivfhdQ8Y+`IkdT&oTZzZ=#&bWQ#5ohU+ZW6Cf6hS>H@FgXhl5ge-S)dk$ z5;p~rFjXS&IjdGcOsmPc0vt$8%0hGc6VKKyWp+17!98&;ca!*u@R#kTF0+o zQii*!y?PJ`i=0Kfl!-E`&2zacW2{oMRFBUg@TKbbX=yAEGDH3xwqu&09R2h|F13n8QR`rwF*-3#61uT2wC8VHwS)VG&LtE7YJcnjKPj z2a=DZA}ZfNjj+xLis5e32R@>bS}V$8M50I*`bZ=(jM1!%3JXLDuWvLnxT*&s=#`;P z{9Zh{@uAnekjBN?YUibHod?Oj&dnk&)ow&UBegHB^u*X&7~(RI01j{>xU6Zyy;)5~ z`x%{iKWf^j5bE@m0tX=Ttn%9}fOMAFUFs%A7#2|OUYFM$D2t+nVZ>9h1qh)Bu2I#L zwx?)>uyDK(b%c86eQEwnKaj-MYngGd=9UoiB?RF*CU92ER;x-~9ZZYb<4wrig4r>l zRr5sDeP;xlr9hL=Ehounsanb&@mswL>~!8ITHLemyWLh-LP%+0nv&t$G?l&MG(@Xv zAQ^>!Em|8Qa9@W)Szp1qIRxQ>UW}$#>#RPXL+d1{AqCKQ8wl|?8AcNNnx7Saxfa_J zx__aDi`U_oFtC`qYQU{q*hlIdli3i{u*PT9ZB9!~I zD(H#teMhN+(OVbw>t+KKi^oh>E_i`CLk8n2KM~Q@Mm@H6VLuU0qAF;XNu&h2z2p0fq*sa9-uinV9Wd4zT2rO%us@j zlCM9BVP-Jw4HxA-C5{HG!#1rs&{XuSPVMq(;>2oe1T8+83+S*QaFC7y;Rtu%n=9Sb z-JKnNYbP&{eL2E-&zGCcX|~gPj06E{{k`C{4~Oq}??)Op+RjmsMFCXMY7emEP7J)& zDB>=;Di`we>bRdC`zGSnFFz4=d-Yfiks>Ep#OTarA`3ZL6qdHt0Nn!x)(!<44K$~8 z^z?XD%FLg_<9Q0a$uZ887G;U#nW22(>{5#$Ktj{p#7CEk*i-pfp2`~a_e=)y#bZYS ztY?BVLV1}vs*R1Jlcg|?zfgFCvvO)CiG)|f3@I4*fDj>$CHrL+x6TO10v^IbBS4v6 zcuxt%Xvgt*JjY%sCM%4;Si*)ma|y0rv-+Ch^%dG z`Dh<*ZKo!HiJovSWvw$a+Bq@!X>sH(gOXgRggca9$C)?W`l7HA5yGKc_a@?fg-`9K zWn(|~exK*&3UfbZ5vV$5pJ*=_04~)pJ zd>y`9ycX9lEqa~NGrb-KV&m1P?@pmczZy&paVj?Owb5$dlt@{k{KYe}vka9>r(80e zQDCG|?f>FaR>m2cJ(v0hR-Y0u4C;r;`R|!qxW40#=jfD7<=ah^94FE^yxON`PtXiC z{O#!_QIQ+C488b1M>Qlf6}F&s^-jQIv$1rk_$m7L z#vEEq^K(N-4?oS*U!LqK-bBsY^^LHc%eXclrh56oj^r5};M%i8SNNt@>;~*1$oSp} ztGtic;Z&n*N;!lpq*%Tf&LOiK>u|jGwZucA=MqEjeY1S84JYUTYobf{?}U2`Am0m3 zAoA<>L}jzi+o;Kjbrzr=N2?Ji(9VI>6lJZx_A!BK5Z529F_?2(Ms(v$jhWi9!_wsW zUc7O{Z2DAe6(!+Gxsw>BKBb_@Jsx`%WnH(8cx)o72l%20UI3z(9bh$4$o6G|wezGP zjZ4uzUSbD(UKzDSw1qunFzF{+JuIbvvx~i!Q)@tP$}UQeLmpDe4>j)zOD||huSjc6 zz{j4fn3+p6J+zBqg_7obu}nO?n)m5LNk*^h%!oDds+r&X$zl2kQx5sqN;+zFr6y&K zS(Eha11=4HZ8l9c{ikvMlvUPeGox9|VBs#>V>5j$eL~mJS=nkmbmH3Ew;UVYt^nu( zPQ{tXqp6o8Xmrp~Ska_v1oCA+6g(}Ux3xUebXPQvvKh5KI(52CN^*#_IH~bdJ^gu^ z{72h7vn>SAb)XnBFuKe69H$CROESF$3EA3 zRo%H37)xw3+BeS79*q;*E59%c;6g*U7CYQXqf2=tX0xq^pDv2XZu+=#n;bV!O(1_6 z#nkk>by3I^P4azlN!;&v6&^p}6v6$Kr72!r4~>;>J;^6^m#wnEAq_n&Gq`g9!AEQQ zsE#hW$Av-UC)HMqg5|#HKDkBfvac=eNz@8KSTs9 zWM)rNWfcKZ@#}*Qsctg7zAh9iX??LDI3{+bIwZDo=3~UWn=>Vv)l|F#S>O^AGotxn zx`lef9%(OWt_Wfu_00nhN5cqX+%PQ!3%DK;2o#_Lpqz-q{Y9VBc%7#FqNPM0gtX<} zwF@9u>cBAuZgP!=DG-OpDc+P36zr=9*cs;BrHDWQDSmn^R*21o2rxl207dL&Ba_mN zpgUNYs@T4*qC2RyYRHN1n1@MF3E>PHkzPj#pMdc#e>80deLH)Fy%?GFvXU3(RDV*_PsWA*}&wm88E4 zgcLvbeK`9SNBWkQ!U*ifo&}JePZ5C2#B=Tz$*Erb@jOuos4&6_F!expJt-=Hg1*2U z@XY^WNFtlZ5)B3PTW#Gwy>Wdk9&k#sLH~i}%Z*E2=K`!Akk$aN^*FgKQ}T!?d+FzG zX^1f?Op4{Vzi9wuB}a@v`5aB^o$fCn@cug@;`^=WrBJVTa)!aS*Nv#-M0hdXx~`@a zWRFQSRWV9{iaB|hV1A&(Lt_JVRt-?dURpgpRU&`?Vx7~aP=_mD{^nF4cIDh@ej@uv z#PvwM80OYt*@J)|kCZIxAUPKRClS*GS-rwdfb3r7?t%QeM#QUNx(HHU5F`LnCY#}nj&szB}lN3jA|Q1WHIGud_Zq9b%84|zwT*CS*y7wh_|M$E;=WXp%_ zrvd#%?|d_3GVeyELRqbiQ{yBr0XfL?RSxk97|Ubz)TlN}xJj@PBXeG`_n1PC>((Xx zoK^>MgXaumavx%YSM{aIE5TjUWakjWx6eb2EOH9vy_fMXVNVQfG86KA!!7@A!TZF- zU=7i$a?XfuOBIIi8JRlT5PoB~Fw}(k-V>FJ?-NwtUi)K{6p2w3lHpl^{^;OMg&K3v>w&ts zsKsO>Teni}2054O)@#fu`3DW!S<8iDPV6gCR9arT#yNW)cStvFj@zwYzSkPGw;nTI zU$KcQ&GwXt4e}_GNUK<*-aJ_qLvjEUM=2*Z@tlwH(!5i1-$*XdC*d%rvG^8OzXQv6 zVJRO!#JRS%jT`=RLvXu93yv?*)t4S5tAE&KfIaxUa&OS%J?v^hvG8Nhf~t2PMse*%8OQCdiWeof670Q0Jd%Pv_u{U> z9|yl34|%(v(t~_Y2nBeC0}bt7dgSz~PE%|YR-Qc$ix*$pPOz%G_RPDmbEA0hYuEW3 zj_7#bD{&u(ec3*KoxZyNDB$h>FNy=^!>FrXdQ1n4CneZp9ajy167EhwG7Kq{Efu2vU{PA6g|J1bBdqIkR7NF(8pc$M+jTuW zL$B`Cb;3M{w6C{nbB6-kl0BDnYH_d780(UjcbaK~g3ioa_NCYh>88(=b*(ozm-@pq zOuwk<&iv$FhDBwXQETYgQ1L9QpTJ@Ppe0=@WPk*H{d3_!Ab-)&ziE->TJ1AT2x>_t+hKl)$C zzXCVt;s12!|Eq)6H83cc^eOSAQnG&!!~lsUY2UvGYdDU+{mi_HvEyt(YOEq6@44#`Zof7Dv3Q`O(M_t!=95^^P8|= za4I+lTokSh*N0ofJ>i$&@$h{3EqEJzfE3DN1-^$sAecy4|C0zkgbm_6;xZx?QG#eh z^dKe?ONehsB$5>=id03KAf1uH$arKSvJUwOIfYz79-t^t+$b584$2ngkBUa+qiRtP zQB$aosPAYDS^%w#HbJ|g!_gV&O7wm7IC=&Bot&0jkX-dRPTg^wy8kcZ)E&pDJC0Fz z9HZ`k#~5}0o|-_4{q+}W0zSz7&+z1!nQ+WZIA$gsGZT)P3CGNYV`joJGvSz-aLi0N zW+ogn6ONe)$IOIdX2LNu;h33l%uG0DCLA*pj+qI^%!FfR!Z9=9n3-_QOgLsH95WM+ znF+_tgkxsHF*D(qnQ+WZIA$gsGZT)P3CGNYV`joJGvSz-aLi0NW+ogn6ONe)$IOId zX2LNu;h33l%uG0DCLA*pAS8+bfE+Uu7=lPp2LPZfq|I0io`2V3f3(ZrHSUjg^YeEj z<@v*T2z2vv`=k3wIx#fFoutVONjm=Td&|kDNt)j`#Lt_Qen8R;e(ugBR6LCGPdW+T z=ta^}BuyD)VWvsaDkLBUrRQI?%U^V`dl-rT0DxvdV0e(Xr&lmm$W<6Ct)!%g)pNh( z>mD2|j(2wTaSn3BY6kcPI{SwM@Rz;z|05RRe|+=LN&g=le|Q*w&$eSqVrG#3p_oSh zmG-X+{*@L`4uIk}Qr~3$E6t@4fO~PID8jS(HLlP^;SQw!5erXyxfW_4zF<|O6@<|*cV7IqdKi#tm)OC!q* zmLpaytM)N7;h33Vdc*XCnY7szvmtYOb4T-9^F0dxmc3_b&f1@?IlFJA zWtD9;Z!KvZX+2`YX5($sVT-gqYkSM~o1L~@p52PQynVd=O9w%RFo!4S*v|Q$>vp7Z zbauS!1b4D>s&)F|Y~oz*{LMw*rPyWDRnzsl>t{EdTkbJ4;h355zb7*R0%ZUU|EH12 z-v*d~>c6Enlh|%<0j?o_?*74&-u@l|coLrc|58+)REG5Y16=smp>`hfZ}1EMQyqWi z3I94!!hfy9!Yjnj#oyW6_iqq~|5Yu+SOES!b^cWaNzEZ4z}Gq4J?NsO;hz_Aby;aG zEm=ivaV1R!b#XZvX$^689R&?>Ep=Hbc^Mf+4Ot~kaTzHYS!o#=X>l28IeA$b2{-3p XXS@L%@uzAS>7hjGub?}BI_>`eYE^{Y literal 0 HcmV?d00001 diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift index ca1f1c9445..2cf37f1c64 100644 --- a/FreeAPS/Sources/Models/Configs.swift +++ b/FreeAPS/Sources/Models/Configs.swift @@ -13,7 +13,7 @@ struct DateFilter { public enum IAPSconfig { static let padding: CGFloat = 60 static let iconSize: CGFloat = 20 - static let backgroundOpacity: Double = 0.2 + static let backgroundOpacity: Double = 0.1 static let buttonSize: CGFloat = 26 static let shadowOpacity: CGFloat = 0.75 static let glassShadowOpacity: CGFloat = 0.6 diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 9557af88d7..d5013bd74d 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -256,7 +256,6 @@ extension Home { @ViewBuilder private func buttonPanel(_ geo: GeometryProxy) -> some View { ZStack { addHeaderBackground() - // Rectangle().fill(colorScheme == .light ? .gray.opacity(0.15) : Color.header.opacity(0.15)) .frame(height: 50 + geo.safeAreaInsets.bottom) let isOverride = fetchedPercent.first?.enabled ?? false HStack { @@ -267,7 +266,7 @@ extension Home { .symbolRenderingMode(.hierarchical) .resizable() .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) - .foregroundColor(.secondary) + .foregroundColor(.gray) .padding(8) } }.buttonStyle(.borderless) @@ -275,10 +274,12 @@ extension Home { Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image(systemName: "fork.knife") + Image("carbs") .renderingMode(.template) .resizable() - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .frame(width: 24, height: 24) + .foregroundColor(colorScheme == .dark ? .loopYellow : .orange) + .padding(8) .foregroundColor(.loopYellow) .padding(8) if let carbsReq = state.carbsRequired { @@ -293,20 +294,19 @@ extension Home { Spacer() Button { if isOverride { - state.cancelProfile() - triggerUpdate.toggle() + showCancelAlert.toggle() + // state.cancelProfile() + // triggerUpdate.toggle() } else { state.showModal(for: .overrideProfilesConfig) } } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image(systemName: "person.fill") + Image(systemName: isOverride ? "person.fill" : "person") .symbolRenderingMode(.palette) - .resizable() - .aspectRatio(contentMode: .fit) + .font(.custom("Buttons", size: 32)) .foregroundStyle(.purple) - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) .padding(8) .background(isOverride ? .blue.opacity(0.3) : .clear) .clipShape(RoundedRectangle(cornerRadius: 10)) @@ -368,7 +368,16 @@ extension Home { } .padding(.horizontal, 24) .padding(.bottom, geo.safeAreaInsets.bottom) - } + }.alert( + "Return to Normal?", isPresented: $showCancelAlert, + actions: { + Button("No", role: .cancel) {} + Button("Yes", role: .destructive) { + state.cancelProfile() + triggerUpdate.toggle() + } + }, message: { Text("This will change settings back to your normal profile.") } + ) } var chart: some View { @@ -520,7 +529,7 @@ extension Home { .scrollIndicators(.hidden) buttonPanel(geo) } - .background(.gray.opacity(IAPSconfig.backgroundOpacity)) + .background(.gray.opacity(IAPSconfig.backgroundOpacity * 2)) .edgesIgnoringSafeArea(.vertical) .overlay { if let progress = state.bolusProgress { diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index fbf5dc2f1e..7ed794a09e 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -143,7 +143,6 @@ struct HeaderBackground: View { var body: some View { Rectangle() .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header.opacity(1)) - // .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.darkerBlue.opacity(1)) } } From 5a4f226d38ece34b85d28b6c92c99f91fb95f51d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 22 Dec 2023 13:18:00 +0100 Subject: [PATCH 300/405] Fix override target, when not overridden --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 7c9421180e..d9fe6478b6 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ye&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ye&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ye&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Pt=!1),wLt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&6!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ye&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ye&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ye&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&6!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Pt=!1),wLt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file From fc8126d3dcd84be20c1fd57f6e8301206aa5829f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 23 Dec 2023 14:25:32 +0100 Subject: [PATCH 301/405] Render an indefinite override duration. --- FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 396f6bb25b..975f79477d 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -1113,13 +1113,11 @@ extension MainChartView { } } else { let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) - let plusNow = (latest?.date ?? Date.now).addingTimeInterval(60.minutes.timeInterval) - let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) - + let oneMore = CGRect( x: x1, y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), - width: x2 - x1, + width: additionalWidth(viewWidth: fullSize.width), height: 6 ) old.append(oneMore) From 137f2bec4ad9220dba4fd2df72595ebaefbd98f4 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Sat, 30 Dec 2023 07:43:31 -0800 Subject: [PATCH 302/405] Backport OmniBLE PR #94 & #105, OmniKit PR #9 & #18 and MinimedKit PR #6 (#438) + Extend low reservoir notification range + Prevent negative duration doses, which can happen if the phone clock is changed + Fixes Loop crash when changing time back and cancelling bolus, Loop Issue #2057 --- .../MinimedKit/MinimedKit/PumpManager/UnfinalizedDose.swift | 4 +++- Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift | 2 +- .../OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift | 4 +++- Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift | 2 +- .../OmniKit/OmniKit/OmnipodCommon/UnfinalizedDose.swift | 4 +++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Dependencies/MinimedKit/MinimedKit/PumpManager/UnfinalizedDose.swift b/Dependencies/MinimedKit/MinimedKit/PumpManager/UnfinalizedDose.swift index 6298588e1b..de9d0f74d6 100644 --- a/Dependencies/MinimedKit/MinimedKit/PumpManager/UnfinalizedDose.swift +++ b/Dependencies/MinimedKit/MinimedKit/PumpManager/UnfinalizedDose.swift @@ -117,7 +117,9 @@ public struct UnfinalizedDose: RawRepresentable, Equatable, CustomStringConverti let programmedUnits = units self.programmedUnits = programmedUnits - let newDuration = date.timeIntervalSince(startTime) + + // Guard against negative duration if clock has changed + let newDuration = max(0, date.timeIntervalSince(startTime)) switch doseType { case .bolus: diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift index 55a5e8dc1d..8839feea59 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/Pod.swift @@ -93,7 +93,7 @@ public struct Pod { public static let defaultLowReservoirReminder: Double = 10 // Allowed Low Reservoir reminder values - public static let allowedLowReservoirReminderValues = Array(stride(from: 10, through: 50, by: 1)) + public static let allowedLowReservoirReminderValues = Array(stride(from: 1, through: 50, by: 1)) } // DeliveryStatus used in StatusResponse and DetailedStatus diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift index cc8e2487d2..f6bc7edc62 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/UnfinalizedDose.swift @@ -147,7 +147,9 @@ public struct UnfinalizedDose: RawRepresentable, Equatable, CustomStringConverti } scheduledUnits = units - let newDuration = date.timeIntervalSince(startTime) + + // Guard against negative duration if clock has changed + let newDuration = max(0, date.timeIntervalSince(startTime)) switch doseType { case .bolus: diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift index b16fe5d796..d98621a732 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/Pod.swift @@ -95,7 +95,7 @@ public struct Pod { public static let defaultLowReservoirReminder: Double = 10 // Allowed Low Reservoir reminder values - public static let allowedLowReservoirReminderValues = Array(stride(from: 10, through: 50, by: 1)) + public static let allowedLowReservoirReminderValues = Array(stride(from: 1, through: 50, by: 1)) } // DeliveryStatus used in StatusResponse and DetailedStatus diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/UnfinalizedDose.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/UnfinalizedDose.swift index d439d9d50d..3fe2ed5351 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/UnfinalizedDose.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/UnfinalizedDose.swift @@ -147,7 +147,9 @@ public struct UnfinalizedDose: RawRepresentable, Equatable, CustomStringConverti } scheduledUnits = units - let newDuration = date.timeIntervalSince(startTime) + + // Guard against negative duration if clock has changed + let newDuration = max(0, date.timeIntervalSince(startTime)) switch doseType { case .bolus: From c3f6bea56d5899da086d482e4155cc38120c29c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 30 Dec 2023 19:57:12 +0100 Subject: [PATCH 303/405] Updates * Bolus progress. Display units currently delivered in the bolus progress view * Highlight TT when activated.Disable by tap.Long press to see TT or Profile Override settings. * Make Loop border thicker * Clean up PumpView. Display when no pod is active. Reduce HStack size (length) for the PumpView. * Increase Header text contast in dark mode * Simplify Cancel TT and Profile from Home View * Color code highlighted buttons * Bring back Time Buttons * Localizations * Clean up --- .../Colors/Header2.colorset/Contents.json | 34 ++++ FreeAPS/Sources/APS/APSManager.swift | 6 +- .../Sources/Helpers/Color+Extensions.swift | 2 + .../Main/en.lproj/Localizable.strings | 10 +- .../Main/sv.lproj/Localizable.strings | 10 +- FreeAPS/Sources/Models/Configs.swift | 1 + .../Sources/Modules/Home/HomeStateModel.swift | 22 +++ .../Home/View/Chart/MainChartView.swift | 2 - .../Modules/Home/View/Header/PumpView.swift | 53 ++---- .../Modules/Home/View/HomeRootView.swift | 166 +++++++++++------- .../Views/BolusProgressViewStyle.swift | 2 +- FreeAPS/Sources/Views/ViewModifiers.swift | 26 ++- 12 files changed, 230 insertions(+), 104 deletions(-) create mode 100644 FreeAPS/Resources/Assets.xcassets/Colors/Header2.colorset/Contents.json diff --git a/FreeAPS/Resources/Assets.xcassets/Colors/Header2.colorset/Contents.json b/FreeAPS/Resources/Assets.xcassets/Colors/Header2.colorset/Contents.json new file mode 100644 index 0000000000..615138cb02 --- /dev/null +++ b/FreeAPS/Resources/Assets.xcassets/Colors/Header2.colorset/Contents.json @@ -0,0 +1,34 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.246" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.199" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 7e387b0959..ee8407eb91 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -23,6 +23,7 @@ protocol APSManager { var bolusProgress: CurrentValueSubject { get } var pumpExpiresAtDate: CurrentValueSubject { get } var isManualTempBasal: Bool { get } + var bolusAmount: CurrentValueSubject { get } func enactTempBasal(rate: Double, duration: TimeInterval) func makeProfiles() -> AnyPublisher func determineBasal() -> AnyPublisher @@ -100,8 +101,8 @@ final class BaseAPSManager: APSManager, Injectable { let isLooping = CurrentValueSubject(false) let lastLoopDateSubject = PassthroughSubject() let lastError = CurrentValueSubject(nil) - let bolusProgress = CurrentValueSubject(nil) + let bolusAmount = CurrentValueSubject(nil) var pumpDisplayState: CurrentValueSubject { deviceDataManager.pumpDisplayState @@ -449,6 +450,7 @@ final class BaseAPSManager: APSManager, Injectable { self.determineBasal().sink { _ in }.store(in: &self.lifetime) } self.bolusProgress.send(0) + self.bolusAmount.send(Decimal(roundedAmout)) } } receiveValue: { _ in } .store(in: &lifetime) @@ -559,6 +561,7 @@ final class BaseAPSManager: APSManager, Injectable { debug(.apsManager, "Announcement Bolus succeeded") self.announcementsStorage.storeAnnouncements([announcement], enacted: true) self.bolusProgress.send(0) + self.bolusAmount.send(Decimal(roundedAmount)) } } case let .pump(pumpAction): @@ -693,6 +696,7 @@ final class BaseAPSManager: APSManager, Injectable { } return pump.enactBolus(units: Double(units), automatic: true).map { _ in self.bolusProgress.send(0) + self.bolusAmount.send(units) return () } .eraseToAnyPublisher() diff --git a/FreeAPS/Sources/Helpers/Color+Extensions.swift b/FreeAPS/Sources/Helpers/Color+Extensions.swift index cd4c0a4ba4..7b10fdda47 100644 --- a/FreeAPS/Sources/Helpers/Color+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Color+Extensions.swift @@ -68,6 +68,8 @@ extension Color { static let darkGreen = Color("DarkGreen") static let blueComplicationBackground = Color(red: 0.1176470588, green: 0.2352941176, blue: 0.3725490196) static let header = Color("Header") + static let header2 = Color("Header2") static let homeBackground = Color("HomeBackground") static let popUpGray = Color("PopUpGray") + static let darkChartBackground = Color("DarkChartBackground") } diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index e10ba6d7e9..a55262c6a5 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Agree and Continue"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1335,8 +1338,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 65fb45edbd..590c0c91d8 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Godkänn och fortsätt"; +/* Bolus progress view */ +"of" = "av"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Utfört klockan"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Spara som profil"; -/* */ -"Return to Normal" = "Tillbaka till normal profil"; +/* Alert */ +"Cancel Profile Override" = "Avbryt Profil"; + +/* Alert */ +"Cancel Temp Target" = "Avbryt tillfälligt målvärde"; /* Alert */ "Return to Normal?" = "Tillbaka till normal profil?"; diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift index 2cf37f1c64..4573bf9815 100644 --- a/FreeAPS/Sources/Models/Configs.swift +++ b/FreeAPS/Sources/Models/Configs.swift @@ -39,4 +39,5 @@ extension Font { static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 24) static let bolusProgressStopFont = Font.custom("BolusProgressStop", fixedSize: 24) static let bolusProgressFont = Font.custom("BolusProgress", fixedSize: 20) + static let bolusProgressBarFont = Font.custom("BolusProgressBarFont", fixedSize: 18) } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index ba49eafd21..c32cb90878 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -9,6 +9,7 @@ extension Home { @Injected() var broadcaster: Broadcaster! @Injected() var apsManager: APSManager! @Injected() var nightscoutManager: NightscoutManager! + @Injected() var storage: TempTargetsStorage! private let timer = DispatchTimer(timeInterval: 5) private(set) var filteredHours = 24 @Published var glucose: [BloodGlucose] = [] @@ -43,6 +44,7 @@ extension Home { @Published var errorMessage: String? = nil @Published var errorDate: Date? = nil @Published var bolusProgress: Decimal? + @Published var bolusAmount: Decimal? @Published var eventualBG: Int? @Published var carbsRequired: Decimal? @Published var allowManualTemp = false @@ -171,6 +173,11 @@ extension Home { .weakAssign(to: \.bolusProgress, on: self) .store(in: &lifetime) + apsManager.bolusAmount + .receive(on: DispatchQueue.main) + .weakAssign(to: \.bolusAmount, on: self) + .store(in: &lifetime) + apsManager.pumpDisplayState .receive(on: DispatchQueue.main) .sink { [weak self] state in @@ -226,6 +233,21 @@ extension Home { setupOverrideHistory() } + func cancelTempTarget() { + storage.storeTempTargets([TempTarget.cancel(at: Date())]) + coredataContext.performAndWait { + let saveToCoreData = TempTargets(context: self.coredataContext) + saveToCoreData.active = false + saveToCoreData.date = Date() + try? self.coredataContext.save() + + let setHBT = TempTargetsSlider(context: self.coredataContext) + setHBT.enabled = false + setHBT.date = Date() + try? self.coredataContext.save() + } + } + private func setupGlucose() { DispatchQueue.main.async { [weak self] in guard let self = self else { return } diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 975f79477d..9ebdeef235 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -1094,7 +1094,6 @@ extension MainChartView { let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) let plusNow = (latest?.date ?? Date.now).addingTimeInterval(Int(latest?.duration ?? 0).minutes.timeInterval) let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) - let oneMore = CGRect( x: x1, y: glucoseToYCoordinate( @@ -1113,7 +1112,6 @@ extension MainChartView { } } else { let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) - let oneMore = CGRect( x: x1, y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index 8cfc71d8b5..3e0368b464 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -39,33 +39,8 @@ struct PumpView: View { var body: some View { HStack(spacing: 10) { - if let battery = battery, expiresAtDate == nil { - let percent = (battery.percent ?? 100) > 80 ? 100 : (battery.percent ?? 100) < 81 && - (battery.percent ?? 100) > - 60 ? 75 : (battery.percent ?? 100) < 61 && (battery.percent ?? 100) > 40 ? 50 : 25 - Image(systemName: "battery.\(percent)") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 15) - .foregroundColor(batteryColor) - } - if let reservoir = reservoir { - let fill = CGFloat(min(max(Double(reservoir) / 200.0, 0.15), Double(reservoir) / 200.0, 0.9)) * 12 HStack { - Image("vial") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxWidth: 10) - .foregroundColor(reservoirColor) - .offset(x: 0, y: -3) - .overlay { - UnevenRoundedRectangle(cornerRadii: .init(bottomLeading: 2, bottomTrailing: 2)) - .fill(Color.insulin) - .frame(maxWidth: 8.8, maxHeight: fill) - .frame(maxHeight: .infinity, alignment: .bottom) - .offset(x: -0.09, y: -3.22) - } if reservoir == 0xDEAD_BEEF { HStack(spacing: 0) { Text("50+ ").font(.statusFont).bold() @@ -80,11 +55,22 @@ struct PumpView: View { Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) } } - }.offset(x: 0, y: 4) + }.offset(x: 0, y: expiresAtDate != nil ? 4 : 0) } else { Text("No Pump").font(.statusFont).foregroundStyle(.secondary) } + if let battery = battery, !state.pumpName.contains("Omni") { + let percent = (battery.percent ?? 100) > 80 ? 100 : (battery.percent ?? 100) < 81 && + (battery.percent ?? 100) > + 60 ? 75 : (battery.percent ?? 100) < 61 && (battery.percent ?? 100) > 40 ? 50 : 25 + Image(systemName: "battery.\(percent)") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 15) + .foregroundColor(batteryColor) + } + if let date = expiresAtDate { HStack(spacing: 2) { Image("pod_reservoir") @@ -94,6 +80,8 @@ struct PumpView: View { remainingTime(time: date.timeIntervalSince(timerDate)) .font(.pumpFont) } + } else if state.pumpName.contains("Omni") { + Text("No Pod").font(.statusFont).foregroundStyle(.secondary) } } } @@ -108,28 +96,25 @@ struct PumpView: View { HStack(spacing: 0) { Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) Text(NSLocalizedString("d", comment: "abbreviation for days")) - } - HStack(spacing: 0) { - Text(" \(hours - days * 24)") - Text(NSLocalizedString("h", comment: "abbreviation for hours")) + Text("+") } } else if hours >= 1 { HStack(spacing: 0) { - Text("\(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) + Text(" \(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) Text(NSLocalizedString("h", comment: "abbreviation for hours")) .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - }.offset(x: 0, y: 6) + } } else { HStack(spacing: 0) { Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) Text(NSLocalizedString("m", comment: "abbreviation for minutes")) .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - }.offset(x: 0, y: 6) + } } } else { Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) } - } + }.offset(x: 0, y: 4) } private var batteryColor: Color { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index d5013bd74d..e9407a567f 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -11,8 +11,11 @@ extension Home { @StateObject var state = StateModel() @State var isStatusPopupPresented = false @State var showCancelAlert = false + @State var showCancelTTAlert = false @State var triggerUpdate = false + let buttonFont = Font.custom("TimeButtonFont", size: 14) + @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme @@ -258,6 +261,7 @@ extension Home { addHeaderBackground() .frame(height: 50 + geo.safeAreaInsets.bottom) let isOverride = fetchedPercent.first?.enabled ?? false + let isTarget = (state.tempTarget != nil) HStack { Button { state.showModal(for: .dataTable) } label: { @@ -265,7 +269,10 @@ extension Home { Image(systemName: "book") .symbolRenderingMode(.hierarchical) .resizable() - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .frame( + width: IAPSconfig.buttonSize * 0.9, + height: IAPSconfig.buttonSize + ) .foregroundColor(.gray) .padding(8) } @@ -274,10 +281,9 @@ extension Home { Button { state.showModal(for: .addCarbs(editMode: false, override: false)) } label: { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image("carbs") + Image(systemName: "fork.knife") .renderingMode(.template) - .resizable() - .frame(width: 24, height: 24) + .font(.custom("Buttons", size: 24)) .foregroundColor(colorScheme == .dark ? .loopYellow : .orange) .padding(8) .foregroundColor(.loopYellow) @@ -292,39 +298,44 @@ extension Home { } }.buttonStyle(.borderless) Spacer() - Button { + ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { + Image(systemName: isOverride ? "person.fill" : "person") + .symbolRenderingMode(.palette) + .font(.custom("Buttons", size: 28)) + .foregroundStyle(.purple) + .padding(8) + .background(isOverride ? .purple.opacity(0.15) : .clear) + .clipShape(RoundedRectangle(cornerRadius: 10)) + } + .onTapGesture { if isOverride { showCancelAlert.toggle() - // state.cancelProfile() - // triggerUpdate.toggle() } else { state.showModal(for: .overrideProfilesConfig) } } - label: { - ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { - Image(systemName: isOverride ? "person.fill" : "person") - .symbolRenderingMode(.palette) - .font(.custom("Buttons", size: 32)) - .foregroundStyle(.purple) - .padding(8) - .background(isOverride ? .blue.opacity(0.3) : .clear) - .clipShape(RoundedRectangle(cornerRadius: 10)) - } - }.buttonStyle(.borderless) - + .onLongPressGesture { + state.showModal(for: .overrideProfilesConfig) + } if state.useTargetButton { Spacer() - Button { state.showModal(for: .addTempTarget) } - label: { - Image("target") - .renderingMode(.template) - .resizable() - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize) - .padding(8) - } - .foregroundColor(.loopGreen) - .buttonStyle(.borderless) + Image(systemName: "target") + .renderingMode(.template) + .font(.custom("Buttons", size: 24)) + .padding(8) + .foregroundColor(.loopGreen) + .background(isTarget ? .green.opacity(0.15) : .clear) + .clipShape(RoundedRectangle(cornerRadius: 10)) + .onTapGesture { + if isTarget { + showCancelTTAlert.toggle() + } else { + state.showModal(for: .addTempTarget) + } + } + .onLongPressGesture { + state.showModal(for: .addTempTarget) + } } Spacer() Button { @@ -334,10 +345,9 @@ extension Home { )) } label: { - Image("bolus") + Image(systemName: "syringe") .renderingMode(.template) - .resizable() - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .font(.custom("Buttons", size: 24)) .padding(8) } .buttonStyle(.borderless) @@ -357,10 +367,9 @@ extension Home { } Button { state.showModal(for: .settings) } label: { - Image("settings1") + Image(systemName: "gear") .renderingMode(.template) - .resizable() - .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) + .font(.custom("Buttons", size: 24)) .padding(8) } .buttonStyle(.borderless) @@ -368,16 +377,18 @@ extension Home { } .padding(.horizontal, 24) .padding(.bottom, geo.safeAreaInsets.bottom) - }.alert( - "Return to Normal?", isPresented: $showCancelAlert, - actions: { - Button("No", role: .cancel) {} - Button("Yes", role: .destructive) { - state.cancelProfile() - triggerUpdate.toggle() - } - }, message: { Text("This will change settings back to your normal profile.") } - ) + } + .confirmationDialog("Cancel Profile Override", isPresented: $showCancelAlert) { + Button("Cancel Profile Override", role: .destructive) { + state.cancelProfile() + triggerUpdate.toggle() + } + } + .confirmationDialog("Cancel Temporary Target", isPresented: $showCancelTTAlert) { + Button("Cancel Temporary Target", role: .destructive) { + state.cancelTempTarget() + } + } } var chart: some View { @@ -385,11 +396,14 @@ extension Home { .overlay { VStack { infoPanel - mainChart + VStack(spacing: 0) { + mainChart + timeSetting + }.chartBackground() } } .frame( - minHeight: UIScreen.main.bounds.height / 1.46 + minHeight: UIScreen.main.bounds.height / 1.48 ) } @@ -456,7 +470,12 @@ extension Home { if let name = currentProfile.name, name != "EMPTY", name.nonEmpty != nil, name != "", name != "\u{0022}\u{0022}" { - Text(name).font(.statusFont).foregroundStyle(.secondary) + if name.count > 15 { + let shortened = name.prefix(15) + Text(shortened).font(.statusFont).foregroundStyle(.secondary) + } else { + Text(name).font(.statusFont).foregroundStyle(.secondary) + } } } } else if override.percentage != 100 { @@ -477,20 +496,29 @@ extension Home { } } - func bolusProgressView(progress: Decimal) -> some View { + func bolusProgressView(progress: Decimal, amount: Decimal) -> some View { ZStack { HStack { - Text("Bolusing") - .foregroundColor(.primary).font(.bolusProgressFont) - ProgressView(value: Double(progress)) - .progressViewStyle(BolusProgressViewStyle()) + VStack { + HStack { + Text("Bolusing") + .foregroundColor(.primary).font(.bolusProgressFont) + let bolused = targetFormatter.string(from: (amount * progress) as NSNumber) ?? "" + + Text( + bolused + " " + NSLocalizedString("of", comment: "") + " " + amount + .formatted() + NSLocalizedString(" U", comment: "") + ).font(.bolusProgressBarFont) + } + ProgressView(value: Double(progress)) + .progressViewStyle(BolusProgressViewStyle()) + } Image(systemName: "xmark.square.fill") .symbolRenderingMode(.palette) .foregroundStyle(.white, .blue) .font(.bolusProgressStopFont) - .onTapGesture { - state.cancelBolus() - } + .onTapGesture { state.cancelBolus() } + .offset(x: 10, y: 0) } } } @@ -515,6 +543,21 @@ extension Home { .clipShape(Rectangle()) } + var timeSetting: some View { + TimeEllipse() + .overlay { + Menu("\(state.hours) " + NSLocalizedString("hours", comment: "")) { + Button("3 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 3 }) + Button("6 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 6 }) + Button("12 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 12 }) + Button("24 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 24 }) + Button("UI/UX Settings", action: { state.showModal(for: .statisticsConfig) }) + }.foregroundStyle(.secondary) + } + .font(buttonFont) + .padding(.vertical, 15) + } + var body: some View { GeometryReader { geo in VStack { @@ -532,13 +575,15 @@ extension Home { .background(.gray.opacity(IAPSconfig.backgroundOpacity * 2)) .edgesIgnoringSafeArea(.vertical) .overlay { - if let progress = state.bolusProgress { + if let progress = state.bolusProgress, let amount = state.bolusAmount { ZStack { RoundedRectangle(cornerRadius: 15) .fill(.gray.opacity(0.8)) - .frame(width: 300, height: 50) - bolusProgressView(progress: progress) - }.frame(maxWidth: .infinity, alignment: .center) + .frame(width: 320, height: 60) + bolusProgressView(progress: progress, amount: amount) + } + .frame(maxWidth: .infinity, alignment: .center) + .offset(x: 0, y: -100) } } } @@ -565,6 +610,7 @@ extension Home { } ) } + .onAppear(perform: configureView) } private var popup: some View { diff --git a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift index 33e3e1eac5..a4ed525c10 100644 --- a/FreeAPS/Sources/Views/BolusProgressViewStyle.swift +++ b/FreeAPS/Sources/Views/BolusProgressViewStyle.swift @@ -9,6 +9,6 @@ public struct BolusProgressViewStyle: ProgressViewStyle { VStack { ProgressView(value: progress) } - }.frame(width: 80, height: 30) + }.frame(width: 160) } } diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 7ed794a09e..205ccb7667 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -130,7 +130,7 @@ struct LoopEllipse: View { let stroke: Color var body: some View { RoundedRectangle(cornerRadius: 15) - .stroke(stroke, lineWidth: 1) + .stroke(stroke, lineWidth: 2) .background( RoundedRectangle(cornerRadius: 15) .fill(Color.white).opacity(colorScheme == .light ? 0.2 : 0.08) @@ -138,11 +138,29 @@ struct LoopEllipse: View { } } +struct TimeEllipse: View { + @Environment(\.colorScheme) var colorScheme + var body: some View { + RoundedRectangle(cornerRadius: 15) + .fill(Color.gray).opacity(colorScheme == .light ? 0.2 : 0.08) + .frame(width: 120, height: 25) + } +} + struct HeaderBackground: View { @Environment(\.colorScheme) var colorScheme var body: some View { Rectangle() - .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header.opacity(1)) + .fill(colorScheme == .light ? .gray.opacity(IAPSconfig.backgroundOpacity) : Color.header2.opacity(1)) + } +} + +struct ChartBackground: ViewModifier { + @Environment(\.colorScheme) var colorScheme + + func body(content: Content) -> some View { + content + .background(colorScheme == .light ? .gray.opacity(0.05) : .black).brightness(colorScheme == .dark ? 0.05 : 0) } } @@ -251,6 +269,10 @@ extension View { HeaderBackground() } + func chartBackground() -> some View { + modifier(ChartBackground()) + } + func frostedGlassLayer(_ opacity: CGFloat) -> some View { FrostedGlass(opacity: opacity) } From da554eba83e51b0da5b71692cba11580653f7b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 30 Dec 2023 20:04:32 +0100 Subject: [PATCH 304/405] Bump version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 7194c1f2f6..4bf62311af 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.4.1 +APP_VERSION = 2.4.2 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 8592ccad5bdd972673b9f75dfc102945481faa18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 30 Dec 2023 20:29:55 +0100 Subject: [PATCH 305/405] Add back setting for Time Setting button --- FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 +++++ FreeAPS/Sources/Modules/Home/HomeStateModel.swift | 3 +++ FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 4 +++- .../Sources/Modules/StatConfig/StatConfigStateModel.swift | 2 ++ .../Sources/Modules/StatConfig/View/StatConfigRootView.swift | 1 + 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 1f9feff7ea..74f2182b4e 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -53,6 +53,7 @@ struct FreeAPSSettings: JSON, Equatable { var useLiveActivity: Bool = false var useTargetButton: Bool = false var alwaysUseColors: Bool = true + var timeSettings: Bool = true } extension FreeAPSSettings: Decodable { @@ -274,6 +275,10 @@ extension FreeAPSSettings: Decodable { settings.alwaysUseColors = alwaysUseColors } + if let timeSettings = try? container.decode(Bool.self, forKey: .timeSettings) { + settings.timeSettings = timeSettings + } + self = settings } } diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index c32cb90878..d2b2ef9e86 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -71,6 +71,7 @@ extension Home { @Published var useTargetButton: Bool = false @Published var overrideHistory: [OverrideHistory] = [] @Published var alwaysUseColors: Bool = true + @Published var timeSettings: Bool = true let coredataContext = CoreDataStack.shared.persistentContainer.viewContext @@ -113,6 +114,7 @@ extension Home { useTargetButton = settingsManager.settings.useTargetButton hours = settingsManager.settings.hours alwaysUseColors = settingsManager.settings.alwaysUseColors + timeSettings = settingsManager.settings.timeSettings broadcaster.register(GlucoseObserver.self, observer: self) broadcaster.register(SuggestionObserver.self, observer: self) @@ -477,6 +479,7 @@ extension Home.StateModel: useTargetButton = settingsManager.settings.useTargetButton hours = settingsManager.settings.hours alwaysUseColors = settingsManager.settings.alwaysUseColors + timeSettings = settingsManager.settings.timeSettings setupGlucose() setupOverrideHistory() } diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index e9407a567f..ff097d16f9 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -398,7 +398,9 @@ extension Home { infoPanel VStack(spacing: 0) { mainChart - timeSetting + if state.timeSettings { + timeSetting + } }.chartBackground() } } diff --git a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift index d28df1e9f2..d9dff34f4a 100644 --- a/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift @@ -14,6 +14,7 @@ extension StatConfig { @Published var useTargetButton: Bool = false @Published var hours: Decimal = 6 @Published var alwaysUseColors: Bool = true + @Published var timeSettings: Bool = true var units: GlucoseUnits = .mmolL @@ -25,6 +26,7 @@ extension StatConfig { subscribeSetting(\.xGridLines, on: $xGridLines) { xGridLines = $0 } subscribeSetting(\.yGridLines, on: $yGridLines) { yGridLines = $0 } subscribeSetting(\.rulerMarks, on: $rulerMarks) { rulerMarks = $0 } + subscribeSetting(\.timeSettings, on: $timeSettings) { timeSettings = $0 } subscribeSetting(\.alwaysUseColors, on: $alwaysUseColors) { alwaysUseColors = $0 } subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 } subscribeSetting(\.useTargetButton, on: $useTargetButton) { useTargetButton = $0 } diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index a947858e76..f66059f2ff 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -37,6 +37,7 @@ extension StatConfig { DecimalTextField("6", value: $state.hours, formatter: carbsFormatter) Text("hours").foregroundColor(.secondary) } + Toggle("Display Time Interval Setting Button", isOn: $state.timeSettings) } header: { Text("Home Chart settings ") } Section { From 3084d8f39a600b632729ffe433cf860cf9417d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 31 Dec 2023 13:06:56 +0100 Subject: [PATCH 306/405] UI glitch. Display override target toggle. --- .../OverrideProfilesConfig/OverrideProfilesStateModel.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index 3d92c1b662..b088bcadc8 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -211,7 +211,6 @@ extension OverrideProfilesConfig { } let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal - var newDuration = Double(duration) if isEnabled { let duration = overrideArray.first?.duration ?? 0 @@ -221,12 +220,10 @@ extension OverrideProfilesConfig { isEnabled = false } newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes - if overrideTarget != 0 { - override_target = true + if override_target { target = units == .mmolL ? overrideTarget.asMmolL : overrideTarget } } - if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) } if !isEnabled { From 10a55541662ee5d0f97bd76a74f560cec476fb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 31 Dec 2023 19:30:40 +0100 Subject: [PATCH 307/405] Time Interval setting for mainChartView updates Save the time interval setting for main chart in two places. Adjust frame for different languages. --- .../Sources/Modules/Home/HomeStateModel.swift | 7 ++++++ .../Modules/Home/View/HomeRootView.swift | 24 +++++++++---------- .../OverrideProfilesStateModel.swift | 3 --- FreeAPS/Sources/Views/ViewModifiers.swift | 3 ++- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index d2b2ef9e86..8f600f141f 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -130,6 +130,13 @@ extension Home { broadcaster.register(OverrideObserver.self, observer: self) animatedBackground = settingsManager.settings.animatedBackground + subscribeSetting(\.hours, on: $hours, initial: { + let value = max(min($0, 24), 2) + hours = value + }, map: { + $0 + }) + timer.eventHandler = { DispatchQueue.main.async { [weak self] in self?.timerDate = Date() diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index ff097d16f9..ec18881338 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -546,18 +546,18 @@ extension Home { } var timeSetting: some View { - TimeEllipse() - .overlay { - Menu("\(state.hours) " + NSLocalizedString("hours", comment: "")) { - Button("3 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 3 }) - Button("6 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 6 }) - Button("12 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 12 }) - Button("24 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 24 }) - Button("UI/UX Settings", action: { state.showModal(for: .statisticsConfig) }) - }.foregroundStyle(.secondary) - } - .font(buttonFont) - .padding(.vertical, 15) + let string = " \(state.hours) " + NSLocalizedString("hours", comment: "") + " " + return Menu(string) { + Button("3 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 3 }) + Button("6 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 6 }) + Button("12 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 12 }) + Button("24 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 24 }) + Button("UI/UX Settings", action: { state.showModal(for: .statisticsConfig) }) + } + .foregroundStyle(.secondary) + .font(buttonFont) + .padding(.vertical, 15) + .background(TimeEllipse(characters: string.count)) } var body: some View { diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index b088bcadc8..ccc8bf0f0c 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -48,7 +48,6 @@ extension OverrideProfilesConfig { saveOverride.percentage = self.percentage saveOverride.enabled = true saveOverride.smbIsOff = self.smbIsOff - if self.isPreset { saveOverride.isPreset = true saveOverride.id = id @@ -63,7 +62,6 @@ extension OverrideProfilesConfig { } else { saveOverride.target = 6 } if advancedSettings { saveOverride.advancedSettings = true - if !isfAndCr { saveOverride.isfAndCr = false saveOverride.isf = isf @@ -110,7 +108,6 @@ extension OverrideProfilesConfig { if advancedSettings { saveOverride.advancedSettings = true - if !isfAndCr { saveOverride.isfAndCr = false saveOverride.isf = isf diff --git a/FreeAPS/Sources/Views/ViewModifiers.swift b/FreeAPS/Sources/Views/ViewModifiers.swift index 205ccb7667..4172b65855 100644 --- a/FreeAPS/Sources/Views/ViewModifiers.swift +++ b/FreeAPS/Sources/Views/ViewModifiers.swift @@ -140,10 +140,11 @@ struct LoopEllipse: View { struct TimeEllipse: View { @Environment(\.colorScheme) var colorScheme + let characters: Int var body: some View { RoundedRectangle(cornerRadius: 15) .fill(Color.gray).opacity(colorScheme == .light ? 0.2 : 0.08) - .frame(width: 120, height: 25) + .frame(width: CGFloat(characters * 7), height: 25) } } From 4b675cba642d391ed66e355ac6779df46fc4fdcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 31 Dec 2023 20:42:56 +0100 Subject: [PATCH 308/405] Clean up --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index ec18881338..f7347d9288 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -546,7 +546,7 @@ extension Home { } var timeSetting: some View { - let string = " \(state.hours) " + NSLocalizedString("hours", comment: "") + " " + let string = "\(state.hours) " + NSLocalizedString("hours", comment: "") + " " return Menu(string) { Button("3 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 3 }) Button("6 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 6 }) From b2e3f218a301979e4006cc18c501e85aef907f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 1 Jan 2024 15:57:29 +0100 Subject: [PATCH 309/405] Test --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b955cd220c..d2fed923a6 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ https://loopkit.github.io/loopdocs/gh-actions/gh-overview/ # iPhone and iPod -iAPS app runs on iPhone or iPod. An iPhone 8 or newer is required. +iAPS app runs on iPhone or iPod. An iPhone 8 or newer is required. Minimum iOS 16. # Documentation From b40f76bd80e2c84ef089ad86c96d062e75934afb Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Mon, 1 Jan 2024 17:24:18 +0100 Subject: [PATCH 310/405] Added build expiry info to settings view and logs (#439) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added build expiry info to settings view and logs Added a function to grab the embedded profile expiry date and display it in the settings view & exported logs * Refactor to avoid force unwrapping and a typo fixed, by @Jon-b-m. --------- Co-authored-by: Jon Mårtensson --- FreeAPS/Sources/Application/FreeAPSApp.swift | 3 +- .../Sources/Helpers/Bundle+Extensions.swift | 40 +++++++++++++++++++ .../Settings/View/SettingsRootView.swift | 3 ++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Application/FreeAPSApp.swift b/FreeAPS/Sources/Application/FreeAPSApp.swift index 9ee16aeab7..39516ed5b6 100644 --- a/FreeAPS/Sources/Application/FreeAPSApp.swift +++ b/FreeAPS/Sources/Application/FreeAPSApp.swift @@ -1,5 +1,6 @@ import ActivityKit import CoreData +import Foundation import SwiftUI import Swinject @@ -53,7 +54,7 @@ import Swinject init() { debug( .default, - "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)]" + "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)] [buildExpires: \(Bundle.main.profileExpiration)]" ) loadServices() } diff --git a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift index 9ea6e5e357..dfd002080d 100644 --- a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift @@ -18,4 +18,44 @@ extension Bundle { } return Date() } + + var profileExpiration: String { + guard + let profilePath = Bundle.main.path(forResource: "embedded", ofType: "mobileprovision"), + let profileData = try? Data(contentsOf: URL(fileURLWithPath: profilePath)), + // Note: We use `NSString` instead of `String`, because it makes it easier working with regex, ranges, substring etc. + let profileNSString = NSString(data: profileData, encoding: String.Encoding.ascii.rawValue) + else { + print( + "WARNING: Could not find or read `embedded.mobileprovision`. If running on Simulator, there are no provisioning profiles." + ) + return "N/A" + } + + // NOTE: We have the `[\\W]*?` check to make sure that variations in number of tabs or new lines in the future does not influence the result. + guard let regex = try? NSRegularExpression(pattern: "ExpirationDate[\\W]*?(.*?)", options: []) + else { + print("Warning: Could not create regex.") + return "N/A" + } + + let regExMatches = regex.matches( + in: profileNSString as String, + options: [], + range: NSRange(location: 0, length: profileNSString.length) + ) + + // NOTE: range `0` corresponds to the full regex match, so to get the first capture group, we use range `1` + guard let rangeOfCapturedGroupForDate = regExMatches.first?.range(at: 1) else { + print("Warning: Could not find regex match or capture group.") + return "N/A" + } + + let dateWithTimeAsString = profileNSString.substring(with: rangeOfCapturedGroupForDate) + + guard let dateAsStringIndex = dateWithTimeAsString.firstIndex(of: "T") else { + return "" + } + return String(dateWithTimeAsString[.. Date: Mon, 1 Jan 2024 18:46:21 +0100 Subject: [PATCH 311/405] Merge fix --- FreeAPS/Sources/Helpers/Bundle+Extensions.swift | 2 +- .../Sources/Modules/Settings/View/SettingsRootView.swift | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift index dfd002080d..37e46dcdc2 100644 --- a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift @@ -52,7 +52,7 @@ extension Bundle { } let dateWithTimeAsString = profileNSString.substring(with: rangeOfCapturedGroupForDate) - + guard let dateAsStringIndex = dateWithTimeAsString.firstIndex(of: "T") else { return "" } diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 4e1ac2a9e8..4701499b59 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -10,14 +10,12 @@ extension Settings { var body: some View { Form { - Section( - header: Text( - "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice)\nBuild Expires: \(Bundle.main.profileExpiration)" Section { Toggle("Closed loop", isOn: $state.closedLoop) - } header: { + } + header: { Text( - "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice) " + "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice)\nBuild Expires: \(Bundle.main.profileExpiration)" ).textCase(nil) } From eb86e36fdf99d048f35bf323cd12fcc25f4f0ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 1 Jan 2024 20:41:39 +0100 Subject: [PATCH 312/405] Only display the expiration date when accessible --- FreeAPS/Sources/Helpers/Bundle+Extensions.swift | 10 +++++----- .../Modules/Settings/View/SettingsRootView.swift | 13 ++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift index 37e46dcdc2..46c3a8f493 100644 --- a/FreeAPS/Sources/Helpers/Bundle+Extensions.swift +++ b/FreeAPS/Sources/Helpers/Bundle+Extensions.swift @@ -19,7 +19,7 @@ extension Bundle { return Date() } - var profileExpiration: String { + var profileExpiration: String? { guard let profilePath = Bundle.main.path(forResource: "embedded", ofType: "mobileprovision"), let profileData = try? Data(contentsOf: URL(fileURLWithPath: profilePath)), @@ -29,14 +29,14 @@ extension Bundle { print( "WARNING: Could not find or read `embedded.mobileprovision`. If running on Simulator, there are no provisioning profiles." ) - return "N/A" + return nil } // NOTE: We have the `[\\W]*?` check to make sure that variations in number of tabs or new lines in the future does not influence the result. guard let regex = try? NSRegularExpression(pattern: "ExpirationDate[\\W]*?(.*?)", options: []) else { print("Warning: Could not create regex.") - return "N/A" + return nil } let regExMatches = regex.matches( @@ -48,13 +48,13 @@ extension Bundle { // NOTE: range `0` corresponds to the full regex match, so to get the first capture group, we use range `1` guard let rangeOfCapturedGroupForDate = regExMatches.first?.range(at: 1) else { print("Warning: Could not find regex match or capture group.") - return "N/A" + return nil } let dateWithTimeAsString = profileNSString.substring(with: rangeOfCapturedGroupForDate) guard let dateAsStringIndex = dateWithTimeAsString.firstIndex(of: "T") else { - return "" + return nil } return String(dateWithTimeAsString[.. Date: Mon, 1 Jan 2024 22:02:11 +0100 Subject: [PATCH 313/405] New Crowdin updates (#432) --- .../CGMBLEKitUI/sk.lproj/Localizable.strings | 2 +- .../sk.lproj/TransmitterManagerSetup.strings | 4 +- .../sk.lproj/Localizable.strings | 64 +- .../G7SensorKit/sk.lproj/Localizable.strings | 76 +- .../Resources/sk.lproj/Localizable.strings | 58 +- .../Resources/sk.lproj/Localizable.strings | 86 +- .../sk.lproj/Localizable.strings | 516 +++---- .../Resources/sk.lproj/Localizable.strings | 34 +- .../Resources/sk.lproj/Localizable.strings | 102 +- .../sk.lproj/Localizable.strings | 4 +- FreeAPS/Resources/sk.lproj/InfoPlist.strings | 14 +- .../Main/ar.lproj/Localizable.strings | 10 +- .../Main/da.lproj/Localizable.strings | 10 +- .../Main/de.lproj/Localizable.strings | 12 +- .../Main/es.lproj/Localizable.strings | 10 +- .../Main/fi.lproj/Localizable.strings | 10 +- .../Main/fr.lproj/Localizable.strings | 12 +- .../Main/he.lproj/Localizable.strings | 10 +- .../Main/it.lproj/Localizable.strings | 10 +- .../Main/nb.lproj/Localizable.strings | 10 +- .../Main/nl.lproj/Localizable.strings | 12 +- .../Main/pl.lproj/Localizable.strings | 10 +- .../Main/pt-BR.lproj/Localizable.strings | 10 +- .../Main/pt-PT.lproj/Localizable.strings | 10 +- .../Main/ru.lproj/Localizable.strings | 12 +- .../Main/sk.lproj/Localizable.strings | 1319 +++++++++-------- .../Main/tr.lproj/Localizable.strings | 10 +- .../Main/uk.lproj/Localizable.strings | 12 +- .../Main/zh-Hans.lproj/Localizable.strings | 10 +- 29 files changed, 1285 insertions(+), 1174 deletions(-) diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings index f598c6c8d5..937e98dc29 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings @@ -54,7 +54,7 @@ Title text for the button to remove a CGM from Loop */ "Transmitter ID" = "ID vysielača"; /* Title describing glucose trend */ -"Trend" = "Trend"; +"Trend" = "Vývoj"; /* The title text for the upload glucose switch cell */ "Upload Readings" = "Načítať údaje"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings index 245e681126..04704c9184 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings @@ -1,11 +1,11 @@ /* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */ -"5oU-vK-JHQ.text" = "Credentials"; +"5oU-vK-JHQ.text" = "Poverenia"; /* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */ "Dds-49-o7G.title" = "Nastavenie vysielača"; /* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */ -"GOT-KQ-cEh.text" = "Detail"; +"GOT-KQ-cEh.text" = "Podrobnosti"; /* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */ "Qub-6B-0aB.footerTitle" = "ID vysielača nájdete vytlačené na zadnej strane zariadenia, na boku škatule, v ktorej bol dodaný, a v ponuke nastavení prijímača a mobilnej aplikácie."; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings index 74628ca310..4db4359d8e 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings @@ -5,16 +5,16 @@ "%@/min" = "%@/min"; /* No comment provided by engineer. */ -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Ste si istí, že chcete tento CGM vymazať?"; /* No comment provided by engineer. */ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Zrušiť"; /* No comment provided by engineer. */ -"Configuration" = "Configuration"; +"Configuration" = "Nastavenie"; /* title for g7 settings connection status when connected */ "Connected" = "Pripojené"; @@ -26,92 +26,92 @@ "Continue" = "Pokračovať"; /* Button label for removing CGM */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Odstrániť senzor"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Done"; +"Done" = "Hotovo"; /* Field label */ -"Glucose" = "Glucose"; +"Glucose" = "Glykémia"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Dodatočná doba na výmenu senzoru končí"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Zostávajúce predĺžené obdobie"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "VYSOKÉ"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Posledné spojenie"; /* No comment provided by engineer. */ -"Last Reading" = "Last Reading"; +"Last Reading" = "Posledná hodnota"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS dokáže čítať dáta z G7 CGM, ale stále musíte používať aplikáciu Dexcom G7 na párovanie, kalibráciu a ďalšiu správu senzora."; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "NÍZKE"; /* title for g7 settings row showing BLE Name */ -"Name" = "Name"; +"Name" = "Názov"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Načítať nový senzor"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Skenuje sa"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Vyhľadávam\nsenzor"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Vyhľadávam nový senzor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Senzor\nexspiroval"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Senzor\nzlyhal"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Problém\nsenzoru"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Zahrievanie\nsenzoru"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Senzor exspiruje"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Senzor exspiroval"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Senzor exspiruje"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Senzor zlyhal"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Senzor štartu"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Strata\nsignálu"; /* Field label */ -"Time" = "Time"; +"Time" = "Čas"; /* Field label */ -"Trend" = "Trend"; +"Trend" = "Vývoj"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Nahrať merania"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Zahrievanie senzora dokončené"; diff --git a/Dependencies/G7SensorKit/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/sk.lproj/Localizable.strings index 7a93f141ec..ce08bc0352 100644 --- a/Dependencies/G7SensorKit/sk.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/sk.lproj/Localizable.strings @@ -2,60 +2,60 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS dokáže čítať dáta z G7 CGM, ale stále musíte používať aplikáciu Dexcom G7 na párovanie, kalibráciu a ďalšiu správu senzora."; /* Button title for starting setup */ "Continue" = "Pokračovať"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Zrušiť"; /* Error description for unreliable state */ -"Glucose data is unavailable" = "Glucose data is unavailable"; +"Glucose data is unavailable" = "Dáta o hladine glukózy nie sú k dispozícii"; /* The description of sensor algorithm state when sensor is ok. */ -"Sensor is OK" = "Sensor is OK"; +"Sensor is OK" = "Senzor pracuje správne"; /* The description of sensor algorithm state when sensor is stopped." */ -"Sensor is stopped" = "Sensor is stopped"; +"Sensor is stopped" = "Senzor je zastavený"; /* The description of sensor algorithm state when sensor is warming up. */ -"Sensor is warming up" = "Sensor is warming up"; +"Sensor is warming up" = "Senzor sa zahrieva"; /* The description of sensor algorithm state when sensor is expired. */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Senzor exspiroval"; /* The description of sensor algorithm state when sensor failed. */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Senzor zlyhal"; /* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */ -"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d"; +"Sensor is in unknown state %1$d" = "Senzor je v neznámom stave %1$d"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Sensor Start"; +"Sensor Start" = "Čas zavedenia"; /* title for g7 settings row showing sensor expiration time */ -"Sensor Expiration" = "Sensor Expiration"; +"Sensor Expiration" = "Senzor exspiruje"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Dodatočná doba na výmenu senzoru končí"; /* Field label */ -"Glucose" = "Glucose"; +"Glucose" = "Glykémia"; -"Last Reading" = "Last Reading"; +"Last Reading" = "Posledná hodnota"; -"Time" = "Time"; +"Time" = "Čas"; -"Trend" = "Trend"; +"Trend" = "Vývoj"; "Bluetooth" = "Bluetooth"; /* title for g7 settings row showing BLE Name */ -"Name" = "Name"; +"Name" = "Názov"; /* title for g7 settings connection status when scanning */ -"Scanning" = "Scanning"; +"Scanning" = "Skenuje sa"; /* title for g7 settings connection status when connected */ "Connected" = "Pripojený"; @@ -64,66 +64,66 @@ "Connecting" = "Pripája sa"; /* title for g7 settings row showing sensor last connect time */ -"Last Connect" = "Last Connect"; +"Last Connect" = "Posledné spojenie"; /* Configuration */ -"Configuration" = "Configuration"; +"Configuration" = "Nastavenie"; /* title for g7 config settings to upload readings */ -"Upload Readings" = "Upload Readings"; +"Upload Readings" = "Nahrať merania"; /* Button */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Načítať nový senzor"; /* Button label for removing CGM */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Odstrániť senzor"; /* No glucose value representation (3 dashes for mg/dL) */ "– – –" = "– – –"; /* String displayed instead of a glucose value below the CGM range */ -"LOW" = "LOW"; +"LOW" = "NÍZKE"; /* String displayed instead of a glucose value above the CGM range */ -"HIGH" = "HIGH"; +"HIGH" = "VYSOKÉ"; /* Format string for glucose trend per minute. (1: glucose value and unit) */ "%@/min" = "%@/min"; /* G7 Progress bar label when searching for sensor */ -"Searching for sensor" = "Searching for sensor"; +"Searching for sensor" = "Vyhľadávam nový senzor"; /* G7 Progress bar label when sensor expired */ -"Sensor expired" = "Sensor expired"; +"Sensor expired" = "Senzor exspiroval"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Zahrievanie senzora dokončené"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Zahrievanie senzora dokončené"; /* G7 Progress bar label when sensor failed */ -"Sensor failed" = "Sensor failed"; +"Sensor failed" = "Senzor zlyhal"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Senzor exspiruje"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Zostávajúce predĺžené obdobie"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Vyhľadávam\nsenzor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Senzor\nexspiroval"; /* G7 Status highlight text for signal loss */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Senzor\nzlyhal"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Strata\nsignálu"; /*G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Problém\nsenzoru"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Zahrievanie\nsenzoru"; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/sk.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/sk.lproj/Localizable.strings index 7ed398d336..8096151108 100644 --- a/Dependencies/MinimedKit/MinimedKit/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKit/Resources/sk.lproj/Localizable.strings @@ -1,98 +1,98 @@ /* Communications error for a bolus currently running */ -"A bolus is already in progress" = "A bolus is already in progress"; +"A bolus is already in progress" = "Podanie bolusu už prebieha"; /* The description of AlarmClockReminderPumpEvent */ -"AlarmClockReminder" = "AlarmClockReminder"; +"AlarmClockReminder" = "Pripomienka budíka"; /* The description of AlarmSensorPumpEvent */ -"AlarmSensor" = "AlarmSensor"; +"AlarmSensor" = "Senzor alarmu"; /* Describing the battery chemistry as Alkaline */ -"Alkaline" = "Alkaline"; +"Alkaline" = "Alkalické"; /* The format string description of a BasalProfileStartPumpEvent. (1: The index of the profile)(2: The basal rate) */ -"Basal Profile %1$@: %2$@ U/hour" = "Basal Profile %1$@: %2$@ U/hour"; +"Basal Profile %1$@: %2$@ U/hour" = "Bazálny Profil %1$@: %2$@ J/hod"; /* Pump error code when bolus is in progress */ "Bolus in progress" = "Prebieha bolus"; /* Suggestions for diagnosing a command refused pump error */ -"Check that the pump is not suspended or priming, or has a percent temp basal type" = "Check that the pump is not suspended or priming, or has a percent temp basal type"; +"Check that the pump is not suspended or priming, or has a percent temp basal type" = "Skontrolujte že pumpa nie je pozastavená alebo sa nastavuje, alebo má percentuálny dočasný typ bazálu"; /* Pump error code returned when command refused */ -"Command refused" = "Command refused"; +"Command refused" = "Príkaz zamietnutý"; /* No comment provided by engineer. */ -"Comms with another pump detected" = "Comms with another pump detected."; +"Comms with another pump detected" = "Zaznamenané komunikácie s inou pumpou."; /* Error description */ -"Decoding Error" = "Decoding Error"; +"Decoding Error" = "Chyba dekódovania"; /* Error description */ -"Device Error" = "Device Error"; +"Device Error" = "Chyba zariadenia"; /* Describing the pump history insulin data source */ -"Event History" = "Event History"; +"Event History" = "História Udalostí"; /* Format string for failure reason. (1: The operation being performed) (2: The response data) */ -"Invalid response during %1$@: %2$@" = "Invalid response during %1$@: %2$@"; +"Invalid response during %1$@: %2$@" = "Neplatná odpoveď počas %1$@: %2$@"; /* Describing the battery chemistry as Lithium */ -"Lithium" = "Lithium"; +"Lithium" = "Líthiové"; /* Recovery suggestion */ "Make sure your RileyLink is nearby and powered on" = "Uistite sa, že je váš RileyLink v blízkosti a je zapnutý"; /* Pump error code describing max setting exceeded */ -"Max setting exceeded" = "Max setting exceeded"; +"Max setting exceeded" = "Prekročené max nastavenie"; /* Pump title (1: model number) */ "Minimed %@" = "Minimed %@"; /* Generic title of the minimed pump manager */ -"Minimed 500/700 Series" = "Minimed 500/700 Series"; +"Minimed 500/700 Series" = ""; /* Describing the North America pump region */ -"North America" = "North America"; +"North America" = "Severná Amerika"; /* No comment provided by engineer. */ -"Pump did not respond" = "Pump did not respond"; +"Pump did not respond" = "Pumpa neodpovedá"; /* Error description */ -"Pump Error" = "Pump Error"; +"Pump Error" = "Chyba pumpy"; /* No comment provided by engineer. */ -"Pump is suspended" = "Pump is suspended"; +"Pump is suspended" = "Pumpa je pozastavená"; /* No comment provided by engineer. */ -"Pump responded unexpectedly" = "Pump responded unexpectedly"; +"Pump responded unexpectedly" = "Pumpa odpovedala neočakávane"; /* The format string describing a pump message. (1: The packet type)(2: The message type)(3: The message address)(4: The message data */ -"PumpMessage(%1$@, %2$@, %3$@, %4$@)" = "PumpMessage(%1$@, %2$@, %3$@, %4$@)"; +"PumpMessage(%1$@, %2$@, %3$@, %4$@)" = "Správa o pumpe(%1$@, %2$@, %3$@, %4$@)"; /* Describing the reservoir insulin data source */ "Reservoir" = "Rezervoár"; /* Error description */ -"RileyLink radio tune failed" = "RileyLink radio tune failed"; +"RileyLink radio tune failed" = "RileyLink radio ladenie zlyhalo"; /* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */ -"Temporary Basal: %1$.3f U/hour" = "Temporary Basal: %1$.3f U/hour"; +"Temporary Basal: %1$.3f U/hour" = "Dočasný Bazál: %1$.3f J/hod"; /* The format string description of a TempBasalDurationPumpEvent. (1: The duration of the temp basal in minutes) */ -"Temporary Basal: %1$d min" = "Temporary Basal: %1$d min"; +"Temporary Basal: %1$d min" = "Dočasný Bazál: %1$d min"; /* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in percent) */ -"Temporary Basal: %1$d%%" = "Temporary Basal: %1$d%%"; +"Temporary Basal: %1$d%%" = "Dočasný Bazál: %1$d%%"; /* The format string description of an unknown pump error code. (1: The specific error code raw value) */ -"Unknown pump error code: %1$@" = "Unknown pump error code: %1$@"; +"Unknown pump error code: %1$@" = "Neznáma chyba pumpy kód: %1$@"; /* No comment provided by engineer. */ -"Unknown pump model: %@" = "Unknown pump model: %@"; +"Unknown pump model: %@" = "Neznámy model pumpy: %@"; /* Format string for an unknown response. (1: The operation being performed) (2: The response data) */ -"Unknown response during %1$@: %2$@" = "Unknown response during %1$@: %2$@"; +"Unknown response during %1$@: %2$@" = "Neznáma odpoveď počas %1$@: %2$@"; /* Describing the worldwide pump region */ -"World-Wide" = "World-Wide"; +"World-Wide" = "Celo-Svetovo"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/sk.lproj/Localizable.strings index c5d259d505..23c3613c4c 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/sk.lproj/Localizable.strings @@ -8,10 +8,10 @@ "%1$@ %2$@/%3$@ %4$@" = "%1$@ %2$@/%3$@ %4$@"; /* The format string describing number of basal schedule entries: (1: number of entries) */ -"%1$@ basal schedule entries\n" = "%1$@ basal schedule entries\n"; +"%1$@ basal schedule entries\n" = "%1$@ vstupy do základného plánu\n"; /* The format string describing units of insulin remaining: (1: number of units) */ -"%1$@ Units of insulin remaining\n" = "%1$@ Units of insulin remaining\n"; +"%1$@ Units of insulin remaining\n" = "%1$@ Jednotiek zostávajúci inzulín\n"; /* Accessibility format string for (1: localized volume)(2: time) */ "%1$@ units remaining at %2$@" = "%1$@ jednotiek zostávajúcich na %2$@"; @@ -20,31 +20,31 @@ "%1$@%2$@%3$@" = "%1$@ %2$@ %3$@"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Nastavenie času čerpadla..."; /* Instructions on selecting battery chemistry type */ -"Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure."; +"Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Alkalické a lítiové batérie sa rozkladajú rôznou rýchlosťou. Alkalické majú tendenciu lineárne klesať v priebehu času, zatiaľ čo lítiové batérie majú tendenciu udržiavať napätie až do polovice svojej životnosti. Pri bežnom používaní v inzulínovej pumpe Minimed (x22/x15), ktorá nie je kompatibilná so systémom MySentry a beží v slučke, vydržia alkalické batérie približne 4 až 5 dní. Lítiové batérie vydržia 1 až 2 týždne. Pri tomto výbere sa pre každý typ chemického zloženia batérie použije iná rýchlosť úbytku napätia a používateľ bude upozornený, keď batériu delí približne 8 až 10 hodín od zlyhania."; /* Text to confirm delete this pump */ -"Are you sure you want to delete this Pump?" = "Are you sure you want to delete this Pump?"; +"Are you sure you want to delete this Pump?" = "Ste si istí, že chcete toto čerpadlo vymazať?"; /* The format string describing pump battery voltage: (1: battery voltage) */ -"Battery: %1$@ volts\n" = "Battery: %1$@ volts\n"; +"Battery: %1$@ volts\n" = "Batéria: %1$@ volt\n"; /* The label indicating the best radio frequency */ -"Best Frequency" = "Best Frequency"; +"Best Frequency" = "Najlepšia Frekvencia"; /* The format string describing pump bolusing state: (1: bolusing) */ -"Bolusing: %1$@\n" = "Bolusing: %1$@\n"; +"Bolusing: %1$@\n" = "Podáva sa bolus: %1$@\n"; /* Cancel button title */ "Cancel" = "Zrušiť"; /* Title text for suspend resume button when temp basal canceling */ -"Canceling Temp Basal" = "Canceling Temp Basal"; +"Canceling Temp Basal" = "Ruší sa Dočasný Bazál"; /* Text shown in basal rate space when basal is changing */ -"Changing" = "Changing"; +"Changing" = "Zmena"; /* Progress message for changing pump time. */ "Changing time…" = "Mení sa čas…"; @@ -56,20 +56,20 @@ "Configuration" = "Konfigurácia"; /* Button title to connect to pump during setup */ -"Connect" = "Connect"; +"Connect" = "Pripojiť"; /* Text for continue button */ "Continue" = "Pokračovať"; /* Button label for removing Pump Text to delete pump */ -"Delete Pump" = "Delete Pump"; +"Delete Pump" = "Vymazať Pumpu"; /* Header for devices section of RileyLinkSetupView */ "Devices" = "Zariadenia"; /* Description for option to not use MySentry */ -"Do not use MySentry" = "Do not use MySentry"; +"Do not use MySentry" = "Nepoužívajte službu MySentry"; /* The alert title for a resume error */ "Error Resuming" = "Chyba pri obnovení"; @@ -78,22 +78,22 @@ "Error Suspending" = "Chyba pri pozastavení"; /* The alert title for an error while synching time */ -"Error Syncing Time" = "Error Syncing Time"; +"Error Syncing Time" = "Čas synchronizácie chyby"; /* Progress message for fetching pump glucose. */ -"Fetching glucose…" = "Fetching glucose…"; +"Fetching glucose…" = "Získavanie glukózy…"; /* Progress message for fetching pump history. */ -"Fetching history…" = "Fetching history…"; +"Fetching history…" = "Získavanie histórie…"; /* Progress message for fetching pump model. */ -"Fetching pump model…" = "Fetching pump model…"; +"Fetching pump model…" = "Získavanie modelu čerpadla…"; /* The title of the cell showing the pump firmware version */ -"Firmware Version" = "Firmware Version"; +"Firmware Version" = "Verzia firmvéru"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Inzulín\nSuspendovaný"; /* Title of insulin delivery section */ "Insulin Delivery" = "Podávanie inzulínu"; @@ -117,45 +117,45 @@ "No" = "Nie"; /* Message display when no response from tuning pump */ -"No response" = "No response"; +"No response" = "Žiadna odpoveď"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Nie, nechajte čerpadlo tak, ako je"; /* Pump find device instruction */ "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "Na pumpe prejdite na obrazovku Nájsť zariadenie a vyberte možnosť „Nájsť zariadenie“. \n\n Hlavné menu >\n Pomôcky >\n Pripojiť zariadenia >\n Iné zariadenia >\n Zapnuté >\n Nájsť zariadenie"; /* navigation title for pump battery type selection Text for medtronic pump preferred data source */ -"Preferred Data Source" = "Preferred Data Source"; +"Preferred Data Source" = "Uprednostňovaný zdroj údajov"; /* Text for medtronic pump battery percent remaining */ -"Pump Battery Remaining" = "Pump Battery Remaining"; +"Pump Battery Remaining" = "Zostávajúca batéria čerpadla"; /* navigation title for pump battery type selection Text for medtronic pump battery type */ -"Pump Battery Type" = "Pump Battery Type"; +"Pump Battery Type" = "Top batérie pumpy"; /* The title text for the pump ID config value */ "Pump ID" = "ID pumpy"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Čas čerpadla"; /* Progress message for reading basal schedule */ -"Reading basal schedule…" = "Reading basal schedule…"; +"Reading basal schedule…" = "Načítava sa rozvrh bazálu…"; /* Progress message for reading pump status */ -"Reading pump status…" = "Reading pump status…"; +"Reading pump status…" = "Načítavam stav pumpy…"; /* The title of the cell showing the pump region */ -"Region" = "Region"; +"Region" = "Región"; /* Title text for button to resume insulin delivery */ -"Resume Delivery" = "Resume Delivery"; +"Resume Delivery" = "Obnoviť podávanie inzulínu"; /* Title text for button when insulin delivery is in the process of being resumed */ -"Resuming" = "Resuming"; +"Resuming" = "Obnovuje sa"; /* Button title to retry sentry setup */ "Retry" = "Skúsiť znova"; @@ -167,43 +167,43 @@ "Select the type of insulin that you will be using in this pump." = "Vyberte typ inzulínu, ktorý budete v tejto pumpe používať."; /* Progress message for sending button press to pump. */ -"Sending button press…" = "Sending button press…"; +"Sending button press…" = "Posiela stlačenie tlačidla…"; /* Title text for suspend resume button when temp basal starting */ -"Starting Temp Basal" = "Starting Temp Basal"; +"Starting Temp Basal" = "Spustiť Dočasný Bazál"; /* A message indicating a command succeeded */ "Succeeded" = "Úspešné"; /* Title text for button to suspend insulin delivery */ -"Suspend Delivery" = "Suspend Delivery"; +"Suspend Delivery" = "Pozastavenie dodávky"; /* The format string describing pump suspended state: (1: suspended) */ -"Suspended: %1$@\n" = "Suspended: %1$@\n"; +"Suspended: %1$@\n" = "Pozastavené: %1$@\n"; /* Title text for button when insulin delivery is in the process of being stopped */ -"Suspending" = "Suspending"; +"Suspending" = "Pozastavenie"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synchronizácia s aktuálnym časom"; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Čas na vašej pumpe sa líši od skutočného času. Chcete aktualizovať čas na čerpadle na aktuálny čas?"; /* Title for pod sync time action sheet. */ "Time Change Detected" = "Zistila sa zmena času"; /* The label indicating the results of each frequency trial */ -"Trials" = "Trials"; +"Trials" = "Testovanie"; /* Progress message for tuning radio */ -"Tuning radio…" = "Tuning radio…"; +"Tuning radio…" = "Naladenie rádia…"; /* Units for showing temp basal rate */ -"U/hr" = "U/hr"; +"U/hr" = "J/hod"; /* Text to indicate battery percentage is unknown */ -"unknown" = "unknown"; +"unknown" = "neznámy"; /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Neznáme"; @@ -211,10 +211,10 @@ /* Description for option to use MySentry navigation title for pump battery type selection Text for medtronic pump to use MySentry */ -"Use MySentry" = "Use MySentry"; +"Use MySentry" = "Používajte službu MySentry"; /* Value string for MySentry config when MySentry is being used */ "Yes" = "Áno"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Áno, synchronizujte s aktuálnym časom"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index b01332c817..36859c5e7f 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -6,817 +6,817 @@ */ /* Alert content title for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "Upozornenie na viacero príkazov"; /* Alert content title for userPodExpiration pod alert */ -"Pod Expiration Reminder" = "Pod Expiration Reminder"; +"Pod Expiration Reminder" = "Pripomienka o expirácii"; /* Alert content title for podExpiring pod alert */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod expiroval"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Nízka hladina v rezervoári"; /* Alert content title for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "Pripomienka prebiehajúceho pozastavenia"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Obnoviť podávanie inzulínu"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Párovanie podu nebolo dokončené"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Zistila sa zmena času"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Multiple Command Alert"; +"Multiple Command Alert" = "Upozornenie na viacero príkazov"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod vyprší za %1$@."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Vymeniť pod teraz. Pod bol aktívny 72 hodín."; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Treba vymeniť pod. Podávanie inzulínu sa zastaví o 1 hodinu."; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "V podu zostáva %1$@ inzulínu alebo menej. Čoskoro vymeňte pod."; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; +"Suspend In Progress Reminder" = "Pripomienka prebiehajúceho pozastavenia"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Obdobie pozastavenia podávania inzulínu sa skončilo.\n\nPodávanie môžete obnoviť z bannera na domovskej obrazovke alebo z obrazovky nastavení pumpy. Znovu sa vám to pripomenie za 15 minút."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Dokončite párovanie podu."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Čas na vašej pumpe sa líši od aktuálneho času. Čas na čerpadle si môžete skontrolovať a synchronizovať s aktuálnym časom v nastaveniach."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Čas pozastavenia vypršal. Otvorte aplikáciu a pokračujte."; /* Action button default text for PodAlerts */ -"Ok" = "Ok"; +"Ok" = "OK"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Aktivácia neukončená"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod expiruje o"; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Expirácia Podu"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod aktivovaný"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Nastavenia oznámení"; /* */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Upozornenia s pípnutím zo zariadenia Pod"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Zastavte podávanie inzulínu"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod vypršal"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Deaktivácia neukončená"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Žiadny pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Párovať pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Párovať pod."; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Párovanie."; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Pripravuje sa. Prosím čakajte."; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod sprárovaný úspešne. Pokračovať."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Dokončiť deaktiváciu"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Vymeňte pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "deň"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "dni"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "hodina"; /* Unit for plural hours in pod life remaining */ -"hours" = "hours"; +"hours" = "hodiny"; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "minúta"; /* Unit for plural minutes in pod life remaining */ -"minutes" = "minutes"; +"minutes" = "minút"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Podávanie inzulínu"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "Naplánovaný bazál"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Zostávajúci inzulín"; /* Section header for activity section */ "Activity" = "Aktivita"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Podrobnosti o zariadení"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Nastavenie"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Dokončiť deaktiváciu"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Vymeňte pod"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Vymeňte pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Aktivácia neukončená"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod expiruje o"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod vypršal"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Deaktivácia neukončená"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Žiadny pod"; /* Pod life HUD view label */ -"Fault" = "Fault"; +"Fault" = "Chyba"; /* Label describing pod age view */ -"Pod Age" = "Pod Age"; +"Pod Age" = "Vek podu"; /* Label describing time remaining view */ -"Remaining" = "Remaining"; +"Remaining" = "Zostávajúce"; /* Label indicating pod replacement necessary */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Vymeňte pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "Nie je spárovaný žiadny pod"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod je už spárovaný"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Typ inzulínu nie je nakonfigurovaný"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; +"Pod is not in a state ready for cannula insertion." = "Pod nie je v stave pripravenom na zavedenie kanyly."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Neplatné nastavenie"; /* Recovery suggestion shown when no pod is paired */ -"Please pair a new pod" = "Please pair a new pod"; +"Please pair a new pod" = "Spárujte nový pod"; /* Generic title of the OmniBLE pump manager */ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Problém s komunikáciou"; /* */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Dokončiť párovanie"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Dokončiť deaktiváciu"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Žiadny pod"; /* Status highlight message for emptyReservoir alarm. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Žiadny inzulín"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod expiroval"; /* Status highlight message for occlusion alarm. */ -"Pod Occlusion" = "Pod Occlusion"; +"Pod Occlusion" = "Oklúzia podu"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Chyba podu"; /* Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Žiadny inzulín"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Inzulín Suspendovaný"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Strata signálu"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Manuálny bazál"; /* */ "Insert Cannula" = "Zaviesť Kanylu"; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Zavádza sa..."; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "Skúsiť znova"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Kontroluje sa..."; /* */ -"Check cannula insertion finished" = "Check cannula insertion finished"; +"Check cannula insertion finished" = "Skontrolujte, či je zavedenie kanyly dokončené"; /* */ -"Get pod status" = "Get pod status"; +"Get pod status" = "Zistiť stav Podu"; /* */ -"Save Basal Profile" = "Save Basal Profile"; +"Save Basal Profile" = "Nastavovanie bazálneho profilu"; /* */ -"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; +"Save basal profile failed: %{public}@" = "Uloženie základného profilu sa nepodarilo: %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; +"Skipping Play Test Beeps due to bolus still in progress." = "Vynechanie pípnutia testu prehrávania z dôvodu stále prebiehajúceho podávania bolusu."; /* */ -"Play Test Beeps" = "Play Test Beeps"; +"Play Test Beeps" = "Prehrať skúšobné pípnutia"; /* */ -"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; +"Skipping Read Pulse Log due to bolus still in progress." = "Vynechanie pípnutia testu prehrávania z dôvodu stále prebiehajúceho podávania bolusu."; /* */ -"Read Pulse Log" = "Read Pulse Log"; +"Read Pulse Log" = "Čítať protokol pulzov"; /* */ -"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; +"Set Confirmation Beeps to %s" = "Nastavenie potvrdzujúcich zvukových signálov na %s"; /* */ -"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; +"Set Confirmation Beeps Preference" = "Nastavenie preferencie potvrdzujúcich zvukových signálov"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Pozastavenie"; /* */ -"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; +"Failed to suspend: %{public}@" = "Nepodarilo sa pozastaviť: %{public}@"; /* */ -"Resume" = "Resume"; +"Resume" = "Pokračovať"; /* */ -"Bolus" = "Bolus"; +"Bolus" = "Dávka"; /* */ -"Cancel Bolus" = "Cancel Bolus"; +"Cancel Bolus" = "Zrušiť bolus"; /* Alert acknowledgment OK button */ "OK" = "OK"; /* The title for Empty Reservoir alarm notification */ -"Empty Reservoir" = "Empty Reservoir"; +"Empty Reservoir" = "Prázdny zásobník"; /* The title for Occlusion alarm notification */ -"Occlusion Detected" = "Occlusion Detected"; +"Occlusion Detected" = "Zistená oklúzia"; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Kritická chyba zariadenia Pod"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Podávanie inzulínu sa zastavilo. Vymeňte modul teraz."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Zostávajúci inzulín"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Nastavenie dočasnej bazálnej sadzby"; /* Section header for activity section */ "Activity" = "Aktivita"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Nastavenie"; /* Title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Predchádzajúci Pod"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Čas čerpadla"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Nastavenie času čerpadla..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synchronizácia s aktuálnym časom"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Prechod na iné zariadenie na podávanie inzulínu"; /* Title for pod sync time action sheet. */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Čas na vašej pumpe sa líši od aktuálneho času. Chcete aktualizovať čas na vašej pumpe na aktuálny čas?"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Áno, synchronizujte s aktuálnym časom"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Nie, nechajte čerpadlo tak, ako je"; /* Title for Omnipod DASH PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Odstrániť Pod"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; +"Are you sure you want to stop using Omnipod DASH?" = "Naozaj chcete prestať používať Ominpod Dash?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Delete Omnipod DASH"; +"Delete Omnipod DASH" = "Vymazať Omnipod Dash"; /* Text for confidence reminders navigation link" */ "Insulin Type" = "Typ Inzulínu"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synchronizácia s aktuálnym časom"; /* Title for suspend duration selection action sheet */ -"Suspend Delivery" = "Suspend Delivery"; +"Suspend Delivery" = "Pozastavenie dodávky"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Podávanie inzulínu bude zastavené, kým ho neobnovíte manuálne. Kedy chcete, aby vám slučka pripomenula obnovenie podávania?"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 minút"; /* Button text for 1 hour suspend duration" */ -"1 hour" = "1 hour"; +"1 hour" = "1 hodina"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 hodina 30 minút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 hodiny"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Pozastavenie podávania inzulínu zlyhalo"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Obnovenie podávania inzulínu zlyhalo"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Nastavenie času pumpy zlyhalo"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Zrušenie manuálneho bazálu zlyhalo"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Prosím, deaktivujte pod. Po dokončení deaktivácie, ho môžete odstrániť a spárovať nový pod."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Prosím, deaktivujte pod. Po dokončení deaktivácie, môžete spárovať nový pod."; /* Deactivate pod action button */ "Deactivate Pod" = "Deaktivovať Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Deaktivuje sa."; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod deaktivovaný úspešne. Pokračovať."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "Skúsiť znova"; /* Action button description when deactivated */ "Continue" = "Pokračovať"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Nastal problém s komunikáciou s modulom. Ak tento problém pretrváva, ťuknite na položku Discard Pod. Potom môžete aktivovať nový pod."; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Zlikvidujte pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Odstránenie struku z tela"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Váš Pod môže stále podávať inzulín.\nOdstráňte ho z tela a potom klepnite na \"Pokračova.\""; /* Insulin Unit */ -"U" = "U"; +"U" = "J"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Zmeniť Pod teraz. Podávanie inzulínu sa zastaví 8 hodín po uplynutí doby platnosti Podu alebo keď už nezostane žiadny inzulín."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Naplňte nový pod s inzulínom U-100 (modrý uzáver ihly pod nechajte nasadený)."; /* Label text for step 2 of pair pod instructions */ -"Listen for 2 beeps." = "Listen for 2 beeps."; +"Listen for 2 beeps." = "Počúvajte 2 pípnutia."; /* Label text indicating pairing finished.*/ -"Paired" = "Paired"; +"Paired" = "Spárované"; /* Cancel button text in navigation bar on pair pod UI */ -"Cancel" = "Cancel"; +"Cancel" = "Zrušiť"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Naozaj chcete zrušiť svoj hlas?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Ak zrušíte nastavenie podov, aktuálny pod bude deaktivovaný a nebude možné ho používať."; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Áno, deaktivujte pod"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Nie, pokračujte so zariadením Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Príprava miesta na telo."; /* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Skontrolujte pod, aplikujte ho na telo, potom potvrďte prilepenie podu."; /* Action button title for attach pod view */ "Continue" = "Pokračovať"; /* */ -"Attach Pod" = "Attach Pod"; +"Attach Pod" = "Aplikujte pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Potvrdiť pripojenie zariadenia Pod"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Uistite sa, že je pod bezpečne pripevnený k vášmu telu.\n\nKanylu možno do každého podu zaviesť len raz. Keď je Pod pripojený, klepnite na \"Potvrdiť\"."; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Potvrdiť"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Ťuknutím nižšie spustíte zavádzanie kanyly."; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Počkajte kým nie je zavedenie ukončené."; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Vložené do tela"; /* Check Cannula */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Skontrolujte kanylu"; /* */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Je kanyla správne zavedená?"; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Keď je kanyla správne zavedená do kože, okienko v hornej časti Podu by malo byť sfarbené do ružova."; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "Áno"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "Nie"; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Páruje sa..."; /* Pod pairing action button text while priming */ -"Priming..." = "Priming..."; +"Priming..." = "Príprava..."; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Deaktivuje sa..."; /* Pod state when pod has been deactivated */ -"Deactivated" = "Deactivated"; +"Deactivated" = "Deaktivované"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Váš pod je pripravený na použitie.\n\n%1$@ vám pripomenie, aby ste si vymenili pod pred uplynutím jeho platnosti. Môžete to zmeniť na čas, ktorý vám vyhovuje."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Naplánovaná pripomienka"; /* Label for expiration reminder row */ -"Time" = "Time"; +"Time" = "Čas"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Dokončiť nastavenie"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Nastavenie je dokončené"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Žiadna pripomienka"; /* Error message description for PeripheralManagerError.notReady */ -"Peripheral Not Ready" = "Peripheral Not Ready"; +"Peripheral Not Ready" = "Periférne zariadenie nie je pripravené"; /* Error message description for PeripheralManagerError.incorrectResponse */ -"Incorrect Response" = "Incorrect Response"; +"Incorrect Response" = "Nesprávna odpoveď"; /* Error message description for PeripheralManagerError.timeout */ -"Timeout" = "Timeout"; +"Timeout" = "Časový limit vypršal"; /* Error message description for PeripheralManagerError.emptyValue */ -"Empty Value" = "Empty Value"; +"Empty Value" = "Prázdna hodnota"; /* Error message description for PeripheralManagerError.unknownCharacteristic */ -"Unknown Characteristic" = "Unknown Characteristic"; +"Unknown Characteristic" = "Neznáma charakteristika"; /* Error message description for PeripheralManagerError.nack */ "Nack" = "Nack"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Pripomienky omnipodu"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Aplikácia nakonfiguruje pripomienku na pod, ktorá vás vopred upozorní na vypršanie platnosti pod. Nastavte počet hodín vopred, ktoré chcete nakonfigurovať pri párovaní nového zariadenia Pod."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Toto je pripomienka, ktorú ste naplánovali pri spárovaní aktuálneho Podu."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Naplánovaná pripomienka"; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Aplikácia vás upozorní, keď množstvo inzulínu v pode dosiahne túto úroveň."; /* Description text for critical alerts */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Kritické výstrahy"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Vyššie uvedené upozornenia nezaznejú, ak je vaše zariadenie v tichom režime alebo v režime Nerušiť.\n\nExistujú ďalšie kritické upozornenia a alarmy Pod, ktoré zaznejú, aj keď je vaše zariadenie nastavené na tichý režim alebo režim Nerušiť."; /* navigation title for notification settings */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Nastavenia oznámení"; /* Label for scheduled reminder value row */ -"Time" = "Time"; +"Time" = "Čas"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Žiadna pripomienka"; /* Label for low reservoir reminder row */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Pripomienka Nízka hladina v rezervoári"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Uistite sa, že iPhone a pod sú blízko seba. Ak problémy s komunikáciou pretrvávajú, presuňte sa do inej oblasti."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Ihneď vymeniť pod. Podávanie inzulínu sa zastaví o %1$@ alebo keď sa minie inzulín."; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vypnuté"; /* Title string for BeepPreference.manualCommands */ "Enabled" = "Zapnuté"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Rozšírený"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Nepoužívajú sa žiadne oznámenia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Upozornenia budú znieť pri príkazoch, ktoré iniciujete, ako napríklad bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie pripomienok upozornení atď. Keď aplikácia automaticky upravuje podávanie, nepoužívajú sa žiadne pripomenutia dôvery."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Upozornenia zaznejú, keď aplikácia automaticky upraví doručenie a na príkazy, ktoré sami zadáte."; /* Label text for temporary basal rate summary */ -"Rate" = "Rate"; +"Rate" = "Dávka"; /* Insulin unit per hour */ -"U/hr" = "U/hr"; +"U/hr" = "J/hod"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ pre %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop vám automaticky neupraví dávkovanie inzulínu, kým sa dočasná bazálna rýchlosť neskončí alebo nezruší."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Nastaviť dočasný bazál"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Dočasný bazál"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Dočasný bazál zlyhal"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Nie je možné nastaviť dočasnú dávku bazálu: %1$@ \n\n %2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Nie je možné nastaviť dočasnú dávku bazálu: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Chýba konfigurácia"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Tento manažér čerpadiel nebol nakonfigurovaný s maximálnou bazálnou rýchlosťou, pretože bol pridaný skôr, ako bola pridaná funkcia manuálneho bazálneho nastavenia. Prejdite do nastavení terapie -> limity dodávok a nastavte novú maximálnu bazálnu rýchlosť."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Predvolené pripomenutie o expirácii"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Predchádzajúce informácie o Pod"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Žiadna\ndodávka"; /* description label for active time pod details row */ "Active Time" = "Aktívny Čas"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Celková dávka"; /* description label for device name pod details row */ -"Device Name" = "Device Name"; +"Device Name" = "Názov zariadenia"; /* description label for lot number pod details row */ -"Lot Number" = "Lot Number"; +"Lot Number" = "Číslo šarže"; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Sekvenčné číslo"; /* description label for firmware version pod details row */ -"Firmware Version" = "Firmware Version"; +"Firmware Version" = "Verzia firmvéru"; /* description label for ble firmware version pod details row */ -"BLE Firmware Version" = "BLE Firmware Version"; +"BLE Firmware Version" = "BLE verzia firmvéru"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod aktivovaný"; /* description label for active time pod details row */ "Active Time" = "Aktívny Čas"; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Posledný stav"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Detaily chyby podu"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Nastavenie podu"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Teraz začnete s procesom konfigurácie pripomienok, naplnením podu inzulínom, jeho spárovaním s vašim zariadením a umiestnením podu na telo."; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Zrušiť"; /* Text for continue button on PodSetupView */ "Continue" = "Pokračovať"; /* Are you sure you want to skip Omnipod Onboarding? */ -"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; +"Skip Omnipod Onboarding?" = "Preskočiť Omnipod Onboarding?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Aplikácia vás vopred upozorní na expiráciu podu. \n\nRolovaním nastavte počet hodín vopred, kedy chcete upozornenie dostať."; /* Text of continue button on ExpirationReminderSetupView" */ -"Next" = "Next"; +"Next" = "Ďalej"; /* */ "Expiration Reminder" = "Pripomienka Expirácie"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Aplikácia vás upozorní, keď množstvo inzulínu v pode dosiahne túto úroveň (50 – 10 U). \n\nRolovaním nastavte počet jednotiek, pri ktorých chcete byť upozornení."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Nízka hladina v rezervoári"; /* */ -"Save" = "Save"; +"Save" = "Uložiť"; /* hr (short for hour) */ -"hr" = "hr"; +"hr" = "h"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Zrušenie manuálneho bazálneho"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Inzulín\nSuspendovaný"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Obnoviť podávanie inzulínu"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Uistite sa, že je váš iPhone v dosahu a skúste znova."; /* Error message shown when the pod is not connected */ -"Pod not connected" = "Pod not connected"; +"Pod not connected" = "Žiadny Pod nie je pripojený"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Pozastavené na"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Obnovuje sa podávanie inzulínu..."; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Pozastavenie podávania inzulínu..."; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Nenašiel sa žiadny pod"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Našlo sa príliš veľa podov"; /* Recovery suggestion when no response is received from pod */ -"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; +"Make sure iPhone is nearby the active pod" = "Uistite sa, že iPhone je v dosahu aktívneho podu"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Skúste znova"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Presuňte sa ďalej od ostatných modulov a skúste znova."; /* Recovery suggestion for PodCommsError.noPodsFound */ -"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; +"Make sure your pod is filled and nearby." = "Uistite sa, že je váš pod naplnený a v blízkosti."; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; +"Please reposition iPhone further from the pod" = "Premiestnite RileyLink ďalej od podu"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; +"Please reposition iPhone relative to the pod" = "Zmeňte polohu RileyLink vzhľadom k podu"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Prosím, majte iba pôvodný pod v dosahu alebo deaktivujte pôvodný pod"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Možné presluchy. Presuňte sa na iné miesto"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Uistite sa, že je váš iPhone v dosahu a skúste znova."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Počkajte na dokončenie bolusu alebo bolus zrušte"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Počkajte na dokončenie bolusu alebo bolus zrušte"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Počkajte, kým sa dokončí dočasný bazál, alebo ho zrušte"; /* DASH Pod time ago since last status */ "%@ ago" = "pred %@"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Umlčané"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normálny prevádzkový režim, v ktorom sa zvukové signály Pod používajú pre všetky upozornenia Pod a keď sú povolené pripomenutia dôvery."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Všetky upozornenia Pod nepoužívajú žiadne zvukové signály a zvukové signály pripomínajúce potvrdenie sú potlačené. Pod bude pípať len pri fatálnych poruchách Pod a pri prehrávaní testovacích pípnutí.\n\n⚠️Warning - Vždy, keď je Pod stlmený, musí byť v dosahu Bluetooth tohto zariadenia, aby prijímal upozornenia na upozornenia Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Režim Silence Pod potlačí všetky upozornenia Pod a upozornenia na potvrdenie."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Umlčané"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Detaily Podu"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Predchádzajúci Pod Podrobnosti"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Podrobnosti o manažérovi čerpadla"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Získanie údajov o správcovi čerpadla..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Podrobnosti o manažérovi čerpadla"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostiky"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Zistiť stav Podu"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings index c0f2d23d95..33fb8ddc66 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/sk.lproj/Localizable.strings @@ -2,7 +2,7 @@ " (inactive)" = "{neaktívne}"; /* Format string for low battery alert body for RileyLink. (1: device name) */ -"\"%1$@\" has a low battery" = "\"%1$@\" has a low battery"; +"\"%1$@\" has a low battery" = "\"%1$@\" má slabú batériu"; /* Unit format string for an RSSI value in decibles */ "%@ dB" = "%@ dB"; @@ -18,7 +18,7 @@ "Auto-off" = "Automatické vypnutie"; /* Description for auto-off alarm */ -"Auto-off alarm" = "Auto-off alarm"; +"Auto-off alarm" = "Alarm auto-vypnutý"; /* Pod state when basal initialized */ "Basal initialized" = "Bazál inciovaný"; @@ -27,7 +27,7 @@ "Below 50 units" = "Menej ako 50 jednotiek"; /* Pump Event title for UnfinalizedDose with doseType of .bolus */ -"Bolus" = "Bolus"; +"Bolus" = "Dávka"; /* Error message shown when operation could not be completed due to existing bolus in progress */ "Bolus in progress" = "Prebieha bolus"; @@ -54,22 +54,22 @@ "Change Pod now. Pod has been active for 72 hours." = "Vymeniť pod teraz. Pod bol aktívny 72 hodín."; /* Format string for invalid message error code (1: error code number) */ -"Command error %1$u" = "Command error %1$u"; +"Command error %1$u" = "Chyba príkazu %1$u"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Problém s komunikáciou"; /* Error message when command is rejected because an unacknowledged command is pending. */ "Communication issue: Unacknowledged command pending." = "Problém s komunikáciou: Čaká sa na potvrdenie príkazu."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Tieto upozornenia s pípnutím zo zariadenia Pod zaznejú pri spustení príkazov, ako je bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie pripomienky s upozornením atď. Keď aplikácia automaticky zmení správu, nepoužívajú sa žiadne oznámenia."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Tieto zvukové upozornenia zo zariadenia Pod zaznejú, keď aplikácia automaticky upraví dodávku, ako aj pri príkazoch, ktoré iniciujete."; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Kritická chyba zariadenia Pod"; /* Recovery suggestion when unexpected address received */ "Crosstalk possible. Please move to a new location" = "Možné presluchy. Presuňte sa na iné miesto"; @@ -78,7 +78,7 @@ "Deactivated" = "Deaktivované"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vypnuté"; /* Description for Empty reservoir pod fault */ "Empty reservoir" = "Prázdna nádrž"; @@ -93,7 +93,7 @@ "Expiration alert" = "Varovanie o expirácii"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Rozšírený"; /* Delivery status when extended bolus is running */ "Extended bolus running" = "Prebieha predĺžený bolus"; @@ -105,10 +105,10 @@ "Fault event occurred" = "Vyskytla sa chybová udalosť"; /* Status highlight that when pod is deactivating. */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Dokončiť deaktiváciu"; /* Status highlight that when pod is activating. */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Dokončiť párovanie"; /* Description for finish setup */ "Finish setup " = "Dokončiť nastavenie"; @@ -126,7 +126,7 @@ "Insulin delivery stopped. Change Pod now." = "Podávanie inzulínu sa zastavilo. Vymeňte modul teraz."; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Inzulín Suspendovaný"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ "Insulin type not configured" = "Typ inzulínu nie je nakonfigurovaný"; @@ -225,7 +225,7 @@ "Pairing completed" = "Párovanie je dokončené"; /* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ -"Parsing Error: %1$@ in (%2$@)" = "Parsing Error: %1$@ in (%2$@)"; +"Parsing Error: %1$@ in (%2$@)" = "Chyba pri analyzovaní: %1$@ v (%2$@)"; /* Recovery suggestion on unexpected pod change */ "Please bring only original pod in range or deactivate original pod" = "Prosím, majte iba pôvodný pod v dosahu alebo deaktivujte pôvodný pod"; @@ -264,7 +264,7 @@ "Pod expired" = "Pod vypršal"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod vyprší za %1$@."; /* Format string for pod fault code */ "Pod Fault: %1$@" = "Chyba podu: %1$@"; @@ -313,7 +313,7 @@ "Reminder initialized" = "Pripomienka bola inicializovaná"; /* Pump Event title for UnfinalizedDose with doseType of .resume */ -"Resume" = "Resume"; +"Resume" = "Pokračovať"; /* Recovery suggestion when pod is suspended */ "Resume delivery" = "Obnoviť podávanie inzulínu"; @@ -322,7 +322,7 @@ "Resume Insulin" = "Obnoviť podávanie inzulínu"; /* The format string describing a resume. (1: Time)(2: Scheduled certainty */ -"Resume: %1$@ %2$@" = "Resume: %1$@ %2$@"; +"Resume: %1$@ %2$@" = "Obnoviť: %1$@ %2$@"; /* Delivery status when basal is running */ "Scheduled Basal" = "Naplánovaný bazál"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index c6efa56456..cff69338bd 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -57,16 +57,16 @@ "%g U" = "%g j"; /* Button text for 1 hour suspend duration */ -"1 hour" = "1 hour"; +"1 hour" = "1 hodina"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 hodina 30 minút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 hodiny"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 minút"; /* The title of the cell showing the pod activated at time */ "Active Time" = "Aktívny čas"; @@ -75,13 +75,13 @@ "Activity" = "Aktivita"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Nastavenie času čerpadla..."; /* The title of the cell showing alarm status */ "Alarms" = "Alarmy"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Naozaj chcete zrušiť svoj hlas?"; /* Confirmation message for shutting down a pod */ "Are you sure you want to shutdown this pod?" = "Naozaj chcete vypnúť tento pod?"; @@ -117,7 +117,7 @@ "Cancel" = "Zrušiť"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Zrušenie manuálneho bazálneho"; /* Insert cannula action button accessibility label when cannula insertion succeeded */ "Cannula inserted successfully. Continue." = "Kanyla úspešne zavedená. Pokračovať."; @@ -150,19 +150,19 @@ "Comms Recovered" = "Príkazy obnovené"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Upozornenia s pípnutím zo zariadenia Pod"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Upozornenia s pípnutím zo zariadenia Pod, ktoré možno použiť na potvrdenie vybraných príkazov, keď zariadenie Pod nie je vypnuté."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurácia"; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Potvrdiť"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Potvrdiť pripojenie zariadenia Pod"; /* The title of the continue action in an action sheet */ "Continue" = "Pokračovať"; @@ -294,7 +294,7 @@ "hours" = "hodiny"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Ak zrušíte nastavenie podov, aktuálny pod bude deaktivovaný a nebude možné ho používať."; /* Instructions when deactivating pod that has been paired, but not attached. */ "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Neúplne nastavený pod musí byť deaktivovaný pred spárovaním s novým podom. Deaktivujte a zlikvidujte pod."; @@ -306,7 +306,7 @@ "Insert Cannula" = "Zaviesť kanylu"; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Vložené do tela"; /* Insert cannula action button accessibility label while pairing */ "Inserting. Please wait." = "Zavádzanie. Počkajte, prosím."; @@ -315,7 +315,7 @@ "Inserting..." = "Zavádza sa.."; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Inzulín\nSuspendovaný"; /* The title of the cell showing delivered insulin */ "Insulin Delivered" = "Inzulín podaný"; @@ -327,7 +327,7 @@ "Insulin delivery stopped. Change Pod now." = "Podávanie inzulínu sa zastavilo. Vymeňte modul teraz."; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Podávanie inzulínu bude zastavené, kým ho neobnovíte manuálne. Kedy chcete, aby vám slučka pripomenula obnovenie podávania?"; /* Header for insulin remaining on pod settings screen */ "Insulin Remaining" = "Zostávajúci inzulín"; @@ -340,7 +340,7 @@ "Invalid entry" = "Neplatný údaj"; /* Question to confirm the cannula is inserted properly */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Je kanyla správne zavedená?"; /* Label text for step 2 of pair pod instructions */ "Keep the RileyLink about 6 inches from the pod during pairing." = "Počas párovania držte RileyLink približne 6 palcov od podu."; @@ -390,7 +390,7 @@ "No" = "Nie"; /* Text shown in insulin remaining space when no pod is paired */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Žiadna\ndodávka"; /* Error message for reservoir view when reservoir empty */ "No Insulin" = "Žiadny inzulín"; @@ -403,10 +403,10 @@ "No Reminder" = "Žiadna pripomienka"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Nie, pokračujte so zariadením Pod"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Nie, nechajte čerpadlo tak, ako je"; /* The detail text for bolus delivery when no bolus is being delivered */ "None" = "Žiadny"; @@ -446,7 +446,7 @@ "Pairing..." = "Páruje sa…"; /* No comment provided by engineer. */ -"Percent = %lf" = "Percent = %lf"; +"Percent = %lf" = "Percentá = %lf"; /* The title of the cell showing the pod pi version */ "PI Version" = "Verzia PI"; @@ -458,7 +458,7 @@ "Play Test Beeps…" = "Prehrať skúšobné pípnutia…"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Uistite sa, že je pod bezpečne pripevnený k vášmu telu.\n\nKanylu možno do každého podu zaviesť len raz. Keď je Pod pripojený, klepnite na \"Potvrdiť\"."; /* Instructions for deactivate pod when pod not on body */ "Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Prosím, deaktivujte pod. Po dokončení deaktivácie, môžete spárovať nový pod."; @@ -490,7 +490,7 @@ "Pod Expired" = "Pod expiroval"; /* Label for pod expiration row */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Expirácia Podu"; /* Label for pod life state when time remaining */ "Pod expires in" = "Pod expiruje o"; @@ -517,7 +517,7 @@ "Previous Pod" = "Predchádzajúci Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Predchádzajúce informácie o Pod"; /* The text of the loading label when pod is primed */ "Primed" = "Pripravené"; @@ -532,7 +532,7 @@ "Priming…" = "Príprava…"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Čas čerpadla"; /* Label text for basal rate summary */ "Rate" = "Dávka"; @@ -541,13 +541,13 @@ "Remaining" = "Zostáva"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Odstránenie struku z tela"; /* Title for Omnipod PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Odstrániť Pod"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Odstráňte kryt z ihly a skontrolujte kanylu. Potom odstráňte papierovú podložku."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -609,7 +609,7 @@ "Set Temporary Basal" = "Nastaviť dočasný bazál"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Nastavenie dočasnej bazálnej sadzby"; /* Title for setup complete screen */ "Setup Complete" = "Nastavenie je dokončené"; @@ -627,7 +627,7 @@ "Succeeded" = "Úspešné"; /* Title for suspend duration selection action sheet */ -"Suspend Delivery" = "Suspend Delivery"; +"Suspend Delivery" = "Pozastavenie dodávky"; /* Text for suspend resume button when insulin delivery active */ "Suspend Insulin Delivery" = "Zastavte podávanie inzulínu"; @@ -636,7 +636,7 @@ "Suspended" = "Pozastavené"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Pozastavené na"; /* Text for suspend resume button when insulin delivery is suspending */ "Suspending insulin delivery..." = "Pozastavenie podávania inzulínu..."; @@ -645,10 +645,10 @@ "Switch from Omnipod Pumps" = "Prepnúť z púmp Omnipod "; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Prechod na iné zariadenie na podávanie inzulínu"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Synchronizácia s aktuálnym časom"; /* Title of button to sync basal profile from pod */ "Sync With Pod" = "Synchronizovať s podom"; @@ -681,16 +681,16 @@ "The App notifies you when the amount of insulin in the Pod reaches this level." = "Aplikácia vás upozorní, keď množstvo inzulínu v pode dosiahne túto úroveň."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Vyššie uvedené pripomenutia nezaznejú, ak je vaše zariadenie v tichom režime alebo v režime Nerušiť.\n\nExistujú ďalšie kritické upozornenia a alarmy Pod, ktoré zaznejú, aj keď je vaše zariadenie nastavené na tichý režim alebo režim Nerušiť."; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Čas na vašej pumpe sa líši od skutočného času. Chcete aktualizovať čas na čerpadle na aktuálny čas?"; /* description for time change detected notice */ "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "Čas na pumpe je iný ako aktuálny čas. Čas pumpy riadi vaše naplánované liečebné nastavenia. Prejdite nadol na riadok Čas pumpy, pozrite si časový rozdiel a nakonfigurujte pumpu."; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Keď je kanyla správne zavedená do kože, okienko v hornej časti Podu by malo byť sfarbené do ružova."; /* Format string for recovery suggestion during deactivate pod. */ "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Nastal problém s komunikáciou s podom. Ak tento problém pretrváva, ťuknite na položku Zlikvidovať Pod. Potom môžete aktivovať nový pod."; @@ -720,7 +720,7 @@ "Total Delivery" = "Celková dávka"; /* Units for showing temp basal rate */ -"U/hr" = "U/hr"; +"U/hr" = "J/hod"; /* Instructions when pod cannot be deactivated */ "Unable to deactivate pod. Please continue and pair a new one." = "Pod nie je možné deaktivovať. Prosím pokračujte a spárujte nový pod."; @@ -751,10 +751,10 @@ "Yes" = "Áno"; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Áno, deaktivujte pod"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Áno, synchronizujte s aktuálnym časom"; /* bodyText for PodSetupView */ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Teraz začnete s procesom konfigurácie pripomienok, naplnením podu inzulínom, jeho spárovaním s vašim zariadením a umiestnením podu na telo."; @@ -763,42 +763,42 @@ "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Váš pod je pripravený na použitie. \n\n %1$@ vám pripomenie, aby ste vymenili svoj pod pred časom jeho expirácie. Môžete to zmeniť na čas, ktorý vám vyhovuje."; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Váš Pod môže stále podávať inzulín.\nOdstráňte ho z tela a potom klepnite na \"Pokračova.\""; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Umlčané"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normálny prevádzkový režim, v ktorom sa zvukové signály Pod používajú pre všetky upozornenia Pod a keď sú povolené pripomenutia dôvery."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Všetky upozornenia Pod nepoužívajú žiadne zvukové signály a zvukové signály pripomínajúce potvrdenie sú potlačené. Pod bude pípať len pri fatálnych poruchách Pod a pri prehrávaní testovacích pípnutí.\n\n⚠️Warning - Vždy, keď je Pod stlmený, musí byť v dosahu Bluetooth tohto zariadenia, aby prijímal upozornenia na upozornenia Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Umlčané"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Detaily Podu"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Predchádzajúci Pod Podrobnosti"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Podrobnosti o manažérovi čerpadla"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Získanie údajov o správcovi čerpadla..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Podrobnosti o manažérovi čerpadla"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Nepodarilo sa aktualizovať predvoľbu pripomenutia dôveryhodnosti."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnostiky"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Zistiť stav Podu"; diff --git a/Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings index e658b11636..53ea6cb89e 100644 --- a/Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings +++ b/Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings @@ -8,7 +8,7 @@ "Alert" = "Upozornenie"; /* Text indicating LED Mode is auto */ -"Auto" = "Auto"; +"Auto" = "Automatická "; /* The title of the cell showing battery level */ "Battery level" = "Stav batérie"; @@ -100,7 +100,7 @@ "Updating diagnostic LEDs mode" = "Aktualizuje sa režim diagnostických LED diód"; /* The title of the cell showing uptime */ -"Uptime" = "Uptime"; +"Uptime" = "Doba prevádzky"; /* The title of the cell showing ORL */ "Voltage" = "Napätie"; diff --git a/FreeAPS/Resources/sk.lproj/InfoPlist.strings b/FreeAPS/Resources/sk.lproj/InfoPlist.strings index 490542f424..bb9184b1ec 100644 --- a/FreeAPS/Resources/sk.lproj/InfoPlist.strings +++ b/FreeAPS/Resources/sk.lproj/InfoPlist.strings @@ -1,20 +1,20 @@ /* Privacy - NFC Scan Usage Description */ -"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; +"NFCReaderUsageDescription" = "NFC sa používa na skenovanie snímačov Libre."; /* Privacy - Bluetooth Always Usage Description */ -"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth sa používa pre komunikáciu s inzulínovou pumpou a zariadeniami na kontinuálne monitorovanie krvného cukru"; /* Privacy - Bluetooth Peripheral Usage Description */ -"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothPeripheralUsageDescription" = "Bluetooth sa používa pre komunikáciu s inzulínovou pumpou a zariadeniami na kontinuálne monitorovanie krvného cukru"; /* Privacy - Face ID Usage Description */ -"NSFaceIDUsageDescription" = "For authorized acces to bolus"; +"NSFaceIDUsageDescription" = "Pre autorizovaný prístup k bolusu"; /* Privacy - Calendars Usage Description */ -"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; +"NSCalendarsUsageDescription" = "Kalendár slúži na vytvorenie novej udalosti s glukózou."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthUpdateUsageDescription" = "Aplikácia Zdravie sa používa na meranie glukózy v krvi, inzulínu a ukladanie sacharidov"; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthShareUsageDescription" = "Aplikácia Zdravie sa používa na meranie glukózy v krvi, inzulínu a ukladanie sacharidov"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 5ff771b9ca..242fc22072 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Agree and Continue"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index d47555ef96..5a558acafa 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Godkend og fortsæt"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Udført"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 6a6e94155a..ab6e0b034f 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Zustimmen und fortfahren"; +/* Bolus progress view */ +"of" = "von"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Letzte Berechnung um"; @@ -336,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Lokalen BZ-Server verwenden"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Dies ermöglicht das Hochladen der statistics.json zu Nightscout, die vom Community Statistics and Demographics Project genutzt werden kann.\n\nDie Teilnahme an der Gemeinschaftsstatistik erfolgt auf freiwilliger Basis und erfordert eine gesonderte Registrierung unter:\n"; /* */ "Edit settings json" = "Einstellungen bearbeiten json"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Als Profil speichern"; -/* */ -"Return to Normal" = "Rückkehr zum Normalzustand"; +/* Alert */ +"Cancel Profile Override" = "Profilüberschreibung abbrechen?"; + +/* Alert */ +"Cancel Temp Target" = "Vorläufiges Ziel abbrechen?"; /* Alert */ "Return to Normal?" = "Rückkehr zum Normalzustand?"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 1bd4a5800a..ea77b9fa46 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Aceptar y continuar"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index f7e562b0ea..ca7494d171 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Agree and Continue"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 1a9540ab06..362f65b5ea 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Accepter et continuer"; +/* Bolus progress view */ +"of" = "de"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Activé à"; @@ -336,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Utiliser le serveur de glucose local"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Cela permet de télécharger le fichier statistics.json vers Nightscout, qui peut être utilisé par le projet de statistiques et de démographie communautaires.\n\nLa participation aux statistiques communautaires est facultative et nécessite une inscription séparée à l'adresse suivante:\n"; /* */ "Edit settings json" = "Modifier les paramètres json"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Enregistrer comme profil"; -/* */ -"Return to Normal" = "Revenir à la normale"; +/* Alert */ +"Cancel Profile Override" = "Annuler le réglage de l'annulation du profil ?"; + +/* Alert */ +"Cancel Temp Target" = "Annuler la cible temporaire ?"; /* Alert */ "Return to Normal?" = "Revenir à la normale?"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 5ff771b9ca..242fc22072 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Agree and Continue"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index f796edc04d..3e14686337 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Acconsenti e Continua"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Eseguito alle"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Salva Profilo"; -/* */ -"Return to Normal" = "Ritorna al Normale"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Ritorno al Normale?"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 07b76786bc..84df49e3a0 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Godta og fortsett"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Utført kl."; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Lagre som profil"; -/* */ -"Return to Normal" = "Gå tilbake til normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Gå tilbake til normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 9bfdf8a435..25195e3d2c 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Akkoord en doorgaan"; +/* Bolus progress view */ +"of" = "van"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Toegediend op"; @@ -336,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Lokale glucose server gebruiken"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Dit maakt het uploaden van statistics.json naar Nightscout mogelijk, wat gebruikt kan worden door het Community Statistics and Demographics Project.\n\nDeelname aan Community Statistics is opt-in en vereist aparte registratie op:\n"; /* */ "Edit settings json" = "Bewerk instellingen json"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Bewaar als profiel"; -/* */ -"Return to Normal" = "Terug naar normaal"; +/* Alert */ +"Cancel Profile Override" = "Profieloverschrijving annuleren?"; + +/* Alert */ +"Cancel Temp Target" = "Tijdelijk doel annuleren?"; /* Alert */ "Return to Normal?" = "Terug naar normaal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 053d7b2b69..d6c67bea35 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Zaakceptuj i kontynuuj"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1336,8 +1339,11 @@ Połączono z Nightscout!"; /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 1d6d80cb26..8a9633b471 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Concordar e Continuar"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index fc8bbe429f..bc83ec001a 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Concordar e Continuar"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 6380cd55d2..2f4f35b6ba 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Согласиться и Продолжить"; +/* Bolus progress view */ +"of" = "из"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Принято в"; @@ -336,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Использовать локальный сервер глюкозы"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Это позволяет загружать файл statistics.json в Nightscout, который может использоваться проектом статистики и сообщества.\n\nУчастие в статистике сообщества является добровольным и требует отдельной регистрации по адресу:\n"; /* */ "Edit settings json" = "Редактировать json настроек"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Сохранить как профиль"; -/* */ -"Return to Normal" = "Вернуться к нормальному"; +/* Alert */ +"Cancel Profile Override" = "Отменить переопределение профиля?"; + +/* Alert */ +"Cancel Temp Target" = "Отменить временную цель?"; /* Alert */ "Return to Normal?" = "Вернуться к нормальному?"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index b407b7bfcc..baa1da2f84 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -4,200 +4,203 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; +"Add insulin without actually bolusing" = "Pridávanie inzulínu bez skutočného podávania"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Add %@ without bolusing"; +"Add %@ without bolusing" = "Pridať %@ bez použitia bolusu"; -"Bolus" = "Bolus"; +"Bolus" = "Dávka"; -"Close" = "Close"; +"Close" = "Zatvoriť"; /* Continue after added carbs without bolus */ -"Continue without bolus" = "Continue without bolus"; +"Continue without bolus" = "Pokračovať bez dávky"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nDávka prekračuje vaše nastavenie Max Bolus!\nSte si istí, že chcete dávku pridať "; /* Header */ -"Enact Bolus" = "Enact Bolus"; +"Enact Bolus" = "Pridať dávku"; /* Button */ -"Enact bolus" = "Enact bolus"; +"Enact bolus" = "Pridať dávku"; /* */ -"Insulin recommended" = "Insulin recommended"; +"Insulin recommended" = "Odporúčaný inzulín"; /* */ -"Insulin required" = "Insulin required"; +"Insulin required" = "Požadovaný inzulín"; /* Bolus screen */ -"Recommendation" = "Recommendation"; +"Recommendation" = "Odporúčania"; /* Button */ -"Clear" = "Clear"; +"Clear" = "Vymazať"; /* Button */ -"Done" = "Done"; +"Done" = "Hotovo"; /* */ -"Wait please" = "Wait please"; +"Wait please" = "Čakajte prosím"; /* */ -"Agree and continue" = "Agree and Continue"; +"Agree and continue" = "Súhlasím a pokračovať"; + +/* Bolus progress view */ +"of" = "z"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Enacted at"; +"Enacted at" = "Uskutočnené o"; /* Headline in suggested pop up (at: at what time) */ -"Suggested at" = "Suggested at"; +"Suggested at" = "Navrhnuté o"; /* Headline in enacted pop up (at: at what time) */ -"Error at" = "Error at"; +"Error at" = "Chyba o"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Sumár jedla"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Upraviť jedlo"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Pridať jedlo"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Sumár dávky"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Výpočty"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Mastné jedlo"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Celková dávka"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Zlomok"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Faktor mastného jedla"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Výsledok"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Vaša zadaná hodnota bola obmedzená Vaším maximálnym nastavením dávky na %d%@"; /* Bolus View Continue Button */ "Continue" = "Pokračovať"; /* Home title */ -"Home" = "Home"; +"Home" = "Domov"; /* Looping in progress */ -"looping" = "looping"; +"looping" = "aktualizácia"; /* min ago since last loop */ -"min ago" = "min ago"; +"min ago" = "min. pred"; /* Status Title */ -"No suggestion" = "No suggestion"; +"No suggestion" = "Žiadne návrhy"; /* Replace pod text in Header */ -"Replace pod" = "Replace pod"; +"Replace pod" = "Vymeňte pod"; /* Add carbs screen */ -"Add Carbs" = "Add Carbs"; +"Add Carbs" = "Pridať sacharidy"; /* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ -"Add Carbs " = "Add Carbs "; +"Add Carbs " = "Pridať sacharidy "; /* */ -"Amount Carbs" = "Amount Carbs"; +"Amount Carbs" = "Množstvo sacharidov"; /* Grams unit */ -"grams" = "grams"; +"grams" = "gramov"; /* */ -"Carbs required" = "Carbs required"; +"Carbs required" = "Potrebné sacharidy"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Uložené jedlá"; /* */ -"Are you sure?" = "Are you sure?"; +"Are you sure?" = "Ste si istý?"; /* Bottom target temp */ -"Bottom target" = "Bottom target"; +"Bottom target" = "Spodný cieľ"; /* Cancel preset name */ -"Cancel" = "Cancel"; +"Cancel" = "Zrušiť"; /* */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Zrušiť dočasný cieľ"; /* Custom temp target */ -"Custom" = "Custom"; +"Custom" = "Vlastné"; /* */ -"Date" = "Date"; +"Date" = "Dátum"; /* */ -"Delete" = "Delete"; +"Delete" = "Odstrániť"; /* Delete preset temp target */ -"Delete preset \"%@\"" = "Delete preset \"%@\""; +"Delete preset \"%@\"" = "Odstrániť predvoľbu \\\"%@\\\""; /* Duration of target temp or temp basal */ -"Duration" = "Duration"; +"Duration" = "Trvanie"; /* */ -"Enact Temp Target" = "Enact Temp Target"; +"Enact Temp Target" = "Nastaviť dočasný cieľ"; /* */ -"Target" = "Target"; +"Target" = "Cieľ"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Pomer bazálneho inzulínu a citlivosti"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "Nižšie nastavenie \"Polovičný základný cieľ\" zníži bazálnu dávku a zvýši ISF skôr, pri nižšej cieľovej glykémii."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Vaše nastavenie: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosenzor max obmedzuje maximálny koncový bod"; /* */ -"Enter preset name" = "Enter preset name"; +"Enter preset name" = "Zadajte názov prednastavenia"; /* Preset name */ -"Name" = "Name"; +"Name" = "Názov"; /* minutes of target temp */ -"minutes" = "minutes"; +"minutes" = "minút"; /* */ -"Presets" = "Presets"; +"Presets" = "Predvoľby"; /* Save preset name */ -"Save" = "Save"; +"Save" = "Uložiť"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Uložiť ako predvoľbu"; /* Delete Meal Preset */ -"Delete Preset" = "Delete Preset"; +"Delete Preset" = "Odstrániť predvoľbu"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Delete preset '%@'?"; +"Delete preset '%@'?" = "Odstrániť predvoľbu '%@'?"; /* Button */ -"No" = "No"; +"No" = "Nie"; /* Button */ -"Yes" = "Yes"; +"Yes" = "Áno"; /* + Button */ "[ +1 ]" = "[ +1 ]"; @@ -206,10 +209,10 @@ "[ -1 ]" = "[ -1 ]"; /* Upper temp target limit */ -"Top target" = "Top target"; +"Top target" = "Vysoký cieľ"; /* Temp target set for ... minutes */ -"for" = "for"; +"for" = "počas"; /* Temp target set for ... minutes */ "min" = "min"; @@ -218,242 +221,245 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Basal profile"; +"Basal profile" = "Bazálny profil"; /* */ -"Carb ratio" = "Carb ratio"; +"Carb ratio" = "Sacharidový pomer"; /* */ -"Delete autotune data" = "Delete autotune data"; +"Delete autotune data" = "Odstrániť údaje autotune"; /* */ -"Run now" = "Run now"; +"Run now" = "Spustiť teraz"; /* */ -"Last run" = "Last run"; +"Last run" = "Naposledy spustené"; /* */ -"Sensitivity" = "Sensitivity"; +"Sensitivity" = "Citlivosť"; /* */ -"Use Autotune" = "Use Autotune"; +"Use Autotune" = "Použiť autotune"; /* Add profile basal */ -"Add" = "Add"; +"Add" = "Pridať"; /* */ -"Basal Profile" = "Basal Profile"; +"Basal Profile" = "Bazálny profil"; /* Rate basal profile */ -"Rate" = "Rate"; +"Rate" = "Hodnotenie"; /* */ -"Save on Pump" = "Save on Pump"; +"Save on Pump" = "Ušetrite na čerpadle"; /* */ -"Saving..." = "Saving..."; +"Saving..." = "Úspora..."; /* */ -"Schedule" = "Schedule"; +"Schedule" = "Plán"; /* */ -"starts at" = "starts at"; +"starts at" = "začína o"; /* Time basal profile */ -"Time" = "Time"; +"Time" = "Čas"; /* */ -"Calculated Ratio" = "Calculated Ratio"; +"Calculated Ratio" = "Vypočítaný pomer"; /* Carb Ratios header */ -"Carb Ratios" = "Carb Ratios"; +"Carb Ratios" = "Sacharidový pomer"; /* */ -"Ratio" = "Ratio"; +"Ratio" = "Pomer"; /* */ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Vypočítaná citlivosť"; /* */ -"Insulin Sensitivities" = "Insulin Sensitivities"; +"Insulin Sensitivities" = "Inzulínová citlivosť"; /* */ -"Sensitivity Ratio" = "Sensitivity Ratio"; +"Sensitivity Ratio" = "Pomer citlivosti"; /* */ -"Dismiss" = "Dismiss"; +"Dismiss" = "Zamietnuť"; /* */ -"Important message" = "Important message"; +"Important message" = "Dôležitá správa"; /* */ -"Amount" = "Amount"; +"Amount" = "Množstvo"; /* */ -"Cancel Temp Basal" = "Cancel Temp Basal"; +"Cancel Temp Basal" = "Zrušiť dočasný bazál"; /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Vykonať"; /* */ -"Manual Temp Basal" = "Manual Temp Basal"; +"Manual Temp Basal" = "Manuálny dočasný bazál"; /* Allow uploads to different services */ -"Allow uploads" = "Allow uploads"; +"Allow uploads" = "Povoliť nahrávanie"; /* API secret in NS */ -"API secret" = "API secret"; +"API secret" = "API kľúč"; /* Connect to NS */ -"Connect" = "Connect"; +"Connect" = "Pripojiť"; /* Connected to NS */ -"Connected!" = "Connected!"; +"Connected!" = "Pripojené!"; /* Connecting to NS */ -"Connecting..." = "Connecting..."; +"Connecting..." = "Pripája sa..."; /* */ -"Invalid URL" = "Invalid URL"; +"Invalid URL" = "Neplatná URL adresa"; /* */ -"Local glucose source" = "Local glucose source"; +"Local glucose source" = "Lokálny zdroj glukózy"; /* Header */ -"Nightscout Config" = "Nightscout Config"; +"Nightscout Config" = "Nastavenie Nightscout"; /* */ "Port" = "Port"; /* */ -"URL" = "URL"; +"URL" = "Adresa URL"; /**/ -"Use local glucose server" = "Use local glucose server"; +"Use local glucose server" = "Použiť lokálny server glukózy"; + +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "To umožňuje nahrávanie súboru statistics.json do aplikácie Nightscout, ktorý môže byť použitý v projekte štatistiky a demografie Spoločenstva.\n\nÚčasť na štatistikách Spoločenstva je dobrovoľná a vyžaduje si samostatnú registráciu na adrese:\n"; /* Enable Statistics */ "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; /* */ -"Edit settings json" = "Edit settings json"; +"Edit settings json" = "Upraviť settings json"; /* */ -"Glucose units" = "Glucose units"; +"Glucose units" = "Jednotky glukózy"; /* */ -"Preferences" = "Preferences"; +"Preferences" = "Predvoľby"; /* Recommended Insulin Fraction in preferences */ -"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; +"Recommended Insulin Fraction" = "Odporúčaný podiel inzulínu"; /* Do you want to show bolus screen after added carbs? */ -"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; +"Skip Bolus screen after carbs" = "Preskočiť pridanie dávky po sacharidoch"; /* Allow remote control from NS */ -"Remote control" = "Remote control"; +"Remote control" = "Vzdialené ovládanie"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\\Teraz dôkladne skontrolujte všetky nové nastavenia:\n\n* Bazálne nastavenia\n * Pomery uhľohydrátov\n * Cieľové hodnoty glukózy\n * Citlivosť na inzulín\n * DIA\n\n v iAPS Nastavenia > Konfigurácia.\n\nZlé alebo neplatné nastavenia profilu by mohli mať škodlivé účinky."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Tým sa nahradia niektoré alebo všetky aktuálne nastavenia čerpadla. Ste si istí, že chcete importovať nastavenia profilu z programu Nightscout?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nNeplatné základné nastavenia Nightcsout. \n\nImport bol prerušený. Skontrolujte základné nastavenia svojho profilu Nightscout!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nNastavenia boli importované, ale základné údaje nebolo možné uložiť do čerpadla (žiadne čerpadlo). Skontrolujte bazálne nastavenia a klepnutím na ´Uložiť na pumpe´ synchronizujte nové bazálne nastavenia"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Chyba importu"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Áno, importovať"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Importovať nastavenia z Nightscoutu"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Importovať nastavenia?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importovať z Nightscoutu"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Nastavenia naimportované"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nNekompatibilné jednotky glukózy v Nightscoute a nastaveniach pumpy. Import nastavení bol zrušený."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Nemôžem nájsť predvolený Nightscout profil."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Test krvi na glukózu"; /* Add Medtronic pump */ -"Add Medtronic" = "Add Medtronic"; +"Add Medtronic" = "Pridať Medtronic"; /* Add Omnipod pump */ -"Add Omnipod" = "Add Omnipod"; +"Add Omnipod" = "Pridať Omnipod"; /* Add Simulator pump */ -"Add Simulator" = "Add Simulator"; +"Add Simulator" = "Pridať simulátor"; /* Insulin model */ "Model" = "Model"; /* */ -"Pump config" = "Pump config"; +"Pump config" = "Nastavenia pumpy"; /* */ -"Delivery limits" = "Delivery limits"; +"Delivery limits" = "Obmedzenia dávkovania"; /* */ -"Duration of Insulin Action" = "Duration of Insulin Action"; +"Duration of Insulin Action" = "Trvanie účinku inzulínu"; /* hours of duration of insulin activity */ -"hours" = "hours"; +"hours" = "hodiny"; /* Max setting */ -"Max Basal" = "Max Basal"; +"Max Basal" = "Maximálna bazálna"; /* Max setting */ -"Max Bolus" = "Max Bolus"; +"Max Bolus" = "Maximálna dávka bolusu"; /* Max setting */ -"Max Carbs" = "Max Carbs"; +"Max Carbs" = "Maximum sacharidov"; /* */ -"Pump Settings" = "Pump Settings"; +"Pump Settings" = "Nastavenia pumpy"; /* Insulin unit per hour */ -"U/hr" = "U/hr"; +"U/hr" = "J/hod"; /* Unit in number of units delivered (keep the space character!) */ -" U" = " U"; +" U" = " J"; /* /Insulin unit */ -"/U" = "/U"; +"/U" = "/J"; /* Insulin unit */ -"U" = "U"; +"U" = "J"; /* Unit per hour with space */ -" U/hr" = " U/hr"; +" U/hr" = " J/hod"; /* Number of units per hour*/ -"%@ U/hr" = "%@ U/hr"; +"%@ U/hr" = "%@ J/hod"; /* Number of units insulin delivered */ -"%@ U" = "%@ U"; +"%@ U" = "%@ J"; /*Carb ratio unit */ -"g/U" = "g/U"; +"g/U" = "g/J"; /* grams */ " g" = " g"; @@ -462,7 +468,7 @@ Enact a temp Basal or a temp target */ "g" = "g"; /* when 0 U/hr */ -"0 U/hr" = "0 U/hr"; +"0 U/hr" = "0 J/hod"; /* abbreviation for days */ "d" = "d"; @@ -474,169 +480,169 @@ Enact a temp Basal or a temp target */ "m" = "m"; /* */ -"Closed loop" = "Closed loop"; +"Closed loop" = "Uzavretý okruh"; /* */ -"Configuration" = "Configuration"; +"Configuration" = "Nastavenie"; /* */ -"Devices" = "Devices"; +"Devices" = "Zariadenia"; /* */ -"Pump" = "Pump"; +"Pump" = "Pumpa"; /* */ -"Watch" = "Watch"; +"Watch" = "Hodinky"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Nastavenie hodiniek"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Zobraziť na hodinkách"; /* */ "Garmin Watch" = "Garmin Watch"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Pridať zariadenie"; /* */ -"Glucose Target" = "Glucose Target"; +"Glucose Target" = "Cieľ glukózy"; /* */ -"Heart Rate" = "Heart Rate"; +"Heart Rate" = "Srdcový tep"; /* */ -"Steps" = "Steps"; +"Steps" = "Kroky"; /* */ -"ISF" = "ISF"; +"ISF" = "Citlivosť"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "Aplikácia Garmin Connect musí byť nainštalovaná pre použitie s iAPS.\n Pre stiahnutie choďte do App Store"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin je nedostupný"; /* */ -"Services" = "Services"; +"Services" = "Služby"; /* */ -"Settings" = "Settings"; +"Settings" = "Nastavenia"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Odporúčaný podiel dávky"; /* 2 log files to share */ -"Share logs" = "Share logs"; +"Share logs" = "Zdieľať záznamy"; /* Upper target */ -"High target" = "High target"; +"High target" = "Vysoký cieľ"; /* Lower target */ -"Low target" = "Low target"; +"Low target" = "Nízky cieľ"; /* When bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Dávkovanie"; /* */ -"Pump suspended" = "Pump suspended"; +"Pump suspended" = "Pumpa pozastavená"; /* */ "Middleware" = "Middleware"; /* Header */ -"History" = "History"; +"History" = "História"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Nahrať"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Povoliť nahrávanie"; /* Type of CGM or glucose source */ -"Type" = "Type"; +"Type" = "Typ"; /* CGM */ "CGM" = "CGM"; /* CGM Transmitter ID */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "ID vysielača"; /* Other CGM setting */ -"Other" = "Other"; +"Other" = "Iné"; /* Whatch app alert */ -"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; +"Set temp targets presets on iPhone first" = "Najprv nastavte dočasný cieľ na iPhone"; /* Updating Watch app */ -"Updating..." = "Updating..."; +"Updating..." = "Aktualizuje sa..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp Targets"; +"Temp Targets" = "Dočasné ciele"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Odstrániť sacharidy?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Odstrániť inzulín?"; /* Treatments list */ -"Treatments" = "Treatments"; +"Treatments" = "Ošetrenia"; /* " min" in Treatments list */ " min" = " min"; /* */ -"Unable to change anything" = "Unable to change anything"; +"Unable to change anything" = "Nemožnosť čokoľvek zmeniť"; /* Calendar and Libre transmitter settings --------------- */ /* */ -"Configure Libre Transmitter" = "Configure Libre Transmitter"; +"Configure Libre Transmitter" = "Nastaviť vysielač Libre"; /* */ -"Calibrations" = "Calibrations"; +"Calibrations" = "Kalibrácie"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Vytvoriť udalosť v kalendári"; /* */ -"Calendar" = "Calendar"; +"Calendar" = "Kalendár"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatický"; /* External insulin treatments */ -"External" = "External"; +"External" = "Externý"; /* */ -"Other" = "Other"; +"Other" = "Iné"; /* */ -"Libre Transmitter" = "Libre Transmitter"; +"Libre Transmitter" = "Libre vysielač"; /* */ -"Libre Transmitters" = "Libre Transmitters"; +"Libre Transmitters" = "Libre vysielače"; /* */ -"Bluetooth Transmitters" = "Bluetooth Transmitters"; +"Bluetooth Transmitters" = "Vysielače Bluetooth"; /* */ -"Modes" = "Modes"; +"Modes" = "Režimy"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; /* */ -"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; +"Select the third party transmitter you want to connect to" = "Vyberte vysielač tretej strany, ku ktorému sa chcete pripojiť"; /* State was restored */ -"State was restored" = "State was restored"; +"State was restored" = "Štát bol obnovený"; /* The short unit display string for millimoles of glucose per liter */ "mmol/L" = "mmol/L"; @@ -645,1060 +651,1063 @@ Enact a temp Basal or a temp target */ "mg/dL" = "mg/dL"; /* */ -"Add calibration" = "Add calibration"; +"Add calibration" = "Pridať kalibráciu"; /* When adding capillary glucose meater reading */ -"Meter glucose" = "Meter glucose"; +"Meter glucose" = "Meranie glukózy"; /* */ -"Info" = "Info"; +"Info" = "Informácie"; /*v*/ -"Slope" = "Slope"; +"Slope" = "Svah"; /* */ -"Intercept" = "Intercept"; +"Intercept" = "Zachytenie"; /* */ -"Chart" = "Chart"; +"Chart" = "Grafy"; /* */ -"Remove" = "Remove"; +"Remove" = "Odstrániť"; /* */ -"Remove Last" = "Remove Last"; +"Remove Last" = "Odstrániť posledný"; /* */ -"Remove All" = "Remove All"; +"Remove All" = "Odstrániť všetko"; /* */ -"About the Process" = "About the Process"; +"About the Process" = "O procese"; /* */ -"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; +"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Uistite sa, že váš senzor Libre 2 je už aktivovaný a zahriaty. Ak máte iné aplikácie pripojené k senzoru cez bluetooth, tieto musia byť vypnuté alebo odinštalované.\n\nMôžete mať iba jednu aplikáciu komunikujúcu so senzorom cez bluetooth. Potom stlačte tlačidlo „spárovanie a pripojenie“ nižšie, aby ste začali proces. Upozorňujeme, že pripojenie cez bluetooth môže trvať až niekoľko minút, kým začne fungovať."; /* */ -"Pairinginfo" = "Pairinginfo"; +"Pairinginfo" = "Informácie o párovaní"; /* */ -"PatchInfo" = "PatchInfo"; +"PatchInfo" = "Informácie o záplatách"; /* */ -"Calibrationinfo" = "Calibrationinfo"; +"Calibrationinfo" = "Informácie o kalibrácii"; /* */ -"Unknown" = "Unknown"; +"Unknown" = "Neznáme"; /* */ -"Not paired yet" = "Not paired yet"; +"Not paired yet" = "Zatiaľ nespárované"; /* */ -"Pair Sensor & connect" = "Pair Sensor & connect"; +"Pair Sensor & connect" = "Párovanie snímača a pripojenie"; /* */ -"Phone NFC required!" = "Phone NFC required!"; +"Phone NFC required!" = "Vyžaduje sa telefón NFC!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Váš telefón alebo aplikácia nemá povolenú komunikáciu NFC, ktorá je potrebná na spárovanie so snímačmi libre2"; /* Bluetooth Power Off */ -"Bluetooth Power Off" = "Bluetooth Power Off"; +"Bluetooth Power Off" = "Bluetooth je vypnutý"; /* Please turn on Bluetooth */ -"Please turn on Bluetooth" = "Please turn on Bluetooth"; +"Please turn on Bluetooth" = "Zapnite Bluetooth"; /* No Libre Transmitter Selected */ -"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; +"No Libre Transmitter Selected" = "Nie je vybraný žiadny vysielač Libre"; /* Delete Transmitter and start anew. */ -"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; +"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Odstráňte CGMManager a začnite odznova. Vaše poverenia pre libreoopweb zostanú zachované"; /* Invalid libre checksum */ -"Invalid libre checksum" = "Invalid libre checksum"; +"Invalid libre checksum" = "Neplatný kontrolný súčet súboru"; /* Libre sensor was incorrectly read, CRCs were not valid */ -"Libre sensor was incorrectly read, CRCs were not valid" = "Libre sensor was incorrectly read, CRCs were not valid"; +"Libre sensor was incorrectly read, CRCs were not valid" = "Senzor Libre bol nesprávne načítaný, CRC neboli platné"; /* Glucose */ -"Glucose" = "Glucose"; +"Glucose" = "Glykémia"; /* LOWALERT! */ -"LOWALERT!" = "LOWALERT!"; +"LOWALERT!" = "NÍZKE UPOZORNENIE!"; /* HIGHALERT! */ -"HIGHALERT!" = "HIGHALERT!"; +"HIGHALERT!" = "VYSOKÉ UPOZORNENIE!"; /* (Snoozed)*/ -"(Snoozed)" = "(Snoozed)"; +"(Snoozed)" = "(Zdriemol)"; /* Glucose: %@ */ -"Glucose: %@" = "Glucose: %@"; +"Glucose: %@" = "Glukóza: %@"; /* Transmitter: %@%% */ -"Transmitter: %@%%" = "Transmitter: %@%%"; +"Transmitter: %@%%" = "Vysielač: %@%%"; /* No Sensor Detected */ -"No Sensor Detected" = "No Sensor Detected"; +"No Sensor Detected" = "Nie je detegovaný žiadny senzor"; /* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ -"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "Môže ísť o občasný problém, ale skontrolujte, či je vysielač pevne upevnený na snímači"; /* New Sensor Detected */ -"New Sensor Detected" = "New Sensor Detected"; +"New Sensor Detected" = "Nový senzor detegovaný"; /* Please wait up to 30 minutes before glucose readings are available! */ -"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; +"Please wait up to 30 minutes before glucose readings are available!" = "Počkajte, prosím, až 30 minút, kým budú k dispozícii údaje o glukóze!"; /* Invalid Glucose sample detected, try again later */ -"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; +"Invalid Glucose sample detected, try again later" = "Detegovaná neplatný vzorka glukózy, skúste znova neskôr"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Senzor sa mohol dočasne zastaviť, spadnúť, alebo je príliš studený alebo príliš teplý"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Invalid Sensor Detected"; +"Invalid Sensor Detected" = "Detegovaný neplatný senzor"; /* Detected sensor seems not to be a libre 1 sensor! */ -"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; +"Detected sensor seems not to be a libre 1 sensor!" = "Detegovaný senzor nie je libre 1!"; /* Detected sensor is invalid: %@ */ -"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; +"Detected sensor is invalid: %@" = "Detegovaný senzor nie je platný: %@"; /* Low Battery */ -"Low battery" = "Low battery"; +"Low battery" = "Slabá batéria"; /* */ -"Invalid sensor" = "Invalid sensor"; +"Invalid sensor" = "Neplatný senzor"; /* */ -"Sensor change" = "Sensor change"; +"Sensor change" = "Výmena snímača"; /* */ -"Sensor expires soon" = "Sensor expires soon"; +"Sensor expires soon" = "Senzor čoskoro exspiruje"; /* Battery is running low %@, consider charging your %@ device as soon as possible */ -"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Batéria sa vybíja %@, zvážte čo najskoršie nabitie zariadenia %@"; /* Extracting calibrationdata from sensor */ -"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; +"Extracting calibrationdata from sensor" = "Získanie kalibračných údajov zo snímača"; /* Sensor Ending Soon */ -"Sensor Ending Soon" = "Sensor Ending Soon"; +"Sensor Ending Soon" = "Senzor čoskoro skončí"; /* Current Sensor is Ending soon! Sensor Life left in %@ */ -"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; +"Current Sensor is Ending soon! Sensor Life left in %@" = "Aktuálny senzor čoskoro skončí! Do konca životnosti senzora zostáva %@"; /* */ "Libre Bluetooth" = "Libre Bluetooth"; /* */ -"Snooze Alerts" = "Snooze Alerts"; +"Snooze Alerts" = "Odložiť výstrahy"; /* */ -"Last measurement" = "Last measurement"; +"Last measurement" = "Posledné meranie"; /* */ -"Sensor Footer checksum" = "Sensor Footer checksum"; +"Sensor Footer checksum" = "Kontrolný súčet päty snímača"; /* */ -"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; +"Last Blood Sugar prediction" = "Najnovšia predikcia glukózy"; /* */ -"CurrentBG" = "CurrentBG"; +"CurrentBG" = "AktuálneBG"; /* */ -"Sensor Info" = "Sensor Info"; +"Sensor Info" = "Informácie o senzore"; /* */ -"Sensor Age" = "Sensor Age"; +"Sensor Age" = "Vek senzora"; /* */ -"Sensor Age Left" = "Sensor Age Left"; +"Sensor Age Left" = "Zostávajúci vek senzora"; /* */ -"Sensor Endtime" = "Sensor Endtime"; +"Sensor Endtime" = "Konce senzora"; /* */ -"Sensor State" = "Sensor State"; +"Sensor State" = "Stav senzora"; /* */ -"Sensor Serial" = "Sensor Serial"; +"Sensor Serial" = "Serióve číslo senzora"; /* */ -"Transmitter Info" = "Transmitter Info"; +"Transmitter Info" = "Informácie o vysielači"; /* */ -"Hardware" = "Hardware"; +"Hardware" = "Hardvér"; /* */ -"Firmware" = "Firmware"; +"Firmware" = "Firmvér"; /* */ "Connection State" = "Stav pripojenia"; /* */ -"Transmitter Type" = "Transmitter Type"; +"Transmitter Type" = "Typ vysielača"; /* */ -"Sensor Type" = "Sensor Type"; +"Sensor Type" = "Typ senzoru"; /* */ -"Factory Calibration Parameters" = "Factory Calibration Parameters"; +"Factory Calibration Parameters" = "Továrenské kalibračné parametre"; /* */ -"Valid for footer" = "Valid for footer"; +"Valid for footer" = "Platí pre pätičku"; /* */ -"Edit calibrations" = "Edit calibrations"; +"Edit calibrations" = "Upraviť kalibrácie"; /* */ -"edit calibration clicked" = "edit calibration clicked"; +"edit calibration clicked" = "upraviť kalibráciu kliknutím"; /* */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Odstrániť senzor"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; +"Are you sure you want to remove this cgm from loop?" = "Ste si istí, že chcete tento CGM odstrániť zo slučky?"; /* */ -"There is no undo" = "There is no undo"; +"There is no undo" = "Nič sa nedá vrátiť späť"; /* */ -"Advanced" = "Advanced"; +"Advanced" = "Pokročilé"; /* */ "Alarms" = "Alarmy"; /* */ -"Glucose Settings" = "Glucose Settings"; +"Glucose Settings" = "Nastavenia glukózy"; /* */ -"Notifications" = "Notifications"; +"Notifications" = "Oznámenia"; /* */ -"Export logs" = "Export logs"; +"Export logs" = "Exportovať záznamy"; /* */ -"Export not available" = "Export not available"; +"Export not available" = "Exportovanie nedostupné"; /* */ -"Log export requires ios 15" = "Log export requires ios 15"; +"Log export requires ios 15" = "Exportovanie záznamov vyžaduje ios 15"; /* */ -"Got it!" = "Got it!"; +"Got it!" = "Mám!"; /* */ -"Saved to %@" = "Saved to %@"; +"Saved to %@" = "Uložené do %@"; /* */ -"No logs available" = "No logs available"; +"No logs available" = "Nie sú k dispozícii žiadne protokoly"; /* */ -"Glucose Notification visibility" = "Glucose Notification visibility"; +"Glucose Notification visibility" = "Viditeľnosť oznámenia o glukóze"; /* */ -"Always Notify Glucose" = "Always Notify Glucose"; +"Always Notify Glucose" = "Vždy informujte o glukóze"; /* */ -"Notify per reading" = "Notify per reading"; +"Notify per reading" = "Oznámenie na čítanie"; /* */ -"Value" = "Value"; +"Value" = "Hodnota"; /* */ -"Adds Phone Battery" = "Adds Phone Battery"; +"Adds Phone Battery" = "Pridáva batériu telefónu"; /* */ -"Adds Transmitter Battery" = "Adds Transmitter Battery"; +"Adds Transmitter Battery" = "Pridáva batériu vysielača"; /* */ -"Also vibrate" = "Also vibrate"; +"Also vibrate" = "Tiež vibrovať"; /* */ -"Additional notification types" = "Additional notification types"; +"Additional notification types" = "Ďalšie typy oznámení"; /* */ -"Misc" = "Misc"; +"Misc" = "Rôzne"; /* */ -"Unit override" = "Unit override"; +"Unit override" = "Prepis jednotky"; /* */ -"Low" = "Low"; +"Low" = "Nízka"; /* */ -"High" = "High"; +"High" = "Vysoká"; /* */ -"glucose" = "glucose"; +"glucose" = "glukóza"; /* */ -"Schedule " = "Schedule "; +"Schedule " = "Plán "; /* */ -"tapped save schedules" = "tapped save schedules"; +"tapped save schedules" = "časové plány ukladania"; /* */ -"Error" = "Error"; +"Error" = "Chyba"; /* */ -"Some ui element was incorrectly specified" = "Some ui element was incorrectly specified"; +"Some ui element was incorrectly specified" = "Niektorý prvok 'ui' bol zadaný nesprávne"; /* */ -"Success" = "Success"; +"Success" = "Úspech"; /* */ -"Schedules were saved successfully!" = "Schedules were saved successfully!"; +"Schedules were saved successfully!" = "Zmeny boli úspešne uložené!"; /* */ -"High Glucose Alarm active" = "High Glucose Alarm active"; +"High Glucose Alarm active" = "Alarm vysokej hladiny glukózy je aktívny"; /* */ -"Low Glucose Alarm active" = "Low Glucose Alarm active"; +"Low Glucose Alarm active" = "Alarm nízkej hladiny glukózy je aktívny"; /* */ -"No Glucose Alarm active" = "No Glucose Alarm active"; +"No Glucose Alarm active" = "Nie je aktívny žiadny glukózový alarm"; /* */ -"snoozing until %@" = "snoozing until %@"; +"snoozing until %@" = "driemanie do %@"; /* */ -"not snoozing" = "not snoozing"; +"not snoozing" = "nedriemať"; /* */ -"nothing to see here" = "nothing to see here"; +"nothing to see here" = "nie je tu nič k zobrazeniu"; /* */ -"snooze from testview clicked" = "snooze from testview clicked"; +"snooze from testview clicked" = "kliknutie na tlačidlo snooze z testovacieho zobrazenia"; /* */ -"will snooze for %@ until %@" = "will snooze for %@ until %@"; +"will snooze for %@ until %@" = "odloží na %@ až do %@"; /* */ -"Click to Snooze Alerts" = "Click to Snooze Alerts"; +"Click to Snooze Alerts" = "Kliknutím odložíte upozornenia"; /* */ -"Strength" = "Strength"; +"Strength" = "Sila"; /* */ -"Hold the top of your iPhone near the sensor to pair" = "Hold the top of your iPhone near the sensor to pair"; +"Hold the top of your iPhone near the sensor to pair" = "Podržte hornú časť iPhonu v blízkosti snímača, aby ste ho spárovali"; /* */ -"Sensor not found" = "Sensor not found"; +"Sensor not found" = "Senzor nenájdený"; /* */ -"Also play alert sound" = "Also play alert sound"; +"Also play alert sound" = "Prehrajte aj zvuk upozornenia"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Nastavenia oznámení"; /* */ -"Found devices: %d" = "Found devices: %d"; +"Found devices: %d" = "Nájdené zariadenia: %d"; /* */ -"Backfill options" = "Backfill options"; +"Backfill options" = "Možnosti zasypania"; /* */ -"Backfilling from trend is currently not well supported by Loop" = "Backfilling from trend is currently not well supported by Loop"; +"Backfilling from trend is currently not well supported by Loop" = "Spätné zasypávanie z trendu nie je v súčasnosti dostatočne podporované službou Loop"; /* */ -"Backfill from history" = "Backfill from history"; +"Backfill from history" = "Výplň z histórie"; /* */ -"Backfill from trend" = "Backfill from trend"; +"Backfill from trend" = "Zásyp z trendu"; /* */ -"Debug options" = "Debug options"; +"Debug options" = "Možnosti ladenia"; /* */ -"Adds a lot of data to the Issue Report " = "Adds a lot of data to the Issue Report "; +"Adds a lot of data to the Issue Report " = "Pridáva množstvo údajov do správy o probléme "; /* */ -"Persist sensordata" = "Persist sensordata"; +"Persist sensordata" = "Trvalé sensordata"; /* */ -"Battery" = "Battery"; +"Battery" = "Batéria"; /* */ -"Also add source info" = "Also add source info"; +"Also add source info" = "Pridajte aj informácie o zdroji"; /* */ -"Carbs Required Threshold" = "Carbs Required Threshold"; +"Carbs Required Threshold" = "Požadovaná prahová hodnota pre uhľohydráty"; /* */ -"Carbs required: %d g" = "Carbs required: %d g"; +"Carbs required: %d g" = "Potrebné sacharidy: %d g"; /* */ -"To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; +"To prevent LOW required %d g of carbs" = "Na zabránenie NÍZKY potrebných %d g sacharidov"; /* */ -"iAPS not active" = "iAPS not active"; +"iAPS not active" = "iAPS nie je aktívny"; /* */ -"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; +"Last loop was more than %d min ago" = "Posledná slučka bola pred viac ako %d min"; /* Glucose badge */ -"Show glucose on the app badge" = "Show glucose on the app badge"; +"Show glucose on the app badge" = "Zobrazenie glukózy na odznaku aplikácie"; /* */ -"Backfill glucose" = "Backfill glucose"; +"Backfill glucose" = "Zásyp glukózou"; /* About this source */ -"About this source" = "About this source"; +"About this source" = "Informácie o tomto zdroji"; /* */ -"Bolus failed" = "Bolus failed"; +"Bolus failed" = "Chyba pri aplikácii bolusu"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Maximálny bolus prekročený!"; /* */ -"Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; +"Bolus failed or inaccurate. Check pump history before repeating." = "Bolus zlyhal alebo bol nepresný. Pred opakovaním skontrolujte históriu čerpadla."; /* */ -"Carbs" = "Carbs"; +"Carbs" = "Sacharidy"; /* Food Type / Meal Note */ -"Note" = "Note"; +"Note" = "Poznámka"; /* */ -"Temp Basal" = "Temp Basal"; +"Temp Basal" = "Dočasný bazál"; /* */ -"Temp Target" = "Temp Target"; +"Temp Target" = "Dočasný cieľ"; /* */ -"Resume" = "Resume"; +"Resume" = "Pokračovať"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Pozastavenie"; /* */ -"Animated Background" = "Animated Background"; +"Animated Background" = "Animované pozadie"; /* Sensor day(s) */ -" day(s)" = " day(s)"; +" day(s)" = " deň(y)"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Display HR on Watch"; +"Display HR on Watch" = "Zobraziť na hodinkách"; /* Headers for settings ----------------------- */ -"OpenAPS main settings" = "OpenAPS main settings"; +"OpenAPS main settings" = "Hlavné nastavenia OpenAPS"; -"OpenAPS SMB settings" = "OpenAPS SMB settings"; +"OpenAPS SMB settings" = "Hlavné nastavenia OpenAPS"; -"OpenAPS targets settings" = "OpenAPS targets settings"; +"OpenAPS targets settings" = "Hlavné nastavenia OpenAPS"; -"OpenAPS other settings" = "OpenAPS other settings"; +"OpenAPS other settings" = "Hlavné nastavenia OpenAPS"; /* Glucose Simulator CGM */ -"Glucose Simulator" = "Glucose Simulator"; +"Glucose Simulator" = "Simulátor glukózy"; /* Restored state message */ -"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@"; +"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Stav Bluetooth obnovený (APS reštartovaný?). Nájdené %d periférnych zariadení a pripojené k %@ s identifikátorom %@"; /* Shared app group xDrip4iOS */ -"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; +"Using shared app group with external CGM app xDrip4iOS" = "Používanie zdieľanej skupiny aplikácií s externou aplikáciou CGM xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Používanie zdieľanej skupiny aplikácií s externou aplikáciou CGM GlucoseDirect"; /* Dexcom G6 app */ -"Dexcom G6 app" = "Dexcom G6 app"; +"Dexcom G6 app" = "Aplikácia Dexcom G6"; /* Native G5 app */ -"Native G5 app" = "Native G5 app"; +"Native G5 app" = "Natívna aplikácia pre G5"; /* Minilink transmitter */ -"Minilink transmitter" = "Minilink transmitter"; +"Minilink transmitter" = "Vysielač Minilink"; /* Simple simulator */ -"Simple simulator" = "Simple simulator"; +"Simple simulator" = "Jednoduchý simulátor"; /* Direct connection with Libre 1 transmitters or Libre 2 */ -"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Priame prepojenie s vysielačmi Libre 1 alebo európskymi snímačmi Libre 2"; /* Online or internal server */ -"Online or internal server" = "Online or internal server"; +"Online or internal server" = "Online alebo interný server"; /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Developer"; +"Developer" = "Vývojár"; /* Debug option view NS Upload Profile */ -"NS Upload Profile" = "NS Upload Profile"; +"NS Upload Profile" = "Nahrať profil NS"; /* Debug option view NS Uploaded Profile */ -"NS Uploaded Profile" = "NS Uploaded Profile"; +"NS Uploaded Profile" = "NS Nahraný profil"; /* Debug option view Autosense */ "Autosense" = "Autosense"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Dynamická senzitivita"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Iba Autotune bazálneho inzulínu"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Uložiť ako normálne bazálne sadzby"; /* */ -"Save on Pump" = "Save on Pump"; +"Save on Pump" = "Ušetrite na čerpadle"; /* Debug option view Pump History */ -"Pump History" = "Pump History"; +"Pump History" = "História pumpy"; /* Debug option view Target Ranges */ -"Target ranges" = "Target ranges"; +"Target ranges" = "Cieľový rozsah"; /* Debug option view Temp targets */ -"Temp targets" = "Temp targets"; +"Temp targets" = "Dočasné ciele"; /* Debug option view Meal */ -"Meal" = "Meal"; +"Meal" = "Jedlo"; /* Debug option view Pump profile */ -"Pump profile" = "Pump profile"; +"Pump profile" = "Profil pumpy"; /* Debug option view Profile */ -"Profile" = "Profile"; +"Profile" = "Profil"; /* Debug option view Enacted */ -"Enacted" = "Enacted"; +"Enacted" = "Prijaté"; /* Debug option view Announcements (from NS) */ -"Announcements" = "Announcements"; +"Announcements" = "Oznámenia"; /* Debug option view Enacted announcements announcements (from NS) */ -"Enacted announcements" = "Enacted announcements"; +"Enacted announcements" = "Prijaté oznámenia"; /* Debug option view Autotune */ "Autotune" = "Autotune"; /* Debug option view Target presets */ -"Target presets" = "Target presets"; +"Target presets" = "Cieľové predvoľby"; /* Debug option view */ -"Loop Cycles" = "Loop Cycles"; +"Loop Cycles" = "Cykly slučky"; /* Debug option view Glucose Data used for statistics */ -"Glucose Data used for statistics" = "Glucose Data used for statistics"; +"Glucose Data used for statistics" = "Údaje o glukóze použité na štatistiku"; /* --------------- HealthKit intergration --------------------*/ /* */ "Apple Health" = "Apple Health"; /* */ -"Connect to Apple Health" = "Connect to Apple Health"; +"Connect to Apple Health" = "Pripojte Apple Health"; /* Show when have not permissions for writing to Health */ -"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Ak chcete zapisovať údaje do aplikácie Apple Health, musíte udeliť oprávnenia v ponuke Nastavenia > Zdravie > Prístup k údajom"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "To umožňuje iAPS čítať z Apple Heath a zapisovať do neho. Oprávnenia musíte udeliť aj v ponuke Nastavenia > Zdravie > Prístup k údajom. Ak do aplikácie Apple Health zadáte hodnotu glukózy, otvorte iAPS a potvrďte, že sa zobrazí."; /* New ALerts ------------------------- */ /* Info title */ -"Info" = "Info"; +"Info" = "Informácie"; /* Warning title */ -"Warning" = "Warning"; +"Warning" = "Upozornenie"; /* Error title */ -"Error" = "Error"; +"Error" = "Chyba"; /* Manual temp basal mode */ -"Manual" = "Manual"; +"Manual" = "Manuálny"; /* An Automatic delivered bolus (SMB) */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Externý inzulín"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Manuálny bazál"; /* Current Manual Temp basal */ -" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; +" - Manual Basal ⚠️" = " - Manuálny bazál ⚠️"; /* Total AT / Scheduled basal insulin */ -" U/day" = " U/day"; +" U/day" = " J/deň"; /* Total AT / Scheduled basal insulin */ -"Total" = "Total"; +"Total" = "Celkom"; /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ /* Enable FPU */ -"Enable" = "Enable"; +"Enable" = "Povoliť"; /* Header */ -"Conversion settings" = "Conversion settings"; +"Conversion settings" = "Nastavenia konverzie"; /* Delay */ -"Delay In Minutes" = "Delay In Minutes"; +"Delay In Minutes" = "Oneskorenie v minútach"; /* Duration */ -"Maximum Duration In Hours" = "Maximum Duration In Hours"; +"Maximum Duration In Hours" = "Maximálne trvanie v hodinách"; /* Interval */ -"Interval In Minutes" = "Interval In Minutes"; +"Interval In Minutes" = "Interval v minútach"; /* Override */ -"Override With A Factor Of " = "Override With A Factor Of "; +"Override With A Factor Of " = "Prepísanie s faktorom "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Umožňuje prepočítavať tuky a bielkoviny na budúce ekvivalenty sacharidov pomocou Varšavského vzorca kilokalórií delených 10.\n\nTýmto spôsobom sa ekvivalenty sacharidov rozložia na maximálne nastavené trvanie, ktoré možno nakonfigurovať v rozsahu 5-12 hodín.\n\nDelay je čas odteraz do prvého budúceho zápisu sacharidov.\n\nInterval v minútach je počet minút medzi jednotlivými zápismi. Čím je interval kratší, tým je výsledok plynulejší. 10, 15, 20, 30 alebo 60 sú rozumné možnosti.\n\nAdjustment factor je, aký vplyv má tuk a bielkoviny na záznamy. 1,0 je plný účinok (pôvodná Varšavská metóda) a 0,5 je polovičný účinok. Všimnite si, že možno zistíte, že váš normálny pomer sacharidov sa musí zvýšiť na väčšie číslo, ak začnete pridávať položky tukov a bielkovín. Z tohto dôvodu je najlepšie začať s faktorom približne 0,5, aby ste si to uľahčili.\n\nPredvolené nastavenia: Časový limit: 8 h, Interval: 30 min, Faktor: 0,5, Oneskorenie 60 min"; /* FPU Settings Title */ -"Fat and Protein" = "Fat and Protein"; +"Fat and Protein" = "Tuk a bielkoviny"; /* Display fat and protein entities */ -"Fat & Protein" = "Fat & Protein"; +"Fat & Protein" = "Tuk a bielkoviny"; /* */ -"Hide Fat & Protein" = "Hide Fat & Protein"; +"Hide Fat & Protein" = "Skryť tuk a bielkoviny"; /* Add Fat */ -"Fat" = "Fat"; +"Fat" = "Tuk"; /* Add Protein */ -"Protein" = "Protein"; +"Protein" = "Bielkoviny"; /* Service Section */ -"Fat And Protein Conversion" = "Fat And Protein Conversion"; +"Fat And Protein Conversion" = "Konverzia tukov a bielkovín"; /* Service Section */ -"Profile Override" = "Profile Override"; +"Profile Override" = "Prepísanie profilu"; /* */ -"Override Profiles" = "Override Profiles"; +"Override Profiles" = "Profily prepísania"; /* */ -"Normal " = "Normal "; +"Normal " = "Normálny "; -"Currently no Override active" = "Currently no Override active"; +"Currently no Override active" = "Momentálne nie je aktívne žiadne Override"; /* */ -"Total Insulin Adjustment" = "Total Insulin Adjustment"; +"Total Insulin Adjustment" = "Celková úprava inzulínu"; /* */ -"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; +"Override your Basal, ISF, CR and Target profiles" = "Prepíšte svoje profily Basal, ISF, CR a Target"; /* */ -"Enable indefinitely" = "Enable indefinitely"; +"Enable indefinitely" = "Povolenie na dobu neurčitú"; /* */ -"Override Profile target" = "Override Profile target"; +"Override Profile target" = "Prepísať cieľ profilu"; /* */ -"Disable SMBs" = "Disable SMBs"; +"Disable SMBs" = "Zakázanie SMB"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Normal Profile"; +"Normal Profile" = "Normálny profil"; /* Custom but unsaved Profile */ -"Custom Profile" = "Custom Profile"; +"Custom Profile" = "Vlastný profil"; /* */ -"Profiles" = "Profiles"; +"Profiles" = "Profily"; /* */ -"More options" = "More options"; +"More options" = "Viac možností"; /* */ -"Schedule when SMBs are Off" = "Schedule when SMBs are Off"; +"Schedule when SMBs are Off" = "Plán, kedy sú SMB vypnuté"; /* */ -"Change ISF and CR" = "Change ISF and CR"; +"Change ISF and CR" = "Zmena ISF a CR"; /* */ -"Change ISF" = "Change ISF"; +"Change ISF" = "Zmena ISF"; /* */ -"Change CR" = "Change CR"; +"Change CR" = "Zmena CR"; /* */ -"SMB Minutes" = "SMB Minutes"; +"SMB Minutes" = "Zápisnice SMB"; /* */ -"UAM SMB Minutes" = "UAM SMB Minutes"; +"UAM SMB Minutes" = "Zápisnica UAM SMB"; /* */ -"Start new Profile" = "Start new Profile"; +"Start new Profile" = "Spustenie nového profilu"; /* */ -"Save as Profile" = "Save as Profile"; +"Save as Profile" = "Uložiť ako profil"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Zrušiť prepísanie profilu?"; + +/* Alert */ +"Cancel Temp Target" = "Zrušiť dočasný cieľ?"; /* Alert */ -"Return to Normal?" = "Return to Normal?"; +"Return to Normal?" = "Návrat do normálu?"; /* */ -"This will change settings back to your normal profile." = "This will change settings back to your normal profile."; +"This will change settings back to your normal profile." = "Tým sa nastavenia vrátia do normálneho profilu."; /* Start Profile Alert */ -"Start Profile" = "Start Profile"; +"Start Profile" = "Štartovací profil"; /* */ -"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Váš profilový bazálny inzulín sa upraví pomocou percentuálnej hodnoty override a váš profilový ISF a CR sa opačne upraví pomocou percentuálnej hodnoty."; /* */ -"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile."; +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Spustením tohto prepísania sa zmenia vaše profily a/alebo cieľová glykémia, ktoré sa používajú na zacyklenie počas celého zvoleného trvania. Klepnutím na \"Spustiť profil\" spustíte svoj nový profil alebo upravíte svoj aktuálny aktívny profil."; /* Change Target glucose in profile settings */ -"Override Profile Target" = "Override Profile Target"; +"Override Profile Target" = "Prepísať cieľ profilu"; /* Alert string. Keep spaces. */ -" SMBs are disabled either by schedule or during the entire duration." = " SMBs are disabled either by schedule or during the entire duration."; +" SMBs are disabled either by schedule or during the entire duration." = " SMB sú vypnuté buď podľa plánu, alebo počas celého trvania."; /* Alert strings. Keep spaces */ -" infinite duration." = " infinite duration."; +" infinite duration." = " nekonečné trvanie."; /* Service Section */ -"App Icons" = "App Icons"; +"App Icons" = "Ikony aplikácie"; /* */ -"iAPS Icon" = "iAPS Icon"; +"iAPS Icon" = "ikona iAPS"; /* Service Section */ -"Statistics and Home View" = "Statistics and Home View"; +"Statistics and Home View" = "Štatistiky a domovské zobrazenie"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Vymazať ekvivalenty uhľovodíkov?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Všetky FPU jedla sa vymažú."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Vymazať glukózu?"; /* */ -"Meal Presets" = "Meal Presets"; +"Meal Presets" = "Predvoľby jedál"; /* */ -"Empty" = "Empty"; +"Empty" = "Prázdny"; /* */ -"Delete Selected Preset" = "Delete Selected Preset"; +"Delete Selected Preset" = "Odstrániť vybrané predvoľby"; /* */ -"Enter Meal Preset Name" = "Enter Meal Preset Name"; +"Enter Meal Preset Name" = "Zadajte názov predvoľby jedla"; /* */ -"Name Of Dish" = "Name Of Dish"; +"Name Of Dish" = "Názov jedla"; /* Save Carbs and continue to bolus recommendation */ -"Save and continue" = "Save and continue"; +"Save and continue" = "Uložiť a pokračovať"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Uložiť ako predvoľbu"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Predikcia"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Zobrazenie bielkovín a tukov"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ -"Warning!" = "Warning!"; +"Warning!" = "Upozornenie!"; /* Alert to confirm bolus amount to add */ -"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; +"\n\nTap 'Add' to continue with selected amount." = "\n\nKlepnutím na \"Pridať\" pokračujte s vybranou sumou."; /* */ -"Eventual Glucose" = "Eventual Glucose"; +"Eventual Glucose" = "Prípadná glukóza"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Čakajte, prosím"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Glykémia, "; /* */ -"Target Glucose" = "Target Glucose"; +"Target Glucose" = "Cieľová glykémia"; /* */ -"Percentage setting" = "Percentage setting"; +"Percentage setting" = "Nastavenie percenta"; /* */ -"Insulin Sensitivity" = "Insulin Sensitivity"; +"Insulin Sensitivity" = "Inzulínová Citlivosť"; /* Formula displayed in Bolus info pop-up. Make translation short! */ -"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; +"(Eventual Glucose - Target) / ISF" = "(Prípadná glykémia - cieľová hodnota) / ISF"; /* */ -"Formula:" = "Formula:"; +"Formula:" = "Vzorec:"; /* Bolus pop-up footer */ -"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Sacharidy a predchádzajúci inzulín sú zahrnuté do predpovede glykémie, ale ak je prípadná glykémia nižšia ako cieľová glykémia, bolus sa neodporúča."; /* Hide pop-up */ -"Hide" = "Hide"; +"Hide" = "Skryť"; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Konečná glykémia > cieľová glykémia, ale predpokladá sa, že glykémia najprv klesne na "; /* Bolus pop-up / Alert string. Make translations concise! */ -"which is below your Threshold (" = "which is below your Threshold ("; +"which is below your Threshold (" = "ktorá je nižšia ako vaša prahová hodnota ("; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Konečná glykémia > cieľová glykémia, ale glykémia stúpa pomalšie, ako sa očakávalo. Očakávané: "; //* Bolus pop-up / Alert string. Make translations concise! */ -". Climbing: " = ". Climbing: "; +". Climbing: " = ". Lezenie:"; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Konečná glykémia > cieľová glykémia, ale glykémia klesá rýchlejšie, ako sa očakávalo. Očakávaná: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Falling: " = ". Falling: "; +". Falling: " = ". Klesajúci: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Konečná glykémia > cieľová glykémia, ale glykémia sa mení rýchlejšie, ako sa očakávalo. Očakávaná: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Changing: " = ". Changing: "; +". Changing: " = ". Zmena: "; /* Add insulin without bolusing alert */ -" without bolusing" = " without bolusing"; +" without bolusing" = " pridanie bez použitia bolusu"; /* ------------------------------------------------------------------------------------------- DASH strings */ -"Attach Pod" = "Attach Pod"; +"Attach Pod" = "Pripojenie k Pod"; "Deactivate Pod" = "Deaktivovať Pod"; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Deaktivácia..."; -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Párovanie Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Predchádzajúce informácie o Pod"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Upozornenia s pípnutím zo zariadenia Pod"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Upozornenia s pípnutím zo zariadenia Pod, ktoré možno použiť na potvrdenie vybraných príkazov, keď zariadenie Pod nie je vypnuté."; /* button title for saving low reservoir reminder while saving */ -"Saving..." = "Saving..."; +"Saving..." = "Úspora..."; /* button title for saving low reservoir reminder */ -"Save" = "Save"; +"Save" = "Uložiť"; /* Alert title for error when updating confidence reminder preference */ -"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; +"Failed to update confidence reminder preference." = "Nepodarilo sa aktualizovať predvoľbu pripomenutia dôveryhodnosti."; /* */ -"No Error" = "No Error"; +"No Error" = "Žiadna chyba"; /* description label for active time pod details row */ "Active Time" = "Aktívny Čas"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vypnuté"; /* Title string for BeepPreference.manualCommands */ "Enabled" = "Zapnuté"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Rozšírený"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Nepoužívajú sa žiadne oznámenia."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Upozornenia budú znieť pri príkazoch, ktoré iniciujete, ako napríklad bolus, zrušenie bolusu, pozastavenie, obnovenie, uloženie pripomienok upozornení atď. Keď aplikácia automaticky upravuje podávanie, nepoužívajú sa žiadne pripomenutia dôvery."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Upozornenia zaznejú, keď aplikácia automaticky upraví doručenie a na príkazy, ktoré sami zadáte."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Predvolené pripomenutie o expirácii"; /* */ "Expiration Reminder" = "Pripomienka Expirácie"; /* */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Nízka hladina v rezervoári"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Žiadna pripomienka"; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Naplánovaná pripomienka"; /* */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Pripomienka Nízka hladina v rezervoári"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Uistite sa, že iPhone a Pod sú blízko seba. Ak problémy s komunikáciou pretrvávajú, presuňte sa do inej oblasti."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Ihneď vymeniť pod. Podávanie inzulínu sa zastaví o %1$@ alebo keď sa minie inzulín."; /* Label text for temporary basal rate summary */ -"Rate" = "Rate"; +"Rate" = "Hodnotenie"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ pre %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "iAPS vám automaticky neupraví dávkovanie inzulínu, kým sa dočasná bazálna rýchlosť neskončí alebo nezruší."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Nastaviť dočasný bazál"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Dočasný bazál"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Dočasný bazál zlyhal"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Nie je možné nastaviť dočasnú dávku bazálu: %1$@ \n\n %2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Nie je možné nastaviť dočasnú dávku bazálu: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Chýba konfigurácia"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Tento manažér čerpadiel nebol nakonfigurovaný s maximálnou bazálnou rýchlosťou, pretože bol pridaný skôr, ako bola pridaná funkcia manuálneho bazálneho nastavenia. Prejdite do nastavení terapie -> limity dodávok a nastavte novú maximálnu bazálnu rýchlosť."; /* description label for active time pod details row */ "Active Time" = "Aktívny Čas"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Celková dávka"; /* */ -"Add Omnipod Dash" = "Add Omnipod Dash"; +"Add Omnipod Dash" = "Pridať Omnipod Dash"; /* */ "Insert Cannula" = "Zaviesť Kanylu"; /* */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Skontrolujte kanylu"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Nastavenie je dokončené"; /* */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Inzulín Suspendovaný"; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Pozastavenie podávania inzulínu..."; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Obnoviť podávanie inzulínu"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Obnovuje sa podávanie inzulínu..."; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Pozastavenie podávania inzulínu zlyhalo"; //* -----------------------------------------------------------------------*/ /* ----------------------Statistics strings -------------------------------*/ /* */ -"Today" = "Today"; +"Today" = "Dnes"; /* */ -"Day" = "Day"; +"Day" = "Deň"; /* */ -"Week" = "Week"; +"Week" = "Týždeň"; /* */ -"Month" = "Month"; +"Month" = "Mesiac"; /* */ -"Total" = "Total"; +"Total" = "Celkom"; /* Headline Statistics */ -"Statistics" = "Statistics"; +"Statistics" = "Štatistiky"; /* Option in preferences */ -"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; +"Allow Upload of Statistics to NS" = "Povolenie nahrávania štatistík do NS"; /* Low Glucose Threshold in Statistics settings */ -"Low" = "Low"; +"Low" = "Nízka"; /* High Glucose Threshold in Statistics settings */ -"High" = "High"; +"High" = "Vysoká"; /* In Range */ -"In Range" = "In Range"; +"In Range" = "V dosahu"; /* Display % */ -"Change HbA1c Unit" = "Change HbA1c Unit"; +"Change HbA1c Unit" = "Zmena jednotky HbA1c"; /* */ -"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; +"Display Chart X - Grid lines" = "Zobrazenie grafu X - Línie mriežky"; /* */ -"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; +"Display Chart Y - Grid lines" = "Zobrazenie grafu Y - Línie mriežky"; /* */ -"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; +"Display Chart Threshold lines for Low and High" = "Zobrazenie prahových čiar grafu pre nízke a vysoké hodnoty"; /* */ -"Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; +"Standing / Laying TIR Chart" = "Tabuľka TIR v stoji / v ľahu"; /* */ -"Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +"Hours X-Axis (6 default)" = "Hodiny na osi X (6 predvolených)"; /* */ -"2 hours" = "2 hours"; +"2 hours" = "2 hodiny"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 hodiny"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 hodiny"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 hodiny"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 hodiny"; /* Average BG = */ -"Average" = "Average"; +"Average" = "Priemerný"; /* Median BG */ -"Median" = "Median"; +"Median" = "Medián"; /* CGM readings in statView */ -"Readings" = "Readings"; +"Readings" = "Čítanie"; /* CGM readings in statView */ -"Readings / 24h" = "Readings / 24h"; +"Readings / 24h" = "Odčítania / 24h"; /* Days of saved readings*/ -"Days" = "Days"; +"Days" = "Dni"; /* Normal BG (within TIR) */ -"Normal" = "Normal"; +"Normal" = "Normálny"; /* Title High BG in statPanel */ -"High (>" = "High (>"; +"High (>" = "Vysoká (>"; /* Title Low BG in statPanel */ -"Low (<" = "Low (<"; +"Low (<" = "Nízka (<"; /* SD */ "SD" = "SD"; @@ -1710,78 +1719,78 @@ Enact a temp Basal or a temp target */ "HbA1c" = "HbA1c"; /* Total number of days of data for HbA1c estimation, part 1/2*/ -"All" = "All"; +"All" = "Všetko"; /* Total number of days of data for HbA1c estimation, part 2/2*/ -"days" = "days"; +"days" = "dni"; /* Nr of Loops in statPanel */ -"Loops" = "Loops"; +"Loops" = "Opakovanie"; /* Loop Errors in statPanel */ -"Errors" = "Errors"; +"Errors" = "Chyba"; /* Average loop interval */ -"Interval" = "Interval"; +"Interval" = "Intervalové"; /* Median loop interval */ -"Duration" = "Duration"; +"Duration" = "Trvanie"; /* "Display SD */ -"Display SD instead of CV" = "Display SD instead of CV"; +"Display SD instead of CV" = "Zobrazenie SD namiesto CV"; /* Description for display SD */ -"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Zobrazenie štandardnej odchýlky (SD) namiesto variačného koeficientu (CV) v paneli statPanel"; /* How often to update the statistics */ -"Update every number of minutes:" = "Update every number of minutes:"; +"Update every number of minutes:" = "Aktualizujte každý počet minút:"; /* Description for update interval for statistics */ -"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Predvolená hodnota je 20 minút. Ako často sa má aktualizovať a ukladať súbor statistics.json a odosielať posledné pole, ak je povolené, do služby Nightscout."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "Past 24 Hours "; +"Past 24 Hours " = "Posledných 24 Hodín "; /* Duration displayed in statPanel */ -"Past Week " = "Past Week "; +"Past Week " = "Minulý týždeň "; /* Duration displayed in statPanel */ -"Past Month " = "Past Month "; +"Past Month " = "Minulý mesiac "; /* Duration displayed in statPanel */ -"Past 90 Days " = "Past 90 Days "; +"Past 90 Days " = "Posledných 90 dní "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "All Past Days of Data "; +"All Past Days of Data " = "Všetky údaje za uplynulé dni "; /* "Display Loop statistics in statPanel */ -"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; +"Display Loop Cycle statistics" = "Zobrazenie štatistík cyklu slučky"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; +"Displays Loop statistics in the statPanel in Home View" = "Zobrazí štatistiky slučky v paneli statPanel v zobrazení Domov"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Zmena predvolenej jednotky HbA1c v statPanlel. Jednotka v statPanel bude aktualizovaná pri ďalšej aktualizácii statistics.json"; /* HbA1c for all glucose storage days */ -"all" = "all"; +"all" = "všetko"; /* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ -"CGM Configuration" = "CGM Configuration"; +"CGM Configuration" = "Konfigurácia CGM"; -"Heartbeat" = "Heartbeat"; +"Heartbeat" = "Tlkot srdca"; -"CGM address :" = "CGM address :"; +"CGM address :" = "Adresa CGM :"; -"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; +"CGM is not used as heartbeat." = "CGM sa nepoužíva ako srdcový tep."; -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Ste si istí, že chcete tento CGM vymazať?"; /* New Experimental feature */ -"Experimental" = "Experimental"; +"Experimental" = "Experimentálny"; /* Smoothing of CGM readings */ -"Smooth Glucose Value" = "Smooth Glucose Value"; +"Smooth Glucose Value" = "Hladká hodnota glukózy"; /* ----------------------------------------------------------------------------------------------------------- @@ -1790,314 +1799,314 @@ Enact a temp Basal or a temp target */ */ /* Headline Rewind Resets Autosens */ -"Rewind Resets Autosens" = "Rewind Resets Autosens"; +"Rewind Resets Autosens" = "Návrat do pôvodného stavu 'Autosens'"; /* ”Rewind Resets Autosens” */ -"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."; +"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "Vrátenie do pôvodného stavu \"Autosens \"Táto funkcia, ktorá je predvolene zapnutá, obnoví pomer \"autosens\" na neutrálny, keď previniete čerpadlo, za predpokladu, že to zodpovedá pravdepodobnej zmene miesta. Pomer 'Autosens' sa začne učiť citlivosť nanovo od času previnutia, čo môže trvať až 6 hodín. Ak zvyčajne prevíjate čerpadlo nezávisle od zmien miesta, možno budete chcieť zvážiť vypnutie tejto funkcie."; /* Headline "High Temptarget Raises Sensitivity" */ -"High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; +"High Temptarget Raises Sensitivity" = "Vysoký dočasný cieľ zvýši citlivosť"; /* ”High Temptarget Raises Sensitivity" */ -"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Predvolené nastavenie je false. Ak je nastavená na hodnotu true, zvýši sa citlivosť (nižší pomer citlivosti) pre teplotné ciele nastavené na >= 111. Synonymum pre exercise_mode. Čím vyšší je váš temp target nad 110, tým citlivejší (nižší) je pomer citlivosti, napr. temp target 120 má za následok pomer citlivosti 0,75, zatiaľ čo 140 má za následok 0,6 (pri predvolenom halfBasalTarget 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ -"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; +"Low Temptarget Lowers Sensitivity" = "Nízky dočasný cieľ zníži citlivosť"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Predvolené nastavenie je false. Ak je nastavená na hodnotu true, môže znížiť citlivosť (vyšší pomer citlivosti) pre temptargets <= 99. Nižšia vaša cieľová teplota pod 100 bude mať za následok menej citlivé (vyššie) pomery, napr. cieľová teplota 95 má za následok pomer citlivosti 1,09, zatiaľ čo 85 má za následok 1,33 (s predvolenou hodnotou halfBasalTarget 160)."; /* Headline ”Sensitivity Raises Target" */ -"Sensitivity Raises Target" = "Sensitivity Raises Target"; +"Sensitivity Raises Target" = "Citlivosť zvyšuje cieľ"; /* ”Sensitivity Raises Target" */ -"When true, raises BG target when autosens detects sensitivity" = "When true, raises BG target when autosens detects sensitivity"; +"When true, raises BG target when autosens detects sensitivity" = "Keď je to pravda, zvýši cieľový krvný cukor, keď \"autosens\" zistí citlivosť"; /* Headline ”Resistance Lowers Target" */ -"Resistance Lowers Target" = "Resistance Lowers Target"; +"Resistance Lowers Target" = "Rezistancia znižuje cieľ"; /* ”Resistance Lowers Target" */ -"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Defaults to false. When true, will lower BG target when autosens detects resistance"; +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Predvolené nastavenie je false. Keď je true, zníži cieľový krvný cukor, keď \"autosens\" zistí rezistenciu"; /* Headline ”Advanced Target Adjustments" */ -"Advanced Target Adjustments" = "Advanced Target Adjustments"; +"Advanced Target Adjustments" = "Pokročilé úpravy cieľa"; /* ”Advanced Target Adjustments" */ -"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone."; +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Táto funkcia bola predtým predvolene povolená, ale teraz bude v oref0 0.6.0 a novších verziách predvolená hodnota false (nebude automaticky povolená). (Vo verzii 0.6.0 to nie je potrebné). Táto funkcia automaticky znižuje cieľovú hodnotu krvného cukru oref0, keď sú aktuálna hodnota krvného cukru a prípadná hodnota krvného cukru vysoké. Pomáha to predchádzať a zmierňovať vysoký bloodsugar, ale automaticky sa prepína na nízke tempovanie, aby sa zabezpečilo, že bloodsugar bude plynule klesať smerom k vášmu aktuálnemu cieľu. Ak sa vám toto správanie zdá príliš agresívne, môžete túto funkciu vypnúť. Ak tak urobíte, dajte nám o tom vedieť, aby sme mohli lepšie pochopiť, aké nastavenia fungujú pre každého najlepšie."; /* Headline "Exercise Mode" */ -"Exercise Mode" = "Exercise Mode"; +"Exercise Mode" = "Režim cvičenia"; /* "Exercise Mode" */ -"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity"; +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Predvolené nastavenie je false. Ak je true, > 105 mg/dl cieľovej hodnoty vysokej teploty upraví pomer citlivosti pre režim exercise_mode. Synonymum pre high_temptarget_raises_sensitivity"; /* Headline "Wide BG Target Range" */ -"Wide BG Target Range" = "Wide BG Target Range"; +"Wide BG Target Range" = "Široký cieľový rozsah cukru v krvi"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Predvolené nastavenie je false, čo znamená, že v predvolenom nastavení sa ako cieľová hodnota OpenAPS používa iba dolná hranica cieľového rozsahu cukru v krvi. Ide o bezpečnostnú funkciu, ktorá má zabrániť príliš širokým cieľovým hodnotám a menej optimálnym výsledkom. Preto sa vyšší koniec cieľového rozsahu používa len na zabránenie nadmernej korekcie bolusového sprievodcu. Použite wide_bg_target_range: true na vynútenie neutrálnych teplôt v širšom rozsahu prípadných krvných cukrov."; /* Headline "Skip Neutral Temps" */ -"Skip Neutral Temps" = "Skip Neutral Temps"; +"Skip Neutral Temps" = "Vynechanie neutrálnych teplôt"; /* "Skip Neutral Temps" */ -"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means OpenAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications form the 'rig', that may wake you up during the night. "; +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Predvolené nastavenie je false, takže iAPS nastaví teploty vždy, keď to bude možné, takže bude jednoduchšie zistiť, či systém funguje, aj keď ste offline. To znamená, že iAPS nastaví \"neutrálnu\" teplotu (rovnakú ako vaša predvolená bazálna teplota), ak nie sú potrebné žiadne úpravy. Toto je staré nastavenie systému OpenAPS, aby mal možnosti minimalizovať zvuky a oznámenia z \"platformy\", ktoré vás môžu počas noci zobudiť. "; /* Headline "Unsuspend If No Temp” */ -"Unsuspend If No Temp" = "Unsuspend If No Temp"; +"Unsuspend If No Temp" = "Zrušenie pozastavenia Ak nie je dočasné"; /* "Unsuspend If No Temp” */ -"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended."; +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Mnohí ľudia po opätovnom pripojení čerpadla občas zabudnú obnoviť/odstaviť jeho prevádzku. Ak patríte medzi nich a ste ochotní spoľahlivo nastaviť nulovú bazálnu teplotu vždy pri pozastavení a odpojení pumpy, táto funkcia vám kryje chrbát. Ak je zapnutá, automaticky obnoví / zruší pozastavenie pumpy, ak to zabudnete urobiť pred vypršaním nulovej teploty. Pokiaľ nulová teplota stále beží, ponechá čerpadlo pozastavené."; /* Headline "Enable UAM" */ -"Enable UAM" = "Enable UAM"; +"Enable UAM" = "Povoliť UAM"; /* "Enable UAM" */ -"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier."; +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Ak je táto možnosť povolená, algoritmus SMB dokáže rozpoznať neohlásené jedlá. To je užitočné, ak zabudnete iAPS informovať o sacharidoch alebo ich nesprávne odhadnete a množstvo zadaných sacharidov je nesprávne, alebo ak jedlo s veľkým množstvom tukov a bielkovín má dlhšie trvanie, ako sa očakávalo. Bez akéhokoľvek zadávania sacharidov dokáže UAM rozpoznať rýchle zvýšenie glukózy spôsobené sacharidmi, adrenalínom atď. a snaží sa ho upraviť pomocou SMB. Funguje to aj opačne: ak dôjde k rýchlemu poklesu glukózy, môže zastaviť SMB skôr."; /* Headline "Enable SMB With COB" */ -"Enable SMB With COB" = "Enable SMB With COB"; +"Enable SMB With COB" = "Povoliť SMB zo sacharidmi"; /* Enable SMB With COB" */ -"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "This enables supermicrobolus (SMB) while carbs on board (COB) are positive."; +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "To umožňuje supermikrobolus (SMB), zatiaľ čo carbs on board (COB) sú pozitívne."; /* Headline "Enable SMB With Temptarget” */ -"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; +"Enable SMB With Temptarget" = "Povoliť SMB s dočasnými cieľmi"; /* "Enable SMB With Temptarget” */ -"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB."; +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "To umožňuje supermikrobolus (SMB), ktorý čoskoro zje / má nízku teplotu. Ak je táto funkcia zapnutá, akýkoľvek dočasný cieľ pod 100 mg/dl, napríklad cieľová teplota 99 (alebo 80, typický cieľový ukazovateľ pre skoré jedenie), aktivuje SMB."; /* Headline "Enable SMB Always" */ -"Enable SMB Always" = "Enable SMB Always"; +"Enable SMB Always" = "Vždy povoliť SMB"; /* "Enable SMB Always" */ -"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)."; +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Predvolené nastavenie je false. Ak je true, vždy sa zapne supermikrobolus (pokiaľ nie je zakázaný vysokým dočasným cieľom)."; /* Headline "Enable SMB After Carbs" */ -"Enable SMB After Carbs" = "Enable SMB After Carbs"; +"Enable SMB After Carbs" = "Povoliť SMB po jedle"; /* "Enable SMB After Carbs" */ -"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)."; +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Predvolené nastavenie je false. Keď je true, zapne supermikrobolus (SMB) na 6 hodín po sacharidoch, dokonca aj pri 0 sacharidoch na palube (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Povolenie SMB s vysokým dočasným cieľom"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Povolenie SMB s vysokým dočasným cieľom"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Predvolené nastavenie je false. Ak je true, umožní supermikrobolus (ak je inak povolený) aj pri vysokých cieľových teplotách (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ -"Use Custom Peak Time" = "Use Custom Peak Time"; +"Use Custom Peak Time" = "Používanie vlastného času špičky"; /* "Use Custom Peak Time” */ -"Defaults to false. Setting to true allows changing insulinPeakTime" = "Defaults to false. Setting to true allows changing insulinPeakTime"; +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Predvolené nastavenie je false. Nastavenie na true umožňuje zmenu inzulínu Peak Time"; /* Headline "Suspend Zeros IOB” */ -"Suspend Zeros IOB" = "Suspend Zeros IOB"; +"Suspend Zeros IOB" = "Pozastavenie núl IOB"; /* "Suspend Zeros IOB” */ -"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added."; +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Predvolená hodnota je false. Všetky existujúce temp bazály počas doby, keď bolo čerpadlo pozastavené, sa odstránia a pridá sa 0 temp bazálov, ktoré negujú profilové bazálne sadzby počas doby, keď je čerpadlo pozastavené."; /* Headline "Max IOB" */ "Max IOB" = "Max IOB"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB je maximálne množstvo inzulínu zo všetkých zdrojov - bazálneho (alebo korekčného SMB) a bolusového inzulínu - ktoré môže vaša slučka akumulovať na liečbu vyššieho ako cieľového BG. Na rozdiel od ostatných dvoch bezpečnostných nastavení systému OpenAPS (max_daily_safety_multiplier a current_basal_safety_multiplier) je max_iob nastavený ako pevný počet jednotiek inzulínu. Odteraz manuálne bolusy NIE sú týmto nastavením obmedzené. \n\n Ak chcete testovať bazálne dávky počas noci, môžete v uzavretej slučke upraviť nastavenie Max IOB na nulu. To umožní režim pozastavenia nízkej hladiny glukózy počas testovania nastavení bazálnych dávok\n\n (Tip z https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ -"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; +"Max Daily Safety Multiplier" = "Max násobiteľ denného najvyššieho bazálu"; /* "Max Daily Safety Multiplier" */ -"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Ide o dôležitý bezpečnostný limit systému OpenAPS. Predvolené nastavenie (ktoré pravdepodobne nebude potrebné upravovať) je 3. To znamená, že systém OpenAPS nikdy nebude môcť nastaviť dočasnú bazálnu dávku, ktorá je vyššia ako 3× najvyššia hodinová bazálna dávka naprogramovaná v používateľskej pumpe alebo, ak je zapnutá, určená automatickým ladením."; /* Headline "Current Basal Safety Multiplier" */ -"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; +"Current Basal Safety Multiplier" = "Aktuálny základný bezpečnostný multiplikátor"; /* "Current Basal Safety Multiplier" */ -"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Toto je ďalší dôležitý bezpečnostný limit systému OpenAPS. Predvolené nastavenie (ktoré tiež pravdepodobne nebude potrebné upravovať) je 4. To znamená, že systém OpenAPS nikdy nebude môcť nastaviť dočasnú bazálnu dávku, ktorá je vyššia ako 4-násobok aktuálnej hodinovej bazálnej dávky naprogramovanej v pumpe používateľa alebo, ak je zapnutá, určenej automatickým nastavením."; /* Headline "Autosens Max" */ "Autosens Max" = "Autosens Max"; /* "Autosens Max" */ -"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target."; +"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "Ide o násobiaci limit pre autosenzory (a autotune), ktorý stanovuje maximálny limit 20 % na to, aký vysoký môže byť pomer autosenzorov, čo následne určuje, ako vysoko môže autosenzor nastaviť základné hodnoty, ako nízko môže nastaviť ISF a ako nízko môže nastaviť cieľové hodnoty BG."; /* Headline "Autosens Min" */ "Autosens Min" = "Autosens Min"; /* "Autosens Min" */ -"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets."; +"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "Druhá strana bezpečnostných limitov autosenzora stanovuje limit na to, ako nízko môže autosenzor nastaviť základné hodnoty a ako vysoko môže nastaviť ciele ISF a BG."; /* Headline "Half Basal Exercise Target" */ -"Half Basal Exercise Target" = "Half Basal Exercise Target"; +"Half Basal Exercise Target" = "Polovičný cieľ bazálneho cvičenia"; /* "Half Basal Exercise Target" */ -"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes."; +"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Nastavte číslo, napr. 160, čo znamená, že ak je cieľová teplota 160 mg/dl a exercise_mode=true, spustite 50 % bazálnej dávky pri tejto úrovni (120 = 75 %; 140 = 60 %). Túto hodnotu môžete upraviť, aby ste mali väčšiu kontrolu nad režimami cvičenia."; /* Headline "Max COB" */ -"Max COB" = "Max COB"; +"Max COB" = "Maximálna hodnota COB"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Predvolená hodnota maxCOB je 120. (Ak niekto zadá viac sacharidov v jednom alebo viacerých záznamoch, iAPS obmedzí COB na maxCOB a udrží ho na maxCOB, kým sa nepreukáže, že sacharidy zadané nad maxCOB sa vstrebávajú. V podstate to len obmedzuje UAM ako bezpečnostný limit proti podivným výpočtom COB v dôsledku fluktuačných údajov)"; /* Headline "Bolus Snooze DIA Divisor" */ -"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; +"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Deliteľ"; /* "Bolus Snooze DIA Divisor" */ -"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)."; +"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Funkcia Bolus snooze sa aktivuje po podaní jedla, takže slučka nebude pôsobiť proti nízkym teplotám, keď ste práve jedli. Príklad tu a predvolená hodnota je 2; takže 3 hodiny DIA znamenajú, že bolus snooze sa postupne ukončí v priebehu 1,5 hodiny (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ -"Min 5m Carbimpact" = "Min 5m Carbimpact"; +"Min 5m Carbimpact" = "Minimálne 5 minút Carbimpact"; /* "Min 5m Carbimpact" */ -"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g."; +"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Toto je nastavenie pre predvolený vplyv absorpcie sacharidov za 5 minút. Predvolené nastavenie je očakávaných 8 mg/dl/5 min. Toto ovplyvňuje, ako rýchlo sa COB rozkladá v situáciách, keď absorpcia sacharidov nie je viditeľná v odchýlkach BG. Predvolená hodnota 8 mg/dl/5min zodpovedá minimálnej rýchlosti absorpcie sacharidov 24 g/hod pri CSF 4 mg/dl/g."; /* Headline "Autotune ISF Adjustment Fraction" */ -"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; +"Autotune ISF Adjustment Fraction" = "Frakcia automatického ladenia ISF"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Predvolená hodnota 0,5 pre túto hodnotu udržuje automatické ladenie ISF bližšie k hodnote ISF čerpadla prostredníctvom váženého priemeru fullNewISF a pumpISF. Hodnota 1,0 umožňuje úplné prispôsobenie, hodnota 0 neznamená žiadne prispôsobenie od ISF čerpadla."; /* Headline "Remaining Carbs Fraction" */ -"Remaining Carbs Fraction" = "Remaining Carbs Fraction"; +"Remaining Carbs Fraction" = "Zvyšná frakcia uhľohydrátov"; /* "Remaining Carbs Fraction" */ -"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Toto je časť sacharidov, o ktorej predpokladáme, že sa vstrebe v priebehu 4 hodín, ak ešte nevidíme vstrebávanie sacharidov."; /* Headline "Remaining Carbs Cap" */ -"Remaining Carbs Cap" = "Remaining Carbs Cap"; +"Remaining Carbs Cap" = "Zostávajúci limit uhľovodíkov"; /* "Remaining Carbs Cap" */ -"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Toto je množstvo maximálneho počtu sacharidov, o ktorom predpokladáme, že sa vstrebe v priebehu 4 hodín, ak ešte nevidíme vstrebávanie sacharidov."; /* Headline ”Max SMB Basal Minutes" */ -"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; +"Max SMB Basal Minutes" = "Maximálny počet bazálnych minút SMB"; /* ”Max SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Predvolené nastavenie začína na 30. Toto je maximálny počet minút bazálnej dávky, ktorú možno dodať ako jeden SMB s nekrytým COB. To dáva možnosť urobiť SMB agresívnejším, ak sa tak rozhodnete. Odporúča sa nastaviť túto hodnotu na začiatok na 30, v súlade s predvoleným nastavením, a ak sa rozhodnete túto hodnotu zvýšiť, urobte tak v maximálne 15-minútových krokoch, pričom pozorne sledujte účinky zmien. Neodporúča sa nastaviť túto hodnotu na viac ako 90 minút, pretože to môže ovplyvniť schopnosť algoritmu bezpečne vynulovať teplotu. Odporúča sa tiež, aby sa pri nastavení hodnoty vyššej ako predvolená hodnota použil pushover, aby sa generovali upozornenia na všetky predpokladané najnižšie alebo najvyššie hodnoty."; /* Headline "Max UAM SMB Basal Minutes" */ -"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; +"Max UAM SMB Basal Minutes" = "Maximálny počet bazálnych minút SMB"; /* "Max UAM SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Predvolené nastavenie začína na 30. Toto je maximálny počet minút bazálnej dávky, ktorú môže UAM dodať ako jeden SMB, keď IOB prekročí COB. To dáva možnosť, aby bol UAM viac alebo menej agresívny, ak sa tak rozhodnete. Odporúča sa nastaviť túto hodnotu na začiatok na 30, v súlade s predvoleným nastavením, a ak sa rozhodnete túto hodnotu zvýšiť, urobte tak v maximálne 15-minútových intervaloch, pričom pozorne sledujte účinky zmien. Zníženie hodnoty spôsobí, že UAM bude dávkovať menej inzulínu pre každý SMB. Neodporúča sa nastaviť túto hodnotu na viac ako 60 minút, pretože to môže ovplyvniť schopnosť algoritmu bezpečne vynulovať teplotu. Odporúča sa tiež, aby sa pri nastavení hodnoty vyššej ako predvolená hodnota použil pushover, aby sa generovali upozornenia na všetky predpokladané najnižšie alebo najvyššie hodnoty."; /* Headline "SMB Interval" */ -"SMB Interval" = "SMB Interval"; +"SMB Interval" = "Časový interval SMB"; /* "SMB Interval" */ -"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimálne trvanie v minútach pre nový SMB od posledného SMB alebo manuálneho bolusu"; /* Headline "Bolus Increment" */ -"Bolus Increment" = "Bolus Increment"; +"Bolus Increment" = "Bolusový prírastok"; /* "Bolus Increment" */ -"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Najmenšia uzákonená suma pre malé a stredné podniky. Minimálne množstvo pre pumpy Omnipod je 0,05 U, zatiaľ čo pre pumpy Medtronic sa pre rôzne modely líši, od 0,025 U do 0,10 U. Skontrolujte si, aké minimálne množstvo bolusu môže vaša pumpa dodať. Predvolená hodnota je 0,1."; /* Headline "Insulin Peak Time" */ -"Insulin Peak Time" = "Insulin Peak Time"; +"Insulin Peak Time" = "Čas inzulínového vrcholu"; /* "Insulin Peak Time" */ -"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops."; +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Čas maximálneho účinku inzulínu na zníženie hladiny glukózy v krvi v minútach. Pozor: Oref predpokladá pre ultra-rýchle (Lyumjev) a rýchlo pôsobiace (Fiasp) krivky minimálny (35 a 50 min) a maximálny (100 a 120 min) použiteľný inzulínPeakTimes. Použitie vlastného insulinPeakTime mimo týchto hraníc bude mať za následok problémy s iAPS, dlhšie výpočty slučiek a možné červené slučky."; /* Headline "Carbs Req Threshold" */ -"Carbs Req Threshold" = "Carbs Req Threshold"; +"Carbs Req Threshold" = "Požadovaný prah uhľohydrátov"; /* "Carbs Req Threshold" */ -"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold."; +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Gramy sacharidovPotrebné na spustenie pushoveru. Predvolená hodnota je 1 (pre 1 gram sacharidov). Môže sa zvýšiť, ak chcete, aby sa Pushover zobrazil len pre carbsReq na hranici X."; /* Headline "Noisy CGM Target Multiplier" */ -"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; +"Noisy CGM Target Multiplier" = "Hlučný cieľový multiplikátor CGM"; /* "Noisy CGM Target Multiplier" */ -"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data"; +"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Predvolená hodnota je 1.3. Zvýšte cieľovú hodnotu o túto hodnotu, keď sa v slučke vypínajú nespracované/hlučné údaje CGM"; /* Headline "SMB DeliveryRatio" */ -"SMB DeliveryRatio" = "SMB DeliveryRatio"; +"SMB DeliveryRatio" = "Pomer dodávok pre malé a stredné podniky"; /* SMB DeliveryRatio */ -"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Predvolená hodnota: 0,5 Toto je ďalší kľúčový bezpečnostný limit OpenAPS a určuje, aký podiel z celkového požadovaného inzulínu sa môže dodať ako SMB. Túto experimentálnu hodnotu zvyšujte pomaly a opatrne."; // Dynamic ISF + CR Settings: /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Enable Dynamic ISF, Headline */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Pri každom cykle slučky vypočítajte novú hodnotu ISF. Nový ISF bude založený na aktuálnom BG, TDD inzulínu (posledných 24 hodín alebo vážený priemer) a korekčnom faktore (predvolená hodnota je 1).\n\nDynamický pomer ISF a CR bude obmedzený limitmi autosens.min/max.\n\nDynamický pomer nahrádza autosens.pomer: Nový ISF = statický ISF / dynamický pomer,\nDynamický pomer = profil.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; /* Headline "Enable Dynamic CR" */ -"Enable Dynamic CR" = "Enable Dynamic CR"; +"Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; /* Enable Dynamic CR */ -"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Používajte dynamický CR. Dynamický pomer sa použije pre CR takto:\n\n Keď pomer > 1: dynCR = (newRatio - 1) / 2 + 1.\nKeď pomer < 1: dynCR = CR/dynCR.\n\nNepoužívajte spolu s vysokou inzulínovou frakciou (> 2)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Upravte dynamické pomery pomocou konštanty. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF pre vysoký alebo nízky BG. Maximálna korekcia je určená nastavením min/max v položke Autosens. Pre funkciu Sigmoid sa na začiatku odporúča korekčný faktor 0,4 - 0,5. Pre logaritmický vzorec existuje menej konsenzu, ale pre väčšinu používateľov je vhodnejšie začať s 0,5 - 0,8"; /* Headline "Use Sigmoid Function" */ -"Use Sigmoid Function" = "Use Sigmoid Function"; +"Use Sigmoid Function" = "Použitie funkcie Sigmoid"; /* Use Sigmoid Function */ -"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Použitie sigmoidnej funkcie pre ISF (a pre CR, ak je povolená) namiesto predvoleného logaritmického vzorca. Vyžaduje, aby bolo v nastaveniach povolené nastavenie Dynamická ISF.\n\nNastavenie Adjustment (Úprava) upravuje sklon krivky (Y: dynamický pomer, X: glykémia). Nižšia hodnota ==> menej strmá == menej agresívna.\n\nNastavenie autosens.min/max určuje limity max/min pre dynamický pomer A tiež to, ako veľmi sa dynamický pomer upravuje. Ak AF je sklon krivky, autosens.min/max je výška grafu, interval Y, kde Y: dynamický pomer. Krivka bude mať vždy sigmoidný tvar bez ohľadu na to, aké nastavenia autosens.min/max sa použijú, čo znamená, že tieto nastavenia majú veľké dôsledky na výsledok vypočítaného dynamického ISF. Buďte opatrní pri nastavení príliš vysokej hodnoty autosens.max. Pri správnom nastavení profilu ISF ju pravdepodobne nikdy nebudete potrebovať vyššiu ako 1.5\n\nLimit autosens.max > 1.5 sa pri použití sigmoidnej funkcie neodporúča."; /* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +"Threshold Setting (mg/dl)" = "Nastavenie prahu (mg/dl)"; /* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ -"Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; +"Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; /* Weight of past 24 hours of insulin */ -"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Musí byť > 0 a <= 1.\nPredvolená hodnota je 0,65 (65 %) * TDD. Zvyšok bude z priemeru celkových údajov (do 14 dní) všetkých výpočtov TDD (35 %). Ak chcete použiť len posledných 24 hodín, nastavte túto hodnotu na 1.\n\nAby sa predišlo náhlym výkyvom, napríklad po veľkom jedle, použije sa priemer posledných 2 hodín výpočtov TDD namiesto len aktuálneho TDD (posledných 24 hodín v tomto okamihu)."; /* Headline "Adjust basal" */ -"Adjust basal" = "Adjust basal"; +"Adjust basal" = "Úprava bazálnej"; /* Enable adjustment of basal profile */ -"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Umožniť úpravu základnej dávky na základe pomeru aktuálnej TDD / 7-dňovej priemernej TDD"; /* Headline "Max Delta-BG Threshold SMB" */ -"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; +"Max Delta-BG Threshold SMB" = "Maximálna prahová hodnota Delta-BG SMB"; /* Max Delta-BG Threshold SMB */ -"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Predvolená hodnota je 0,2 (20%). Maximálna kladná percentuálna zmena úrovne BG na použitie SMB, pri prekročení tejto hodnoty sa SMB vypne. Pevne nastavený limit 40 %. Pre plne uzavretú slučku UAM sa odporúča 30 %. Pozorujte v protokole a vyskakovacom okne (maxDelta 27 > 20% BG 100 - vypnutie SMB!)."; /* Headline "... When Blood Glucose Is Over (mg/dl):" */ -"... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; +"... When Blood Glucose Is Over (mg/dl):" = "... Keď je glykémia v krvi vyššia ako (mg/dl):"; /* ... When Blood Glucose Is Over (mg/dl): */ -"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Nastavenie hodnoty enableSMB_high_bg, s ktorou sa bude porovnávať povolenie SMB. Ak je BG > ako táto hodnota, SMB by sa mali povoliť."; /* Headline "Enable SMB With High BG" */ -"Enable SMB With High BG" = "Enable SMB With High BG"; +"Enable SMB With High BG" = "Povolenie SMB s vysokým krvným cukrom"; /* "Enable SMB With High BG" */ -"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Povolenie SMB pri zistení vysokej hladiny cukru v krvi na základe cieľa vysokej hladiny cukru v krvi (upraveného alebo profilu)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Dynamic settings"; +"Dynamic settings" = "Dynamické nastavenia"; /* Insulin curve */ -"Insulin curve" = "Insulin curve"; +"Insulin curve" = "Inzulínová krivka"; /* Headline "Adjustment Factor" */ -"Adjustment Factor" = "Adjustment Factor"; +"Adjustment Factor" = "Faktor úpravy"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index befbedbb68..7299584cc0 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Kabul et ve Devam et"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 2ef6f10a62..a83c3b914f 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "Прийняти та Продовжити"; +/* Bolus progress view */ +"of" = "із"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Виконано в"; @@ -336,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Використовувати локальний сервер"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Це дає змогу завантажувати statistics.json у Nightscout, який може використовуватися Проектом статистики та демографії спільноти.\n\nУчасть у статистиці спільноти є обов’язковою та потребує окремої реєстрації за адресою:\n"; /* */ "Edit settings json" = "Редагувати json налаштувань"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Зберегти як Профіль"; -/* */ -"Return to Normal" = "Повернутися до Нормального стану"; +/* Alert */ +"Cancel Profile Override" = "Скасувати заміну профілю?"; + +/* Alert */ +"Cancel Temp Target" = "Відмінити Тимчасову ціль?"; /* Alert */ "Return to Normal?" = "Повернутися до Нормального стану?"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 25f7866225..47d757bf3d 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -46,6 +46,9 @@ /* */ "Agree and continue" = "同意并继续"; +/* Bolus progress view */ +"of" = "of"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -1334,8 +1337,11 @@ Enact a temp Basal or a temp target */ /* */ "Save as Profile" = "Save as Profile"; -/* */ -"Return to Normal" = "Return to Normal"; +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target?"; /* Alert */ "Return to Normal?" = "Return to Normal?"; From 424d4dd8fdb385d19577e80ffea2849b1fdb86f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 1 Jan 2024 22:08:53 +0100 Subject: [PATCH 314/405] Crowdin fixes --- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index a55262c6a5..223233f580 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -1342,7 +1342,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancel Temp Target"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 7299584cc0..138d30c3dd 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancel Temp Target"; /* Alert */ "Return to Normal?" = "Return to Normal?"; From e16d8e2f764fe8eed35b0966a203ff66a4e330b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 1 Jan 2024 22:27:00 +0100 Subject: [PATCH 315/405] New Crowdin updates (#442) --- .../OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/ar.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/da.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/de.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/es.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/fi.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/fr.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/he.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/nl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pl.lproj/Localizable.strings | 2 +- .../Localizations/Main/pt-BR.lproj/Localizable.strings | 2 +- .../Localizations/Main/pt-PT.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/ru.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/sk.lproj/Localizable.strings | 5 +---- .../Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/uk.lproj/Localizable.strings | 2 +- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 2 +- 20 files changed, 20 insertions(+), 23 deletions(-) diff --git a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings index f65092072d..3fd6ea3046 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nl.lproj/Localizable.strings @@ -282,7 +282,7 @@ "Pod Occlusion" = "Pod verstopping"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Koppeling pod onvolledig"; +"Pod Pairing Incomplete" = "Koppeling Pod Onvolledig"; /* Error message shown when pod sends ack instead of response */ "Pod sent ack instead of response" = "Pod heeft een bevestiging gestuurd in plaats van een antwoord"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 242fc22072..63ad0dce93 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancel Temp Target"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 5a558acafa..0f6f95382f 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Annuller Midlertidigt Mål"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index ab6e0b034f..45453e9745 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Profilüberschreibung abbrechen?"; /* Alert */ -"Cancel Temp Target" = "Vorläufiges Ziel abbrechen?"; +"Cancel Temp Target" = "Temporäres Ziel abbrechen"; /* Alert */ "Return to Normal?" = "Rückkehr zum Normalzustand?"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index ea77b9fa46..3def22f271 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancelar objetivo temporal"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index ca7494d171..004dd289b2 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancel Temp Target"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 362f65b5ea..afe5413713 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Annuler le réglage de l'annulation du profil ?"; /* Alert */ -"Cancel Temp Target" = "Annuler la cible temporaire ?"; +"Cancel Temp Target" = "Annuler la cible temporaire"; /* Alert */ "Return to Normal?" = "Revenir à la normale?"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 242fc22072..63ad0dce93 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancel Temp Target"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 3e14686337..6f78ede35b 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancella basali temporanee"; /* Alert */ "Return to Normal?" = "Ritorno al Normale?"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 84df49e3a0..28b77fb6c7 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Avbryt midlertidig mål"; /* Alert */ "Return to Normal?" = "Gå tilbake til normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 25195e3d2c..253f0c9625 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Profieloverschrijving annuleren?"; /* Alert */ -"Cancel Temp Target" = "Tijdelijk doel annuleren?"; +"Cancel Temp Target" = "Annuleer tijdelijk doel"; /* Alert */ "Return to Normal?" = "Terug naar normaal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index d6c67bea35..eb0de071c3 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1343,7 +1343,7 @@ Połączono z Nightscout!"; "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Anuluj tymczasowy cel"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 8a9633b471..6b429874c5 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancelar Meta Temporária"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index bc83ec001a..b99bceed97 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "Cancelar Meta Temporária"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 2f4f35b6ba..1262bc1f46 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Отменить переопределение профиля?"; /* Alert */ -"Cancel Temp Target" = "Отменить временную цель?"; +"Cancel Temp Target" = "Отменить временную цель"; /* Alert */ "Return to Normal?" = "Вернуться к нормальному?"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index baa1da2f84..5be5c7cab3 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -341,9 +341,6 @@ Enact a temp Basal or a temp target */ /* Enable Statistics */ "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "To umožňuje nahrávanie súboru statistics.json do aplikácie Nightscout, ktorý môže byť použitý v projekte štatistiky a demografie Spoločenstva.\n\nÚčasť na štatistikách Spoločenstva je dobrovoľná a vyžaduje si samostatnú registráciu na adrese:\n"; -/* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; - /* */ "Edit settings json" = "Upraviť settings json"; @@ -1344,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Zrušiť prepísanie profilu?"; /* Alert */ -"Cancel Temp Target" = "Zrušiť dočasný cieľ?"; +"Cancel Temp Target" = "Zrušiť dočasný cieľ"; /* Alert */ "Return to Normal?" = "Návrat do normálu?"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 590c0c91d8..a0cef3cae4 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Spara som profil"; /* Alert */ -"Cancel Profile Override" = "Avbryt Profil"; +"Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ "Cancel Temp Target" = "Avbryt tillfälligt målvärde"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 138d30c3dd..0876f3e28b 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Geçici Hedefi İptal Et"; /* Alert */ "Return to Normal?" = "Return to Normal?"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index a83c3b914f..a0208c0c2c 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Скасувати заміну профілю?"; /* Alert */ -"Cancel Temp Target" = "Відмінити Тимчасову ціль?"; +"Cancel Temp Target" = "Відмінити Тимчасову ціль"; /* Alert */ "Return to Normal?" = "Повернутися до Нормального стану?"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 47d757bf3d..ba2eaffeb1 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1341,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target?"; +"Cancel Temp Target" = "取消临时目标"; /* Alert */ "Return to Normal?" = "Return to Normal?"; From 03a6540e2956978239f5925eaa5c20253346f8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 2 Jan 2024 02:05:50 +0100 Subject: [PATCH 316/405] Crowdin updates (#443) --- FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-BR.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/pt-PT.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings | 2 +- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 63ad0dce93..ca145504a9 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancel Temp Target"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 0f6f95382f..e4563fe627 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Annuller Midlertidigt Mål"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 3def22f271..e489430b00 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancelar objetivo temporal"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 004dd289b2..96b524b21d 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancel Temp Target"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 63ad0dce93..ca145504a9 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancel Temp Target"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 6f78ede35b..22ee03da7e 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Salva Profilo"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancella basali temporanee"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 28b77fb6c7..74485febc7 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Lagre som profil"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Avbryt midlertidig mål"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index eb0de071c3..24dae30c1c 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -1340,7 +1340,7 @@ Połączono z Nightscout!"; "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Anuluj tymczasowy cel"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 6b429874c5..a799515be0 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancelar Meta Temporária"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index b99bceed97..01894b15ea 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Cancelar Meta Temporária"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index a0cef3cae4..590c0c91d8 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Spara som profil"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Avbryt Profil"; /* Alert */ "Cancel Temp Target" = "Avbryt tillfälligt målvärde"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 0876f3e28b..1ce8ea8ed5 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "Geçici Hedefi İptal Et"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index ba2eaffeb1..7d5e483142 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Save as Profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Cancel Profile Override"; /* Alert */ "Cancel Temp Target" = "取消临时目标"; From 7b1a1342dd6c9a8b6259b42f33ec6e023479b24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 2 Jan 2024 23:17:38 +0100 Subject: [PATCH 317/405] Add Hungarian Language files. --- .../CGMBLEKit.xcodeproj/project.pbxproj | 7 + .../CGMBLEKit/hu.lproj/Localizable.strings | 41 + .../CGMBLEKitUI/hu.lproj/Localizable.strings | 60 + .../hu.lproj/TransmitterManagerSetup.strings | 24 + .../G7SensorKit.xcodeproj/project.pbxproj | 5 + .../G7SensorKit/hu.lproj/Localizable.strings | 7 + .../hu.lproj/Localizable.strings | 118 + .../LoopKit/LoopKit.xcodeproj/project.pbxproj | 11 +- .../Resources/hu.lproj/Localizable.strings | 98 + .../Resources/hu.lproj/InsulinKit.strings | 33 + ...InsulinDeliveryTableViewController.strings | 30 + .../Resources/hu.lproj/Localizable.strings | 252 ++ .../MinimedKit.xcodeproj/project.pbxproj | 7 + .../Resources/hu.lproj/Localizable.strings | 98 + .../Resources/hu.lproj/Localizable.strings | 220 ++ .../hu.lproj/MinimedPumpManager.strings | 69 + .../hu.lproj/Localizable.strings | 828 +++++++ .../OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 5 + .../OmniBLE/hu.lproj/Localizable.strings | 1132 +++++++++ .../OmniKit/OmniKit.xcodeproj/project.pbxproj | 5 + .../Resources/hu.lproj/Localizable.strings | 429 ++++ .../Resources/hu.lproj/Localizable.strings | 805 +++++++ .../RileyLink.xcodeproj/project.pbxproj | 7 + .../RileyLink/hu.lproj/Localizable.strings | 51 + .../hu.lproj/Localizable.strings | 30 + .../hu.lproj/Localizable.strings | 106 + FreeAPS.xcodeproj/project.pbxproj | 10 + FreeAPS/Resources/hu.lproj/InfoPlist.strings | 20 + FreeAPS/Resources/vi.lproj/InfoPlist.strings | 20 + .../Main/hu.lproj/Localizable.strings | 2113 +++++++++++++++++ .../Main/vi.lproj/Localizable.strings | 2113 +++++++++++++++++ 31 files changed, 8753 insertions(+), 1 deletion(-) create mode 100644 Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings create mode 100644 Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings create mode 100644 Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings create mode 100644 Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings create mode 100644 Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings create mode 100644 Dependencies/LoopKit/LoopKit/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/InsulinKit.strings create mode 100644 Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/LegacyInsulinDeliveryTableViewController.strings create mode 100644 Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/MinimedKit/MinimedKit/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/MinimedPumpManager.strings create mode 100644 Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings create mode 100644 Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings create mode 100644 Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings create mode 100644 Dependencies/rileylink_ios/RileyLink/hu.lproj/Localizable.strings create mode 100644 Dependencies/rileylink_ios/RileyLinkBLEKit/hu.lproj/Localizable.strings create mode 100644 Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings create mode 100644 FreeAPS/Resources/hu.lproj/InfoPlist.strings create mode 100644 FreeAPS/Resources/vi.lproj/InfoPlist.strings create mode 100644 FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings create mode 100644 FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings diff --git a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.pbxproj b/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.pbxproj index 3f84f8e5af..582edc7352 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.pbxproj +++ b/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.pbxproj @@ -346,6 +346,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 193F1E3F2B44C1CE00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/TransmitterManagerSetup.strings; sourceTree = ""; }; + 193F1E402B44C1CE00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E412B44C1CE00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; 43026D3E2131C5C600A332E2 /* LocalizedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizedString.swift; sourceTree = ""; }; 43026D472131C99500A332E2 /* base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 43026D492131CA8C00A332E2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; @@ -1243,6 +1246,7 @@ ar, cs, hi, + hu, ); mainGroup = 43CABDE91C3506F100005705; productRefGroup = 43CABDF41C3506F100005705 /* Products */; @@ -1616,6 +1620,7 @@ C15A581729C7866600D3A5A1 /* ar */, C121D8C929C7866D00DA0520 /* cs */, C1FAB5B929C786B000D25073 /* hi */, + 193F1E402B44C1CE00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1646,6 +1651,7 @@ C15A581829C7866600D3A5A1 /* ar */, C121D8CA29C7866D00DA0520 /* cs */, C1FAB5BA29C786B000D25073 /* hi */, + 193F1E412B44C1CE00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1713,6 +1719,7 @@ F5E0BE1727E1DE3E0033557E /* he */, C1C247802995823200371B88 /* sk */, C15A581929C7866600D3A5A1 /* ar */, + 193F1E3F2B44C1CE00525770 /* hu */, ); name = TransmitterManagerSetup.storyboard; sourceTree = ""; diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..864a138e0a --- /dev/null +++ b/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings @@ -0,0 +1,41 @@ +/* CGM display title */ +"Dexcom G5" = "Dexcom G5"; + +/* CGM display title */ +"Dexcom G6" = "Dexcom G6"; + +/* Error description for unreliable state */ +"Glucose data is unavailable" = "Glucose data is unavailable"; + +/* Describes a low battery */ +"Low Battery" = "Low Battery"; + +/* Describes a functioning transmitter */ +"OK" = "OK"; + +/* invlid config error description */ +"Peripheral command was invalid" = "Peripheral command was invalid"; + +/* Timeout error description */ +"Peripheral did not respond in time" = "Peripheral did not respond in time"; + +/* Not ready error description */ +"Peripheral isnʼt connected" = "Peripheral isnʼt connected"; + +/* The description of sensor calibration state when sensor calibration is ok. */ +"Sensor calibration is OK" = "Sensor calibration is OK"; + +/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */ +"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d"; + +/* The description of sensor calibration state when sensor sensor is stopped. */ +"Sensor is stopped" = "Sensor is stopped"; + +/* The description of sensor calibration state when sensor sensor is warming up. */ +"Sensor is warming up" = "Sensor is warming up"; + +/* The description of sensor calibration state when sensor needs calibration. */ +"Sensor needs calibration" = "Sensor needs calibration"; + +/* Error description */ +"Unknown characteristic" = "Unknown characteristic"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..8ed9ea5712 --- /dev/null +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings @@ -0,0 +1,60 @@ +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* Confirmation message for deleting a CGM */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* The title of the cancel action in an action sheet */ +"Cancel" = "Cancel"; + +/* Title describing glucose date */ +"Date" = "Date"; + +/* Button title to delete CGM +Title text for the button to remove a CGM from Loop */ +"Delete CGM" = "Delete CGM"; + +/* Title describing glucose value */ +"Glucose" = "Glucose"; + +/* Describes a glucose value adjusted to reflect a recent calibration */ +"Glucose (Adjusted)" = "Glucose (Adjusted)"; + +/* Section title for latest glucose calibration */ +"Latest Calibration" = "Latest Calibration"; + +/* Section title for latest glucose reading */ +"Latest Reading" = "Latest Reading"; + +/* Section title for latest connection date */ +"Latest Connection" = "Latest Connection"; + +/* Button title to open CGM app */ +"Open App" = "Open App"; + +/* Title describing sensor session age */ +"Session Age" = "Session Age"; + +/* Section title for remote data synchronization */ +"Remote Data Synchronization" = "Remote Data Synchronization"; + +/* Title describing sensor expiration */ +"Sensor Expires" = "Sensor Expires"; + +/* Title describing past sensor expiration */ +"Sensor Expired" = "Sensor Expired"; + +/* Title describing CGM calibration and battery state */ +"Status" = "Status"; + +/* Title describing transmitter session age */ +"Transmitter Age" = "Transmitter Age"; + +/* The title text for the Dexcom G5/G6 transmitter ID config value */ +"Transmitter ID" = "Transmitter ID"; + +/* Title describing glucose trend */ +"Trend" = "Trend"; + +/* The title text for the upload glucose switch cell */ +"Upload Readings" = "Upload Readings"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings new file mode 100644 index 0000000000..41859f853c --- /dev/null +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings @@ -0,0 +1,24 @@ + +/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */ +"5oU-vK-JHQ.text" = "Credentials"; + +/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */ +"Dds-49-o7G.title" = "Transmitter Setup"; + +/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */ +"GOT-KQ-cEh.text" = "Detail"; + +/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */ +"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; + +/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */ +"Qub-6B-0aB.headerTitle" = "Transmitter ID"; + +/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */ +"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; + +/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */ +"k1N-Rg-XDy.headerTitle" = "Dexcom Share"; + +/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */ +"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID"; diff --git a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj b/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj index c87edd317e..73d3df64d0 100644 --- a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj +++ b/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj @@ -107,6 +107,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 193F1E3D2B44C18000525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E3E2B44C18100525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; C1086B0E29C9169100D46E65 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; C1086B0F29C9169100D46E65 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; C109F149291ECCE2008EA5B6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -550,6 +552,7 @@ uk, "pt-PT", ca, + hu, ); mainGroup = C17F50BC291EAC3800555EB5; productRefGroup = C17F50C7291EAC3800555EB5 /* Products */; @@ -715,6 +718,7 @@ C1CCD81429C916F600A1158E /* sv */, C1CE705E29C916FE00E70F9D /* tr */, C1E3B2FF29C9170800A06681 /* vi */, + 193F1E3D2B44C18000525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -745,6 +749,7 @@ C1E3B30029C9170800A06681 /* vi */, C1E9A8EB29C9170F00478AA9 /* zh-Hans */, C19C9F4F29C91ED400A6D3D0 /* en */, + 193F1E3E2B44C18100525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; diff --git a/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..233b32c18b --- /dev/null +++ b/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + G7SensorKit + + Created by Pete Schwamb on 3/20/23. + +*/ diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..8fb5899d15 --- /dev/null +++ b/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings @@ -0,0 +1,118 @@ +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Cancel"; + +/* No comment provided by engineer. */ +"Configuration" = "Configuration"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Connected"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Connecting"; + +/* Button title for starting setup */ +"Continue" = "Continue"; + +/* Button label for removing CGM */ +"Delete CGM" = "Delete CGM"; + +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "Done"; + +/* Field label */ +"Glucose" = "Glucose"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* No comment provided by engineer. */ +"Last Reading" = "Last Reading"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Name"; + +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "Time"; + +/* Field label */ +"Trend" = "Trend"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + diff --git a/Dependencies/LoopKit/LoopKit.xcodeproj/project.pbxproj b/Dependencies/LoopKit/LoopKit.xcodeproj/project.pbxproj index 6b13fc894f..b88d32f23d 100644 --- a/Dependencies/LoopKit/LoopKit.xcodeproj/project.pbxproj +++ b/Dependencies/LoopKit/LoopKit.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -984,6 +984,10 @@ /* Begin PBXFileReference section */ 14B33264293ED44C009B8746 /* GlucoseRangeSchedule+SafeBounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GlucoseRangeSchedule+SafeBounds.swift"; sourceTree = ""; }; + 193F1E422B44C1EE00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InsulinKit.strings; sourceTree = ""; }; + 193F1E432B44C1EE00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/LegacyInsulinDeliveryTableViewController.strings; sourceTree = ""; }; + 193F1E442B44C1EF00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E452B44C1EF00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; 1D096BF924C242300078B6B5 /* CheckmarkListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkListItem.swift; sourceTree = ""; }; 1D096BFF24C24C220078B6B5 /* InsulinModelProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsulinModelProvider.swift; sourceTree = ""; }; 1D096C0024C24C220078B6B5 /* ExponentialInsulinModelPreset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExponentialInsulinModelPreset.swift; sourceTree = ""; }; @@ -3425,6 +3429,7 @@ ar, hi, sk, + hu, ); mainGroup = 43D8FDC11C728FDF0073BE78; packageReferences = ( @@ -4506,6 +4511,7 @@ C1D7162929C75EE200B5AB3B /* cs */, C15A582629C7866600D3A5A1 /* ar */, C1FDCC0629C786F90056E652 /* sk */, + 193F1E442B44C1EF00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -4578,6 +4584,7 @@ F5E0BE1527E1DCC90033557E /* vi */, C15A582729C7866600D3A5A1 /* ar */, C1FDCC0729C786F90056E652 /* sk */, + 193F1E422B44C1EE00525770 /* hu */, ); name = InsulinKit.storyboard; sourceTree = ""; @@ -4687,6 +4694,7 @@ C15A582929C7866600D3A5A1 /* ar */, C1FAB5C329C786B000D25073 /* hi */, C1FDCC0929C786F90056E652 /* sk */, + 193F1E452B44C1EF00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -4746,6 +4754,7 @@ F5E0BE1627E1DCC90033557E /* vi */, C15A582829C7866600D3A5A1 /* ar */, C1FDCC0829C786F90056E652 /* sk */, + 193F1E432B44C1EE00525770 /* hu */, ); name = LegacyInsulinDeliveryTableViewController.storyboard; sourceTree = ""; diff --git a/Dependencies/LoopKit/LoopKit/Resources/hu.lproj/Localizable.strings b/Dependencies/LoopKit/LoopKit/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..39dc4ee396 --- /dev/null +++ b/Dependencies/LoopKit/LoopKit/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,98 @@ +/* Describes a certain bolus failure (1: size of the bolus in units) */ +"%1$@ U bolus failed" = "%1$@ U bolus failed"; + +/* Describes an uncertain bolus failure (1: size of the bolus in units) */ +"%1$@ U bolus may not have succeeded" = "%1$@ U bolus may not have succeeded"; + +/* The error description describing when Health sharing was denied */ +"Authorization Denied" = "Authorization Denied"; + +/* Recovery instruction for an uncertain bolus failure */ +"Check your pump before retrying" = "Check your pump before retrying"; + +/* The description of an error returned when attempting to delete a sample not shared by the current app */ +"com.loudnate.CarbKit.deleteCarbEntryUnownedErrorDescription" = "Authorization Denied"; + +/* The error recovery suggestion when attempting to delete a sample not shared by the current app */ +"com.loudnate.carbKit.sharingDeniedErrorRecoverySuggestion" = "This sample can be deleted from the Health app"; + +/* Generic pump error description */ +"Communication Failure" = "Communication Failure"; + +/* Generic pump error description */ +"Connection Failure" = "Connection Failure"; + +/* Generic pump error description */ +"Device Refused" = "Device Refused"; + +/* Recovery suggestion for a no data error */ +"Ensure carb data exists for the specified date" = "Ensure carb data exists for the specified date"; + +/* Glucose trend down */ +"Falling" = "Falling"; + +/* Glucose trend down-down */ +"Falling fast" = "Falling fast"; + +/* Glucose trend down-down-down */ +"Falling very fast" = "Falling very fast"; + +/* Glucose trend flat */ +"Flat" = "Flat"; + +/* The short unit display string for grams per U */ +"g/U" = "g/U"; + +/* Generic pump error description */ +"Invalid Configuration" = "Invalid Configuration"; + +/* Recovery instruction for a certain bolus failure */ +"It is safe to retry" = "It is safe to retry"; + +/* The short unit display string for milligrams per deciliter per U */ +"mg/dL/U" = "mg/dL/U"; + +/* The short unit display string for millimoles per liter */ +"mmol/L" = "mmol/L"; + +/* The short unit display string for millimoles per liter per U */ +"mmol/L/U" = "mmol/L/U"; + +/* Sensor state description for the non-valid state */ +"Needs Attention" = "Needs Attention"; + +/* Describes an error for no data found in a CarbStore request */ +"No values found" = "No values found"; + +/* Sensor state description for the valid state */ +"OK" = "OK"; + +/* The error recovery suggestion when Health sharing was denied */ +"Please re-enable sharing in Health" = "Please re-enable sharing in Health"; + +/* Glucose trend up */ +"Rising" = "Rising"; + +/* Glucose trend up-up */ +"Rising fast" = "Rising fast"; + +/* Glucose trend up-up-up */ +"Rising very fast" = "Rising very fast"; + +/* The short unit display string for international units of insulin */ +"U" = "U"; + +/* The short unit display string for international units of insulin per hour */ +"U/hr" = "U/hr"; + +/* The long unit display string for a singular international unit of insulin */ +"Unit" = "Unit"; + +/* The long unit display string for a singular international unit of insulin per hour */ +"Unit/hour" = "Unit/hour"; + +/* The long unit display string for international units of insulin */ +"Units" = "Units"; + +/* The long unit display string for international units of insulin per hour */ +"Units/hour" = "Units/hour"; diff --git a/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/InsulinKit.strings b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/InsulinKit.strings new file mode 100644 index 0000000000..3f6fac54d5 --- /dev/null +++ b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/InsulinKit.strings @@ -0,0 +1,33 @@ + +/* Class = "UILabel"; text = "Title"; ObjectID = "7Fi-wD-gf2"; */ +"7Fi-wD-gf2.text" = "Title"; + +/* Class = "UILabel"; text = "..."; ObjectID = "7Fy-gG-Zof"; */ +"7Fy-gG-Zof.text" = "..."; + +/* Class = "UILabel"; text = "Detail"; ObjectID = "9jm-X6-3QA"; */ +"9jm-X6-3QA.text" = "Detail"; + +/* Class = "UILabel"; text = "..."; ObjectID = "PZQ-gO-084"; */ +"PZQ-gO-084.text" = "..."; + +/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[0] = "Reservoir"; ObjectID = "TyZ-xm-mVN"; */ +"TyZ-xm-mVN.segmentTitles[0]" = "Reservoir"; + +/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[1] = "Event History"; ObjectID = "TyZ-xm-mVN"; */ +"TyZ-xm-mVN.segmentTitles[1]" = "Event History"; + +/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[2] = "Non-Pump Insulin"; ObjectID = "TyZ-xm-mVN"; */ +"TyZ-xm-mVN.segmentTitles[2]" = "Non-Pump Insulin"; + +/* Class = "UILabel"; text = "U IOB"; ObjectID = "dZi-Ta-IHm"; */ +"dZi-Ta-IHm.text" = "U IOB"; + +/* Class = "UILabel"; text = "No pump configured"; ObjectID = "jSc-64-2tZ"; */ +"jSc-64-2tZ.text" = "No pump configured"; + +/* Class = "UILabel"; text = "U Total"; ObjectID = "kys-by-14s"; */ +"kys-by-14s.text" = "U Total"; + +/* Class = "UINavigationItem"; title = "Insulin Delivery"; ObjectID = "vls-EW-uwI"; */ +"vls-EW-uwI.title" = "Insulin Delivery"; diff --git a/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/LegacyInsulinDeliveryTableViewController.strings b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/LegacyInsulinDeliveryTableViewController.strings new file mode 100644 index 0000000000..6db3b2d320 --- /dev/null +++ b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/LegacyInsulinDeliveryTableViewController.strings @@ -0,0 +1,30 @@ + +/* Class = "UILabel"; text = "Title"; ObjectID = "7Fi-wD-gf2"; */ +"7Fi-wD-gf2.text" = "Title"; + +/* Class = "UILabel"; text = "..."; ObjectID = "7Fy-gG-Zof"; */ +"7Fy-gG-Zof.text" = "..."; + +/* Class = "UILabel"; text = "Detail"; ObjectID = "9jm-X6-3QA"; */ +"9jm-X6-3QA.text" = "Detail"; + +/* Class = "UILabel"; text = "..."; ObjectID = "PZQ-gO-084"; */ +"PZQ-gO-084.text" = "..."; + +/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[0] = "Reservoir"; ObjectID = "TyZ-xm-mVN"; */ +"TyZ-xm-mVN.segmentTitles[0]" = "Reservoir"; + +/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[1] = "Event History"; ObjectID = "TyZ-xm-mVN"; */ +"TyZ-xm-mVN.segmentTitles[1]" = "Event History"; + +/* Class = "UILabel"; text = "U IOB"; ObjectID = "dZi-Ta-IHm"; */ +"dZi-Ta-IHm.text" = "U IOB"; + +/* Class = "UILabel"; text = "No pump configured"; ObjectID = "jSc-64-2tZ"; */ +"jSc-64-2tZ.text" = "No pump configured"; + +/* Class = "UILabel"; text = "U Tutal"; ObjectID = "kys-by-14s"; */ +"kys-by-14s.text" = "U Tutal"; + +/* Class = "UINavigationItem"; title = "Insulin Delivery"; ObjectID = "vls-EW-uwI"; */ +"vls-EW-uwI.title" = "Insulin Delivery"; diff --git a/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..bbc497d99f --- /dev/null +++ b/Dependencies/LoopKit/LoopKitUI/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,252 @@ +/* The format for an override preset cell. (1: symbol)(2: name) + The format for an override symbol and name (1: symbol)(2: name) */ +"%1$@ %2$@" = "%1$@ %2$@"; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"%1$@ units remaining at %2$@" = "%1$@ units remaining at %2$@"; + +/* The format for a glucose target range. (1: min target)(2: max target)(3: glucose unit) */ +"%1$@ – %2$@ %3$@" = "%1$@ – %2$@ %3$@"; + +/* The format for an insulin needs percentage. */ +"%@%% of normal insulin" = "%@%% of normal insulin"; + +/* Appends a full-stop to a statement */ +"%@." = "%@."; + +/* Format string for reservoir volume. (1: The localized volume) */ +"%@U" = "%@U"; + +/* Title of the carb entry absorption time cell */ +"Absorption Time" = "Absorption Time"; + +/* The title for the override emoji activity section */ +"Activity" = "Activity"; + +/* Action sheet confirmation message for pump history deletion */ +"Are you sure you want to delete all history entries?" = "Are you sure you want to delete all history entries?"; + +/* Action sheet confirmation message for reservoir deletion */ +"Are you sure you want to delete all reservoir values?" = "Are you sure you want to delete all reservoir values?"; + +/* The title of the button to add the credentials for a service */ +"Add Account" = "Add Account"; + +/* The title of the button to remove the credentials for a service */ +"Delete Account" = "Delete Account"; + +/* Describes a percentage decrease in overall insulin needs */ +"Basal, bolus, and correction insulin dose amounts are decreased by %@%%." = "Basal, bolus, and correction insulin dose amounts are decreased by %@%%."; + +/* Describes a percentage increase in overall insulin needs */ +"Basal, bolus, and correction insulin dose amounts are increased by %@%%." = "Basal, bolus, and correction insulin dose amounts are increased by %@%%."; + +/* Describes a lack of change in overall insulin needs */ +"Basal, bolus, and correction insulin dose amounts are unaffected." = "Basal, bolus, and correction insulin dose amounts are unaffected."; + +/* The title of the cancel action in an action sheet */ +"Cancel" = "Cancel"; + +/* The text for the override cancellation button */ +"Cancel Override" = "Cancel Override"; + +/* Title text for suspend resume button when temp basal canceling */ +"Canceling Temp Basal" = "Canceling Temp Basal"; + +/* The title of the view controller to create a new carb entry */ +"Add Carb Entry" = "Add Carb Entry"; + +/* The title of the view controller to edit an existing carb entry */ +"Edit Carb Entry" = "Edit Carb Entry"; + +/* Footer text for customizing an override from a preset (1: preset name) */ +"Changes will only apply this time you enable the override. The default settings of %@ will not be affected." = "Changes will only apply this time you enable the override. The default settings of %@ will not be affected."; + +/* Carb entry section footer text explaining absorption time */ +"Choose a longer absorption time for larger meals, or those containing fats and proteins. This is only guidance to the algorithm and need not be exact." = "Choose a longer absorption time for larger meals, or those containing fats and proteins. This is only guidance to the algorithm and need not be exact."; + +/* The format string describing the date of a COB value. The first format argument is the localized date. */ +"com.loudnate.CarbKit.COBDateLabel" = "at %1$@"; + +/* The format string describing the starting date of a total value. The first format argument is the localized date. */ +"com.loudnate.CarbKit.totalDateLabel" = "since %1$@"; + +/* The format string describing the date of an IOB value. The first format argument is the localized date. */ +"com.loudnate.InsulinKit.IOBDateLabel" = "at %1$@"; + +/* The format string describing the starting date of a total value. The first format argument is the localized date. */ +"com.loudnate.InsulinKit.totalDateLabel" = "since %1$@"; + +/* The title of the action used to dismiss an error alert */ +"com.loudnate.LoopKit.errorAlertActionTitle" = "OK"; + +/* The title for the override emoji condition section */ +"Condition" = "Condition"; + +/* Title of the setup button to continue */ +"Continue" = "Continue"; + +/* The section footer of correction range schedule */ +"Correction range is the blood glucose range that you would like Loop to correct to." = "Correction range is the blood glucose range that you would like Loop to correct to."; + +/* The text for a custom override */ +"Custom" = "Custom"; + +/* The title for the custom override entry screen */ +"Custom Override" = "Custom Override"; + +/* Title of the carb entry date picker cell */ +"Date" = "Date"; + +/* Button title to delete all objects */ +"Delete All" = "Delete All"; + +/* The text for the override duration setting */ +"Duration" = "Duration"; + +/* The title for the override editing screen */ +"Edit Override" = "Edit Override"; + +/* Footer text for editing an active override (1: preset name) */ +"Editing affects only the active override. The default settings of %@ will not be affected." = "Editing affects only the active override. The default settings of %@ will not be affected."; + +/* The text for the indefinite override duration setting */ +"Enable Indefinitely" = "Enable Indefinitely"; + +/* The detail text describing an enabled setting */ +"Enabled" = "Enabled"; + +/* The placeholder text instructing users how to enter a maximum bolus */ +"Enter a number of units" = "Enter a number of units"; + +/* The placeholder text instructing users how to enter a maximum basal rate */ +"Enter a rate in units per hour" = "Enter a rate in units per hour"; + +/* Section title for fast absorbing food */ +"Fast" = "Fast"; + +/* The description shown on the insulin sensitivity schedule interface. */ +"Insulin sensitivity describes how your blood glucose should respond to a 1 Unit dose of insulin. Smaller values mean more insulin will be given when above target. Values that are too small can cause dangerously low blood glucose." = "Insulin sensitivity describes how your blood glucose should respond to a 1 Unit dose of insulin. Smaller values mean more insulin will be given when above target. Values that are too small can cause dangerously low blood glucose."; + +/* Placeholder for maximum value in glucose range */ +"max" = "max"; + +/* The title text for the maximum basal rate value */ +"Maximum Basal Rate" = "Maximum Basal Rate"; + +/* The title text for the maximum bolus value */ +"Maximum Bolus" = "Maximum Bolus"; + +/* Section title for medium absorbing food */ +"Medium" = "Medium"; + +/* Placeholder for minimum value in glucose range */ +"min" = "min"; + +/* Alert action title to open error help */ +"More Info" = "More Info"; + +/* The text for the override preset name setting */ +"Name" = "Name"; + +/* The title for the new override preset entry screen */ +"New Preset" = "New Preset"; + +/* Section title for no-carb food + The title for override emoji miscellaneous section */ +"Other" = "Other"; + +/* The title text for the insulin sensitivity scaling setting */ +"Overall Insulin Needs" = "Overall Insulin Needs"; + +/* The title text for the override presets screen */ +"Override Presets" = "Override Presets"; + +/* Text directing the user to configure override presets */ +"Override presets can be set up under the 'Configuration' section of the settings screen." = "Override presets can be set up under the 'Configuration' section of the settings screen."; + +/* The section title of glucose overrides */ +"Overrides" = "Overrides"; + +/* Title for the pre-meal override range */ +"Pre-Meal" = "Pre-Meal"; + +/* The section header text override presets */ +"PRESETS" = "PRESETS"; + +/* The title of the screen displaying a pump event */ +"Pump Event" = "Pump Event"; + +/* Title text for button to resume insulin delivery */ +"Resume Delivery" = "Resume Delivery"; + +/* Title text for button when insulin delivery is in the process of being resumed */ +"Resuming" = "Resuming"; + +/* The text for the override preset name field placeholder */ +"Running" = "Running"; + +/* Button text for saving glucose correction range schedule + Button text for saving insulin sensitivity schedule */ +"Save" = "Save"; + +/* The section header text for a scheduled override */ +"SCHEDULED OVERRIDE" = "SCHEDULED OVERRIDE"; + +/* Section title for slow absorbing food */ +"Slow" = "Slow"; + +/* The text for the override start time */ +"Start Time" = "Start Time"; + +/* Title text for suspend resume button when temp basal starting */ +"Starting Temp Basal" = "Starting Temp Basal"; + +/* Title text for button to suspend insulin delivery */ +"Suspend Delivery" = "Suspend Delivery"; + +/* Title text for button when insulin delivery is in the process of being stopped */ +"Suspending" = "Suspending"; + +/* The text for the override preset symbol setting */ +"Symbol" = "Symbol"; + +/* The empty-state text for a configuration value */ +"Tap to set" = "Tap to set"; + +/* The text for the override target range setting */ +"Target Range" = "Target Range"; + +/* The title for the override selection screen */ +"Temporary Override" = "Temporary Override"; + +/* The default placeholder string for a credential */ +"Required" = "Required"; + +/* Alert body displayed absorption time greater than max (1: maximum absorption time) */ +"The maximum absorption time is %@" = "The maximum absorption time is %@"; + +/* Alert body displayed for quantity greater than max (1: maximum quantity in grams) */ +"The maximum allowed amount is %@ grams" = "The maximum allowed amount is %@ grams"; + +/* The schedule table view header describing the configured time zone difference from the default time zone. The substitution parameters are: (1: time zone name)(2: +/-)(3: time interval) */ +"Times in %1$@%2$@%3$@" = "Times in %1$@%2$@%3$@"; + +/* The unit string for units per hour */ +"U/hour" = "U/hour"; + +/* The unit string for units */ +"Units" = "Units"; + +/* Accessibility value for an unknown value + The default title to use when an entry has none */ +"Unknown" = "Unknown"; + +/* Label indicating validation is occurring */ +"Verifying" = "Verifying"; + +/* Title of an alert containing a validation warning */ +"Warning" = "Warning"; + +/* Title for the workout override range */ +"Workout" = "Workout"; diff --git a/Dependencies/MinimedKit/MinimedKit.xcodeproj/project.pbxproj b/Dependencies/MinimedKit/MinimedKit.xcodeproj/project.pbxproj index 40da8b82a7..3b548eea51 100644 --- a/Dependencies/MinimedKit/MinimedKit.xcodeproj/project.pbxproj +++ b/Dependencies/MinimedKit/MinimedKit.xcodeproj/project.pbxproj @@ -387,6 +387,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 193F1E522B44C22A00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/MinimedPumpManager.strings; sourceTree = ""; }; + 193F1E532B44C22A00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E542B44C22A00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; C1229C2129C7ECA70066A89C /* TimeInterval.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeInterval.swift; sourceTree = ""; }; C1229C2329C7ECEB0066A89C /* Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; }; C13CC34129C7B73A007F25DE /* MinimedKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MinimedKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1463,6 +1466,7 @@ "zh-Hans", fr, pl, + hu, ); mainGroup = C1E3490729C7A866009A50A5; productRefGroup = C1E3491229C7A866009A50A5 /* Products */; @@ -1907,6 +1911,7 @@ C13CC3D829C7B8E9007F25DE /* sv */, C13CC3D929C7B8E9007F25DE /* tr */, C13CC3DA29C7B8EB007F25DE /* vi */, + 193F1E522B44C22A00525770 /* hu */, ); name = MinimedPumpManager.storyboard; sourceTree = ""; @@ -1936,6 +1941,7 @@ C1E34AF829C7A9BC009A50A5 /* fi */, C1E34AF929C7A9BC009A50A5 /* nl */, C1E34AFA29C7A9BC009A50A5 /* ro */, + 193F1E532B44C22A00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1965,6 +1971,7 @@ C1E34B5429C7AC6F009A50A5 /* tr */, C1E34B5529C7AC70009A50A5 /* vi */, C1BF2DB929C8007300EB8987 /* en */, + 193F1E542B44C22A00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/hu.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..afe05abcf5 --- /dev/null +++ b/Dependencies/MinimedKit/MinimedKit/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,98 @@ +/* Communications error for a bolus currently running */ +"A bolus is already in progress" = "A bolus is already in progress"; + +/* The description of AlarmClockReminderPumpEvent */ +"AlarmClockReminder" = "AlarmClockReminder"; + +/* The description of AlarmSensorPumpEvent */ +"AlarmSensor" = "AlarmSensor"; + +/* Describing the battery chemistry as Alkaline */ +"Alkaline" = "Alkaline"; + +/* The format string description of a BasalProfileStartPumpEvent. (1: The index of the profile)(2: The basal rate) */ +"Basal Profile %1$@: %2$@ U/hour" = "Basal Profile %1$@: %2$@ U/hour"; + +/* Pump error code when bolus is in progress */ +"Bolus in progress" = "Bolus in progress"; + +/* Suggestions for diagnosing a command refused pump error */ +"Check that the pump is not suspended or priming, or has a percent temp basal type" = "Check that the pump is not suspended or priming, or has a percent temp basal type"; + +/* Pump error code returned when command refused */ +"Command refused" = "Command refused"; + +/* No comment provided by engineer. */ +"Comms with another pump detected" = "Comms with another pump detected."; + +/* Error description */ +"Decoding Error" = "Decoding Error"; + +/* Error description */ +"Device Error" = "Device Error"; + +/* Describing the pump history insulin data source */ +"Event History" = "Event History"; + +/* Format string for failure reason. (1: The operation being performed) (2: The response data) */ +"Invalid response during %1$@: %2$@" = "Invalid response during %1$@: %2$@"; + +/* Describing the battery chemistry as Lithium */ +"Lithium" = "Lithium"; + +/* Recovery suggestion */ +"Make sure your RileyLink is nearby and powered on" = "Make sure your RileyLink is nearby and powered on"; + +/* Pump error code describing max setting exceeded */ +"Max setting exceeded" = "Max setting exceeded"; + +/* Pump title (1: model number) */ +"Minimed %@" = "Minimed %@"; + +/* Generic title of the minimed pump manager */ +"Minimed 500/700 Series" = "Minimed 500/700 Series"; + +/* Describing the North America pump region */ +"North America" = "North America"; + +/* No comment provided by engineer. */ +"Pump did not respond" = "Pump did not respond"; + +/* Error description */ +"Pump Error" = "Pump Error"; + +/* No comment provided by engineer. */ +"Pump is suspended" = "Pump is suspended"; + +/* No comment provided by engineer. */ +"Pump responded unexpectedly" = "Pump responded unexpectedly"; + +/* The format string describing a pump message. (1: The packet type)(2: The message type)(3: The message address)(4: The message data */ +"PumpMessage(%1$@, %2$@, %3$@, %4$@)" = "PumpMessage(%1$@, %2$@, %3$@, %4$@)"; + +/* Describing the reservoir insulin data source */ +"Reservoir" = "Reservoir"; + +/* Error description */ +"RileyLink radio tune failed" = "RileyLink radio tune failed"; + +/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */ +"Temporary Basal: %1$.3f U/hour" = "Temporary Basal: %1$.3f U/hour"; + +/* The format string description of a TempBasalDurationPumpEvent. (1: The duration of the temp basal in minutes) */ +"Temporary Basal: %1$d min" = "Temporary Basal: %1$d min"; + +/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in percent) */ +"Temporary Basal: %1$d%%" = "Temporary Basal: %1$d%%"; + +/* The format string description of an unknown pump error code. (1: The specific error code raw value) */ +"Unknown pump error code: %1$@" = "Unknown pump error code: %1$@"; + +/* No comment provided by engineer. */ +"Unknown pump model: %@" = "Unknown pump model: %@"; + +/* Format string for an unknown response. (1: The operation being performed) (2: The response data) */ +"Unknown response during %1$@: %2$@" = "Unknown response during %1$@: %2$@"; + +/* Describing the worldwide pump region */ +"World-Wide" = "World-Wide"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..ebe3f71382 --- /dev/null +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,220 @@ +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* Format string for reservoir volume. (1: The localized volume) */ +"%@U" = "%@U"; + +/* The format string for displaying a frequency tune trial. Extra spaces added for emphesis: (1: frequency in MHz)(2: success count)(3: total count)(4: average RSSI) */ +"%1$@ %2$@/%3$@ %4$@" = "%1$@ %2$@/%3$@ %4$@"; + +/* The format string describing number of basal schedule entries: (1: number of entries) */ +"%1$@ basal schedule entries\n" = "%1$@ basal schedule entries\n"; + +/* The format string describing units of insulin remaining: (1: number of units) */ +"%1$@ Units of insulin remaining\n" = "%1$@ Units of insulin remaining\n"; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"%1$@ units remaining at %2$@" = "%1$@ units remaining at %2$@"; + +/* String format for value with units (1: value, 2: separator, 3: units) */ +"%1$@%2$@%3$@" = "%1$@%2$@%3$@"; + +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Adjusting Pump Time..."; + +/* Instructions on selecting battery chemistry type */ +"Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure."; + +/* Text to confirm delete this pump */ +"Are you sure you want to delete this Pump?" = "Are you sure you want to delete this Pump?"; + +/* The format string describing pump battery voltage: (1: battery voltage) */ +"Battery: %1$@ volts\n" = "Battery: %1$@ volts\n"; + +/* The label indicating the best radio frequency */ +"Best Frequency" = "Best Frequency"; + +/* The format string describing pump bolusing state: (1: bolusing) */ +"Bolusing: %1$@\n" = "Bolusing: %1$@\n"; + +/* Cancel button title */ +"Cancel" = "Cancel"; + +/* Title text for suspend resume button when temp basal canceling */ +"Canceling Temp Basal" = "Canceling Temp Basal"; + +/* Text shown in basal rate space when basal is changing */ +"Changing" = "Changing"; + +/* Progress message for changing pump time. */ +"Changing time…" = "Changing time…"; + +/* Instructions on selecting battery chemistry type */ +"Choose the type of battery you are using in your pump for better alerting about low battery conditions." = "Choose the type of battery you are using in your pump for better alerting about low battery conditions."; + +/* The title of the configuration section in MinimedPumpManager settings */ +"Configuration" = "Configuration"; + +/* Button title to connect to pump during setup */ +"Connect" = "Connect"; + +/* Text for continue button */ +"Continue" = "Continue"; + +/* Button label for removing Pump + Text to delete pump */ +"Delete Pump" = "Delete Pump"; + +/* Header for devices section of RileyLinkSetupView */ +"Devices" = "Devices"; + +/* Description for option to not use MySentry */ +"Do not use MySentry" = "Do not use MySentry"; + +/* The alert title for a resume error */ +"Error Resuming" = "Error Resuming"; + +/* The alert title for a suspend error */ +"Error Suspending" = "Error Suspending"; + +/* The alert title for an error while synching time */ +"Error Syncing Time" = "Error Syncing Time"; + +/* Progress message for fetching pump glucose. */ +"Fetching glucose…" = "Fetching glucose…"; + +/* Progress message for fetching pump history. */ +"Fetching history…" = "Fetching history…"; + +/* Progress message for fetching pump model. */ +"Fetching pump model…" = "Fetching pump model…"; + +/* The title of the cell showing the pump firmware version */ +"Firmware Version" = "Firmware Version"; + +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulin\nSuspended"; + +/* Title of insulin delivery section */ +"Insulin Delivery" = "Insulin Delivery"; + +/* Instructions on selecting an insulin data source */ +"Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option." = "Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option."; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin Remaining"; + +/* Text for confidence reminders navigation link */ +"Insulin Type" = "Insulintyp"; + +/* Format string fof navigation bar title for MinimedPumpSettingsView (1: model number) */ +"Medtronic %1$@" = "Medtronic %1$@"; + +/* Instructions on selecting setting for MySentry */ +"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models."; + +/* Value string for MySentry config when MySentry is not being used */ +"No" = "No"; + +/* Message display when no response from tuning pump */ +"No response" = "No response"; + +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "No, Keep Pump As Is"; + +/* Pump find device instruction */ +"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device"; + +/* navigation title for pump battery type selection + Text for medtronic pump preferred data source */ +"Preferred Data Source" = "Preferred Data Source"; + +/* Text for medtronic pump battery percent remaining */ +"Pump Battery Remaining" = "Pump Battery Remaining"; + +/* navigation title for pump battery type selection + Text for medtronic pump battery type */ +"Pump Battery Type" = "Pump Battery Type"; + +/* The title text for the pump ID config value */ +"Pump ID" = "Pump ID"; + +/* The title of the command to change pump time zone */ +"Pump Time" = "Pump Time"; + +/* Progress message for reading basal schedule */ +"Reading basal schedule…" = "Reading basal schedule…"; + +/* Progress message for reading pump status */ +"Reading pump status…" = "Reading pump status…"; + +/* The title of the cell showing the pump region */ +"Region" = "Region"; + +/* Title text for button to resume insulin delivery */ +"Resume Delivery" = "Resume Delivery"; + +/* Title text for button when insulin delivery is in the process of being resumed */ +"Resuming" = "Resuming"; + +/* Button title to retry sentry setup */ +"Retry" = "Retry"; + +/* Title of insulin delivery section */ +"Scheduled Basal" = "Scheduled Basal"; + +/* Title text for insulin type confirmation page */ +"Select the type of insulin that you will be using in this pump." = "Select the type of insulin that you will be using in this pump."; + +/* Progress message for sending button press to pump. */ +"Sending button press…" = "Sending button press…"; + +/* Title text for suspend resume button when temp basal starting */ +"Starting Temp Basal" = "Starting Temp Basal"; + +/* A message indicating a command succeeded */ +"Succeeded" = "Succeeded"; + +/* Title text for button to suspend insulin delivery */ +"Suspend Delivery" = "Suspend Delivery"; + +/* The format string describing pump suspended state: (1: suspended) */ +"Suspended: %1$@\n" = "Suspended: %1$@\n"; + +/* Title text for button when insulin delivery is in the process of being stopped */ +"Suspending" = "Suspending"; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + +/* Message for pod sync time action sheet */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; + +/* Title for pod sync time action sheet. */ +"Time Change Detected" = "Time Change Detected"; + +/* The label indicating the results of each frequency trial */ +"Trials" = "Trials"; + +/* Progress message for tuning radio */ +"Tuning radio…" = "Tuning radio…"; + +/* Units for showing temp basal rate */ +"U/hr" = "U/hr"; + +/* Text to indicate battery percentage is unknown */ +"unknown" = "unknown"; + +/* Text shown in basal rate space when delivery status is unknown */ +"Unknown" = "Unknown"; + +/* Description for option to use MySentry + navigation title for pump battery type selection + Text for medtronic pump to use MySentry */ +"Use MySentry" = "Use MySentry"; + +/* Value string for MySentry config when MySentry is being used */ +"Yes" = "Yes"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/MinimedPumpManager.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/MinimedPumpManager.strings new file mode 100644 index 0000000000..a44f54c693 --- /dev/null +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/MinimedPumpManager.strings @@ -0,0 +1,69 @@ + +/* Class = "UITableViewController"; title = "RileyLink Setup"; ObjectID = "0MV-2k-Dty"; */ +"0MV-2k-Dty.title" = "RileyLink Setup"; + +/* Class = "UILabel"; text = "Find Device"; ObjectID = "1fp-45-qWK"; */ +"1fp-45-qWK.text" = "Find Device"; + +/* Class = "UILabel"; text = "Other Devices"; ObjectID = "A6i-Cb-baR"; */ +"A6i-Cb-baR.text" = "Other Devices"; + +/* Class = "UILabel"; text = "Do not change the time using your pumpʼs menu."; ObjectID = "Bdb-j4-WcR"; */ +"Bdb-j4-WcR.text" = "Do not change the time using your pumpʼs menu."; + +/* Class = "UITableViewController"; title = "Pump Clock"; ObjectID = "Fps-h3-V4K"; */ +"Fps-h3-V4K.title" = "Pump Clock"; + +/* Class = "UITextField"; placeholder = "Enter the 6-digit pump ID"; ObjectID = "HeG-VF-L5P"; */ +"HeG-VF-L5P.placeholder" = "Enter the 6-digit pump ID"; + +/* Class = "UILabel"; text = "If you travel to a different time zone for an extended period of time, you can change the pumpʼs time zone at any time in Loopʼs Settings screen."; ObjectID = "HuY-fE-vM8"; */ +"HuY-fE-vM8.text" = "If you travel to a different time zone for an extended period of time, you can change the pumpʼs time zone at any time in Loopʼs Settings screen."; + +/* Class = "UILabel"; text = "Loop will keep your pumpʼs clock synchronized with your phone in the time zone youʼre in now."; ObjectID = "IQ5-53-x9s"; */ +"IQ5-53-x9s.text" = "Loop will keep your pumpʼs clock synchronized with your phone in the time zone youʼre in now."; + +/* Class = "UITableViewController"; title = "Setup Complete"; ObjectID = "Nwf-TJ-KmJ"; */ +"Nwf-TJ-KmJ.title" = "Setup Complete"; + +/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "OZk-Db-KCs"; */ +"OZk-Db-KCs.title" = "Pump Setup"; + +/* Class = "UINavigationItem"; title = "Pump Setup"; ObjectID = "V47-Nq-7ew"; */ +"V47-Nq-7ew.title" = "Pump Setup"; + +/* Class = "UITableViewSection"; headerTitle = "Main Menu"; ObjectID = "ZnF-zy-5gR"; */ +"ZnF-zy-5gR.headerTitle" = "Main Menu"; + +/* Class = "UILabel"; text = "Utilities"; ObjectID = "c7t-pZ-WqY"; */ +"c7t-pZ-WqY.text" = "Utilities"; + +/* Class = "UILabel"; text = "Connect Devices"; ObjectID = "erq-yb-anx"; */ +"erq-yb-anx.text" = "Connect Devices"; + +/* Class = "UITableViewSection"; footerTitle = "The pump ID is the 6-digit numerical portion of the serial number (labeled as SN or S/N)."; ObjectID = "fVG-pl-jT9"; */ +"fVG-pl-jT9.footerTitle" = "The pump ID is the 6-digit numerical portion of the serial number (labeled as SN or S/N)."; + +/* Class = "UITableViewSection"; headerTitle = "Pump ID"; ObjectID = "fVG-pl-jT9"; */ +"fVG-pl-jT9.headerTitle" = "Pump ID"; + +/* Class = "UILabel"; text = "Your pump is ready for use."; ObjectID = "g1m-3k-XI3"; */ +"g1m-3k-XI3.text" = "Your pump is ready for use."; + +/* Class = "UITableViewSection"; footerTitle = "The pump region and color are denoted as the last 3 letters of the the model number (labeled as REF)."; ObjectID = "lGI-LD-xR7"; */ +"lGI-LD-xR7.footerTitle" = "The pump region and color are denoted as the last 3 letters of the the model number (labeled as REF)."; + +/* Class = "UITableViewSection"; headerTitle = "Region and Color"; ObjectID = "lGI-LD-xR7"; */ +"lGI-LD-xR7.headerTitle" = "Region and Color"; + +/* Class = "UITableViewController"; title = "Pump Broadcasts"; ObjectID = "oBL-lh-SHI"; */ +"oBL-lh-SHI.title" = "Pump Broadcasts"; + +/* Class = "UILabel"; text = "On"; ObjectID = "ojQ-ob-gBx"; */ +"ojQ-ob-gBx.text" = "On"; + +/* Class = "UILabel"; text = "Enter the pump region"; ObjectID = "tGa-FP-JqD"; */ +"tGa-FP-JqD.text" = "Enter the pump region"; + +/* Class = "UILabel"; text = "Loop will listen for status messages sent by your pump. Follow the steps below on your pump to enable these messages:"; ObjectID = "yLn-Ya-p1R"; */ +"yLn-Ya-p1R.text" = "Loop will listen for status messages sent by your pump. Follow the steps below on your pump to enable these messages:"; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..2612ff2e95 --- /dev/null +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -0,0 +1,828 @@ +/* + Localizable.strings + OmniBLE + Created by Jon Mårtensson on 2022-08-28. + Copyright © 2022 Randall Knutson. All rights reserved. +*/ + +/* Alert content title for multiCommand pod alert */ +"Multiple Command Alert" = "Multiple Command Alert"; + +/* Alert content title for userPodExpiration pod alert */ +"Pod Expiration Reminder" = "Pod Expiration Reminder"; + +/* Alert content title for podExpiring pod alert */ +"Pod Expired" = "Pod Expired"; + +/* Alert content title for lowReservoir pod alert */ +"Low Reservoir" = "Low Reservoir"; + +/* Alert content title for suspendInProgress pod alert */ +"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; + +/* Alert content title for suspendEnded pod alert */ +"Resume Insulin" = "Resume Insulin"; + +/* Alert content title for finishSetupReminder pod alert */ +"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; + +/* Alert content title for timeOffsetChangeDetected pod alert */ +"Time Change Detected" = "Time Change Detected"; + +/* Alert content body for multiCommand pod alert */ +"Multiple Command Alert" = "Multiple Command Alert"; + +/* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ +"Pod expires in %1$@." = "Pod expires in %1$@."; + +/* Alert content body for podExpiring pod alert */ +"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; + +/* Alert content body for podExpireImminent pod alert */ +"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; + +/* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; + +/* Alert content body for suspendInProgress pod alert */ +"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; + +/* Alert content body for suspendEnded pod alert */ +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; + +/* Alert content body for finishSetupReminder pod alert */ +"Please finish pairing your pod." = "Please finish pairing your pod."; + +/* Alert content body for timeOffsetChangeDetected pod alert */ +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; + +/* Alert notification body for suspendEnded pod alert user notification */ +"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; + +/* Action button default text for PodAlerts */ +"Ok" = "Ok"; + +/* Label for pod life state when pod not fully activated */ +"Unfinished Activation" = "Unfinished Activation"; + +/* Label for pod life state when time remaining */ +"Pod expires in" = "Pod expires in"; + +/* */ +"Pod Expires" = "Pod Expires"; + +/* */ +"Pod Activated" = "Pod Activated"; + +/* */ +"Notification Settings" = "Notification Settings"; + +/* */ +"Confidence Reminders" = "Confidence Reminders"; + +/* Text for suspend resume button when insulin delivery active */ +"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; + +/* Label for pod life state when within pod expiration window */ +"Pod expired" = "Pod expired"; + +/* Label for pod life state when pod not fully deactivated */ +"Unfinished deactivation" = "Unfinished deactivation"; + +/* Label for pod life state when no pod paired */ +"No Pod" = "No Pod"; + +/* Settings page link description when next lifecycle action is to pair new pod */ +"Pair Pod" = "Pair Pod"; + +/* Pairing action button accessibility label while ready to pair */ +"Pair pod." = "Pair pod."; + +/* Pairing action button accessibility label while pairing */ +"Pairing." = "Pairing."; + +/* Pairing action button accessibility label while priming */ +"Priming. Please wait." = "Priming. Please wait."; + +/* Pairing action button accessibility label when pairing succeeded */ +"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; + +/* Settings page link description when next lifecycle action is to finish deactivation */ +"Finish deactivation" = "Finish deactivation"; + +/* Settings page link description when next lifecycle action is to replace pod */ +"Replace Pod" = "Replace Pod"; + +/* Unit for singular day in pod life remaining */ +"day" = "day"; + +/* Unit for plural days in pod life remaining */ +"days" = "days"; + +/* Unit for singular hour in pod life remaining */ +"hour" = "hour"; + +/* Unit for plural hours in pod life remaining */ +"hours" = "hours"; + +/* Unit for singular minute in pod life remaining */ +"minute" = "minute"; + +/* Unit for plural minutes in pod life remaining */ +"minutes" = "minutes"; + +/* Title of insulin delivery section */ +"Insulin Delivery" = "Insulin Delivery"; + +/* */ +"Scheduled Basal" = "Scheduled Basal"; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin Remaining"; + +/* Section header for activity section */ +"Activity" = "Activity"; + +/* title for device details page */ +"Device Details" = "Device Details"; + +/* Section header for configuration section */ +"Configuration" = "Configuration"; + +/* Settings page link description when next lifecycle action is to finish deactivation */ +"Finish deactivation" = "Finish deactivation"; + +/* Settings page link description when next lifecycle action is to replace pod */ +"Replace Pod" = "Replace Pod"; + +/* Settings page link description when next lifecycle action is to replace pod */ +"Replace Pod" = "Replace Pod"; + +/* Label for pod life state when pod not fully activated */ +"Unfinished Activation" = "Unfinished Activation"; + +/* Label for pod life state when time remaining */ +"Pod expires in" = "Pod expires in"; + +/* Label for pod life state when within pod expiration window */ +"Pod expired" = "Pod expired"; + +/* Label for pod life state when pod not fully deactivated */ +"Unfinished deactivation" = "Unfinished deactivation"; + +/* Label for pod life state when no pod paired */ +"No Pod" = "No Pod"; + +/* Pod life HUD view label */ +"Fault" = "Fault"; + +/* Label describing pod age view */ +"Pod Age" = "Pod Age"; + +/* Label describing time remaining view */ +"Remaining" = "Remaining"; + +/* Label indicating pod replacement necessary */ +"Replace Pod" = "Replace Pod"; + +/* Error message shown when no pod is paired */ +"No pod paired" = "No pod paired"; + +/* Error message shown when user cannot pair because pod is already paired */ +"Pod already paired" = "Pod already paired"; + +/* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ +"Insulin type not configured" = "Insulin type not configured"; + +/* Error message when cannula insertion fails because the pod is in an unexpected state */ +"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; + +/* Error description for OmniBLEPumpManagerError.invalidSetting */ +"Invalid Setting" = "Invalid Setting"; + +/* Recovery suggestion shown when no pod is paired */ +"Please pair a new pod" = "Please pair a new pod"; + +/* Generic title of the OmniBLE pump manager */ +"Omnipod DASH" = "Omnipod DASH"; + +/* Status highlight that delivery is uncertain. */ +"Comms Issue" = "Comms Issue"; + +/* */ +"Finish Pairing" = "Finish Pairing"; + +/* Status highlight that when pod is deactivating */ +"Finish Deactivation" = "Finish Deactivation"; + +/* Status highlight that when no pod is paired. */ +"No Pod" = "No Pod"; + +/* Status highlight message for emptyReservoir alarm. */ +"No Insulin" = "No Insulin"; + +/* Status highlight message for podExpired alarm. */ +"Pod Expired" = "Pod Expired"; + +/* Status highlight message for occlusion alarm. */ +"Pod Occlusion" = "Pod Occlusion"; + +/* Status highlight message for other alarm. */ +"Pod Error" = "Pod Error"; + +/* Status highlight that a pump is out of insulin. */ +"No Insulin" = "No Insulin"; + +/* Status highlight that insulin delivery was suspended. */ +"Insulin Suspended" = "Insulin Suspended"; + +/* Status highlight when communications with the pod haven't happened recently. */ +"Signal Loss" = "Signal Loss"; + +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Manual Basal"; + +/* */ +"Insert Cannula" = "Insert Cannula"; + +/* Cannula insertion button text while inserting */ +"Inserting..." = "Inserting..."; + +/* Cannula insertion button text while showing error */ +"Retry" = "Retry"; + +/* Cannula insertion button text while checking insertion */ +"Checking..." = "Checking..."; + +/* */ +"Check cannula insertion finished" = "Check cannula insertion finished"; + +/* */ +"Get pod status" = "Get pod status"; + +/* */ +"Save Basal Profile" = "Save Basal Profile"; + +/* */ +"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; + +/* */ +"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; + +/* */ +"Play Test Beeps" = "Play Test Beeps"; + +/* */ +"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; + +/* */ +"Read Pulse Log" = "Read Pulse Log"; + +/* */ +"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; + +/* */ +"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; + +/* */ +"Suspend" = "Suspend"; + +/* */ +"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; + +/* */ +"Resume" = "Resume"; + +/* */ +"Bolus" = "Bolus"; + +/* */ +"Cancel Bolus" = "Cancel Bolus"; + +/* Alert acknowledgment OK button */ +"OK" = "OK"; + +/* The title for Empty Reservoir alarm notification */ +"Empty Reservoir" = "Empty Reservoir"; + +/* The title for Occlusion alarm notification */ +"Occlusion Detected" = "Occlusion Detected"; + +/* The title for AlarmCode.other notification */ +"Critical Pod Error" = "Critical Pod Error"; + +/* The default notification body for AlarmCodes */ +"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin Remaining"; + +/* Button title to set temporary basal rate */ +"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; + +/* Section header for activity section */ +"Activity" = "Activity"; + +/* Section header for configuration section */ +"Configuration" = "Configuration"; + +/* Title for previous pod page */ +"Previous Pod" = "Previous Pod"; + +/* The title of the command to change pump time zone */ +"Pump Time" = "Pump Time"; + +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Adjusting Pump Time..."; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + +/* Label for PumpManager deletion button */ +"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; + +/* Title for pod sync time action sheet. */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; + +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "No, Keep Pump As Is"; + +/* Title for Omnipod DASH PumpManager deletion action sheet. */ +"Remove Pump" = "Remove Pump"; + +/* Message for Omnipod DASH PumpManager deletion action sheet */ +"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; + +/* Button text to confirm Omnipod DASH PumpManager deletion */ +"Delete Omnipod DASH" = "Delete Omnipod DASH"; + +/* Text for confidence reminders navigation link" */ +"Insulin Type" = "Insulin Type"; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + +/* Title for suspend duration selection action sheet */ +"Suspend Delivery" = "Suspend Delivery"; + +/* Message for suspend duration selection action sheet */ +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; + +/* Button text for 30 minute suspend duration */ +"30 minutes" = "30 minutes"; + +/* Button text for 1 hour suspend duration" */ +"1 hour" = "1 hour"; + + /* Button text for 1 hour 30 minute suspend duration */ +"1 hour 30 minutes" = "1 hour 30 minutes"; + +/* Button text for 2 hour suspend duration */ +"2 hours" = "2 hours"; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; + +/* Alert title for resume error */ +"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; + +/* Alert title for time sync error */ +"Failed to Set Pump Time" = "Failed to Set Pump Time"; + +/* Alert title for failing to cancel manual basal error */ +"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; + +/* */ +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; + +/* Instructions for deactivate pod when pod not on body */ +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; + +/* Deactivate pod action button */ +"Deactivate Pod" = "Deactivate Pod"; + +/* Deactivate pod action button accessibility label while deactivating */ +"Deactivating." = "Deactivating."; + +/* Deactivate pod action button accessibility label when deactivation complete */ +"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; + +/* Action button description for deactivate after failed attempt */ +"Retry" = "Retry"; + +/* Action button description when deactivated */ +"Continue" = "Continue"; + +/* Format string for recovery suggestion during deactivate pod. */ +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; + +/* Text for discard pod button */ +"Discard Pod" = "Discard Pod"; + +/* Title for remove pod modal */ +"Remove Pod from Body" = "Remove Pod from Body"; + +/* Alert message body for confirm pod attachment */ +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Insulin Unit */ +"U" = "U"; + +/* The action string on pod status page when pod expired */ +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; + +/* Label text for step 1 of pair pod instructions */ +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; + +/* Label text for step 2 of pair pod instructions */ +"Listen for 2 beeps." = "Listen for 2 beeps."; + +/* Label text indicating pairing finished.*/ +"Paired" = "Paired"; + +/* Cancel button text in navigation bar on pair pod UI */ +"Cancel" = "Cancel"; + +/* Alert title for cancel pairing modal */ +"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; + +/* Alert message body for confirm pod attachment */ +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; + +/* Button title for confirm deactivation option */ +"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; + +/* Continue pairing button title of in pairing cancel modal */ +"No, Continue With Pod" = "No, Continue With Pod"; + +/* Label text for step one of attach pod instructions */ +"Prepare site." = "Prepare site."; + +/* Label text for step two of attach pod instructions */ +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; + +/* Label text for step three of attach pod instructions */ +"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; + +/* Action button title for attach pod view */ +"Continue" = "Continue"; + +/* */ +"Attach Pod" = "Attach Pod"; + +/* Alert title for confirm pod attachment */ +"Confirm Pod Attachment" = "Confirm Pod Attachment"; + +/* Alert message body for confirm pod attachment */ +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; + +/* Button title for confirm attachment option */ +"Confirm" = "Confirm"; + +/* Label text for step one of insert cannula instructions */ +"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; + +/* Label text for step two of insert cannula instructions */ +"Wait until insertion is completed." = "Wait until insertion is completed."; + +/* Label text indicating insertion finished. */ +"Inserted" = "Inserted"; + +/* Check Cannula */ +"Check Cannula" = "Check Cannula"; + +/* */ +"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; + +/* Description of proper cannula insertion */ +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; + +/* Button label for user to answer cannula was properly inserted */ +"Yes" = "Yes"; + +/* Button label for user to answer cannula was not properly inserted */ +"No" = "No"; + +/* Pod pairing action button text while pairing */ +"Pairing..." = "Pairing..."; + +/* Pod pairing action button text while priming */ +"Priming..." = "Priming..."; + +/* */ +"Deactivating..." = "Deactivating..."; + +/* Pod state when pod has been deactivated */ +"Deactivated" = "Deactivated"; + +/* Format string for instructions for setup complete view. (1: app name) */ +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; + +/* */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* Label for expiration reminder row */ +"Time" = "Time"; + +/* Action button title to continue at Setup Complete */ +"Finish Setup" = "Finish Setup"; + +/* */ +"Setup Complete" = "Setup Complete"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* Error message description for PeripheralManagerError.notReady */ +"Peripheral Not Ready" = "Peripheral Not Ready"; + +/* Error message description for PeripheralManagerError.incorrectResponse */ +"Incorrect Response" = "Incorrect Response"; + +/* Error message description for PeripheralManagerError.timeout */ +"Timeout" = "Timeout"; + +/* Error message description for PeripheralManagerError.emptyValue */ +"Empty Value" = "Empty Value"; + +/* Error message description for PeripheralManagerError.unknownCharacteristic */ +"Unknown Characteristic" = "Unknown Characteristic"; + +/* Error message description for PeripheralManagerError.nack */ +"Nack" = "Nack"; + +/* Title for omnipod reminders section */ +"Omnipod Reminders" = "Omnipod Reminders"; + +/* Footer text for omnipod reminders section */ +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; + +/* Footer text for scheduled reminder area */ +"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; + +/* */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* Footer text for low reservoir value row */ +"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; + +/* Description text for critical alerts */ +"Critical Alerts" = "Critical Alerts"; + +/* Description text for critical alerts */ +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; + +/* navigation title for notification settings */ +"Notification Settings" = "Notification Settings"; + +/* Label for scheduled reminder value row */ +"Time" = "Time"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* Label for low reservoir reminder row */ +"Low Reservoir Reminder" = "Low Reservoir Reminder"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; + +/* Title string for BeepPreference.silent */ +"Disabled" = "Disabled"; + +/* Title string for BeepPreference.manualCommands */ +"Enabled" = "Enabled"; + +/* Title string for BeepPreference.extended */ +"Extended" = "Extended"; + +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "No confidence reminders are used."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; + +/* Label text for temporary basal rate summary */ +"Rate" = "Rate"; + +/* Insulin unit per hour */ +"U/hr" = "U/hr"; + +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ for %2$@"; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; + +/* Button text for setting manual temporary basal rate*/ +"Set Temporary Basal" = "Set Temporary Basal"; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporary Basal"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal Failed"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Missing Config"; + +/* Alert format string for missing temp basal configuration. */ +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; + +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Expiration Reminder Default"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Previous Pod Information"; + +/* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ +"No\nDelivery" = "No\nDelivery"; + +/* description label for active time pod details row */ +"Active Time"= "Active Time"; + +/* description label for total delivery pod details row */ +"Total Delivery" = "Total Delivery"; + +/* description label for device name pod details row */ +"Device Name" = "Device Name"; + +/* description label for lot number pod details row */ +"Lot Number" = "Lot Number"; + +/* description label for sequence number pod details row */ +"Sequence Number" = "Sequence Number"; + +/* description label for firmware version pod details row */ +"Firmware Version" = "Firmware Version"; + +/* description label for ble firmware version pod details row */ +"BLE Firmware Version" = "BLE Firmware Version"; + +/* description label for activated at timne pod details row */ +"Pod Activated" = "Pod Activated"; + +/* description label for active time pod details row */ +"Active Time" = "Active Time"; + +/* description label for last status date pod details row */ +"Last Status" = "Last Status"; + +/* description label for pod fault details */ +"Pod Fault Details" = "Pod Fault Details"; + +/* Title for PodSetupView */ +"Pod Setup" = "Pod Setup"; + +/* bodyText for PodSetupView */ +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; + +/* Cancel button title */ +"Cancel" = "Cancel"; + +/* Text for continue button on PodSetupView */ +"Continue" = "Continue"; + +/* Are you sure you want to skip Omnipod Onboarding? */ +"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; + +/* Description text on ExpirationReminderSetupView */ +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; + +/* Text of continue button on ExpirationReminderSetupView" */ +"Next" = "Next"; + +/* */ +"Expiration Reminder" = "Expiration Reminder"; + +/* Description text on LowReservoirReminderSetupView */ +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; + +/* Label text for low reservoir value row */ +"Low Reservoir" = "Low Reservoir"; + +/* */ +"Save" = "Save"; + +/* hr (short for hour) */ +"hr" = "hr"; + +/* Button title to cancel manual basal */ +"Cancel Manual Basal" = "Cancel Manual Basal"; + +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulin\nSuspended"; + +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Resume Insulin Delivery"; + +/* Recovery suggestion when no pod is available */ +"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; + +/* Error message shown when the pod is not connected */ +"Pod not connected" = "Pod not connected"; + +/* Label for suspended at time */ +"Suspended At" = "Suspended At"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Resuming insulin delivery..."; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Suspending insulin delivery..."; + +/* Error message for PodCommsError.noPodsFound */ +"No pods found" = "No pods found"; + +/* Error message for PodCommsError.tooManyPodsFound */ +"Too many pods found" = "Too many pods found"; + +/* Recovery suggestion when no response is received from pod */ +"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; + +/* Recovery suggestion when ack received instead of response */ +"Try again" = "Try again"; + +/* Recovery suggestion for PodCommsError.tooManyPodsFound */ +"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; + +/* Recovery suggestion for PodCommsError.noPodsFound */ +"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; + +/* Recovery suggestion when pairing signal strength is too high */ +"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; + +/* Recovery suggestion when pairing signal strength is too low */ +"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; + +/* Recovery suggestion on unexpected pod change */ +"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; + +/* Recovery suggestion when unexpected address received */ +"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; + +/* Recovery suggestion when no pod is available */ +"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; + +/* Recovery suggestion when operation could not be completed due to existing bolus in progress */ +"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; + +/* Recovery suggestion when operation could not be completed due to existing bolus in progress */ +"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; + +/* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ +"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; + +/* DASH Pod time ago since last status */ +"%@ ago" = "%@ ago"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; + +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; + +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index fa893bc13c..9a83b2ea1d 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -303,6 +303,8 @@ 191DB66A2A06F17800212AC9 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; 191DB66B2A06F17800212AC9 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; 191DB66C2A06F17800212AC9 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E492B44C21100525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E4A2B44C21100525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; 196A6F222AFFFD1200E3C089 /* SilencePodPreference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SilencePodPreference.swift; sourceTree = ""; }; 4B23AA6328D909E2009B453B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 4B23AA6428D909E7009B453B /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; @@ -1009,6 +1011,7 @@ bn, "pt-PT", ca, + hu, ); mainGroup = 84752E7826ED0FFE009FD801; packageReferences = ( @@ -1283,6 +1286,7 @@ 191DB66A2A06F17800212AC9 /* pt-PT */, 191DB66B2A06F17800212AC9 /* ro */, 191DB66C2A06F17800212AC9 /* ca */, + 193F1E492B44C21100525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1316,6 +1320,7 @@ 1909F73C2A127FEF00F145A2 /* uk */, 1909F73D2A127FF300F145A2 /* pt-PT */, 1909F73E2A127FF800F145A2 /* ca */, + 193F1E4A2B44C21100525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; diff --git a/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..5d77765663 --- /dev/null +++ b/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings @@ -0,0 +1,1132 @@ +/* Description for an inactive alert modifier */ +" (inactive)" = " (inaktiv)"; + +/* No comment provided by engineer. */ +"—" = "—"; + +/* Format string for last status date on pod details screen */ +"%@ ago" = "%@ vor"; + +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* No comment provided by engineer. */ +"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ hat die Kommunikation mit dem Pod an Ihrem Körper wiederhergestellt.\n\nDie Insulinabgabeaufzeichnungen wurden aktualisiert und sollten mit dem übereinstimmen, was tatsächlich abgegeben wurde.\n\nSie können %@ jetzt normal weiter verwenden."; + +/* Format string for reservoir volume when above maximum reading. (1: The maximum reading) */ +"%@+ U" = "%@+ IE"; + +/* Format string for reservoir volume. (1: The localized volume) */ +"%@U" = "%@U"; + +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ für %2$@"; + +/* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ +"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ konnte seit %2$@ nicht mehr mit Ihrem Pod kommunizieren.\n\nOhne Kommunikation mit dem Pod kann die App keine Befehle für die Insulinabgabe senden oder genaue, aktuelle Informationen über Ihr aktives Insulin oder das vom Pod abgegebene Insulin anzeigen.\n\nÜberwachen Sie Ihren Blutzucker für die nächsten 6 oder mehr Stunden genau, da in Ihrem Körper Insulin aktiv sein kann oder auch nicht, das %3$@ nicht anzeigen kann."; + +/* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ Insulin oder weniger verbleibend im Pod. Pod bald wechseln."; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"%1$@ units remaining at %2$@" = "%1$@ IE verbleibend bei %2$@"; + +/* Format string for reservoir level above max measurable threshold. (1: measurable reservoir threshold) (2: units) */ +"%1$@+ %2$@" = "%1$@+ %2$@"; + +/* Format string for total delivery on pod details screen */ +"%g U" = "%g IE"; + +/* Button text for 1 hour suspend duration */ +"1 hour" = "1 Stunde"; + +/* Button text for 1 hour 30 minute suspend duration */ +"1 hour 30 minutes" = "1 Stunde 30 Minuten"; + +/* Button text for 2 hour suspend duration */ +"2 hours" = "2 Stunden"; + +/* Button text for 30 minute suspend duration */ +"30 minutes" = "30 Minuten"; + +/* Format string for activation time exceeded + Pod state when activation not completed in the time allowed */ +"Activation time exceeded" = "Aktivierungszeit überschritten"; + +/* description label for active time pod details row */ +"Active Time" = "Laufzeit"; + +/* Section header for activity section */ +"Activity" = "Aktivität"; + +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Pumpenzeit einstellen"; + +/* Alert title for cancel pairing modal */ +"Are you sure you want to cancel Pod setup?" = "Sind Sie sicher, dass Sie die Pod-Einrichtung abbrechen möchten?"; + +/* No comment provided by engineer. */ +"Are you sure you want to skip Omnipod Onboarding?" = "Sind Sie sicher, dass Sie das Omnipod Onboarding überspringen wollen?"; + +/* Message for Omnipod DASH PumpManager deletion action sheet */ +"Are you sure you want to stop using Omnipod DASH?" = "Sind Sie sicher, dass Sie keinen Omnipod DASH mehr benutzen möchten?"; + +/* navigation bar title attach pod + Title for Attach Pod screen */ +"Attach Pod" = "Pod anbringen"; + +/* Description string above progress indicator while attempting to re-establish communication from an unacknowledged command */ +"Attemping to re-establish communication" = "Versuche die Verbindung wieder aufzubauen"; + +/* Description for auto-off */ +"Auto-off" = "Auto-Off"; + +/* Description for auto-off alarm */ +"Auto-off alarm" = "Auto-Off Alarm"; + +/* Back button text on DeliveryUncertaintyRecoveryView */ +"Back" = "Zurück"; + +/* Pod state when basal initialized */ +"Basal initialized" = "Basal initialisiert"; + +/* Pod state when running below fifty units */ +"Below 50 units" = "Weniger als 50 Einheiten"; + +/* description label for ble firmware version pod details row */ +"BLE Firmware Version" = "BLE Firmware Version"; + +/* Error description for BluetoothManagerError.bluetoothNotAvailable(.poweredOff) */ +"Bluetooth is powered off" = "Bluetooth ist ausgeschaltet"; + +/* Error description for BluetoothManagerError.bluetoothNotAvailable(.resetting) */ +"Bluetooth is resetting" = "Bluetooth wird zurückgesetzt"; + +/* Error description for BluetoothManagerError.bluetoothNotAvailable(.unknown) */ +"Bluetooth is unavailable for an unknown reason." = "Bluetooth ist aus einem unbekannten Grund nicht verfügbar."; + +/* The format string for BluetoothManagerError.bluetoothNotAvailable for unknown state (1: the unknown state) */ +"Bluetooth is unavailable: %1$@" = "Bluetooth ist nicht verfügbar: %1$@"; + +/* Error description for BluetoothManagerError.bluetoothNotAvailable(.unauthorized) */ +"Bluetooth use is unauthorized" = "Bluetooth-Nutzung ist nicht erlaubt"; + +/* Error description for BluetoothManagerError.bluetoothNotAvailable(.unsupported) */ +"Bluetooth use unsupported on this device" = "Bluetooth-Verwendung wird auf diesem Gerät nicht unterstützt"; + +/* Pump Event title for UnfinalizedDose with doseType of .bolus */ +"Bolus" = "Bolus"; + +/* Error message shown when operation could not be completed due to existing bolus in progress */ +"Bolus in progress" = "Bolusabgabe läuft "; + +/* The format string describing a bolus. (1: The amount delivered)(2: Start time of the dose)(3: duration)(4: scheduled certainty) */ +"Bolus: %1$@U %2$@ %3$@ %4$@" = "Bolus: %1$@IE %2$@ %3$@ %4$@"; + +/* Delivery status when bolusing */ +"Bolusing" = "Bolusabgabe"; + +/* Delivery status when bolusing and temp basal is running */ +"Bolusing with temp basal" = "Bolus-Abgabe mit temporärer Basalrate"; + +/* Button title for cancelling low reservoir reminder edit + Button title for cancelling scheduled reminder date edit + Cancel button text in navigation bar on insert cannula screen + Cancel button text in navigation bar on pair pod UI + Cancel button title + Pairing interface navigation bar button text for cancel action */ +"Cancel" = "Abbrechen"; + +/* Button title to cancel manual basal */ +"Cancel Manual Basal" = "Manuelles Basal abbrechen"; + +/* Insert cannula action button accessibility label when cannula insertion succeeded */ +"Cannula inserted successfully. Continue." = "Kanüle erfolgreich eingeführt. Weiter."; + +/* Pod state when inserting cannula */ +"Cannula inserting" = "Einsetzen der Kanüle"; + +/* String describing a dose that was certainly scheduled */ +"Certain" = "Sicher"; + +/* The action string on pod status page when pod expired */ +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Pod jetzt wechseln. Die Insulinabgabe stoppt 8 Stunden nach Ablauf des Pods oder wenn kein Insulin mehr vorhanden ist."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Pod jetzt wechseln. Die Insulinabgabe stoppt in %1$@ oder wenn kein Insulin mehr vorhanden ist."; + +/* Alert content body for podExpireImminent pod alert */ +"Change Pod now. Insulin delivery will stop in 1 hour." = "Pod jetzt wechseln. Die Insulinabgabe stoppt in 1 Stunde."; + +/* Alert content body for podExpiring pod alert */ +"Change Pod now. Pod has been active for 72 hours." = "Pod jetzt wechseln. Der Pod ist seit 72 Stunden aktiv."; + +/* navigation bar title for check cannula + Title for check cannula screen */ +"Check Cannula" = "Prüfe die Kanüle"; + +/* Label text for step three of attach pod instructions */ +"Check Pod, apply to site, then confirm pod attachment." = "Überprüfe den Pod, bringe ihn an und bestätige dann die Pod-Anbringung."; + +/* Insert cannula action button accessibility label checking insertion */ +"Checking Insertion" = "Prüfe die Einfügung"; + +/* Cannula insertion button text while checking insertion */ +"Checking..." = "Prüfe…"; + +/* Format string for invalid message error code (1: error code number) */ +"Command error %1$u" = "Befehlsfehler %1$u"; + +/* Status highlight that delivery is uncertain. */ +"Comms Issue" = "Comms Problem"; + +/* Title for uncertainty recovered screen */ +"Comms Recovered" = "Kommunikation wiederhergestellt"; + +/* Error message when command is rejected because an unacknowledged command is pending. */ +"Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Unbestätigter Befehl steht noch aus."; + +/* navigation title for confidence reminders + Text for confidence reminders navigation link */ +"Confidence Reminders" = "Sicherheitserinnerung"; + +/* No comment provided by engineer. */ +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Vertrauenserinnerungen sind Pieptöne vom Pod, die verwendet werden können, um ausgewählte Befehle zu bestätigen."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Vertrauenserinnerungen ertönen für von Ihnen initiierte Befehle, wie Bolus, Bolus abbrechen, Unterbrechen, Fortsetzen, Benachrichtigungserinnerungen speichern usw. Wenn Loop die Abgabe automatisch anpasst, werden keine Vertrauenserinnerungen verwendet."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Vertrauenserinnerungen ertönen, wenn Loop die Lieferung automatisch anpasst, sowie für von Ihnen initiierte Befehle."; + +/* Section header for configuration section */ +"Configuration" = "Konfiguration"; + +/* Button title for confirm attachment option */ +"Confirm" = "Bestätige"; + +/* Alert title for confirm pod attachment */ +"Confirm Pod Attachment" = "Bestätige Pod Befestigung"; + +/* Action button description when deactivated + Action button title for attach pod view + Button title to continue + Cannula insertion button text when inserted + Pod pairing action button text when paired + Text for continue button + Text for continue button on PodSetupView + Title of button to continue discard */ +"Continue" = "Weiter"; + +/* The format string for PodProtocolError.couldNotParseMessageException (1: message associated with error) */ +"Could not parse message: %1$@" = "Nachrichte konnte nicht analysiert werden: %1$@"; + +/* Title for critical alerts description */ +"Critical Alerts" = "Kritische Warnungen"; + +/* The title for AlarmCode.other notification */ +"Critical Pod Error" = "Kritischer Pod-Fehler"; + +/* Recovery suggestion when unexpected address received */ +"Crosstalk possible. Please move to a new location" = "Überlagerungen möglich. Bitte wechseln Sie an einen neuen Standort"; + +/* Unit for singular day in pod life remaining */ +"day" = "Tag"; + +/* Unit for plural days in pod life remaining */ +"days" = "Tage"; + +/* Action button description for deactivate while pod still active + Button text for deactivate pod button + Button title to deactive pod on uncertain program + Deactivate pod action button accessibility label while ready to deactivate + navigation bar title for deactivate pod + Title for deactivate pod screen */ +"Deactivate Pod" = "Pod deaktivieren"; + +/* Pod state when pod has been deactivated */ +"Deactivated" = "Deaktiviert"; + +/* Deactivate pod action button accessibility label while deactivating */ +"Deactivating." = "Deaktiviere."; + +/* Action button description while deactivating */ +"Deactivating..." = "Deaktiviere…"; + +/* Button text to confirm Omnipod DASH PumpManager deletion */ +"Delete Omnipod DASH" = "Omnipod DASH löschen"; + +/* Text for device details disclosure row + title for device details page */ +"Device Details" = "Gerätedetails"; + +/* description label for device name pod details row */ +"Device Name" = "Gerätename"; + +/* Title string for BeepPreference.silent */ +"Disabled" = "Ausgeschaltet"; + +/* Pairing interface navigation bar button text for discard pod action + Text for discard pod button */ +"Discard Pod" = "Pod verwerfen"; + +/* No comment provided by engineer. */ +"Done" = "Fertig"; + +/* Description for Empty reservoir pod fault */ +"Empty reservoir" = "Reservoir leer"; + +/* The title for Empty Reservoir alarm notification */ +"Empty Reservoir" = "Leeres Reservoir"; + +/* Error message shown when empty response from pod was received */ +"Empty response from pod" = "Leere Antwort vom Pod"; + +/* Error message description for PeripheralManagerError.emptyValue */ +"Empty Value" = "Leerer Wert"; + +/* Title string for BeepPreference.manualCommands */ +"Enabled" = "Aktiviert"; + +/* Accessibility label indicating an error occurred */ +"Error" = "Fehler"; + +/* Pod state error event logged shutting down */ +"Error event logged, shutting down" = "Fehlerereignis protokolliert, fahre herunter"; + +/* Description for expiration advisory */ +"Expiration advisory" = "Ablaufhinweis"; + +/* Description for expiration alert */ +"Expiration alert" = "Ablaufalarm"; + +/* navigation bar title for expiration reminder + Title for ExpirationReminderSetupView */ +"Expiration Reminder" = "Erinnerung an den Ablauf der Nutzungsdauer"; + +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Standard Erinnerung an den Ablauf der Nutzungsdauer"; + +/* Title string for BeepPreference.extended */ +"Extended" = "Verzögerung"; + +/* Delivery status when extended bolus is running */ +"Extended bolus running" = "Verzögerter Bolus aktiv"; + +/* Delivery status when extended bolus and temp basal is running */ +"Extended bolus running with temp basal" = "Verzögerter Bolus mit temporärer Basalrate aktiv"; + +/* Alert title for failing to cancel manual basal error */ +"Failed to Cancel Manual Basal" = "Fehler beim Abbrechen der manuellen Basalrate"; + +/* Alert title for resume error */ +"Failed to Resume Insulin Delivery" = "Wiederaufnahme der Insulinabgabe fehlgeschlagen"; + +/* Alert title for time sync error */ +"Failed to Set Pump Time" = "Fehler beim Einstellen der Pumpenzeit"; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Fehler beim Anhalten der Insulinabgabe"; + +/* Alert title for error when updating confidence reminder preference */ +"Failed to update confidence reminder preference." = "Fehler beim Aktualisieren der Einstellung für die Sicherheitserinnerung."; + +/* Alert title for error when updating expiration reminder */ +"Failed to Update Expiration Reminder" = "Fehler beim Aktualisieren der Ablauferinnerung"; + +/* Alert title for error when updating low reservoir reminder */ +"Failed to Update Low Reservoir Reminder" = "Fehler beim Aktualisieren der Erinnerung für einen niedrigen Vorratsbehälter"; + +/* Pod life HUD view label */ +"Fault" = "Störung"; + +/* Pod state when fault event has occurred */ +"Fault event occurred" = "Fehlerereignis aufgetreten"; + +/* Label text for step 1 of pair pod instructions */ +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fülle U-100 Insulin in den Pod (lasse die blaue Kappe drauf)"; + +/* Settings page link description when next lifecycle action is to finish deactivation */ +"Finish deactivation" = "Deaktivierung abschließen"; + +/* Status highlight that when pod is deactivating. */ +"Finish Deactivation" = "Deaktivierung abgeschlossen"; + +/* Status highlight that when pod is activating. */ +"Finish Pairing" = "Kopplung abgeschlossen"; + +/* Action button title to continue at Setup Complete */ +"Finish Setup" = "Einrichtung abschließen"; + +/* Description for finish setup */ +"Finish setup " = "Einrichtung abgeschlossen"; + +/* Description for finish setup reminder */ +"Finish setup reminder" = "Einrichtungserinnerung abgeschlossen"; + +/* description label for firmware version pod details row */ +"Firmware Version" = "Firmware Version"; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"Greater than %1$@ units remaining at %2$@" = "Mehr als %1$@ verbleibende Einheiten um %2$@"; + +/* Unit for singular hour in pod life remaining */ +"hour" = "Stunde"; + +/* Unit for plural hours in pod life remaining */ +"hours" = "Stunden"; + +/* Alert message body for confirm pod attachment */ +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Wenn Du die Einrichtung abbrichst, dann wird der Pod deaktiviert und unbrauchbar."; + +/* The format string for PodProtocolError.incorrectPacketException (1: payload)(2: location) */ +"Incorrect Packet Exception: %1$@ (location=%2$d)" = "Incorrect Packet Exception: %1$@ (location=%2$d)"; + +/* Error message description for PeripheralManagerError.incorrectResponse */ +"Incorrect Response" = "Falsche Antwort"; + +/* Pod inititialized */ +"Initialized" = "Initialisiert"; + +/* Cannula insertion button text while ready to insert + Insert cannula action button accessibility label while ready to pair + navigation bar title for insert cannula + Title for insert cannula screen */ +"Insert Cannula" = "Kanüle einsetzen"; + +/* Label text indicating insertion finished. */ +"Inserted" = "Eingeführt"; + +/* Pod state when inserting cannula */ +"Inserting cannula" = "Einfügen von Kanüle"; + +/* Insert cannula action button accessibility label while pairing */ +"Inserting. Please wait." = "Füge ein, bitte warte…"; + +/* Cannula insertion button text while inserting */ +"Inserting..." = "Füge ein…"; + +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulinabgabe\nunterbrochen"; + +/* Title of insulin delivery section */ +"Insulin Delivery" = "Insulin Delivery"; + +/* The action string on pod status page when pod faulted + The default notification body for AlarmCodes */ +"Insulin delivery stopped. Change Pod now." = "Insulinabgabe wurde gestoppt. Pod jetzt wechseln."; + +/* Message for suspend duration selection action sheet */ +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Die Insulinabgabe wird angehalten, bis Sie sie manuell wieder aufnehmen. Wann soll Loop Sie daran erinnern, die Abgabe fortzusetzen?"; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Verbleibendes Insulin"; + +/* Status highlight that insulin delivery was suspended. */ +"Insulin Suspended" = "Insulinabgabe unterbrochen"; + +/* Text for confidence reminders navigation link + Title for insulin type selection screen */ +"Insulin Type" = "Insulintyp"; + +/* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ +"Insulin type not configured" = "Insulintyp nicht konfiguriert"; + +/* The format string for Internal pod fault (1: The fault code value) */ +"Internal pod fault %1$03d" = "Interner Podfehler %1$03d"; + +/* The format string describing a bolus that was interrupted. (1: The amount delivered)(2: The amount scheduled)(3: Start time of the dose)(4: duration)(5: scheduled certainty) */ +"InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "Abgebrochener Bolus: %1$@ IE (%2$@ IE geplant) %3$@ %4$@ %5$@"; + +/* Error message for when unexpected address is received (1: received address) (2: expected address) */ +"Invalid address 0x%x. Expected 0x%x" = "Ungültige Adresse (%1$x). Adresse %2$x erwartet"; + +/* Description for MessageError invalidAddress */ +"Invalid address: (%1$@)" = "Ungültige Adresse (%1$@)"; + +/* Description for MessageError invalidCrc */ +"Invalid CRC" = "Ungültiger CRC"; + +/* The format string for PodProtocolError.invalidLTKKey (1: message associated with error) */ +"Invalid LTK Key: %1$@" = "Invalid LTK Key: %1$@"; + +/* Error description for OmniBLEPumpManagerError.invalidSetting */ +"Invalid Setting" = "Ungültige Einstellung"; + +/* Question to confirm the cannula is inserted properly */ +"Is the cannula inserted properly?" = "Wurde der Katheter ordentlich eingeführt?"; + +/* description label for last status date pod details row */ +"Last Status" = "Letzter Status"; + +/* Label text for step 2 of pair pod instructions */ +"Listen for 2 beeps." = "Achte auf zwei Pieptöne."; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop passt Ihre Insulinabgabe nicht automatisch an, bis die temporäre Basalrate beendet oder abgebrochen wurde."; + +/* description label for lot number pod details row */ +"Lot Number" = "LOT Nummer"; + +/* Pod state when running with fifty or less units */ +"Low reservoir" = "Niedriges Reservoir"; + +/* Alert content title for lowReservoir pod alert + Label text for low reservoir value row + navigation bar title for low reservoir + Title for LowReservoirReminderSetupView */ +"Low Reservoir" = "Niedriges Reservoir"; + +/* Format string for description for low reservoir advisory (1: reminder units) */ +"Low reservoir advisory (%1$gU)" = "Hinweis auf niedriges Reservior (%1$gU)"; + +/* Description for low reservoir alarm */ +"Low reservoir advisory alarm" = "Hinweisalarm für fast leeres Reservoir"; + +/* Label for low reservoir reminder row + Title for low reservoir reminder edit page */ +"Low Reservoir Reminder" = "Erinnerung an niedriges Reservoir"; + +/* Recovery suggestion when no response is received from pod */ +"Make sure iPhone is nearby the active pod" = "Stellen Sie sicher, dass Ihr iPhone nah am Pod ist"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Stellen Sie sicher, dass sich Ihr iPhone und Ihr Pod nahe beieinander befinden. Wenn die Kommunikationsprobleme bestehen bleiben, dann gehen Sie an einen anderen Ort."; + +/* Recovery suggestion for PodCommsError.noPodsFound */ +"Make sure your pod is filled and nearby." = "Stellen Sie sicher, dass Ihr Pod gefüllt und in der Nähe ist."; + +/* Recovery suggestion when no pod is available */ +"Make sure your pod is nearby and try again." = "Stellen Sie sicher, dass sich Ihr Pod in der Nähe befindet, und versuchen Sie es erneut."; + +/* Recovery suggestion when no RileyLink is available */ +"Make sure your RileyLink is nearby and powered on" = "Stellen Sie sicher, dass sich Ihr RileyLink in der Nähe befindet und eingeschaltet ist"; + +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Manuelle Basalrate"; + +/* Pod memory initialized */ +"Memory initialized" = "Speicher initialisiert"; + +/* The format string for PodProtocolError.messageIOException (1: message associated with error) */ +"Message IO Exception: %1$@" = "Message IO Exception: %1$@"; + +/* Unit for singular minute in pod life remaining */ +"minute" = "Minute"; + +/* Unit for plural minutes in pod life remaining */ +"minutes" = "Minuten"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Fehlende Konfiguration"; + +/* Recovery suggestion for PodCommsError.tooManyPodsFound */ +"Move to a new area away from any other pods and try again." = "Begeben Sie sich in einen anderen Bereich, entfernt von anderen Pods und versuchen Sie es erneut."; + +/* Alert content body for multiCommand pod alert + Alert content title for multiCommand pod alert */ +"Multiple Command Alert" = "Warnung bei mehreren Befehlen"; + +/* String shown on pod details for active time when conversion fails. + String shown on pod details for last status date when not available. + String shown on pod details for total delivery when not available. */ +"NA" = "NV"; + +/* Error message description for PeripheralManagerError.nack */ +"Nack" = "nicht bestätigt"; + +/* Text of continue button on ExpirationReminderSetupView */ +"Next" = "Weiter"; + +/* Button label for user to answer cannula was not properly inserted */ +"No" = "Nein"; + +/* Text shown in insulin remaining space when no pod is paired */ +"No\nDelivery" = "Keine\nAbgabe"; + +/* Pod alert state when no alerts are active */ +"No alerts" = "Keine Alarme"; + +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "Es werden keine Sicherheitserinnerungen verwendet."; + +/* Description for Fault Event Code .noFaults */ +"No faults" = "Keine Fehler"; + +/* Error message for reservoir view when reservoir empty + Status highlight message for emptyReservoir alarm. + Status highlight that a pump is out of insulin. */ +"No Insulin" = "Kein Insulin"; + +/* Label for pod life state when no pod paired + Status highlight that when no pod is paired. + Text shown in insulin remaining space when no pod is paired */ +"No Pod" = "Kein Pod gekoppelt"; + +/* Error message shown when no pod is paired */ +"No pod paired" = "Kein Pod gekoppelt"; + +/* Error message for PodCommsError.noPodsFound */ +"No pods found" = "Keine Pods gefunden"; + +/* Value text for no expiration reminder */ +"No Reminder" = "Keine Erinnerung"; + +/* Error message shown when no response from pod was received */ +"No response from pod" = "Keine Rückmeldung vom Pod"; + +/* Error message shown when no response from pod was received */ +"No RileyLink available" = "Kein RileyLink verfügbar"; + +/* Continue pairing button title of in pairing cancel modal */ +"No, Continue With Pod" = "Nein, mit Pod fortfahren"; + +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "Nein, Pumpe so lassen wie sie ist"; + +/* Delivery status when basal is running + Pod state when running above fifty units */ +"Normal" = "Normal"; + +/* Description for MessageError notEnoughData */ +"Not enough data" = "Nicht genügend Daten"; + +/* navigation title for notification settings + Text for pod details disclosure row */ +"Notification Settings" = "Benachrichtigungseinstellungen"; + +/* No comment provided by engineer. */ +"Numbers" = "Zahlen"; + +/* Description for Occlusion detected pod fault */ +"Occlusion detected" = "Verstopfung erkannt"; + +/* The title for Occlusion alarm notification */ +"Occlusion Detected" = "Verstopfung erkannt"; + +/* Action button default text for PodAlerts */ +"Ok" = "OK"; + +/* Alert acknowledgment OK button */ +"OK" = "OK"; + +/* Generic title of the omnipod pump manager */ +"Omnipod" = "Omnipod"; + +/* Generic title of the OmniBLE pump manager */ +"Omnipod DASH" = "Omnipod DASH"; + +/* Title for omnipod reminders section */ +"Omnipod Reminders" = "Omnipod Erinnerung"; + +/* Pod state oneNotUsed */ +"oneNotUsed" = "oneNotUsed"; + +/* Pair Pod navigationBarTitle + Pod pairing action button text while ready to pair + Settings page link description when next lifecycle action is to pair new pod + Title for pod pairing screen */ +"Pair Pod" = "Pod koppeln"; + +/* Pairing action button accessibility label while ready to pair */ +"Pair pod." = "Pod koppeln."; + +/* Pod status after pairing */ +"Paired" = "Gekoppelt"; + +/* Pod status when pairing completed */ +"Pairing completed" = "Kopplung abgeschlossen"; + +/* The format string for PodProtocolError.pairingException (1: message associated with error) */ +"Pairing Exception: %1$@" = "Kopplungsausnahme: %1$@"; + +/* Pairing action button accessibility label while pairing */ +"Pairing." = "Koppeln"; + +/* Pod pairing action button text while pairing */ +"Pairing..." = "Koppeln…"; + +/* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ +"Parsing Error: %1$@ in (%2$@)" = "Parsing-Fehler: %1$@ in (%2$@)"; + +/* The format string for description of PodProtocolError.invalidCrc (1:payload crc)(2:computed crc) */ +"Payload crc32 %1$@ does not match computed crc32 %2$@" = "Payload crc32 %1$@ does not match computed crc32 %2$@"; + +/* No comment provided by engineer. */ +"Percent = %lf" = "Percent = %lf"; + +/* Error message description for PeripheralManagerError.notReady */ +"Peripheral Not Ready" = "Peripheriegerät nicht bereit"; + +/* Recovery suggestion on unexpected pod change */ +"Please bring only original pod in range or deactivate original pod" = "Bitte nur Original-Pod in Reichweite bringen oder Original-Pod deaktivieren"; + +/* Recovery suggestion when no response is received from pod */ +"Please bring your pod closer to the RileyLink and try again" = "Bitte bringen Sie Ihren Pod näher an Ihr RileyLink und versuchen Sie es erneut"; + +/* Alert message body for confirm pod attachment */ +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Bitte vergewissern Sie sich, dass der Pod sicher an Ihrem Körper befestigt ist.\n\nDer Katheter kann mit jedem Pod nur einmal eingeführt werden. Tippen Sie auf „Bestätigen“, wenn der Pod angeschlossen ist."; + +/* Instructions for deactivate pod when pod not on body */ +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Bitte deaktivieren Sie den Pod. Wenn die Deaktivierung abgeschlossen ist, können Sie einen neuen Pod koppeln."; + +/* Instructions for deactivate pod when pod is on body */ +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Bitte deaktivieren Sie den Pod. Wenn die Deaktivierung abgeschlossen ist, können Sie ihn entfernen und einen neuen Pod koppeln."; + +/* recoverySuggestion for BluetoothManagerError.bluetoothNotAvailable(.unauthorized) */ +"Please enable bluetooth permissions for this app in system settings" = "Bitte aktiviere die Bluetooth-Berechtigungen für diese App in den Systemeinstellungen"; + +/* Alert content body for finishSetupReminder pod alert */ +"Please finish pairing your pod." = "Bitte schließen Sie die Kopplung Ihres Pods ab."; + +/* Recover suggestion shown when no pod is paired */ +"Please pair a new pod" = "Bitte koppel einen neuen Pod"; + +/* Recovery suggestion when pairing signal strength is too high */ +"Please reposition iPhone further from the pod" = "Bitte positionieren Sie das iPhone weiter vom Pod entfernt"; + +/* Recovery suggestion when pairing signal strength is too low */ +"Please reposition iPhone relative to the pod" = "Bitte positionieren Sie das iPhone relativ zum Pod neu"; + +/* recoverySuggestion for BluetoothManagerError.bluetoothNotAvailable(.unsupported) */ +"Please use a different device with bluetooth capabilities" = "Bitte verwenden Sie ein anderes Gerät mit Bluetooth-Funktion"; + +/* description label for activated at timne pod details row + Label for pod insertion row */ +"Pod Activated" = "Pod aktiviert"; + +/* Label describing pod age view */ +"Pod Age" = "Pod-Alter"; + +/* Error message shown when user cannot pair because pod is already paired */ +"Pod already paired" = "Pod bereits gekoppelt"; + +/* Error message shown when prime is attempted, but pod is already primed */ +"Pod already primed" = "Pod bereits gefüllt"; + +/* Deactivate pod action button accessibility label when deactivation complete */ +"Pod deactivated successfully. Continue." = "Pod erfolgreich deaktiviert. Weiter."; + +/* Error message for reservoir view during general pod fault + Status highlight message for other alarm. */ +"Pod Error" = "Pod-Fehler"; + +/* Description for expiration advisory alarm */ +"Pod expiration advisory alarm" = "Ablaufalarm des Pods"; + +/* The title for pod expiration notification */ +"Pod Expiration Notice" = "Hinweis zum Ablaufen des Pods"; + +/* Alert content title for userPodExpiration pod alert */ +"Pod Expiration Reminder" = "Pod-Ablauferinnerung"; + +/* Description for Pod expired pod fault */ +"Pod expired" = "Pod abgelaufen"; + +/* Alert content title for podExpireImminent pod alert + Alert content title for podExpiring pod alert + Error message for reservoir view when pod expired + Label for pod expiration row, past tense + Status highlight message for podExpired alarm. + The title for Pod Expired alarm notification */ +"Pod Expired" = "Pod abgelaufen"; + +/* Label for pod expiration row */ +"Pod Expires" = "Pod läuft ab"; + +/* Label for pod life state when time remaining */ +"Pod expires in" = "Pod läufen ab in"; + +/* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ +"Pod expires in %1$@." = "Pod läuft in %1$@ ab."; + +/* description label for pod fault details */ +"Pod Fault Details" = "Pod Fehlerdetails"; + +/* Format string for pod fault code */ +"Pod Fault: %1$@" = "Podfehler: %1$@"; + +/* Error message when cannula insertion fails because the pod is in an unexpected state */ +"Pod is not in a state ready for cannula insertion." = "Der Pod ist nicht bereit zum Einführen der Kanüle."; + +/* Error message when prime fails because the pod is in an unexpected state */ +"Pod is not in a state ready for priming." = "Der Pod ist nicht bereit zum Befüllen."; + +/* Error message action could not be performed because pod is suspended */ +"Pod is suspended" = "Pod ist angehalten"; + +/* Error message shown when the pod is not connected. */ +"Pod not connected" = "Pod nicht verbunden"; + +/* Error message for reservoir view when pod occlusion checks failed + Status highlight message for occlusion alarm. */ +"Pod Occlusion" = "Pod Verstopfung"; + +/* Pairing action button accessibility label when pairing succeeded */ +"Pod paired successfully. Continue." = "Pod erfolgreich gekoppelt. Weiter."; + +/* Alert content title for finishSetupReminder pod alert */ +"Pod Pairing Incomplete" = "Pod-Kopplung unvollständig"; + +/* Error message shown when pod sends ack instead of response */ +"Pod sent ack instead of response" = "Pod sendet Bestätigung anstelle von Antwort"; + +/* Title for PodSetupView */ +"Pod Setup" = "Pod Einrichtung"; + +/* Pod state when prime or cannula insertion has not completed in the time allotted */ +"Pod setup window expired" = "Das Zeitfenster für die Pod-Einrichtung ist abgelaufen"; + +/* Description for pod suspended reminder */ +"Pod suspended reminder" = "Erinnerung über abgelaufenen Pod "; + +/* Format string for poor pod signal strength */ +"Poor signal strength" = "Schlechte Signalstärke"; + +/* Label text for step one of attach pod instructions */ +"Prepare site." = "Stelle vorbereiten."; + +/* title for previous pod page */ +"Previous Pod" = "Vorheriger Pod"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Informationen über den letzten Pod"; + +/* Delivery status when pod is priming + Pod status when priming */ +"Priming" = "Befüllen"; + +/* Pod state when priming completed */ +"Priming completed" = "Befüllen des Pods abgeschlossen"; + +/* Pairing action button accessibility label while priming */ +"Priming. Please wait." = "Befülle, bitte warte."; + +/* Pod pairing action button text while priming */ +"Priming..." = "Befülle…"; + +/* The title of the command to change pump time zone */ +"Pump Time" = "Uhrzeit der Pumpe"; + +/* Label text for basal rate summary */ +"Rate" = "Rate"; + +/* Pod state when ready for basal programming */ +"Ready for basal programming" = "Bereit für die Programmierung der Basalrate"; + +/* Pod state when ready for cannula insertion */ +"Ready to insert cannula" = "Bereit zum Einführen der Kanüle"; + +/* Label describing time remaining view + Label for remaining time of manual basal */ +"Remaining" = "Verbleibend"; + +/* Pod pairing reminder initialized */ +"Reminder initialized" = "Erinnerung initialisiert"; + +/* Label text for step two of attach pod instructions */ +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Entfernte die blaue Kappe und überprüfe den Katheter. Dann entferne das Papier."; + +/* Title for remove pod modal */ +"Remove Pod from Body" = "Entferne den Pod vom Körper"; + +/* Title for Omnipod DASH PumpManager deletion action sheet. */ +"Remove Pump" = "Pumpe löschen"; + +/* Label indicating pod replacement necessary + Settings page link description when next lifecycle action is to replace pod */ +"Replace Pod" = "Pod ersetzen"; + +/* Pump Event title for UnfinalizedDose with doseType of .resume */ +"Resume" = "Fortsetzen"; + +/* Recovery suggestion when pod is suspended */ +"Resume delivery" = "Insulinabgabe fortsetzen"; + +/* Alert content title for suspendEnded pod alert */ +"Resume Insulin" = "Insulinabgabe fortsetzen"; + +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Insulinabgabe wiederaufnehmen"; + +/* The format string describing a resume. (1: Time)(2: Scheduled certainty */ +"Resume: %1$@ %2$@" = "Fortsetzen: %1$@ %2$@"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Nehme Insulinabgabe wieder auf…"; + +/* Action button description for deactivate after failed attempt + Cannula insertion button text while showing error + Pod pairing action button text while showing error */ +"Retry" = "Wiederholen"; + +/* button title for saving low reservoir reminder + button title for saving scheduled reminder */ +"Save" = "Speichern"; + +/* button title for saving low reservoir reminder while saving + button title for saving scheduled reminder while saving */ +"Saving..." = "Speichere…"; + +/* Delivery status when scheduled basal is running */ +"Scheduled basal" = "Geplante Basalrate"; + +/* Delivery status when basal is running */ +"Scheduled Basal" = "Geplante Basalrate"; + +/* Card title for scheduled reminder + Scheduled reminder card title on SetupCompleteView + Title for scheduled expiration reminder edit page + Title of scheduled reminder card on NotificationSettingsView */ +"Scheduled Reminder" = "Geplante Erinnerung"; + +/* Title text for insulin type confirmation page */ +"Select the type of insulin that you will be using in this pod." = "Wähle die Insulinart aus, die Du für diesen Pod benutzen möchtest."; + +/* description label for sequence number pod details row */ +"Sequence Number" = "Sequenznummer"; + +/* Button text for setting manual temporary basal rate */ +"Set Temporary Basal" = "Temporäre Basalrate setzen"; + +/* Button title to set temporary basal rate */ +"Set Temporary Basal Rate" = "Temporärere Basalrate setzen"; + +/* Title for setup complete screen + Title of SetupCompleteView */ +"Setup Complete" = "Einrichtung abgeschlossen"; + +/* Description for shutdown imminent */ +"Shutdown imminent" = "Pod-Abschaltung steht bevor"; + +/* Description for shutdown imminent alarm */ +"Shutdown imminent alarm" = "Alarm für die bevorstehende Pod-Abschaltung"; + +/* Error message for reservoir view during general pod fault + Status highlight when communications with the pod haven't happened recently. */ +"Signal Loss" = "Signalverlust"; + +/* Format string for pod signal strength too high */ +"Signal strength too high" = "Signalstärke ist zu hoch"; + +/* No comment provided by engineer. */ +"Skip Omnipod Onboarding?" = "Omnipod-Onboarding überspringen?"; + +/* Pump Event title for UnfinalizedDose with doseType of .suspend */ +"Suspend" = "Unterbrechen"; + +/* Title for suspend duration selection action sheet */ +"Suspend Delivery" = "Abgabe unterbrechen"; + +/* Alert content body for suspendInProgress pod alert + Alert content title for suspendInProgress pod alert */ +"Suspend In Progress Reminder" = "Unterbrechungsfortschritts-Erinnerung"; + +/* Text for suspend resume button when insulin delivery active */ +"Suspend Insulin Delivery" = "Insulinabgabe unterbrechen"; + +/* Description for suspend time expired */ +"Suspend time expired" = "Unterbrechungszeit abgelaufen"; + +/* The format string describing a suspend. (1: Time)(2: Scheduled certainty */ +"Suspend: %1$@ %2$@" = "Unterbrochen: %1$@ %2$@"; + +/* Delivery status when insulin delivery is suspended */ +"Suspended" = "Unterbrochen"; + +/* Label for suspended at time */ +"Suspended At" = "Unterbrochen um"; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Unterbreche die Insulinabgabe…"; + +/* Alert notification body for suspendEnded pod alert user notification */ +"Suspension time is up. Open the app and resume." = "Die Unterbrechungszeit ist abgelaufen. Öffnen Sie die App und fahren Sie fort."; + +/* Label for PumpManager deletion button */ +"Switch to other insulin delivery device" = "Zu einer anderen Pumpe wechseln"; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Mit aktueller Uhrzeit synchronisieren."; + +/* Pod tank fill completed */ +"Tank fill completed" = "Befüllen des Pods erfolgreich"; + +/* Pod power to motor activated */ +"Tank power activated" = "Energieversorgung für den Podmotor aktiviert"; + +/* Label text for step one of insert cannula instructions */ +"Tap below to start cannula insertion." = "Tippe unten, um das Einführen der Kanüle zu starten."; + +/* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ +"Temp Basal" = "Temporäre Basalrate"; + +/* Error message shown when temp basal could not be set due to existing temp basal in progress */ +"Temp basal in progress" = "Temporäre Basalrate läuft bereits."; + +/* Delivery status when temp basal is running */ +"Temp basal running" = "Temporäre Basalrate läuft"; + +/* The format string describing a temp basal. (1: The rate)(2: Start time)(3: duration)(4: volume)(5: scheduled certainty */ +"TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ IE/h %2$@ %3$@ %4$@ IE %5$@"; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporäre Basalrate"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal fehlgeschlagen"; + +/* Footer text for omnipod reminders section */ +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Die App konfiguriert eine Erinnerung auf dem Pod, um Dich vor Ablauf des Pods zu benachrichtigen. Legen die Anzahl der Stunden fest, die Du vor Ablauf des Pods benachrichtigt werden möchtest."; + +/* Description text on ExpirationReminderSetupView */ +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Die App benachrichtigt Dich vor Ablauf des Pods.\n\nScrolle, um die gewünschte Anzahl von Stunden im Voraus festzulegen."; + +/* Description text on LowReservoirReminderSetupView */ +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Die App benachrichtigt Dich, wenn die Insulinmenge im Pod diesen Wert erreicht (50-10 IE).\n\nScrolle, um die Anzahl der Einheiten festzulegen, bei der Du erinnert werden möchtest."; + +/* Footer text for low reservoir value row */ +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Die App benachrichtigt Dich, wenn die Insulinmenge im Pod diesen Wert erreicht."; + +/* Alert content body for suspendEnded pod alert */ +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Die Insulinabschaltung ist beendet.\n\nSie können die Abgabe über das Banner auf dem Startbildschirm oder über den Bildschirm mit den Pumpeneinstellungen fortsetzen. Sie werden in 15 Minuten erneut erinnert."; + +/* Description text for critical alerts */ +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Die obigen Erinnerungen ertönen nicht, wenn sich Dein Gerät im Lautlos- oder Nicht-Stören-Modus befindet.\n\nEs gibt andere kritische Pod-Warnungen und -Alarme, die auch dann ertönen, wenn Dein Gerät auf „Lautlos“ oder „Nicht stören“ eingestellt ist."; + +/* Message for pod sync time action sheet */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Die Uhrzeit Ihrer Pumpe unterscheidet sich von Ihrer aktuellen Uhrzeit. Möchten Sie die Uhrzeit Ihrer Pumpe auf Ihre aktuelle Uhrzeit aktualisieren?"; + +/* Alert content body for timeOffsetChangeDetected pod alert */ +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Die Uhrzeit Ihrer Pumpe weicht von der aktuellen Uhrzeit ab. Sie können die Uhrzeit der Pumpe überprüfen und in den Einstellungen mit der aktuellen Uhrzeit synchronisieren."; + +/* description for time change detected notice */ +"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "Die Uhrzeit der Pumpe weicht von der aktuellen Uhrzeit ab. Die Zeit der Pumpe steuert die geplanten Therapieeinstellungen. Scrolle nach unten zur Zeile Pumpenzeit, um den Zeitunterschied zu überprüfen und die Pumpe zu konfigurieren."; + +/* Description of proper cannula insertion */ +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Das Fenster oben auf dem Pod sollte pinkfarben sein, wenn der Katheter ordentlich in die Haut eingeführt wurde."; + +/* Format string for recovery suggestion during deactivate pod. */ +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Es gab ein Problem bei der Kommunikation mit dem Pod. Wenn dieses Problem weiterhin besteht, tippen Sie auf \"Pod verwerfen\". Sie können dann einen neuen Pod aktivieren."; + +/* Footer text for scheduled reminder area */ +"This is a reminder that you scheduled when you paired your current Pod." = "Dies ist eine Erinnerung, die Du beim Koppeln Deines aktuellen Pods eingestellt hast."; + +/* Alert format string for missing temp basal configuration. */ +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Dieser Pumpenmanager wurde nicht mit einer maximalen Basalrate konfiguriert, da er hinzugefügt wurde, bevor die Funktion manuelle temporäre Basalrate hinzugefügt wurde. Bitte gehe zu Therapieeinstellungen -> Abgabegrenzen und stelle eine neue maximale Basalrate ein."; + +/* Pod state threeNotUsed */ +"threeNotUsed" = "threeNotUsed"; + +/* Label for expiration reminder row + Label for scheduled expiration reminder row + Label for scheduled reminder value row */ +"Time" = "Zeit"; + +/* Alert content title for timeOffsetChangeDetected pod alert + Title for pod sync time action sheet. + title for time change detected notice */ +"Time Change Detected" = "Änderung der Uhrzeit erkannt"; + +/* The format string for pod expiration notification body (1: time until expiration) */ +"Time to replace your pod! Your pod will expire in %1$@" = "Es ist Zeit Ihren Pod zu wechseln! Der Pod läuft ab in %1$@"; + +/* Error message description for PeripheralManagerError.timeout */ +"Timeout" = "Zeitüberschreitung"; + +/* No comment provided by engineer. */ +"Toggle sign" = "Zeichen umschalten"; + +/* Error message for PodCommsError.tooManyPodsFound */ +"Too many pods found" = "Zu viele Pods in Reichweite"; + +/* description label for total delivery pod details row */ +"Total Delivery" = "Gesamt Abgabe"; + +/* Recovery suggestion when ack received instead of response + recoverySuggestion for BluetoothManagerError.bluetoothNotAvailable(.resetting) */ +"Try again" = "Versuchen Sie es erneut"; + +/* recoverySuggestion for BluetoothManagerError.bluetoothNotAvailable(.poweredOff) */ +"Turn bluetooth on" = "Schalte Bluetooth ein"; + +/* Pod state twoNotUsed */ +"twoNotUsed" = "twoNotUsed"; + +/* Units for showing temp basal rate */ +"U/hr" = "IE/h"; + +/* Title of delivery uncertainty recovery page */ +"Unable to Reach Pod" = "Pod kann nicht erreicht werden"; + +/* Title for pending command recovery screen */ +"Unable To Reach Pod" = "Pod kann nicht erreicht werden"; + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Eine temporäre Basalrate kann nicht gesetzt werden: %1$@"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Eine temporäre Basalrate kann nicht gesetzt werden: %1$@\n\n%2$@"; + +/* String describing a dose that was possibly scheduled */ +"Uncertain" = "Unsicher"; + +/* Description for MessageError invalidSequence */ +"Unexpected message sequence number" = "Unerwartete Sequenznummer der Nachricht"; + +/* Format string for unexpected pod change */ +"Unexpected pod change" = "Unerwarteter Podwechsel"; + +/* Error message shown when empty response from pod was received */ +"Unexpected response from pod" = "Unerwartete Antwort vom Pod"; + +/* Label for pod life state when pod not fully activated */ +"Unfinished Activation" = "Nicht abgeschlossene Aktivierung"; + +/* Label for pod life state when pod not fully deactivated */ +"Unfinished deactivation" = "Nicht abgeschlossene Deaktivierung"; + +/* Error message description for PeripheralManagerError.unknownCharacteristic */ +"Unknown Characteristic" = "Unbekannte Charakteristik"; + +/* The format string for Unknown pod fault (1: The fault code value) */ +"Unknown pod fault %1$03d" = "Unbekannter Podfehler %1$03d"; + +/* Format string for description of MessageError unknownValue. (1: value) (2: Type) */ +"Unknown Value (%1$@) for type %2$@" = "Unbekannter Wert ( %1$@ ) für Typ %2$@"; + +/* Format string for description of MessageError validationFailed. (1: description of validation failure) */ +"Validation failed: %1$@" = "Überprüfung fehlgeschlagen: %1$@"; + +/* Recovery suggestion when operation could not be completed due to existing bolus in progress */ +"Wait for existing bolus to finish, or cancel bolus" = "Warte, bis der aktuelle Bolus abgegeben wurde, oder unterbreche diesen."; + +/* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ +"Wait for existing temp basal to finish, or suspend to cancel" = "Warten Sie, bis die aktuelle temporäre Basalrate beendet ist, oder unterbrechen Sie diese"; + +/* Label text for step two of insert cannula instructions */ +"Wait until insertion is completed." = "Warte bis das Einführen der Kanüle fertig ist."; + +/* Description waiting for pairing reminder */ +"Waiting for pairing reminder" = "Warten auf Kopplungserinnerung"; + +/* Button label for user to answer cannula was properly inserted */ +"Yes" = "Ja"; + +/* Button title for confirm deactivation option */ +"Yes, Deactivate Pod" = "Ja, deaktiviere Pod"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Ja, mit aktueller Zeit synchronisieren"; + +/* bodyText for PodSetupView */ +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Beginne nun damit, die Erinnerungen zu konfigurieren, Dein Pod mit Insulin zu füllen, ihn mit Deinem Gerät zu koppeln und ihn an Deinem Körper zu platzieren."; + +/* Format string for instructions for setup complete view. (1: app name) */ +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Dein Pod ist einsatzbereit.\n\n%1$@ erinnert Dich daran, Deinen Pod zu wechseln, bevor er abläuft. Du kannst eine für Dich passende Zeit wählen."; + +/* Alert message body for confirm pod attachment */ +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Ihr Pod gibt möglicherweise immer noch Insulin ab.\nEntfernen Sie ihn vom Körper und tippen dann auf „Weiter“."; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; diff --git a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj index 1a8b703d5e..50e1310c3e 100644 --- a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj +++ b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj @@ -220,6 +220,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 193F1E4B2B44C21E00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E4C2B44C21E00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; C1229C1729C7E5BC0066A89C /* RileyLinkBLEKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RileyLinkBLEKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C1229C1829C7E5BC0066A89C /* RileyLinkKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RileyLinkKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C1229C1929C7E5BC0066A89C /* RileyLinkKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RileyLinkKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -991,6 +993,7 @@ nl, ro, hi, + hu, ); mainGroup = C124016229C7D87A00B32844; productRefGroup = C124016D29C7D87A00B32844 /* Products */; @@ -1260,6 +1263,7 @@ C124020229C7D90B00B32844 /* fi */, C124020329C7D90B00B32844 /* nl */, C124020429C7D90B00B32844 /* ro */, + 193F1E4B2B44C21E00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1290,6 +1294,7 @@ C124026429C7DA9700B32844 /* nl */, C124026529C7DA9700B32844 /* ro */, C124026629C7DA9700B32844 /* hi */, + 193F1E4C2B44C21E00525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; diff --git a/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..0e1b974d1c --- /dev/null +++ b/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,429 @@ +/* Description for an inactive alert modifier */ +" (inactive)" = " (inactive)"; + +/* Format string for low battery alert body for RileyLink. (1: device name) */ +"\"%1$@\" has a low battery" = "\"%1$@\" has a low battery"; + +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; + +/* Format string for activation time exceeded + Pod state when activation not completed in the time allowed */ +"Activation time exceeded" = "Activation time exceeded"; + +/* Description for auto-off */ +"Auto-off" = "Auto-Off"; + +/* Description for auto-off alarm */ +"Auto-off alarm" = "Auto-off alarm"; + +/* Pod state when basal initialized */ +"Basal initialized" = "Basal initialized"; + +/* Pod state when running below fifty units */ +"Below 50 units" = "Below 50 units"; + +/* Pump Event title for UnfinalizedDose with doseType of .bolus */ +"Bolus" = "Bolus"; + +/* Error message shown when operation could not be completed due to existing bolus in progress */ +"Bolus in progress" = "Bolus in progress"; + +/* The format string describing a bolus. (1: The amount delivered)(2: Start time of the dose)(3: duration)(4: scheduled certainty) */ +"Bolus: %1$@U %2$@ %3$@ %4$@" = "Bolus: %1$@U %2$@ %3$@ %4$@"; + +/* Delivery status when bolusing */ +"Bolusing" = "Bolusing"; + +/* Delivery status when bolusing and temp basal is running */ +"Bolusing with temp basal" = "Bolusing with temp basal"; + +/* Pod state when inserting cannula */ +"Cannula inserting" = "Cannula inserting"; + +/* String describing a dose that was certainly scheduled */ +"Certain" = "Certain"; + +/* Alert content body for podExpireImminent pod alert */ +"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; + +/* Alert content body for podExpiring pod alert */ +"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; + +/* Format string for invalid message error code (1: error code number) */ +"Command error %1$u" = "Command error %1$u"; + +/* Status highlight that delivery is uncertain. */ +"Comms Issue" = "Comms Issue"; + +/* Error message when command is rejected because an unacknowledged command is pending. */ +"Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; + +/* The title for AlarmCode.other notification */ +"Critical Pod Error" = "Critical Pod Error"; + +/* Recovery suggestion when unexpected address received */ +"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; + +/* Pod state when pod has been deactivated */ +"Deactivated" = "Deactivated"; + +/* Title string for BeepPreference.silent */ +"Disabled" = "Disabled"; + +/* Description for Empty reservoir pod fault */ +"Empty reservoir" = "Empty reservoir"; + +/* Error message shown when empty response from pod was received */ +"Empty response from pod" = "Empty response from pod"; + +/* Pod state error event logged shutting down */ +"Error event logged, shutting down" = "Error event logged, shutting down"; + +/* Description for expiration alert */ +"Expiration alert" = "Expiration alert"; + +/* Title string for BeepPreference.extended */ +"Extended" = "Extended"; + +/* Delivery status when extended bolus is running */ +"Extended bolus running" = "Extended bolus running"; + +/* Delivery status when extended bolus and temp basal is running */ +"Extended bolus running with temp basal" = "Extended bolus running with temp basal"; + +/* Pod state when fault event has occurred */ +"Fault event occurred" = "Fault event occurred"; + +/* Status highlight that when pod is deactivating. */ +"Finish Deactivation" = "Finish Deactivation"; + +/* Status highlight that when pod is activating. */ +"Finish Pairing" = "Finish Pairing"; + +/* Description for finish setup */ +"Finish setup " = "Finish setup "; + +/* Description for finish setup reminder */ +"Finish setup reminder" = "Finish setup reminder"; + +/* Pod inititialized */ +"Initialized" = "Initialized"; + +/* Pod state when inserting cannula */ +"Inserting cannula" = "Inserting cannula"; + +/* The default notification body for AlarmCodes */ +"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; + +/* Status highlight that insulin delivery was suspended. */ +"Insulin Suspended" = "Insulin Suspended"; + +/* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ +"Insulin type not configured" = "Insulin type not configured"; + +/* The format string for Internal pod fault (1: The fault code value) */ +"Internal pod fault %1$03d" = "Internal pod fault %1$03d"; + +/* The format string describing a bolus that was interrupted. (1: The amount delivered)(2: The amount scheduled)(3: Start time of the dose)(4: duration)(5: scheduled certainty) */ +"InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@"; + +/* Error message for when unexpected address is received (1: received address) (2: expected address) */ +"Invalid address 0x%x. Expected 0x%x" = "Invalid address 0x%x. Expected 0x%x"; + +/* Description for MessageError invalidAddress */ +"Invalid address: (%1$@)" = "Invalid address: (%1$@)"; + +/* Description for MessageError invalidCrc */ +"Invalid CRC" = "Invalid CRC"; + +/* Error description for OmniBLEPumpManagerError.invalidSetting */ +"Invalid Setting" = "Invalid Setting"; + +/* Alert content title for lowReservoir pod alert */ +"Low Reservoir" = "Low Reservoir"; + +/* Format string for description for low reservoir advisory (1: reminder units) */ +"Low reservoir advisory (%1$gU)" = "Low reservoir advisory (%1$gU)"; + +/* Description for low reservoir alarm */ +"Low reservoir advisory alarm" = "Low reservoir advisory alarm"; + +/* Title for RileyLink low battery alert */ +"Low RileyLink Battery" = "Low RileyLink Battery"; + +/* Recovery suggestion when no RileyLink is available */ +"Make sure your RileyLink is nearby and powered on" = "Make sure your RileyLink is nearby and powered on"; + +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Manual Basal"; + +/* Pod memory initialized */ +"Memory initialized" = "Memory initialized"; + +/* Recovery suggestion for PodCommsError.tooManyPodsFound */ +"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; + +/* Alert content body for multiCommand pod alert + Alert content title for multiCommand pod alert */ +"Multiple Command Alert" = "Multiple Command Alert"; + +/* Pod alert state when no alerts are active */ +"No alerts" = "No alerts"; + +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "No confidence reminders are used."; + +/* Description for Fault Event Code .noFaults */ +"No faults" = "No faults"; + +/* Status highlight message for emptyReservoir alarm. + Status highlight that a pump is out of insulin. */ +"No Insulin" = "No Insulin"; + +/* Status highlight that when no pod is paired. */ +"No Pod" = "No Pod"; + +/* Error message shown when no pod is paired */ +"No pod paired" = "No pod paired"; + +/* Error message for PodCommsError.noPodsFound */ +"No pods found" = "No pods found"; + +/* Error message shown when no response from pod was received */ +"No response from pod" = "No response from pod"; + +/* Error message shown when no response from pod was received */ +"No RileyLink available" = "No RileyLink available"; + +/* Delivery status when basal is running + Pod state when running above fifty units */ +"Normal" = "Normal"; + +/* Description for MessageError notEnoughData */ +"Not enough data" = "Not enough data"; + +/* Description for Occlusion detected pod fault */ +"Occlusion detected" = "Occlusion detected"; + +/* Generic title of the omnipod pump manager */ +"Omnipod" = "Omnipod"; + +/* Pod status after pairing */ +"Paired" = "Paired"; + +/* Pod status when pairing completed */ +"Pairing completed" = "Pairing completed"; + +/* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ +"Parsing Error: %1$@ in (%2$@)" = "Parsing Error: %1$@ in (%2$@)"; + +/* Recovery suggestion on unexpected pod change */ +"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; + +/* Recovery suggestion when no response is received from pod */ +"Please bring your pod closer to the RileyLink and try again" = "Please bring your pod closer to the RileyLink and try again"; + +/* Alert content body for finishSetupReminder pod alert */ +"Please finish pairing your pod." = "Please finish pairing your pod."; + +/* Recover suggestion shown when no pod is paired */ +"Please pair a new pod" = "Please pair a new pod"; + +/* Recovery suggestion when pairing signal strength is too high */ +"Please reposition the RileyLink further from the pod" = "Please reposition the RileyLink further from the pod"; + +/* Recovery suggestion when pairing signal strength is too low */ +"Please reposition the RileyLink relative to the pod" = "Please reposition the RileyLink relative to the pod"; + +/* Error message shown when user cannot pair because pod is already paired */ +"Pod already paired" = "Pod already paired"; + +/* Error message shown when prime is attempted, but pod is already primed */ +"Pod already primed" = "Pod already primed"; + +/* Status highlight message for other alarm. */ +"Pod Error" = "Pod Error"; + +/* Description for expiration advisory alarm */ +"Pod expiration advisory alarm" = "Pod expiration advisory alarm"; + +/* The title for pod expiration notification */ +"Pod Expiration Notice" = "Pod Expiration Notice"; + +/* Description for Pod expired pod fault */ +"Pod expired" = "Pod expired"; + +/* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ +"Pod expires in %1$@." = "Pod expires in %1$@."; + +/* Format string for pod fault code */ +"Pod Fault: %1$@" = "Pod Fault: %1$@"; + +/* Error message when cannula insertion fails because the pod is in an unexpected state */ +"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; + +/* Error message when prime fails because the pod is in an unexpected state */ +"Pod is not in a state ready for priming." = "Pod is not in a state ready for priming."; + +/* Error message action could not be performed because pod is suspended */ +"Pod is suspended" = "Pod is suspended"; + +/* Status highlight message for occlusion alarm. */ +"Pod Occlusion" = "Pod Occlusion"; + +/* Alert content title for finishSetupReminder pod alert */ +"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; + +/* Error message shown when pod sends ack instead of response */ +"Pod sent ack instead of response" = "Pod sent ack instead of response"; + +/* Pod state when prime or cannula insertion has not completed in the time allotted */ +"Pod setup window expired" = "Pod setup window expired"; + +/* Description for pod suspended reminder */ +"Pod suspended reminder" = "Pod suspended reminder"; + +/* Format string for poor pod signal strength */ +"Poor signal strength" = "Poor signal strength"; + +/* Delivery status when pod is priming + Pod status when priming */ +"Priming" = "Priming"; + +/* Pod state when priming completed */ +"Priming completed" = "Priming completed"; + +/* Pod state when ready for basal programming */ +"Ready for basal programming" = "Ready for basal programming"; + +/* Pod state when ready for cannula insertion */ +"Ready to insert cannula" = "Ready to insert cannula"; + +/* Pod pairing reminder initialized */ +"Reminder initialized" = "Reminder initialized"; + +/* Pump Event title for UnfinalizedDose with doseType of .resume */ +"Resume" = "Resume"; + +/* Recovery suggestion when pod is suspended */ +"Resume delivery" = "Resume delivery"; + +/* Alert content title for suspendEnded pod alert */ +"Resume Insulin" = "Resume Insulin"; + +/* The format string describing a resume. (1: Time)(2: Scheduled certainty */ +"Resume: %1$@ %2$@" = "Resume: %1$@ %2$@"; + +/* Delivery status when basal is running */ +"Scheduled Basal" = "Scheduled Basal"; + +/* Description for shutdown imminent */ +"Shutdown imminent" = "Shutdown imminent"; + +/* Description for shutdown imminent alarm */ +"Shutdown imminent alarm" = "Shutdown imminent alarm"; + +/* Status highlight when communications with the pod haven't happened recently. */ +"Signal Loss" = "Signal Loss"; + +/* Format string for pod signal strength too high */ +"Signal strength too high" = "Signal strength too high"; + +/* Pump Event title for UnfinalizedDose with doseType of .suspend */ +"Suspend" = "Suspend"; + +/* Alert content body for suspendInProgress pod alert + Alert content title for suspendInProgress pod alert */ +"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; + +/* Description for suspend time expired */ +"Suspend time expired" = "Suspend time expired"; + +/* Delivery status when insulin delivery is suspended */ +"Suspended" = "Suspended"; + +/* The format string describing a suspend. (1: Time)(2: Scheduled certainty */ +"Suspend: %1$@ %2$@" = "Suspend: %1$@ %2$@"; + +/* Delivery status when insulin delivery is suspended */ +"Suspended" = "Suspended"; + +/* Alert notification body for suspendEnded pod alert user notification */ +"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; + +/* Pod tank fill completed */ +"Tank fill completed" = "Tank fill completed"; + +/* Pod power to motor activated */ +"Tank power activated" = "Tank power activated"; + +/* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ +"Temp Basal" = "Temp Basal"; + +/* Error message shown when temp basal could not be set due to existing temp basal in progress */ +"Temp basal in progress" = "Temp basal in progress"; + +/* Delivery status when temp basal is running */ +"Temp basal running" = "Temp basal running"; + +/* The format string describing a temp basal. (1: The rate)(2: Start time)(3: duration)(4: volume)(5: scheduled certainty */ +"TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@"; + +/* Alert content body for suspendEnded pod alert */ +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; + +/* Alert content body for timeOffsetChangeDetected pod alert */ +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; + +/* Alert content title for timeOffsetChangeDetected pod alert */ +"Time Change Detected" = "Time Change Detected"; + +/* The format string for pod expiration notification body (1: time until expiration) */ +"Time to replace your pod! Your pod will expire in %1$@" = "Time to replace your pod! Your pod will expire in %1$@"; + +/* Error message for PodCommsError.tooManyPodsFound */ +"Too many pods found" = "Too many pods found"; + +/* Recovery suggestion when ack received instead of response */ +"Try again" = "Try again"; + +/* String describing a dose that was possibly scheduled */ +"Uncertain" = "Uncertain"; + +/* Description for MessageError invalidSequence */ +"Unexpected message sequence number" = "Unexpected message sequence number"; + +/* Format string for unexpected pod change */ +"Unexpected pod change" = "Unexpected pod change"; + +/* Error message shown when empty response from pod was received */ +"Unexpected response from pod" = "Unexpected response from pod"; + +/* The format string for Unknown pod fault (1: The fault code value) */ +"Unknown pod fault %1$03d" = "Unknown pod fault %1$03d"; + +/* Format string for description of MessageError unknownValue. (1: value) (2: Type) */ +"Unknown Value (%1$@) for type %2$@" = "Unknown Value (%1$@) for type %2$@"; + +/* Format string for description of MessageError validationFailed. (1: description of validation failure) */ +"Validation failed: %1$@" = "Validation failed: %1$@"; + +/* Recovery suggestion when operation could not be completed due to existing bolus in progress */ +"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; + +/* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ +"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; + +/* Description waiting for pairing reminder */ +"Waiting for pairing reminder" = "Waiting for pairing reminder"; + diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..72cedeb38c --- /dev/null +++ b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,805 @@ +/* No comment provided by engineer. */ +"—" = "—"; + +/* Format string for last status date on pod details screen */ +"%@ ago" = "%@ ago"; + +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* No comment provided by engineer. */ +"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now."; + +/* Format string for delivered insulin. (1: The localized amount) + Format string for insulin remaining in reservoir. (1: The localized amount) */ +"%@ U" = "%@ U"; + +/* Format string for bolus progress when finished. (1: The localized amount) */ +"%@ U (Finished)" = "%@ U (Finished)"; + +/* Format string for bolus progress. (1: The delivered amount) (2: The programmed amount) (3: the percent progress) */ +"%@ U of %@ U (%@)" = "%@ U of %@ U (%@)"; + +/* Format string for temp basal rate. (1: The localized amount) */ +"%@ U/hour" = "%@ U/hour"; + +/* Appends a full-stop to a statement */ +"%@." = "%@."; + +/* Format string for bolus percent progress. (1: Percent progress) */ +"%@%%" = "%@%%"; + +/* Format string for reservoir reading when above or equal to maximum reading. (1: The localized amount) */ +"%@+ U" = "%@+ U"; + +/* Format string for reservoir volume. (1: The localized volume) */ +"%@U" = "%@U"; + +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ for %2$@"; + +/* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ +"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display."; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"%1$@ units remaining at %2$@" = "%1$@ units remaining at %2$@"; + +/* Format string providing instructions for replacing pod due to a fault. (1: The fault description) */ +"%1$@. Insulin delivery has stopped. Please deactivate and remove pod." = "%1$@. Insulin delivery has stopped. Please deactivate and remove pod."; + +/* The format string for displaying an offset from a time zone: (1: GMT)(2: -)(3: 4:00) */ +"%1$@%2$@%3$@" = "%1$@%2$@%3$@"; + +/* Format string for reservoir level above max measurable threshold. (1: measurable reservoir threshold) (2: units) */ +"%1$@+ %2$@" = "%1$@+ %2$@"; + +/* Format string for total delivery on pod details screen */ +"%g U" = "%g U"; + +/* Button text for 1 hour suspend duration */ +"1 hour" = "1 hour"; + +/* Button text for 1 hour 30 minute suspend duration */ +"1 hour 30 minutes" = "1 hour 30 minutes"; + +/* Button text for 2 hour suspend duration */ +"2 hours" = "2 hours"; + +/* Button text for 30 minute suspend duration */ +"30 minutes" = "30 minutes"; + +/* The title of the cell showing the pod activated at time */ +"Active Time" = "Active Time"; + +/* Section header for activity section */ +"Activity" = "Activity"; + +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Adjusting Pump Time..."; + +/* The title of the cell showing alarm status */ +"Alarms" = "Alarms"; + +/* Alert title for cancel pairing modal */ +"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; + +/* Confirmation message for shutting down a pod */ +"Are you sure you want to shutdown this pod?" = "Are you sure you want to shutdown this pod?"; + +/* No comment provided by engineer. */ +"Are you sure you want to skip Omnipod Onboarding?" = "Are you sure you want to skip Omnipod Onboarding?"; + +/* Confirmation message for removing Omnipod PumpManager */ +"Are you sure you want to stop using Omnipod?" = "Are you sure you want to stop using Omnipod?"; + +/* The title text for the address assigned to the pod */ +"Assigned Address" = "Assigned Address"; + +/* Title for Attach Pod screen */ +"Attach Pod" = "Attach Pod"; + +/* Description string above progress indicator while attempting to re-establish communication from an unacknowledged command */ +"Attemping to re-establish communication" = "Attemping to re-establish communication"; + +/* Back button text on DeliveryUncertaintyRecoveryView */ +"Back" = "Back"; + +/* The title of the cell showing pod basal status */ +"Basal Delivery" = "Basal Delivery"; + +/* The title text for the basal rate schedule */ +"Basal Rates" = "Basal Rates"; + +/* The title of the cell showing pod bolus status */ +"Bolus Delivery" = "Bolus Delivery"; + +/* The title of the cancel action in an action sheet */ +"Cancel" = "Cancel"; + +/* Button title to cancel manual basal */ +"Cancel Manual Basal" = "Cancel Manual Basal"; + +/* Insert cannula action button accessibility label when cannula insertion succeeded */ +"Cannula inserted successfully. Continue." = "Cannula inserted successfully. Continue."; + +/* The action string on pod status page when pod expired */ +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; + +/* The title of the command to change pump time zone */ +"Change Time Zone" = "Change Time Zone"; + +/* Progress message for changing pod time. */ +"Changing time…" = "Changing time…"; + +/* Title for check cannula screen */ +"Check Cannula" = "Check Cannula"; + +/* Label text for step three of attach pod instructions */ +"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; + +/* Insert cannula action button accessibility label checking insertion */ +"Checking Insertion" = "Checking Insertion"; + +/* Cannula insertion button text while checking insertion */ +"Checking..." = "Checking..."; + +/* Title for uncertainty recovered screen */ +"Comms Recovered" = "Comms Recovered"; + +/* Text for confidence reminders navigation link */ +"Confidence Reminders" = "Confidence Reminders"; + +/* Help text for BeepPreferenceSelectionView */ +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; + +/* The title of the configuration section in settings */ +"Configuration" = "Configuration"; + +/* Button title for confirm attachment option */ +"Confirm" = "Confirm"; + +/* Alert title for confirm pod attachment */ +"Confirm Pod Attachment" = "Confirm Pod Attachment"; + +/* The title of the continue action in an action sheet */ +"Continue" = "Continue"; + +/* Title for critical alerts description */ +"Critical Alerts" = "Critical Alerts"; + +/* Unit for singular day in pod life remaining */ +"day" = "day"; + +/* Unit for plural days in pod life remaining */ +"days" = "days"; + +/* Button title to deactivate pod because of fault during setup */ +"Deactivate" = "Deactivate"; + +/* Button title for pod deactivation + Button title to deactivate pod */ +"Deactivate Pod" = "Deactivate Pod"; + +/* Label text showing pod is deactivated */ +"Deactivated" = "Deactivated"; + +/* Deactivate pod action button accessibility label while deactivating */ +"Deactivating." = "Deactivating."; + +/* Action button description while deactivating */ +"Deactivating..." = "Deactivating..."; + +/* Button title to delete Omnipod PumpManager */ +"Delete Omnipod" = "Delete Omnipod"; + +/* Title text for delivery limits */ +"Delivery Limits" = "Delivery Limits"; + +/* Text for device details disclosure row + title for device details page */ +"Device Details" = "Device Details"; + +/* The title of the device information section in settings */ +"Device Information" = "Device Information"; + +/* Header for devices section of RileyLinkSetupView */ +"Devices" = "Devices"; + +/* Title text for button to disable bolus beeps */ +"Disable Bolus Beeps" = "Disable Bolus Beeps"; + +/* Pairing interface navigation bar button text for discard pod action + Text for discard pod button */ +"Discard Pod" = "Discard Pod"; + +/* No comment provided by engineer. */ +"Done" = "Done"; + +/* Title text for button to enable bolus beeps */ +"Enable Bolus Beeps" = "Enable Bolus Beeps"; + +/* Accessibility label indicating an error occurred */ +"Error" = "Error"; + +/* The alert title for disable bolus beeps error */ +"Error disabling bolus beeps" = "Error disabling bolus beeps"; + +/* The alert title for enable bolus beeps error */ +"Error enabling bolus beeps" = "Error enabling bolus beeps"; + +/* The alert title for a resume error */ +"Error Resuming" = "Error Resuming"; + +/* The alert title for a suspend error */ +"Error Suspending" = "Error Suspending"; + +/* The title of the cell showing the pod expiration reminder date */ +"Expiration Reminder" = "Expiration Reminder"; + +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Expiration Reminder Default"; + +/* The title of the cell showing the pod expiration after expiry */ +"Expired" = "Expired"; + +/* The title of the cell showing the pod expiration */ +"Expires" = "Expires"; + +/* Alert title for failing to cancel manual basal error */ +"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; + +/* Alert title for resume error */ +"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; + +/* Alert title for time sync error */ +"Failed to Set Pump Time" = "Failed to Set Pump Time"; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; + +/* Alert title for error when updating confidence reminder preference */ +"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; + +/* Alert title for error when updating expiration reminder */ +"Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; + +/* Alert title for error when updating low reservoir reminder */ +"Failed to Update Low Reservoir Reminder" = "Failed to Update Low Reservoir Reminder"; + +/* Pod life HUD view label */ +"Fault" = "Fault"; + +/* Label text for step 1 of pair pod instructions */ +"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; + +/* Settings page link description when next lifecycle action is to finish deactivation */ +"Finish deactivation" = "Finish deactivation"; + +/* The title of the command to finish pod setup */ +"Finish pod setup" = "Finish pod setup"; + +/* Action button title to continue at Setup Complete */ +"Finish Setup" = "Finish Setup"; + +/* Accessibility format string for (1: localized volume)(2: time) */ +"Greater than %1$@ units remaining at %2$@" = "Greater than %1$@ units remaining at %2$@"; + +/* Unit for singular hour in pod life remaining */ +"hour" = "hour"; + +/* Unit for plural hours in pod life remaining */ +"hours" = "hours"; + +/* Alert message body for confirm pod attachment */ +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; + +/* Instructions when deactivating pod that has been paired, but not attached. */ +"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod."; + +/* Instructions when deactivating pod that has been paired and possibly attached. */ +"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod."; + +/* Button title to insert cannula during setup */ +"Insert Cannula" = "Insert Cannula"; + +/* Label text indicating insertion finished. */ +"Inserted" = "Inserted"; + +/* Insert cannula action button accessibility label while pairing */ +"Inserting. Please wait." = "Inserting. Please wait."; + +/* Cannula insertion button text while inserting */ +"Inserting..." = "Inserting..."; + +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulin\nSuspended"; + +/* The title of the cell showing delivered insulin */ +"Insulin Delivered" = "Insulin Delivered"; + +/* Title of insulin delivery section */ +"Insulin Delivery" = "Insulin Delivery"; + +/* The action string on pod status page when pod faulted */ +"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; + +/* Message for suspend duration selection action sheet */ +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin Remaining"; + +/* Text for confidence reminders navigation link + Title for insulin type selection screen */ +"Insulin Type" = "Insulin Type"; + +/* The error message shown when Loop's basal schedule has an unsupported rate */ +"Invalid entry" = "Invalid entry"; + +/* Question to confirm the cannula is inserted properly */ +"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; + +/* Label text for step 2 of pair pod instructions */ +"Keep the RileyLink about 6 inches from the pod during pairing." = "Keep the RileyLink about 6 inches from the pod during pairing."; + +/* description label for last status date pod details row */ +"Last Status" = "Last Status"; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; + +/* The title of the cell showing the pod lot id */ +"Lot" = "Lot"; + +/* description label for lot number pod details row */ +"Lot Number" = "LOT Nummer"; + +/* Label text for low reservoir value row + Navigation bar title for LowReservoirReminderSetupView + Title for LowReservoirReminderSetupView */ +"Low Reservoir" = "Low Reservoir"; + +/* Label for low reservoir reminder row + Title for low reservoir reminder edit page */ +"Low Reservoir Reminder" = "Low Reservoir Reminder"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; + +/* Unit for singular minute in pod life remaining */ +"minute" = "minute"; + +/* Unit for plural minutes in pod life remaining */ +"minutes" = "minutes"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Missing Config"; + +/* String shown on pod details for active time when conversion fails. + String shown on pod details for last status date when not available. + String shown on pod details for total delivery when not available. */ +"NA" = "NV"; + +/* Text of continue button on ExpirationReminderSetupView */ +"Next" = "Next"; + +/* Button label for user to answer cannula was not properly inserted */ +"No" = "No"; + +/* Text shown in insulin remaining space when no pod is paired */ +"No\nDelivery" = "No\nDelivery"; + +/* Error message for reservoir view when reservoir empty */ +"No Insulin" = "No Insulin"; + +/* Label for pod life state when no pod paired + Text shown in insulin remaining space when no pod is paired */ +"No Pod" = "No Pod"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* Continue pairing button title of in pairing cancel modal */ +"No, Continue With Pod" = "No, Continue With Pod"; + +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "No, Keep Pump As Is"; + +/* The detail text for bolus delivery when no bolus is being delivered */ +"None" = "None"; + +/* navigation title for notification settings + Text for pod details disclosure row */ +"Notification Settings" = "Notification Settings"; + +/* No comment provided by engineer. */ +"Numbers" = "Numbers"; + +/* Title for omnipod reminders section */ +"Omnipod Reminders" = "Omnipod Reminders"; + +/* Button title to pair with pod during setup */ +"Pair" = "Pair"; + +/* The title of the command to pair new pod */ +"Pair New Pod" = "Pair New Pod"; + +/* Navigation bar title for PairPodView + Pod pairing action button text while ready to pair + Settings page link description when next lifecycle action is to pair new pod + Title for pod pairing screen */ +"Pair Pod" = "Pair Pod"; + +/* Pairing action button accessibility label while ready to pair */ +"Pair pod." = "Pair pod."; + +/* Label text indicating pairing finished. */ +"Paired" = "Paired"; + +/* Pairing action button accessibility label while pairing */ +"Pairing." = "Pairing."; + +/* Pod pairing action button text while pairing */ +"Pairing..." = "Pairing..."; + +/* No comment provided by engineer. */ +"Percent = %lf" = "Percent = %lf"; + +/* The title of the cell showing the pod pi version */ +"PI Version" = "PI Version"; + +/* The title of the command to play test beeps */ +"Play Test Beeps" = "Play Test Beeps"; + +/* Progress message for play test beeps. */ +"Play Test Beeps…" = "Play Test Beeps…"; + +/* Alert message body for confirm pod attachment */ +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; + +/* Instructions for deactivate pod when pod not on body */ +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; + +/* Instructions for deactivate pod when pod is on body */ +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; + +/* The title of the cell showing the pod pm version */ +"PM Version" = "PM Version"; + +/* description label for activated at time pod details row + Label for pod insertion row */ +"Pod Activated" = "Pod Activated"; + +/* Label describing pod age view */ +"Pod Age" = "Pod Age"; + +/* Deactivate pod action button accessibility label when deactivation complete */ +"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; + +/* Error message for reservoir view during general pod fault */ +"Pod Error" = "Pod Error"; + +/* Label for pod life state when within pod expiration window */ +"Pod expired" = "Pod expired"; + +/* Error message for reservoir view when pod expired + Label for pod expiration row, past tense */ +"Pod Expired" = "Pod Expired"; + +/* Label for pod expiration row */ +"Pod Expires" = "Pod Expires"; + +/* Label for pod life state when time remaining */ +"Pod expires in" = "Pod expires in"; + +/* description label for pod fault details */ +"Pod Fault Details" = "Pod Fault Details"; + +/* Error message for reservoir view when pod occlusion checks failed */ +"Pod Occlusion" = "Pod Occlusion"; + +/* Pairing action button accessibility label when pairing succeeded */ +"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; + +/* Title of the pod settings view controller */ +"Pod Settings" = "Pod Settings"; + +/* Title for PodSetupView */ +"Pod Setup" = "Pod Setup"; + +/* Label text for step one of attach pod instructions */ +"Prepare site." = "Prepare site."; + +/* title for previous pod page */ +"Previous Pod" = "Previous Pod"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Previous Pod Information"; + +/* The text of the loading label when pod is primed */ +"Primed" = "Primed"; + +/* Pairing action button accessibility label while priming */ +"Priming. Please wait." = "Priming. Please wait."; + +/* Pod pairing action button text while priming */ +"Priming..." = "Priming..."; + +/* The text of the loading label when priming */ +"Priming…" = "Priming…"; + +/* The title of the command to change pump time zone */ +"Pump Time" = "Pump Time"; + +/* Label text for basal rate summary */ +"Rate" = "Rate"; + +/* Label describing time remaining view */ +"Remaining" = "Remaining"; + +/* Title for remove pod modal */ +"Remove Pod from Body" = "Remove Pod from Body"; + +/* Title for Omnipod PumpManager deletion action sheet. */ +"Remove Pump" = "Remove Pump"; + +/* Label text for step two of attach pod instructions */ +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; + +/* Label indicating pod replacement necessary + The title of the command to replace pod */ +"Replace Pod" = "Replace Pod"; + +/* The title of the command to replace pod when there is a pod fault */ +"Replace Pod Now" = "Replace Pod Now"; + +/* The title of the cell showing reservoir status */ +"Reservoir" = "Reservoir"; + +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Resume Insulin Delivery"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Resuming insulin delivery..."; + +/* Action button description for deactivate after failed attempt + Cannula insertion button text while showing error + Pod pairing action button text while showing error */ +"Retry" = "Retry"; + +/* Button title for retrying pod deactivation */ +"Retry Pod Deactivation" = "Retry Pod Deactivation"; + +/* bodyText for RileyLinkSetupView */ +"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink allows for communication with the pump over Bluetooth"; + +/* Navigation title for RileyLinkSetupView */ +"RileyLink Setup" = "RileyLink Setup"; + +/* Title of button to save delivery limit settings + Title of button to sync basal profile when no pod paired */ +"Save" = "Save"; + +/* button title for saving low reservoir reminder while saving + button title for saving scheduled reminder while saving */ +"Saving..." = "Saving..."; + +/* The detail text of the basal row when pod is running scheduled basal */ +"Schedule" = "Schedule"; + +/* Title of insulin delivery section */ +"Scheduled Basal" = "Scheduled Basal"; + +/* Card title for scheduled reminder + Scheduled reminder card title on NotificationSettingsView + Title for scheduled expiration reminder edit page + Title of SetupCompleteView */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* Title text for insulin type confirmation page */ +"Select the type of insulin that you will be using in this pod." = "Select the type of insulin that you will be using in this pod."; + +/* description label for sequence number pod details row */ +"Sequence Number" = "Sequence Number"; + +/* Button text for setting manual temporary basal rate */ +"Set Temporary Basal" = "Set Temporary Basal"; + +/* Button title to set temporary basal rate */ +"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; + +/* Title for setup complete screen */ +"Setup Complete" = "Setup Complete"; + +/* Error message for reservoir view during general pod fault */ +"Signal Loss" = "Signal Loss"; + +/* No comment provided by engineer. */ +"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; + +/* The title of the status section in settings */ +"Status" = "Status"; + +/* A message indicating a command succeeded */ +"Succeeded" = "Succeeded"; + +/* Title for suspend duration selection action sheet */ +"Suspend Delivery" = "Suspend Delivery"; + +/* Text for suspend resume button when insulin delivery active */ +"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; + +/* The detail text of the basal row when pod is suspended */ +"Suspended" = "Suspended"; + +/* Label for suspended at time */ +"Suspended At" = "Suspended At"; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Suspending insulin delivery..."; + +/* Title text for the button to delete Omnipod PumpManager */ +"Switch from Omnipod Pumps" = "Switch from Omnipod Pumps"; + +/* Label for PumpManager deletion button */ +"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + +/* Title of button to sync basal profile from pod */ +"Sync With Pod" = "Sync With Pod"; + +/* Label text for step one of insert cannula instructions */ +"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporary Basal"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal Failed"; + +/* The title of the command to run the test command */ +"Test Command" = "Test Command"; + +/* Progress message for testing commands. */ +"Testing Commands…" = "Testing Commands…"; + +/* Footer text for omnipod reminders section */ +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; + +/* Description text on ExpirationReminderSetupView */ +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; + +/* Description text on LowReservoirReminderSetupView */ +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; + +/* Footer text for low reservoir value row */ +"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; + +/* Description text for critical alerts */ +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; + +/* Message for pod sync time action sheet */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; + +/* description for time change detected notice */ +"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump."; + +/* Description of proper cannula insertion */ +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; + +/* Format string for recovery suggestion during deactivate pod. */ +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; + +/* Footer text for scheduled reminder area */ +"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; + +/* Alert format string for missing temp basal configuration. */ +"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate."; + +/* Label for expiration reminder row + Label for scheduled expiration reminder row + Label for scheduled reminder value row */ +"Time" = "Time"; + +/* Title for pod sync time action sheet. + title for time change detected notice */ +"Time Change Detected" = "Time Change Detected"; + +/* No comment provided by engineer. */ +"Toggle sign" = "Toggle sign"; + +/* The error message shown when Loop's basal schedule has more entries than the pod can support */ +"Too many entries" = "Too many entries"; + +/* description label for total delivery pod details row */ +"Total Delivery" = "Total Delivery"; + +/* Units for showing temp basal rate */ +"U/hr" = "U/hr"; + +/* Instructions when pod cannot be deactivated */ +"Unable to deactivate pod. Please continue and pair a new one." = "Unable to deactivate pod. Please continue and pair a new one."; + +/* Title of delivery uncertainty recovery page */ +"Unable to Reach Pod" = "Unable to Reach Pod"; + + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; + +/* Label for pod life state when pod not fully activated */ +"Unfinished Activation" = "Unfinished Activation"; + +/* Label for pod life state when pod not fully deactivated */ +"Unfinished deactivation" = "Unfinished deactivation"; + +/* The detail text for delivered insulin when no measurement is available */ +"Unknown" = "Unknown"; + +/* Label text for step two of insert cannula instructions */ +"Wait until insertion is completed." = "Wait until insertion is completed."; + +/* Button label for user to answer cannula was properly inserted */ +"Yes" = "Yes"; + +/* Button title for confirm deactivation option */ +"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; + +/* bodyText for PodSetupView */ +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; + +/* Format string for instructions for setup complete view. (1: app name) */ +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; + +/* Alert message body for confirm pod attachment */ +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; + +/* navigation title for Silnce Pod" */ +"Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; + +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj b/Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj index 6c748796a9..e04984db13 100644 --- a/Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj +++ b/Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj @@ -186,6 +186,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 193F1E462B44C20400525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E472B44C20400525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E482B44C20500525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; 43047FC31FAEC70600508343 /* RadioFirmwareVersionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioFirmwareVersionTests.swift; sourceTree = ""; }; 43047FC51FAEC83000508343 /* RFPacketTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RFPacketTests.swift; sourceTree = ""; }; 431185AE1CF25A590059ED98 /* IdentifiableClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifiableClass.swift; sourceTree = ""; }; @@ -891,6 +894,7 @@ cs, ar, hi, + hu, ); mainGroup = C12EA22E198B436800309FA4; productRefGroup = C12EA238198B436800309FA4 /* Products */; @@ -1131,6 +1135,7 @@ F5E0BE2A27E1DF280033557E /* he */, C1DEE897298309EA0008194D /* sk */, C12BCD0629BBFA490066A158 /* cs */, + 193F1E472B44C20400525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1161,6 +1166,7 @@ C12BCD0729BBFA490066A158 /* cs */, C1FAB5CB29C786B000D25073 /* hi */, C12B52E029C8142E0025DA95 /* ar */, + 193F1E482B44C20500525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; @@ -1192,6 +1198,7 @@ C12BCD0329BBFA490066A158 /* cs */, C15A583529C7866600D3A5A1 /* ar */, C1FAB5CA29C786B000D25073 /* hi */, + 193F1E462B44C20400525770 /* hu */, ); name = Localizable.strings; sourceTree = ""; diff --git a/Dependencies/rileylink_ios/RileyLink/hu.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLink/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..7b8ff1d7f2 --- /dev/null +++ b/Dependencies/rileylink_ios/RileyLink/hu.lproj/Localizable.strings @@ -0,0 +1,51 @@ +/* The title of the about section */ +"About" = "About"; + +/* The title of the button to add the credentials for a service */ +"Add Account" = "Add Account"; + +/* The title of the nightscout API secret credential */ +"API Secret" = "API Secret"; + +/* The title of the configuration section in settings */ +"Configuration" = "Configuration"; + +/* The title of the button to remove the credentials for a service */ +"Delete Account" = "Delete Account"; + +/* The placeholder text instructing users how to enter a pump ID */ +"Enter the 6-digit pump ID" = "Enter the 6-digit pump ID"; + +/* The title text for the pull cgm Data cell */ +"Fetch CGM" = "Fetch CGM"; + +/* The placeholder text for the nightscout site URL credential */ +"http://mysite.herokuapp.com" = "http://mysite.herokuapp.com"; + +/* The title of the Nightscout service */ +"Nightscout" = "Nightscout"; + +/* The title text for the pump ID config value */ +"Pump ID" = "Pump ID"; + +/* Title text for section listing configured pumps */ +"Pumps" = "Pumps"; + +/* The default placeholder string for a credential */ +"Required" = "Required"; + +/* Title for RileyLink Testing main view controller */ +"RileyLink Testing" = "RileyLink Testing"; + +/* Title text for button to set up omnipod */ +"Setup Omnipod" = "Setup Omnipod"; + +/* The title of the nightscout site URL credential */ +"Site URL" = "Site URL"; + +/* The empty-state text for a configuration value */ +"Tap to set" = "Tap to set"; + +/* The title text for the nightscout upload enabled switch cell */ +"Upload To Nightscout" = "Upload To Nightscout"; + diff --git a/Dependencies/rileylink_ios/RileyLinkBLEKit/hu.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkBLEKit/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..b8344eccca --- /dev/null +++ b/Dependencies/rileylink_ios/RileyLinkBLEKit/hu.lproj/Localizable.strings @@ -0,0 +1,30 @@ +/* Write size limit exceeded error description (1: size limit) */ +"Data exceeded maximum size of %@ bytes" = "Data exceeded maximum size of %@ bytes"; + +/* Invalid input error description (1: input) */ +"Input %@ is invalid" = "Input %@ is invalid"; + +/* Recovery suggestion for unknown peripheral characteristic */ +"Make sure the device is nearby, and the issue should resolve automatically" = "Make sure the device is nearby, and the issue should resolve automatically"; + +/* Timeout error description */ +"Peripheral did not respond in time" = "Peripheral did not respond in time"; + +/* Not ready error description */ +"Peripheral isnʼt connected" = "Peripheral isnʼt connected"; + +/* Response timeout error description */ +"Pump did not respond in time" = "Pump did not respond in time"; + +/* Invalid response error description (1: response) */ +"Response %@ is invalid" = "Response %@ is invalid"; + +/* Unsupported command error description */ +"RileyLink firmware does not support the %@ command" = "RileyLink firmware does not support the %@ command"; + +/* Failure reason: unknown peripheral characteristic */ +"The RileyLink was temporarily disconnected" = "The RileyLink was temporarily disconnected"; + +/* Error description */ +"Unknown characteristic" = "Unknown characteristic"; + diff --git a/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..56422d08ea --- /dev/null +++ b/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings @@ -0,0 +1,106 @@ +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* Unit format string for an value in percent */ +"%@%%" = "%@%%"; + +/* The title of the section for alerts */ +"Alert" = "Alert"; + +/* Text indicating LED Mode is auto */ +"Auto" = "Auto"; + +/* The title of the cell showing battery level */ +"Battery level" = "Battery level"; + +/* The title of the section describing commands */ +"Commands" = "Commands"; + +/* The connected state */ +"Connected" = "Connected"; + +/* The in-progress connecting state */ +"Connecting" = "Connecting"; + +/* The title of the cell for connection LED */ +"Connection LED" = "Connection LED"; + +/* The title of the section for connection monitoring */ +"Connection Monitoring" = "Connection Monitoring"; + +/* The title of the cell showing BLE connection state */ +"Connection State" = "Connection State"; + +/* The title of the cell for connection vibration */ +"Connection Vibration" = "Connection Vibration"; + +/* The title of the section describing the device */ +"Device" = "Device"; + +/* The title of the devices table section in RileyLink settings */ +"Devices" = "Devices"; + +/* The disconnected state */ +"Disconnected" = "Disconnected"; + +/* The in-progress disconnecting state */ +"Disconnecting" = "Disconnecting"; + +/* The title of the cell for sounding device finding piezo */ +"Find Device" = "Find Device"; + +/* The title of the cell showing firmware version */ +"Firmware" = "Firmware"; + +/* The title of the cell showing current rileylink frequency */ +"Frequency" = "Frequency" ; + +/* The title of the command to fetch RileyLink statistics */ +"Get RileyLink Statistics" = "Get RileyLink Statistics"; + +/* Progress message for getting statistics. */ +"Get Statistics…" = "Get Statistics…"; + +/* The title of the cell showing Lighten Red LED */ +"Lighten Red LED" = "Lighten Red LED"; + +/* The title of the cell showing Lighten Yellow LED */ +"Lighten Yellow LED" = "Lighten Yellow LED"; + +/* The title of the cell showing battery level */ +"Low Battery Alert" = "Low Battery Alert"; + +/* The title of the cell showing device name */ +"Name" = "Name"; + +/* Detail text when battery alert disabled. + Text indicating LED Mode is off */ +"Off" = "Off"; + +/* Text indicating LED Mode is on */ +"On" = "On"; + +/* RileyLink setup description */ +"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink allows for communication with the pump over Bluetooth Low Energy."; + +/* The title of the cell showing BLE signal strength (RSSI) */ +"Signal Strength" = "Signal Strength"; + +/* The title of the section for orangelink commands + The title of the section for rileylink commands */ +"Test Commands" = "Test Commands"; + +/* The title of the cell showing Test Vibration */ +"Test Vibration" = "Test Vibration"; + +/* The title of the command to update diagnostic LEDs */ +"Toggle Diagnostic LEDs" = "Toggle Diagnostic LEDs"; + +/* Progress message for changing diagnostic LED mode */ +"Updating diagnostic LEDs mode" = "Updating diagnostic LEDs mode"; + +/* The title of the cell showing uptime */ +"Uptime" = "Uptime"; + +/* The title of the cell showing ORL */ +"Voltage" = "Voltage"; diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 4441e95b77..bec9a803f9 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -561,6 +561,10 @@ 1927C8FB2744612600347C69 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; 1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 1935363F28496F7D001E0B16 /* Oref2_variables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oref2_variables.swift; sourceTree = ""; }; + 193F1E392B44C13B00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; + 193F1E3A2B44C13B00525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 193F1E3B2B44C14800525770 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = ""; }; + 193F1E3C2B44C14800525770 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; }; 193F6CDC2A512C8F001240FD /* Loops.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loops.swift; sourceTree = ""; }; 1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataStorage.swift; sourceTree = ""; }; 195D80B32AF6973A00D25097 /* DynamicRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicRootView.swift; sourceTree = ""; }; @@ -2582,6 +2586,8 @@ "pt-PT", "pt-BR", sk, + hu, + vi, ); mainGroup = 388E594F25AD948C0019842D; packageReferences = ( @@ -3120,6 +3126,8 @@ 1927C8FB2744612600347C69 /* uk */, 1927C8FE274489BA00347C69 /* Base */, 19C166682756EFBD00ED12E3 /* sk */, + 193F1E392B44C13B00525770 /* hu */, + 193F1E3B2B44C14800525770 /* vi */, ); name = InfoPlist.strings; sourceTree = ""; @@ -3148,6 +3156,8 @@ 199732B4271B72DD00129A3F /* pt-PT */, 199732B5271B9EE900129A3F /* pt-BR */, 19C166692756EFBD00ED12E3 /* sk */, + 193F1E3A2B44C13B00525770 /* hu */, + 193F1E3C2B44C14800525770 /* vi */, ); name = Localizable.strings; sourceTree = ""; diff --git a/FreeAPS/Resources/hu.lproj/InfoPlist.strings b/FreeAPS/Resources/hu.lproj/InfoPlist.strings new file mode 100644 index 0000000000..490542f424 --- /dev/null +++ b/FreeAPS/Resources/hu.lproj/InfoPlist.strings @@ -0,0 +1,20 @@ +/* Privacy - NFC Scan Usage Description */ +"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; + +/* Privacy - Bluetooth Always Usage Description */ +"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; + +/* Privacy - Bluetooth Peripheral Usage Description */ +"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; + +/* Privacy - Face ID Usage Description */ +"NSFaceIDUsageDescription" = "For authorized acces to bolus"; + +/* Privacy - Calendars Usage Description */ +"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; + +/* Privacy - Health Update Usage Description */ +"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; + +/* Privacy - Health Share Usage Description */ +"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; diff --git a/FreeAPS/Resources/vi.lproj/InfoPlist.strings b/FreeAPS/Resources/vi.lproj/InfoPlist.strings new file mode 100644 index 0000000000..490542f424 --- /dev/null +++ b/FreeAPS/Resources/vi.lproj/InfoPlist.strings @@ -0,0 +1,20 @@ +/* Privacy - NFC Scan Usage Description */ +"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; + +/* Privacy - Bluetooth Always Usage Description */ +"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; + +/* Privacy - Bluetooth Peripheral Usage Description */ +"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; + +/* Privacy - Face ID Usage Description */ +"NSFaceIDUsageDescription" = "For authorized acces to bolus"; + +/* Privacy - Calendars Usage Description */ +"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; + +/* Privacy - Health Update Usage Description */ +"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; + +/* Privacy - Health Share Usage Description */ +"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..223233f580 --- /dev/null +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -0,0 +1,2113 @@ +/* + Localizable.strings + iAPS +*/ +/* -------------------------------- */ +/* Bolus screen when adding insulin */ +"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; + +/* Add insulin from source outside of pump */ +"Add %@ without bolusing" = "Add %@ without bolusing"; + +"Bolus" = "Bolus"; + +"Close" = "Close"; + +/* Continue after added carbs without bolus */ +"Continue without bolus" = "Continue without bolus"; + +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + +/* Header */ +"Enact Bolus" = "Enact Bolus"; + +/* Button */ +"Enact bolus" = "Enact bolus"; + +/* */ +"Insulin recommended" = "Insulin recommended"; + +/* */ +"Insulin required" = "Insulin required"; + +/* Bolus screen */ +"Recommendation" = "Recommendation"; + +/* Button */ +"Clear" = "Clear"; + +/* Button */ +"Done" = "Done"; + +/* */ +"Wait please" = "Wait please"; + +/* */ +"Agree and continue" = "Agree and Continue"; + +/* Bolus progress view */ +"of" = "of"; + +/* Headline in enacted pop up (at: at what time) */ +"Enacted at" = "Enacted at"; + +/* Headline in suggested pop up (at: at what time) */ +"Suggested at" = "Suggested at"; + +/* Headline in enacted pop up (at: at what time) */ + "Error at" = "Error at"; + +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Continue"; + +/* Home title */ +"Home" = "Home"; + +/* Looping in progress */ +"looping" = "looping"; + +/* min ago since last loop */ +"min ago" = "min ago"; + +/* Status Title */ +"No suggestion" = "No suggestion"; + +/* Replace pod text in Header */ +"Replace pod" = "Replace pod"; + +/* Add carbs screen */ +"Add Carbs" = "Add Carbs"; + +/* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ +"Add Carbs " = "Add Carbs "; + +/* */ +"Amount Carbs" = "Amount Carbs"; + +/* Grams unit */ +"grams" = "grams"; + +/* */ +"Carbs required" = "Carbs required"; + +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + +/* */ +"Are you sure?" = "Are you sure?"; + +/* Bottom target temp */ +"Bottom target" = "Bottom target"; + +/* Cancel preset name */ +"Cancel" = "Cancel"; + +/* */ +"Cancel Temp Target" = "Cancel Temp Target"; + +/* Custom temp target */ +"Custom" = "Custom"; + +/* */ +"Date" = "Date"; + +/* */ +"Delete" = "Delete"; + +/* Delete preset temp target */ +"Delete preset \"%@\"" = "Delete preset \"%@\""; + +/* Duration of target temp or temp basal */ +"Duration" = "Duration"; + +/* */ +"Enact Temp Target" = "Enact Temp Target"; + +/* */ +"Target" = "Target"; + +/* */ +"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; + +/* */ +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; + +/* */ +" Your setting: " = " Your setting: "; + +/* */ +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; + +/* */ +"Enter preset name" = "Enter preset name"; + +/* Preset name */ +"Name" = "Name"; + +/* minutes of target temp */ +"minutes" = "minutes"; + +/* */ +"Presets" = "Presets"; + +/* Save preset name */ +"Save" = "Save"; + +/* */ +"Save as Preset" = "Save as Preset"; + +/* Delete Meal Preset */ +"Delete Preset" = "Delete Preset"; + +/* Confirm Deletion */ +"Delete preset '%@'?" = "Delete preset '%@'?"; + +/* Button */ +"No" = "No"; + +/* Button */ +"Yes" = "Yes"; + +/* + Button */ +"[ +1 ]" = "[ +1 ]"; + +/* - Button */ +"[ -1 ]" = "[ -1 ]"; + +/* Upper temp target limit */ +"Top target" = "Top target"; + +/* Temp target set for ... minutes */ +"for" = "for"; + +/* Temp target set for ... minutes */ +"min" = "min"; + +/* */ +"Autotune" = "Autotune"; + +/* */ +"Basal profile" = "Basal profile"; + +/* */ +"Carb ratio" = "Carb ratio"; + +/* */ +"Delete autotune data" = "Delete autotune data"; + +/* */ +"Run now" = "Run now"; + +/* */ +"Last run" = "Last run"; + +/* */ +"Sensitivity" = "Sensitivity"; + +/* */ +"Use Autotune" = "Use Autotune"; + +/* Add profile basal */ +"Add" = "Add"; + +/* */ +"Basal Profile" = "Basal Profile"; + +/* Rate basal profile */ +"Rate" = "Rate"; + +/* */ +"Save on Pump" = "Save on Pump"; + +/* */ +"Saving..." = "Saving..."; + +/* */ +"Schedule" = "Schedule"; + +/* */ +"starts at" = "starts at"; + +/* Time basal profile */ +"Time" = "Time"; + +/* */ +"Calculated Ratio" = "Calculated Ratio"; + +/* Carb Ratios header */ +"Carb Ratios" = "Carb Ratios"; + +/* */ +"Ratio" = "Ratio"; + +/* */ +"Autosens" = "Autosens"; + +/* */ +"Calculated Sensitivity" = "Calculated Sensitivity"; + +/* */ +"Insulin Sensitivities" = "Insulin Sensitivities"; + +/* */ +"Sensitivity Ratio" = "Sensitivity Ratio"; + +/* */ +"Dismiss" = "Dismiss"; + +/* */ +"Important message" = "Important message"; + +/* */ +"Amount" = "Amount"; + +/* */ +"Cancel Temp Basal" = "Cancel Temp Basal"; + +/* Enact +Enact a temp Basal or a temp target */ +"Enact" = "Enact"; + +/* */ +"Manual Temp Basal" = "Manual Temp Basal"; + +/* Allow uploads to different services */ +"Allow uploads" = "Allow uploads"; + +/* API secret in NS */ +"API secret" = "API secret"; + +/* Connect to NS */ +"Connect" = "Connect"; + +/* Connected to NS */ +"Connected!" = "Connected!"; + +/* Connecting to NS */ +"Connecting..." = "Connecting..."; + +/* */ +"Invalid URL" = "Invalid URL"; + +/* */ +"Local glucose source" = "Local glucose source"; + +/* Header */ +"Nightscout Config" = "Nightscout Config"; + +/* */ +"Port" = "Port"; + +/* */ +"URL" = "URL"; + +/**/ +"Use local glucose server" = "Use local glucose server"; + +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + +/* */ +"Edit settings json" = "Edit settings json"; + +/* */ +"Glucose units" = "Glucose units"; + +/* */ +"Preferences" = "Preferences"; + +/* Recommended Insulin Fraction in preferences */ +"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; + +/* Do you want to show bolus screen after added carbs? */ +"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; + +/* Allow remote control from NS */ +"Remote control" = "Remote control"; + +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + +/* Add Medtronic pump */ +"Add Medtronic" = "Add Medtronic"; + +/* Add Omnipod pump */ +"Add Omnipod" = "Add Omnipod"; + +/* Add Simulator pump */ +"Add Simulator" = "Add Simulator"; + +/* Insulin model */ +"Model" = "Model"; + +/* */ +"Pump config" = "Pump config"; + +/* */ +"Delivery limits" = "Delivery limits"; + +/* */ +"Duration of Insulin Action" = "Duration of Insulin Action"; + +/* hours of duration of insulin activity */ +"hours" = "hours"; + +/* Max setting */ +"Max Basal" = "Max Basal"; + +/* Max setting */ +"Max Bolus" = "Max Bolus"; + +/* Max setting */ +"Max Carbs" = "Max Carbs"; + +/* */ +"Pump Settings" = "Pump Settings"; + +/* Insulin unit per hour */ +"U/hr" = "U/hr"; + +/* Unit in number of units delivered (keep the space character!) */ +" U" = " U"; + +/* /Insulin unit */ +"/U" = "/U"; + +/* Insulin unit */ +"U" = "U"; + +/* Unit per hour with space */ +" U/hr" = " U/hr"; + +/* Number of units per hour*/ +"%@ U/hr" = "%@ U/hr"; + +/* Number of units insulin delivered */ +"%@ U" = "%@ U"; + +/*Carb ratio unit */ +"g/U" = "g/U"; + +/* grams */ +" g" = " g"; + +/* The short unit display string for grams */ +"g" = "g"; + +/* when 0 U/hr */ +"0 U/hr" = "0 U/hr"; + +/* abbreviation for days */ +"d" = "d"; + +/* abbreviation for hours */ +"h" = "h"; + +/* abbreviation for minutes */ +"m" = "m"; + +/* */ +"Closed loop" = "Closed loop"; + +/* */ +"Configuration" = "Configuration"; + +/* */ +"Devices" = "Devices"; + +/* */ +"Pump" = "Pump"; + +/* */ +"Watch" = "Watch"; + +/* */ +"Watch Configuration" = "Watch Configuration"; + +/* */ +"Apple Watch" = "Apple Watch"; + +/* */ +"Display on Watch" = "Display on Watch"; + +/* */ +"Garmin Watch" = "Garmin Watch"; + +/* */ +"Add devices" = "Add devices"; + +/* */ +"Glucose Target" = "Glucose Target"; + +/* */ +"Heart Rate" = "Heart Rate"; + +/* */ +"Steps" = "Steps"; + +/* */ +"ISF" = "ISF"; + +/* */ +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; + +/* */ +"Garmin is not available" = "Garmin is not available"; + +/* */ +"Services" = "Services"; + +/* */ +"Settings" = "Settings"; + +/* Recommendation for a Manual Bolus */ +"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; + +/* 2 log files to share */ +"Share logs" = "Share logs"; + +/* Upper target */ +"High target" = "High target"; + +/* Lower target */ +"Low target" = "Low target"; + +/* When bolusing */ +"Bolusing" = "Bolusing"; + +/* */ +"Pump suspended" = "Pump suspended"; + +/* */ +"Middleware" = "Middleware"; + +/* Header */ +"History" = "History"; + +/* Nightscout option */ +"Upload" = "Upload"; + +/* Nightscout option */ +"Allow Uploads" = "Allow Uploads"; + +/* Type of CGM or glucose source */ +"Type" = "Type"; + +/* CGM */ +"CGM" = "CGM"; + +/* CGM Transmitter ID */ +"Transmitter ID" = "Transmitter ID"; + +/* Other CGM setting */ +"Other" = "Other"; + +/* Whatch app alert */ +"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; + +/* Updating Watch app */ +"Updating..." = "Updating..."; + +/* Header for Temp targets in Watch app */ +"Temp Targets" = "Temp Targets"; + +/* Delete carbs from data table and Nightscout */ +"Delete Carbs?" = "Delete Carbs?"; + +/* Delete insulin from pump history and Nightscout */ +"Delete Insulin?" = "Delete Insulin?"; + +/* Treatments list */ +"Treatments" = "Treatments"; + +/* " min" in Treatments list */ +" min" = " min"; + +/* */ +"Unable to change anything" = "Unable to change anything"; + + +/* Calendar and Libre transmitter settings --------------- + */ +/* */ +"Configure Libre Transmitter" = "Configure Libre Transmitter"; + +/* */ +"Calibrations" = "Calibrations"; + +/* */ +"Create Events in Calendar" = "Create Events in Calendar"; + +/* */ +"Calendar" = "Calendar"; + +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + +/* External insulin treatments */ +"External" = "External"; + +/* */ +"Other" = "Other"; + +/* */ +"Libre Transmitter" = "Libre Transmitter"; + +/* */ +"Libre Transmitters" = "Libre Transmitters"; + +/* */ +"Bluetooth Transmitters" = "Bluetooth Transmitters"; + +/* */ +"Modes" = "Modes"; + +/* Libre 2 Direct */ +"Libre 2 Direct" = "Libre 2 Direct"; + +/* */ +"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; + +/* State was restored */ +"State was restored" = "State was restored"; + +/* The short unit display string for millimoles of glucose per liter */ +"mmol/L" = "mmol/L"; + +/* The short unit display string for milligrams of glucose per decilter */ +"mg/dL" = "mg/dL"; + +/* */ +"Add calibration" = "Add calibration"; + +/* When adding capillary glucose meater reading */ +"Meter glucose" = "Meter glucose"; + +/* */ +"Info" = "Info"; + +/*v*/ +"Slope" = "Slope"; + +/* */ +"Intercept" = "Intercept"; + +/* */ +"Chart" = "Chart"; + +/* */ +"Remove" = "Remove"; + +/* */ +"Remove Last" = "Remove Last"; + +/* */ +"Remove All" = "Remove All"; + +/* */ +"About the Process"= "About the Process"; + +/* */ +"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; + +/* */ +"Pairinginfo" = "Pairinginfo"; + +/* */ +"PatchInfo" = "PatchInfo"; + +/* */ +"Calibrationinfo" = "Calibrationinfo"; + +/* */ +"Unknown" = "Unknown"; + +/* */ +"Not paired yet" = "Not paired yet"; + +/* */ +"Pair Sensor & connect" = "Pair Sensor & connect"; + +/* */ +"Phone NFC required!" = "Phone NFC required!"; + +/* */ +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; + +/* Bluetooth Power Off */ +"Bluetooth Power Off" = "Bluetooth Power Off"; + +/* Please turn on Bluetooth */ +"Please turn on Bluetooth" = "Please turn on Bluetooth"; + +/* No Libre Transmitter Selected */ +"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; + +/* Delete Transmitter and start anew. */ +"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; + +/* Invalid libre checksum */ +"Invalid libre checksum" = "Invalid libre checksum"; + +/* Libre sensor was incorrectly read, CRCs were not valid */ +"Libre sensor was incorrectly read, CRCs were not valid"= "Libre sensor was incorrectly read, CRCs were not valid"; + +/* Glucose */ +"Glucose" = "Glucose"; + +/* LOWALERT! */ +"LOWALERT!" = "LOWALERT!"; + +/* HIGHALERT! */ +"HIGHALERT!" = "HIGHALERT!"; + +/* (Snoozed)*/ +"(Snoozed)" = "(Snoozed)"; + +/* Glucose: %@ */ +"Glucose: %@" = "Glucose: %@"; + +/* Transmitter: %@%% */ +"Transmitter: %@%%" = "Transmitter: %@%%"; + +/* No Sensor Detected */ +"No Sensor Detected" = "No Sensor Detected"; + +/* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; + +/* New Sensor Detected */ +"New Sensor Detected" = "New Sensor Detected"; + +/* Please wait up to 30 minutes before glucose readings are available! */ +"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; + +/* Invalid Glucose sample detected, try again later */ +"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; + +/* ensor might have temporarily stopped, fallen off or is too cold or too warm */ +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; + +/* Invalid Sensor Detected */ +"Invalid Sensor Detected" = "Invalid Sensor Detected"; + +/* Detected sensor seems not to be a libre 1 sensor! */ +"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; + +/* Detected sensor is invalid: %@ */ +"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; + +/* Low Battery */ +"Low battery" = "Low battery"; + +/* */ +"Invalid sensor" = "Invalid sensor"; + +/* */ +"Sensor change" = "Sensor change"; + +/* */ +"Sensor expires soon" = "Sensor expires soon"; + +/* Battery is running low %@, consider charging your %@ device as soon as possible */ +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; + +/* Extracting calibrationdata from sensor */ +"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; + +/* Sensor Ending Soon */ +"Sensor Ending Soon" = "Sensor Ending Soon"; + +/* Current Sensor is Ending soon! Sensor Life left in %@ */ +"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; + +/* */ +"Libre Bluetooth" = "Libre Bluetooth"; + +/* */ +"Snooze Alerts" = "Snooze Alerts"; + +/* */ +"Last measurement" = "Last measurement"; + +/* */ +"Sensor Footer checksum" = "Sensor Footer checksum"; + +/* */ +"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; + +/* */ +"CurrentBG" = "CurrentBG"; + +/* */ +"Sensor Info" = "Sensor Info"; + +/* */ +"Sensor Age" = "Sensor Age"; + +/* */ +"Sensor Age Left" = "Sensor Age Left"; + +/* */ +"Sensor Endtime" = "Sensor Endtime"; + +/* */ +"Sensor State" = "Sensor State"; + +/* */ +"Sensor Serial" = "Sensor Serial"; + +/* */ +"Transmitter Info" = "Transmitter Info"; + +/* */ +"Hardware" = "Hardware"; + +/* */ +"Firmware" = "Firmware"; + +/* */ +"Connection State" = "Connection State"; + +/* */ +"Transmitter Type" = "Transmitter Type"; + +/* */ +"Sensor Type" = "Sensor Type"; + +/* */ +"Factory Calibration Parameters" = "Factory Calibration Parameters"; + +/* */ +"Valid for footer" = "Valid for footer"; + +/* */ +"Edit calibrations" = "Edit calibrations"; + +/* */ +"edit calibration clicked" = "edit calibration clicked"; + +/* */ +"Delete CGM" = "Delete CGM"; + +/* */ +"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; + +/* */ +"There is no undo" = "There is no undo"; + +/* */ +"Advanced" = "Advanced"; + +/* */ +"Alarms" = "Alarms"; + +/* */ +"Glucose Settings" = "Glucose Settings"; + +/* */ +"Notifications" = "Notifications"; + +/* */ +"Export logs" = "Export logs"; + +/* */ +"Export not available" = "Export not available"; + +/* */ +"Log export requires ios 15" = "Log export requires ios 15"; + +/* */ +"Got it!" = "Got it!"; + +/* */ +"Saved to %@" = "Saved to %@"; + +/* */ +"No logs available" = "No logs available"; + +/* */ +"Glucose Notification visibility" = "Glucose Notification visibility"; + +/* */ +"Always Notify Glucose" = "Always Notify Glucose"; + +/* */ +"Notify per reading" = "Notify per reading"; + +/* */ +"Value" = "Value"; + +/* */ +"Adds Phone Battery" = "Adds Phone Battery"; + +/* */ +"Adds Transmitter Battery" = "Adds Transmitter Battery"; + +/* */ +"Also vibrate" = "Also vibrate"; + +/* */ +"Additional notification types" = "Additional notification types"; + +/* */ +"Misc" = "Misc"; + +/* */ +"Unit override" = "Unit override"; + +/* */ +"Low" = "Low"; + +/* */ +"High" = "High"; + +/* */ +"glucose" = "glucose"; + +/* */ +"Schedule " = "Schedule "; + +/* */ +"tapped save schedules" = "tapped save schedules"; + +/* */ +"Error" = "Error"; + +/* */ +"Some ui element was incorrectly specified" = "Some ui element was incorrectly specified"; + +/* */ +"Success" = "Success"; + +/* */ +"Schedules were saved successfully!" = "Schedules were saved successfully!"; + +/* */ +"High Glucose Alarm active" = "High Glucose Alarm active"; + +/* */ +"Low Glucose Alarm active" = "Low Glucose Alarm active"; + +/* */ +"No Glucose Alarm active" = "No Glucose Alarm active"; + +/* */ +"snoozing until %@" = "snoozing until %@"; + +/* */ +"not snoozing" = "not snoozing"; + +/* */ +"nothing to see here" = "nothing to see here"; + +/* */ +"snooze from testview clicked" = "snooze from testview clicked"; + +/* */ +"will snooze for %@ until %@" = "will snooze for %@ until %@"; + +/* */ +"Click to Snooze Alerts" = "Click to Snooze Alerts"; + +/* */ +"Strength" = "Strength"; + +/* */ +"Hold the top of your iPhone near the sensor to pair" = "Hold the top of your iPhone near the sensor to pair"; + +/* */ +"Sensor not found" = "Sensor not found"; + +/* */ +"Also play alert sound" = "Also play alert sound"; + +/* */ +"Notification Settings" = "Notification Settings"; + +/* */ +"Found devices: %d" = "Found devices: %d"; + +/* */ +"Backfill options" = "Backfill options"; + +/* */ +"Backfilling from trend is currently not well supported by Loop" = "Backfilling from trend is currently not well supported by Loop"; + +/* */ +"Backfill from history" = "Backfill from history"; + +/* */ +"Backfill from trend" = "Backfill from trend"; + +/* */ +"Debug options" = "Debug options"; + +/* */ +"Adds a lot of data to the Issue Report " = "Adds a lot of data to the Issue Report "; + +/* */ +"Persist sensordata" = "Persist sensordata"; + +/* */ +"Battery" = "Battery"; + +/* */ + "Also add source info" = "Also add source info"; + + /* */ + "Carbs Required Threshold" = "Carbs Required Threshold"; + + /* */ + "Carbs required: %d g" = "Carbs required: %d g"; + + /* */ + "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; + + /* */ + "iAPS not active" = "iAPS not active"; + + /* */ + "Last loop was more than %d min ago" = "Last loop was more than %d min ago"; + +/* Glucose badge */ +"Show glucose on the app badge" = "Show glucose on the app badge"; + +/* */ +"Backfill glucose" = "Backfill glucose"; + +/* About this source */ +"About this source" = "About this source"; + +/* */ +"Bolus failed" = "Bolus failed"; + +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + +/* */ +"Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; + +/* */ +"Carbs" = "Carbs"; + +/* Food Type / Meal Note */ +"Note" = "Note"; + +/* */ +"Temp Basal" = "Temp Basal"; + +/* */ +"Temp Target" = "Temp Target"; + +/* */ +"Resume" = "Resume"; + +/* */ +"Suspend" = "Suspend"; + +/* */ +"Animated Background" = "Animated Background"; + +/* Sensor day(s) */ +" day(s)" = " day(s)"; + +/* Option to show HR in Watch app*/ +"Display HR on Watch" = "Display HR on Watch"; + + +/* Headers for settings ----------------------- */ +"OpenAPS main settings" = "OpenAPS main settings"; + +"OpenAPS SMB settings" = "OpenAPS SMB settings"; + +"OpenAPS targets settings" = "OpenAPS targets settings"; + +"OpenAPS other settings" = "OpenAPS other settings"; + +/* Glucose Simulator CGM */ +"Glucose Simulator" = "Glucose Simulator"; + +/* Restored state message */ +"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@"; + +/* Shared app group xDrip4iOS */ +"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; + +/* Shared app group GlucoseDirect */ +"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; + +/* Dexcom G6 app */ +"Dexcom G6 app" = "Dexcom G6 app"; + +/* Native G5 app */ +"Native G5 app" = "Native G5 app"; + +/* Minilink transmitter */ +"Minilink transmitter" = "Minilink transmitter"; + +/* Simple simulator */ +"Simple simulator" = "Simple simulator"; + +/* Direct connection with Libre 1 transmitters or Libre 2 */ +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; + +/* Online or internal server */ +"Online or internal server" = "Online or internal server"; + +/* -------------- Developer settings ---------------------- */ + +/* Debug options */ +"Developer" = "Developer"; + +/* Debug option view NS Upload Profile */ +"NS Upload Profile" = "NS Upload Profile"; + +/* Debug option view NS Uploaded Profile */ +"NS Uploaded Profile" = "NS Uploaded Profile"; + +/* Debug option view Autosense */ +"Autosense" = "Autosense"; + +/* Insulin sensitivity config header */ +"Dynamic Sensitivity" = "Dynamic Sensitivity"; + +/* Autotune config */ +"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; + +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + +/* Debug option view Pump History */ +"Pump History" = "Pump History"; + +/* Debug option view Target Ranges */ +"Target ranges" = "Target ranges"; + +/* Debug option view Temp targets */ +"Temp targets" = "Temp targets"; + +/* Debug option view Meal */ +"Meal" = "Meal"; + +/* Debug option view Pump profile */ +"Pump profile" = "Pump profile"; + +/* Debug option view Profile */ +"Profile" = "Profile"; + +/* Debug option view Enacted */ +"Enacted" = "Enacted"; + +/* Debug option view Announcements (from NS) */ +"Announcements" = "Announcements"; + +/* Debug option view Enacted announcements announcements (from NS) */ +"Enacted announcements" = "Enacted announcements"; + +/* Debug option view Autotune */ +"Autotune" = "Autotune"; + +/* Debug option view Target presets */ +"Target presets" = "Target presets"; + +/* Debug option view */ +"Loop Cycles" = "Loop Cycles"; + +/* Debug option view Glucose Data used for statistics */ +"Glucose Data used for statistics" = "Glucose Data used for statistics"; + +/* --------------- HealthKit intergration --------------------*/ +/* */ +"Apple Health" = "Apple Health"; + +/* */ +"Connect to Apple Health" = "Connect to Apple Health"; + +/* Show when have not permissions for writing to Health */ +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; + +/* */ +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; + + /* New ALerts ------------------------- */ + + /* Info title */ + "Info" = "Info"; + + /* Warning title */ + "Warning" = "Warning"; + + /* Error title */ + "Error" = "Error"; + +/* Manual temp basal mode */ +"Manual" = "Manual"; + +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Manual Basal"; + +/* Current Manual Temp basal */ +" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; + +/* Total AT / Scheduled basal insulin */ +" U/day" = " U/day"; + +/* Total AT / Scheduled basal insulin */ +"Total" = "Total"; + +/* -------------------------------------------- FPU Strings ------------------------------------------------------*/ + +/* Enable FPU */ +"Enable" = "Enable"; + +/* Header */ +"Conversion settings" = "Conversion settings"; + +/* Delay */ +"Delay In Minutes" = "Delay In Minutes"; + +/* Duration */ +"Maximum Duration In Hours" = "Maximum Duration In Hours"; + +/* Interval */ +"Interval In Minutes" = "Interval In Minutes"; + +/* Override */ +"Override With A Factor Of " = "Override With A Factor Of "; + +/* Description */ +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; + +/* FPU Settings Title */ +"Fat and Protein" = "Fat and Protein"; + +/* Display fat and protein entities */ +"Fat & Protein" = "Fat & Protein"; + +/* */ +"Hide Fat & Protein" = "Hide Fat & Protein"; + +/* Add Fat */ +"Fat" = "Fat"; + +/* Add Protein */ +"Protein" = "Protein"; + +/* Service Section */ +"Fat And Protein Conversion" = "Fat And Protein Conversion"; + +/* Service Section */ +"Profile Override" = "Profile Override"; + +/* */ +"Override Profiles" = "Override Profiles"; + +/* */ +"Normal " = "Normal "; + +"Currently no Override active" = "Currently no Override active"; + +/* */ +"Total Insulin Adjustment" = "Total Insulin Adjustment"; + +/* */ +"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; + +/* */ +"Enable indefinitely" = "Enable indefinitely"; + +/* */ +"Override Profile target" = "Override Profile target"; + +/* */ +"Disable SMBs" = "Disable SMBs"; + +/* Your normal Profile. Use a short string */ +"Normal Profile" = "Normal Profile"; + +/* Custom but unsaved Profile */ +"Custom Profile" = "Custom Profile"; + +/* */ +"Profiles" = "Profiles"; + +/* */ +"More options" = "More options"; + +/* */ +"Schedule when SMBs are Off" = "Schedule when SMBs are Off"; + +/* */ +"Change ISF and CR" = "Change ISF and CR"; + +/* */ +"Change ISF" = "Change ISF"; + +/* */ +"Change CR" = "Change CR"; + +/* */ +"SMB Minutes" = "SMB Minutes"; + +/* */ +"UAM SMB Minutes" = "UAM SMB Minutes"; + +/* */ +"Start new Profile" = "Start new Profile"; + +/* */ +"Save as Profile" = "Save as Profile"; + +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target"; + +/* Alert */ +"Return to Normal?" = "Return to Normal?"; + +/* */ +"This will change settings back to your normal profile." = "This will change settings back to your normal profile."; + +/* Start Profile Alert */ +"Start Profile" = "Start Profile"; + +/* */ +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; + +/* */ +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile."; + +/* Change Target glucose in profile settings */ +"Override Profile Target" = "Override Profile Target"; + +/* Alert string. Keep spaces. */ +" SMBs are disabled either by schedule or during the entire duration." = " SMBs are disabled either by schedule or during the entire duration."; + +/* Alert strings. Keep spaces */ +" infinite duration." = " infinite duration."; + +/* Service Section */ +"App Icons" = "App Icons"; + +/* */ +"iAPS Icon" = "iAPS Icon"; + +/* Service Section */ +"Statistics and Home View" = "Statistics and Home View"; + +/* Alert text */ +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + +/* */ +"Meal Presets" = "Meal Presets"; + +/* */ +"Empty" = "Empty"; + +/* */ +"Delete Selected Preset" = "Delete Selected Preset"; + +/* */ +"Enter Meal Preset Name" = "Enter Meal Preset Name"; + +/* */ +"Name Of Dish" = "Name Of Dish"; + +/* Save Carbs and continue to bolus recommendation */ +"Save and continue" = "Save and continue"; + +/* */ +"Save as Preset" = "Save as Preset"; + +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + +/* ----------------------- New Bolus Calculator ---------------------------*/ + +/* Warning about bolus recommendation. Title */ +"Warning!" = "Warning!"; + +/* Alert to confirm bolus amount to add */ +"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; + +/* */ +"Eventual Glucose" = "Eventual Glucose"; + +/* */ +"Please wait" = "Please wait"; + +/* */ +"Glucose, " = "Glucose, "; + +/* */ +"Target Glucose" = "Target Glucose"; + +/* */ +"Percentage setting" = "Percentage setting"; + +/* */ +"Insulin Sensitivity" = "Insulin Sensitivity"; + +/* Formula displayed in Bolus info pop-up. Make translation short! */ +"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; + +/* */ +"Formula:" = "Formula:"; + +/* Bolus pop-up footer */ +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; + +/* Hide pop-up */ +"Hide" = "Hide"; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"which is below your Threshold (" = "which is below your Threshold ("; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; + +//* Bolus pop-up / Alert string. Make translations concise! */ +". Climbing: " = ". Climbing: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +". Falling: " = ". Falling: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +". Changing: " = ". Changing: "; + +/* Add insulin without bolusing alert */ +" without bolusing" = " without bolusing"; + +/* ------------------------------------------------------------------------------------------- + DASH strings +*/ +"Attach Pod" = "Attach Pod"; + +"Deactivate Pod" = "Deactivate Pod"; + +/* */ +"Deactivating..." = "Deactivating..."; + +"Pair Pod" = "Pair Pod"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Previous Pod Information"; + +/* Text for confidence reminders navigation link */ +"Confidence Reminders" = "Confidence Reminders"; + +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; + +/* button title for saving low reservoir reminder while saving */ +"Saving..." = "Saving..."; + +/* button title for saving low reservoir reminder */ +"Save" = "Save"; + +/* Alert title for error when updating confidence reminder preference */ +"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; + +/* */ +"No Error" = "No Error"; + +/* description label for active time pod details row */ +"Active Time"= "Active Time"; + +/* Title string for BeepPreference.silent */ +"Disabled" = "Disabled"; + +/* Title string for BeepPreference.manualCommands */ +"Enabled" = "Enabled"; + +/* Title string for BeepPreference.extended */ +"Extended" = "Extended"; + +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "No confidence reminders are used."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; + +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Expiration Reminder Default"; + +/* */ +"Expiration Reminder" = "Expiration Reminder"; + +/* */ +"Low Reservoir" = "Low Reservoir"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* */ +"Low Reservoir Reminder" = "Low Reservoir Reminder"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; + +/* Label text for temporary basal rate summary */ +"Rate" = "Rate"; + +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ for %2$@"; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; + +/* Button text for setting manual temporary basal rate*/ +"Set Temporary Basal" = "Set Temporary Basal"; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporary Basal"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal Failed"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Missing Config"; + +/* Alert format string for missing temp basal configuration. */ +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; + +/* description label for active time pod details row */ +"Active Time" = "Active Time"; + +/* description label for total delivery pod details row */ +"Total Delivery" = "Total Delivery"; + +/* */ +"Add Omnipod Dash" = "Add Omnipod Dash"; + +/* */ +"Insert Cannula" = "Insert Cannula"; + +/* */ +"Check Cannula" = "Check Cannula"; + +/* */ +"Setup Complete" = "Setup Complete"; + +/* */ +"Insulin Suspended" = "Insulin Suspended"; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Suspending insulin delivery..."; + +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Resume Insulin Delivery"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Resuming insulin delivery..."; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; + +//* -----------------------------------------------------------------------*/ + +/* ----------------------Statistics strings -------------------------------*/ + +/* */ +"Today" = "Today"; + +/* */ +"Day" = "Day"; + +/* */ +"Week" = "Week"; + +/* */ +"Month" = "Month"; + +/* */ +"Total" = "Total"; + +/* Headline Statistics */ +"Statistics" = "Statistics"; + +/* Option in preferences */ +"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; + +/* Low Glucose Threshold in Statistics settings */ +"Low" = "Low"; + +/* High Glucose Threshold in Statistics settings */ +"High" = "High"; + +/* In Range */ +"In Range" = "In Range"; + +/* Display % */ +"Change HbA1c Unit" = "Change HbA1c Unit"; + +/* */ +"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; + +/* */ +"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; + +/* */ +"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; + +/* */ +"Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; + +/* */ +"Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; + +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + +/* Average BG = */ +"Average" = "Average"; + +/* Median BG */ +"Median" = "Median"; + +/* CGM readings in statView */ +"Readings" = "Readings"; + +/* CGM readings in statView */ +"Readings / 24h" = "Readings / 24h"; + +/* Days of saved readings*/ +"Days" = "Days"; + +/* Normal BG (within TIR) */ +"Normal" = "Normal"; + +/* Title High BG in statPanel */ +"High (>" = "High (>"; + +/* Title Low BG in statPanel */ +"Low (<" = "Low (<"; + +/* SD */ +"SD" = "SD"; + +/* CV */ +"CV" = "CV"; + +/* Estimated HbA1c */ +"HbA1c" = "HbA1c"; + +/* Total number of days of data for HbA1c estimation, part 1/2*/ +"All" = "All"; + +/* Total number of days of data for HbA1c estimation, part 2/2*/ +"days" = "days"; + +/* Nr of Loops in statPanel */ +"Loops" = "Loops"; + +/* Loop Errors in statPanel */ +"Errors" = "Errors"; + +/* Average loop interval */ +"Interval" = "Interval"; + +/* Median loop interval */ +"Duration" = "Duration"; + +/* "Display SD */ +"Display SD instead of CV" = "Display SD instead of CV"; + +/* Description for display SD */ +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; + +/* How often to update the statistics */ +"Update every number of minutes:" = "Update every number of minutes:"; + +/* Description for update interval for statistics */ +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; + +/* Duration displayed in statPanel */ +"Past 24 Hours " = "Past 24 Hours "; + +/* Duration displayed in statPanel */ +"Past Week " = "Past Week "; + +/* Duration displayed in statPanel */ +"Past Month " = "Past Month "; + +/* Duration displayed in statPanel */ +"Past 90 Days " = "Past 90 Days "; + +/* Duration displayed in statPanel */ +"All Past Days of Data " = "All Past Days of Data "; + +/* "Display Loop statistics in statPanel */ +"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; + +/* Description for Display Loop statistics */ +"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; + +/* Description for Override HbA1c unit */ +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; + +/* HbA1c for all glucose storage days */ +"all" = "all"; + +/* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ + +"CGM Configuration" = "CGM Configuration"; + +"Heartbeat" = "Heartbeat"; + +"CGM address :" = "CGM address :"; + +"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; + +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* New Experimental feature */ +"Experimental" = "Experimental"; + +/* Smoothing of CGM readings */ +"Smooth Glucose Value" = "Smooth Glucose Value"; + + /* ----------------------------------------------------------------------------------------------------------- + + Infotexts from openaps.docs and androidaps.docs + iAPS +*/ + +/* Headline Rewind Resets Autosens */ +"Rewind Resets Autosens" = "Rewind Resets Autosens"; + +/* ”Rewind Resets Autosens” */ +"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."; + +/* Headline "High Temptarget Raises Sensitivity" */ +"High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; + +/* ”High Temptarget Raises Sensitivity" */ +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)."; + +/* Headline ”Low Temptarget Lowers Sensitivity" */ +"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; + +/* ”Low Temptarget Lowers Sensitivity" */ +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)."; + +/* Headline ”Sensitivity Raises Target" */ +"Sensitivity Raises Target" = "Sensitivity Raises Target"; + +/* ”Sensitivity Raises Target" */ +"When true, raises BG target when autosens detects sensitivity" = "When true, raises BG target when autosens detects sensitivity"; + +/* Headline ”Resistance Lowers Target" */ +"Resistance Lowers Target" = "Resistance Lowers Target"; + +/* ”Resistance Lowers Target" */ +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Defaults to false. When true, will lower BG target when autosens detects resistance"; + +/* Headline ”Advanced Target Adjustments" */ +"Advanced Target Adjustments" = "Advanced Target Adjustments"; + +/* ”Advanced Target Adjustments" */ +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone."; + +/* Headline "Exercise Mode" */ +"Exercise Mode" = "Exercise Mode"; + +/* "Exercise Mode" */ +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity"; + +/* Headline "Wide BG Target Range" */ +"Wide BG Target Range" = "Wide BG Target Range"; + +/* "Wide BG Target Range" */ +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs."; + +/* Headline "Skip Neutral Temps" */ +"Skip Neutral Temps" = "Skip Neutral Temps"; + +/* "Skip Neutral Temps" */ +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means OpenAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications form the 'rig', that may wake you up during the night. "; + +/* Headline "Unsuspend If No Temp” */ +"Unsuspend If No Temp" = "Unsuspend If No Temp"; + +/* "Unsuspend If No Temp” */ +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended."; + +/* Headline "Enable UAM" */ +"Enable UAM" = "Enable UAM"; + +/* "Enable UAM" */ +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier."; + +/* Headline "Enable SMB With COB" */ +"Enable SMB With COB" = "Enable SMB With COB"; + +/* Enable SMB With COB" */ +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "This enables supermicrobolus (SMB) while carbs on board (COB) are positive."; + +/* Headline "Enable SMB With Temptarget” */ +"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; + +/* "Enable SMB With Temptarget” */ +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB."; + +/* Headline "Enable SMB Always" */ +"Enable SMB Always" = "Enable SMB Always"; + +/* "Enable SMB Always" */ +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)."; + +/* Headline "Enable SMB After Carbs" */ +"Enable SMB After Carbs" = "Enable SMB After Carbs"; + +/* "Enable SMB After Carbs" */ +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)."; + +/* Enable "Allow SMB With High Temptarget" */ +"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; + +/* Headline "Allow SMB With High Temptarget" */ +"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; + +/* "Allow SMB With High Temptarget" */ +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)."; + +/* Headline "Use Custom Peak Time” */ +"Use Custom Peak Time" = "Use Custom Peak Time"; + +/* "Use Custom Peak Time” */ +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Defaults to false. Setting to true allows changing insulinPeakTime"; + +/* Headline "Suspend Zeros IOB” */ +"Suspend Zeros IOB" = "Suspend Zeros IOB"; + +/* "Suspend Zeros IOB” */ +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added."; + +/* Headline "Max IOB" */ +"Max IOB" = "Max IOB"; + +/* "Max IOB" */ +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)."; + +/* Headline "Max Daily Safety Multiplier" */ +"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; + +/* "Max Daily Safety Multiplier" */ +"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; + +/* Headline "Current Basal Safety Multiplier" */ +"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; + +/* "Current Basal Safety Multiplier" */ +"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; + +/* Headline "Autosens Max" */ +"Autosens Max" = "Autosens Max"; + +/* "Autosens Max" */ +"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target."; + +/* Headline "Autosens Min" */ +"Autosens Min" = "Autosens Min"; + +/* "Autosens Min" */ +"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets."; + +/* Headline "Half Basal Exercise Target" */ +"Half Basal Exercise Target" = "Half Basal Exercise Target"; + +/* "Half Basal Exercise Target" */ +"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes."; + +/* Headline "Max COB" */ +"Max COB" = "Max COB"; + +/* "Max COB" */ +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; + +/* Headline "Bolus Snooze DIA Divisor" */ +"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; + +/* "Bolus Snooze DIA Divisor" */ +"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)."; + +/* Headline "Min 5m Carbimpact" */ +"Min 5m Carbimpact" = "Min 5m Carbimpact"; + +/* "Min 5m Carbimpact" */ +"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g."; + +/* Headline "Autotune ISF Adjustment Fraction" */ +"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; + +/* "Autotune ISF Adjustment Fraction" */ +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; + +/* Headline "Remaining Carbs Fraction" */ +"Remaining Carbs Fraction" = "Remaining Carbs Fraction"; + +/* "Remaining Carbs Fraction" */ +"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; + +/* Headline "Remaining Carbs Cap" */ +"Remaining Carbs Cap" = "Remaining Carbs Cap"; + +/* "Remaining Carbs Cap" */ +"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; + +/* Headline ”Max SMB Basal Minutes" */ +"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; + +/* ”Max SMB Basal Minutes" */ +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; + +/* Headline "Max UAM SMB Basal Minutes" */ +"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; + +/* "Max UAM SMB Basal Minutes" */ +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; + +/* Headline "SMB Interval" */ +"SMB Interval" = "SMB Interval"; + +/* "SMB Interval" */ +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; + +/* Headline "Bolus Increment" */ +"Bolus Increment" = "Bolus Increment"; + +/* "Bolus Increment" */ +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; + +/* Headline "Insulin Peak Time" */ +"Insulin Peak Time" = "Insulin Peak Time"; + +/* "Insulin Peak Time" */ +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops."; + +/* Headline "Carbs Req Threshold" */ +"Carbs Req Threshold" = "Carbs Req Threshold"; + +/* "Carbs Req Threshold" */ +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold."; + +/* Headline "Noisy CGM Target Multiplier" */ +"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; + +/* "Noisy CGM Target Multiplier" */ +"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data"; + +/* Headline "SMB DeliveryRatio" */ +"SMB DeliveryRatio" = "SMB DeliveryRatio"; + +/* SMB DeliveryRatio */ +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; + +// Dynamic ISF + CR Settings: + +/* Headline "Adjust Dynamic ISF constant" */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Adjust Dynamic ISF constant */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Enable Dynamic ISF, Headline */ +"Enable Dynamic ISF" = "Enable Dynamic ISF"; + +/* Headline "Enable Dynamic ISF" */ +"Enable Dynamic ISF" = "Enable Dynamic ISF"; + +/* Enable Dynamic ISF */ +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; + +/* Headline "Enable Dynamic CR" */ +"Enable Dynamic CR" = "Enable Dynamic CR"; + +/* Enable Dynamic CR */ +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; + +/* Headline "Adjust Dynamic ISF constant" */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Adjust Dynamic ISF constant */ +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; + + +/* Headline "Use Sigmoid Function" */ +"Use Sigmoid Function" = "Use Sigmoid Function"; + +/* Use Sigmoid Function */ +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; + + +/* Headline "Threshold Setting" */ +"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; + +/* Threshold Setting */ +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; + +/* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ +"Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; + +/* Weight of past 24 hours of insulin */ +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; + +/* Headline "Adjust basal" */ +"Adjust basal" = "Adjust basal"; + +/* Enable adjustment of basal profile */ +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; + +/* Headline "Max Delta-BG Threshold SMB" */ +"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; + +/* Max Delta-BG Threshold SMB */ +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; + +/* Headline "... When Blood Glucose Is Over (mg/dl):" */ +"... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; + +/* ... When Blood Glucose Is Over (mg/dl): */ +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; + +/* Headline "Enable SMB With High BG" */ +"Enable SMB With High BG" = "Enable SMB With High BG"; + +/* "Enable SMB With High BG" */ +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; + +/* Headline "Dynamic settings" */ +"Dynamic settings" = "Dynamic settings"; + +/* Insulin curve */ +"Insulin curve" = "Insulin curve"; + +/* Headline "Adjustment Factor" */ +"Adjustment Factor" = "Adjustment Factor"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings new file mode 100644 index 0000000000..223233f580 --- /dev/null +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -0,0 +1,2113 @@ +/* + Localizable.strings + iAPS +*/ +/* -------------------------------- */ +/* Bolus screen when adding insulin */ +"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; + +/* Add insulin from source outside of pump */ +"Add %@ without bolusing" = "Add %@ without bolusing"; + +"Bolus" = "Bolus"; + +"Close" = "Close"; + +/* Continue after added carbs without bolus */ +"Continue without bolus" = "Continue without bolus"; + +/* Alert when adding large amount without bolusing */ +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; + +/* Header */ +"Enact Bolus" = "Enact Bolus"; + +/* Button */ +"Enact bolus" = "Enact bolus"; + +/* */ +"Insulin recommended" = "Insulin recommended"; + +/* */ +"Insulin required" = "Insulin required"; + +/* Bolus screen */ +"Recommendation" = "Recommendation"; + +/* Button */ +"Clear" = "Clear"; + +/* Button */ +"Done" = "Done"; + +/* */ +"Wait please" = "Wait please"; + +/* */ +"Agree and continue" = "Agree and Continue"; + +/* Bolus progress view */ +"of" = "of"; + +/* Headline in enacted pop up (at: at what time) */ +"Enacted at" = "Enacted at"; + +/* Headline in suggested pop up (at: at what time) */ +"Suggested at" = "Suggested at"; + +/* Headline in enacted pop up (at: at what time) */ + "Error at" = "Error at"; + +/* Bolus View Meal Summary Header */ +"Meal Summary" = "Meal Summary"; + +/* Bolus View Meal Edit Meal Button */ +"Edit Meal" = "Edit Meal"; + +/* Bolus View Meal Add Meal Button */ +"Add Meal" = "Add Meal"; + +/* Bolus View Bolus Summary Header */ +"Bolus Summary" = "Bolus Summary"; + +/* For the Bolus View pop-up */ +"Calculations" = "Calculations"; + +/* For the Bolus View pop-up */ +"Fatty Meal" = "Fatty Meal"; + +/* For the Bolus View pop-up */ +"Full Bolus" = "Full Bolus"; + +/* For the Bolus View pop-up */ +"Fraction" = "Fraction"; + +/* For the Bolus View pop-up */ +"Fatty Meal Factor" = "Fatty Meal Factor"; + +/* For the Bolus View pop-up */ +"Result" = "Result"; + +/* For the Bolus View pop-up */ +"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; + +/* Bolus View Continue Button */ +"Continue" = "Continue"; + +/* Home title */ +"Home" = "Home"; + +/* Looping in progress */ +"looping" = "looping"; + +/* min ago since last loop */ +"min ago" = "min ago"; + +/* Status Title */ +"No suggestion" = "No suggestion"; + +/* Replace pod text in Header */ +"Replace pod" = "Replace pod"; + +/* Add carbs screen */ +"Add Carbs" = "Add Carbs"; + +/* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ +"Add Carbs " = "Add Carbs "; + +/* */ +"Amount Carbs" = "Amount Carbs"; + +/* Grams unit */ +"grams" = "grams"; + +/* */ +"Carbs required" = "Carbs required"; + +/* Saved Food Presets */ +"Saved Food" = "Saved Food"; + +/* */ +"Are you sure?" = "Are you sure?"; + +/* Bottom target temp */ +"Bottom target" = "Bottom target"; + +/* Cancel preset name */ +"Cancel" = "Cancel"; + +/* */ +"Cancel Temp Target" = "Cancel Temp Target"; + +/* Custom temp target */ +"Custom" = "Custom"; + +/* */ +"Date" = "Date"; + +/* */ +"Delete" = "Delete"; + +/* Delete preset temp target */ +"Delete preset \"%@\"" = "Delete preset \"%@\""; + +/* Duration of target temp or temp basal */ +"Duration" = "Duration"; + +/* */ +"Enact Temp Target" = "Enact Temp Target"; + +/* */ +"Target" = "Target"; + +/* */ +"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; + +/* */ +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; + +/* */ +" Your setting: " = " Your setting: "; + +/* */ +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; + +/* */ +"Enter preset name" = "Enter preset name"; + +/* Preset name */ +"Name" = "Name"; + +/* minutes of target temp */ +"minutes" = "minutes"; + +/* */ +"Presets" = "Presets"; + +/* Save preset name */ +"Save" = "Save"; + +/* */ +"Save as Preset" = "Save as Preset"; + +/* Delete Meal Preset */ +"Delete Preset" = "Delete Preset"; + +/* Confirm Deletion */ +"Delete preset '%@'?" = "Delete preset '%@'?"; + +/* Button */ +"No" = "No"; + +/* Button */ +"Yes" = "Yes"; + +/* + Button */ +"[ +1 ]" = "[ +1 ]"; + +/* - Button */ +"[ -1 ]" = "[ -1 ]"; + +/* Upper temp target limit */ +"Top target" = "Top target"; + +/* Temp target set for ... minutes */ +"for" = "for"; + +/* Temp target set for ... minutes */ +"min" = "min"; + +/* */ +"Autotune" = "Autotune"; + +/* */ +"Basal profile" = "Basal profile"; + +/* */ +"Carb ratio" = "Carb ratio"; + +/* */ +"Delete autotune data" = "Delete autotune data"; + +/* */ +"Run now" = "Run now"; + +/* */ +"Last run" = "Last run"; + +/* */ +"Sensitivity" = "Sensitivity"; + +/* */ +"Use Autotune" = "Use Autotune"; + +/* Add profile basal */ +"Add" = "Add"; + +/* */ +"Basal Profile" = "Basal Profile"; + +/* Rate basal profile */ +"Rate" = "Rate"; + +/* */ +"Save on Pump" = "Save on Pump"; + +/* */ +"Saving..." = "Saving..."; + +/* */ +"Schedule" = "Schedule"; + +/* */ +"starts at" = "starts at"; + +/* Time basal profile */ +"Time" = "Time"; + +/* */ +"Calculated Ratio" = "Calculated Ratio"; + +/* Carb Ratios header */ +"Carb Ratios" = "Carb Ratios"; + +/* */ +"Ratio" = "Ratio"; + +/* */ +"Autosens" = "Autosens"; + +/* */ +"Calculated Sensitivity" = "Calculated Sensitivity"; + +/* */ +"Insulin Sensitivities" = "Insulin Sensitivities"; + +/* */ +"Sensitivity Ratio" = "Sensitivity Ratio"; + +/* */ +"Dismiss" = "Dismiss"; + +/* */ +"Important message" = "Important message"; + +/* */ +"Amount" = "Amount"; + +/* */ +"Cancel Temp Basal" = "Cancel Temp Basal"; + +/* Enact +Enact a temp Basal or a temp target */ +"Enact" = "Enact"; + +/* */ +"Manual Temp Basal" = "Manual Temp Basal"; + +/* Allow uploads to different services */ +"Allow uploads" = "Allow uploads"; + +/* API secret in NS */ +"API secret" = "API secret"; + +/* Connect to NS */ +"Connect" = "Connect"; + +/* Connected to NS */ +"Connected!" = "Connected!"; + +/* Connecting to NS */ +"Connecting..." = "Connecting..."; + +/* */ +"Invalid URL" = "Invalid URL"; + +/* */ +"Local glucose source" = "Local glucose source"; + +/* Header */ +"Nightscout Config" = "Nightscout Config"; + +/* */ +"Port" = "Port"; + +/* */ +"URL" = "URL"; + +/**/ +"Use local glucose server" = "Use local glucose server"; + +/* Enable Statistics */ +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; + +/* */ +"Edit settings json" = "Edit settings json"; + +/* */ +"Glucose units" = "Glucose units"; + +/* */ +"Preferences" = "Preferences"; + +/* Recommended Insulin Fraction in preferences */ +"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; + +/* Do you want to show bolus screen after added carbs? */ +"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; + +/* Allow remote control from NS */ +"Remote control" = "Remote control"; + +/* Imported Profiles Alert */ +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; + +/* Profile Import Alert */ +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; + +/* Import Error */ +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; + +/* Import Error */ +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; + +/* Import Error Headline */ +"Import Error" = "Import Error"; + +/* */ +"Yes, Import" = "Yes, Import"; + +/* */ +"Import settings from Nightscout" = "Import settings from Nightscout"; + +/* */ +"Import settings?" = "Import settings?"; + +/* */ +"Import from Nightscout" = "Import from Nightscout"; + +/* */ +"Settings imported" = "Settings imported"; + +/* Import Error */ +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; + +/* Import Error */ +"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; + +/* Add Blood Glucose Test, header */ +"Blood Glucose Test" = "Blood Glucose Test"; + +/* Add Medtronic pump */ +"Add Medtronic" = "Add Medtronic"; + +/* Add Omnipod pump */ +"Add Omnipod" = "Add Omnipod"; + +/* Add Simulator pump */ +"Add Simulator" = "Add Simulator"; + +/* Insulin model */ +"Model" = "Model"; + +/* */ +"Pump config" = "Pump config"; + +/* */ +"Delivery limits" = "Delivery limits"; + +/* */ +"Duration of Insulin Action" = "Duration of Insulin Action"; + +/* hours of duration of insulin activity */ +"hours" = "hours"; + +/* Max setting */ +"Max Basal" = "Max Basal"; + +/* Max setting */ +"Max Bolus" = "Max Bolus"; + +/* Max setting */ +"Max Carbs" = "Max Carbs"; + +/* */ +"Pump Settings" = "Pump Settings"; + +/* Insulin unit per hour */ +"U/hr" = "U/hr"; + +/* Unit in number of units delivered (keep the space character!) */ +" U" = " U"; + +/* /Insulin unit */ +"/U" = "/U"; + +/* Insulin unit */ +"U" = "U"; + +/* Unit per hour with space */ +" U/hr" = " U/hr"; + +/* Number of units per hour*/ +"%@ U/hr" = "%@ U/hr"; + +/* Number of units insulin delivered */ +"%@ U" = "%@ U"; + +/*Carb ratio unit */ +"g/U" = "g/U"; + +/* grams */ +" g" = " g"; + +/* The short unit display string for grams */ +"g" = "g"; + +/* when 0 U/hr */ +"0 U/hr" = "0 U/hr"; + +/* abbreviation for days */ +"d" = "d"; + +/* abbreviation for hours */ +"h" = "h"; + +/* abbreviation for minutes */ +"m" = "m"; + +/* */ +"Closed loop" = "Closed loop"; + +/* */ +"Configuration" = "Configuration"; + +/* */ +"Devices" = "Devices"; + +/* */ +"Pump" = "Pump"; + +/* */ +"Watch" = "Watch"; + +/* */ +"Watch Configuration" = "Watch Configuration"; + +/* */ +"Apple Watch" = "Apple Watch"; + +/* */ +"Display on Watch" = "Display on Watch"; + +/* */ +"Garmin Watch" = "Garmin Watch"; + +/* */ +"Add devices" = "Add devices"; + +/* */ +"Glucose Target" = "Glucose Target"; + +/* */ +"Heart Rate" = "Heart Rate"; + +/* */ +"Steps" = "Steps"; + +/* */ +"ISF" = "ISF"; + +/* */ +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; + +/* */ +"Garmin is not available" = "Garmin is not available"; + +/* */ +"Services" = "Services"; + +/* */ +"Settings" = "Settings"; + +/* Recommendation for a Manual Bolus */ +"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; + +/* 2 log files to share */ +"Share logs" = "Share logs"; + +/* Upper target */ +"High target" = "High target"; + +/* Lower target */ +"Low target" = "Low target"; + +/* When bolusing */ +"Bolusing" = "Bolusing"; + +/* */ +"Pump suspended" = "Pump suspended"; + +/* */ +"Middleware" = "Middleware"; + +/* Header */ +"History" = "History"; + +/* Nightscout option */ +"Upload" = "Upload"; + +/* Nightscout option */ +"Allow Uploads" = "Allow Uploads"; + +/* Type of CGM or glucose source */ +"Type" = "Type"; + +/* CGM */ +"CGM" = "CGM"; + +/* CGM Transmitter ID */ +"Transmitter ID" = "Transmitter ID"; + +/* Other CGM setting */ +"Other" = "Other"; + +/* Whatch app alert */ +"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; + +/* Updating Watch app */ +"Updating..." = "Updating..."; + +/* Header for Temp targets in Watch app */ +"Temp Targets" = "Temp Targets"; + +/* Delete carbs from data table and Nightscout */ +"Delete Carbs?" = "Delete Carbs?"; + +/* Delete insulin from pump history and Nightscout */ +"Delete Insulin?" = "Delete Insulin?"; + +/* Treatments list */ +"Treatments" = "Treatments"; + +/* " min" in Treatments list */ +" min" = " min"; + +/* */ +"Unable to change anything" = "Unable to change anything"; + + +/* Calendar and Libre transmitter settings --------------- + */ +/* */ +"Configure Libre Transmitter" = "Configure Libre Transmitter"; + +/* */ +"Calibrations" = "Calibrations"; + +/* */ +"Create Events in Calendar" = "Create Events in Calendar"; + +/* */ +"Calendar" = "Calendar"; + +/* Automatic delivered treatments */ +"Automatic" = "Automatic"; + +/* External insulin treatments */ +"External" = "External"; + +/* */ +"Other" = "Other"; + +/* */ +"Libre Transmitter" = "Libre Transmitter"; + +/* */ +"Libre Transmitters" = "Libre Transmitters"; + +/* */ +"Bluetooth Transmitters" = "Bluetooth Transmitters"; + +/* */ +"Modes" = "Modes"; + +/* Libre 2 Direct */ +"Libre 2 Direct" = "Libre 2 Direct"; + +/* */ +"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; + +/* State was restored */ +"State was restored" = "State was restored"; + +/* The short unit display string for millimoles of glucose per liter */ +"mmol/L" = "mmol/L"; + +/* The short unit display string for milligrams of glucose per decilter */ +"mg/dL" = "mg/dL"; + +/* */ +"Add calibration" = "Add calibration"; + +/* When adding capillary glucose meater reading */ +"Meter glucose" = "Meter glucose"; + +/* */ +"Info" = "Info"; + +/*v*/ +"Slope" = "Slope"; + +/* */ +"Intercept" = "Intercept"; + +/* */ +"Chart" = "Chart"; + +/* */ +"Remove" = "Remove"; + +/* */ +"Remove Last" = "Remove Last"; + +/* */ +"Remove All" = "Remove All"; + +/* */ +"About the Process"= "About the Process"; + +/* */ +"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; + +/* */ +"Pairinginfo" = "Pairinginfo"; + +/* */ +"PatchInfo" = "PatchInfo"; + +/* */ +"Calibrationinfo" = "Calibrationinfo"; + +/* */ +"Unknown" = "Unknown"; + +/* */ +"Not paired yet" = "Not paired yet"; + +/* */ +"Pair Sensor & connect" = "Pair Sensor & connect"; + +/* */ +"Phone NFC required!" = "Phone NFC required!"; + +/* */ +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; + +/* Bluetooth Power Off */ +"Bluetooth Power Off" = "Bluetooth Power Off"; + +/* Please turn on Bluetooth */ +"Please turn on Bluetooth" = "Please turn on Bluetooth"; + +/* No Libre Transmitter Selected */ +"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; + +/* Delete Transmitter and start anew. */ +"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; + +/* Invalid libre checksum */ +"Invalid libre checksum" = "Invalid libre checksum"; + +/* Libre sensor was incorrectly read, CRCs were not valid */ +"Libre sensor was incorrectly read, CRCs were not valid"= "Libre sensor was incorrectly read, CRCs were not valid"; + +/* Glucose */ +"Glucose" = "Glucose"; + +/* LOWALERT! */ +"LOWALERT!" = "LOWALERT!"; + +/* HIGHALERT! */ +"HIGHALERT!" = "HIGHALERT!"; + +/* (Snoozed)*/ +"(Snoozed)" = "(Snoozed)"; + +/* Glucose: %@ */ +"Glucose: %@" = "Glucose: %@"; + +/* Transmitter: %@%% */ +"Transmitter: %@%%" = "Transmitter: %@%%"; + +/* No Sensor Detected */ +"No Sensor Detected" = "No Sensor Detected"; + +/* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; + +/* New Sensor Detected */ +"New Sensor Detected" = "New Sensor Detected"; + +/* Please wait up to 30 minutes before glucose readings are available! */ +"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; + +/* Invalid Glucose sample detected, try again later */ +"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; + +/* ensor might have temporarily stopped, fallen off or is too cold or too warm */ +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; + +/* Invalid Sensor Detected */ +"Invalid Sensor Detected" = "Invalid Sensor Detected"; + +/* Detected sensor seems not to be a libre 1 sensor! */ +"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; + +/* Detected sensor is invalid: %@ */ +"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; + +/* Low Battery */ +"Low battery" = "Low battery"; + +/* */ +"Invalid sensor" = "Invalid sensor"; + +/* */ +"Sensor change" = "Sensor change"; + +/* */ +"Sensor expires soon" = "Sensor expires soon"; + +/* Battery is running low %@, consider charging your %@ device as soon as possible */ +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; + +/* Extracting calibrationdata from sensor */ +"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; + +/* Sensor Ending Soon */ +"Sensor Ending Soon" = "Sensor Ending Soon"; + +/* Current Sensor is Ending soon! Sensor Life left in %@ */ +"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; + +/* */ +"Libre Bluetooth" = "Libre Bluetooth"; + +/* */ +"Snooze Alerts" = "Snooze Alerts"; + +/* */ +"Last measurement" = "Last measurement"; + +/* */ +"Sensor Footer checksum" = "Sensor Footer checksum"; + +/* */ +"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; + +/* */ +"CurrentBG" = "CurrentBG"; + +/* */ +"Sensor Info" = "Sensor Info"; + +/* */ +"Sensor Age" = "Sensor Age"; + +/* */ +"Sensor Age Left" = "Sensor Age Left"; + +/* */ +"Sensor Endtime" = "Sensor Endtime"; + +/* */ +"Sensor State" = "Sensor State"; + +/* */ +"Sensor Serial" = "Sensor Serial"; + +/* */ +"Transmitter Info" = "Transmitter Info"; + +/* */ +"Hardware" = "Hardware"; + +/* */ +"Firmware" = "Firmware"; + +/* */ +"Connection State" = "Connection State"; + +/* */ +"Transmitter Type" = "Transmitter Type"; + +/* */ +"Sensor Type" = "Sensor Type"; + +/* */ +"Factory Calibration Parameters" = "Factory Calibration Parameters"; + +/* */ +"Valid for footer" = "Valid for footer"; + +/* */ +"Edit calibrations" = "Edit calibrations"; + +/* */ +"edit calibration clicked" = "edit calibration clicked"; + +/* */ +"Delete CGM" = "Delete CGM"; + +/* */ +"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; + +/* */ +"There is no undo" = "There is no undo"; + +/* */ +"Advanced" = "Advanced"; + +/* */ +"Alarms" = "Alarms"; + +/* */ +"Glucose Settings" = "Glucose Settings"; + +/* */ +"Notifications" = "Notifications"; + +/* */ +"Export logs" = "Export logs"; + +/* */ +"Export not available" = "Export not available"; + +/* */ +"Log export requires ios 15" = "Log export requires ios 15"; + +/* */ +"Got it!" = "Got it!"; + +/* */ +"Saved to %@" = "Saved to %@"; + +/* */ +"No logs available" = "No logs available"; + +/* */ +"Glucose Notification visibility" = "Glucose Notification visibility"; + +/* */ +"Always Notify Glucose" = "Always Notify Glucose"; + +/* */ +"Notify per reading" = "Notify per reading"; + +/* */ +"Value" = "Value"; + +/* */ +"Adds Phone Battery" = "Adds Phone Battery"; + +/* */ +"Adds Transmitter Battery" = "Adds Transmitter Battery"; + +/* */ +"Also vibrate" = "Also vibrate"; + +/* */ +"Additional notification types" = "Additional notification types"; + +/* */ +"Misc" = "Misc"; + +/* */ +"Unit override" = "Unit override"; + +/* */ +"Low" = "Low"; + +/* */ +"High" = "High"; + +/* */ +"glucose" = "glucose"; + +/* */ +"Schedule " = "Schedule "; + +/* */ +"tapped save schedules" = "tapped save schedules"; + +/* */ +"Error" = "Error"; + +/* */ +"Some ui element was incorrectly specified" = "Some ui element was incorrectly specified"; + +/* */ +"Success" = "Success"; + +/* */ +"Schedules were saved successfully!" = "Schedules were saved successfully!"; + +/* */ +"High Glucose Alarm active" = "High Glucose Alarm active"; + +/* */ +"Low Glucose Alarm active" = "Low Glucose Alarm active"; + +/* */ +"No Glucose Alarm active" = "No Glucose Alarm active"; + +/* */ +"snoozing until %@" = "snoozing until %@"; + +/* */ +"not snoozing" = "not snoozing"; + +/* */ +"nothing to see here" = "nothing to see here"; + +/* */ +"snooze from testview clicked" = "snooze from testview clicked"; + +/* */ +"will snooze for %@ until %@" = "will snooze for %@ until %@"; + +/* */ +"Click to Snooze Alerts" = "Click to Snooze Alerts"; + +/* */ +"Strength" = "Strength"; + +/* */ +"Hold the top of your iPhone near the sensor to pair" = "Hold the top of your iPhone near the sensor to pair"; + +/* */ +"Sensor not found" = "Sensor not found"; + +/* */ +"Also play alert sound" = "Also play alert sound"; + +/* */ +"Notification Settings" = "Notification Settings"; + +/* */ +"Found devices: %d" = "Found devices: %d"; + +/* */ +"Backfill options" = "Backfill options"; + +/* */ +"Backfilling from trend is currently not well supported by Loop" = "Backfilling from trend is currently not well supported by Loop"; + +/* */ +"Backfill from history" = "Backfill from history"; + +/* */ +"Backfill from trend" = "Backfill from trend"; + +/* */ +"Debug options" = "Debug options"; + +/* */ +"Adds a lot of data to the Issue Report " = "Adds a lot of data to the Issue Report "; + +/* */ +"Persist sensordata" = "Persist sensordata"; + +/* */ +"Battery" = "Battery"; + +/* */ + "Also add source info" = "Also add source info"; + + /* */ + "Carbs Required Threshold" = "Carbs Required Threshold"; + + /* */ + "Carbs required: %d g" = "Carbs required: %d g"; + + /* */ + "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; + + /* */ + "iAPS not active" = "iAPS not active"; + + /* */ + "Last loop was more than %d min ago" = "Last loop was more than %d min ago"; + +/* Glucose badge */ +"Show glucose on the app badge" = "Show glucose on the app badge"; + +/* */ +"Backfill glucose" = "Backfill glucose"; + +/* About this source */ +"About this source" = "About this source"; + +/* */ +"Bolus failed" = "Bolus failed"; + +/* "Max Bolus Exceeded label" */ +"Max Bolus exceeded!" = "Max Bolus exceeded!"; + +/* */ +"Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; + +/* */ +"Carbs" = "Carbs"; + +/* Food Type / Meal Note */ +"Note" = "Note"; + +/* */ +"Temp Basal" = "Temp Basal"; + +/* */ +"Temp Target" = "Temp Target"; + +/* */ +"Resume" = "Resume"; + +/* */ +"Suspend" = "Suspend"; + +/* */ +"Animated Background" = "Animated Background"; + +/* Sensor day(s) */ +" day(s)" = " day(s)"; + +/* Option to show HR in Watch app*/ +"Display HR on Watch" = "Display HR on Watch"; + + +/* Headers for settings ----------------------- */ +"OpenAPS main settings" = "OpenAPS main settings"; + +"OpenAPS SMB settings" = "OpenAPS SMB settings"; + +"OpenAPS targets settings" = "OpenAPS targets settings"; + +"OpenAPS other settings" = "OpenAPS other settings"; + +/* Glucose Simulator CGM */ +"Glucose Simulator" = "Glucose Simulator"; + +/* Restored state message */ +"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@"; + +/* Shared app group xDrip4iOS */ +"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; + +/* Shared app group GlucoseDirect */ +"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; + +/* Dexcom G6 app */ +"Dexcom G6 app" = "Dexcom G6 app"; + +/* Native G5 app */ +"Native G5 app" = "Native G5 app"; + +/* Minilink transmitter */ +"Minilink transmitter" = "Minilink transmitter"; + +/* Simple simulator */ +"Simple simulator" = "Simple simulator"; + +/* Direct connection with Libre 1 transmitters or Libre 2 */ +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; + +/* Online or internal server */ +"Online or internal server" = "Online or internal server"; + +/* -------------- Developer settings ---------------------- */ + +/* Debug options */ +"Developer" = "Developer"; + +/* Debug option view NS Upload Profile */ +"NS Upload Profile" = "NS Upload Profile"; + +/* Debug option view NS Uploaded Profile */ +"NS Uploaded Profile" = "NS Uploaded Profile"; + +/* Debug option view Autosense */ +"Autosense" = "Autosense"; + +/* Insulin sensitivity config header */ +"Dynamic Sensitivity" = "Dynamic Sensitivity"; + +/* Autotune config */ +"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; + +/* */ +"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; + +/* */ +"Save on Pump" = "Save on Pump"; + +/* Debug option view Pump History */ +"Pump History" = "Pump History"; + +/* Debug option view Target Ranges */ +"Target ranges" = "Target ranges"; + +/* Debug option view Temp targets */ +"Temp targets" = "Temp targets"; + +/* Debug option view Meal */ +"Meal" = "Meal"; + +/* Debug option view Pump profile */ +"Pump profile" = "Pump profile"; + +/* Debug option view Profile */ +"Profile" = "Profile"; + +/* Debug option view Enacted */ +"Enacted" = "Enacted"; + +/* Debug option view Announcements (from NS) */ +"Announcements" = "Announcements"; + +/* Debug option view Enacted announcements announcements (from NS) */ +"Enacted announcements" = "Enacted announcements"; + +/* Debug option view Autotune */ +"Autotune" = "Autotune"; + +/* Debug option view Target presets */ +"Target presets" = "Target presets"; + +/* Debug option view */ +"Loop Cycles" = "Loop Cycles"; + +/* Debug option view Glucose Data used for statistics */ +"Glucose Data used for statistics" = "Glucose Data used for statistics"; + +/* --------------- HealthKit intergration --------------------*/ +/* */ +"Apple Health" = "Apple Health"; + +/* */ +"Connect to Apple Health" = "Connect to Apple Health"; + +/* Show when have not permissions for writing to Health */ +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; + +/* */ +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; + + /* New ALerts ------------------------- */ + + /* Info title */ + "Info" = "Info"; + + /* Warning title */ + "Warning" = "Warning"; + + /* Error title */ + "Error" = "Error"; + +/* Manual temp basal mode */ +"Manual" = "Manual"; + +/* An Automatic delivered bolus (SMB) */ +"SMB" = "SMB"; + +/* A manually entered dose of external insulin */ +"External Insulin" = "External Insulin"; + +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Manual Basal"; + +/* Current Manual Temp basal */ +" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; + +/* Total AT / Scheduled basal insulin */ +" U/day" = " U/day"; + +/* Total AT / Scheduled basal insulin */ +"Total" = "Total"; + +/* -------------------------------------------- FPU Strings ------------------------------------------------------*/ + +/* Enable FPU */ +"Enable" = "Enable"; + +/* Header */ +"Conversion settings" = "Conversion settings"; + +/* Delay */ +"Delay In Minutes" = "Delay In Minutes"; + +/* Duration */ +"Maximum Duration In Hours" = "Maximum Duration In Hours"; + +/* Interval */ +"Interval In Minutes" = "Interval In Minutes"; + +/* Override */ +"Override With A Factor Of " = "Override With A Factor Of "; + +/* Description */ +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; + +/* FPU Settings Title */ +"Fat and Protein" = "Fat and Protein"; + +/* Display fat and protein entities */ +"Fat & Protein" = "Fat & Protein"; + +/* */ +"Hide Fat & Protein" = "Hide Fat & Protein"; + +/* Add Fat */ +"Fat" = "Fat"; + +/* Add Protein */ +"Protein" = "Protein"; + +/* Service Section */ +"Fat And Protein Conversion" = "Fat And Protein Conversion"; + +/* Service Section */ +"Profile Override" = "Profile Override"; + +/* */ +"Override Profiles" = "Override Profiles"; + +/* */ +"Normal " = "Normal "; + +"Currently no Override active" = "Currently no Override active"; + +/* */ +"Total Insulin Adjustment" = "Total Insulin Adjustment"; + +/* */ +"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; + +/* */ +"Enable indefinitely" = "Enable indefinitely"; + +/* */ +"Override Profile target" = "Override Profile target"; + +/* */ +"Disable SMBs" = "Disable SMBs"; + +/* Your normal Profile. Use a short string */ +"Normal Profile" = "Normal Profile"; + +/* Custom but unsaved Profile */ +"Custom Profile" = "Custom Profile"; + +/* */ +"Profiles" = "Profiles"; + +/* */ +"More options" = "More options"; + +/* */ +"Schedule when SMBs are Off" = "Schedule when SMBs are Off"; + +/* */ +"Change ISF and CR" = "Change ISF and CR"; + +/* */ +"Change ISF" = "Change ISF"; + +/* */ +"Change CR" = "Change CR"; + +/* */ +"SMB Minutes" = "SMB Minutes"; + +/* */ +"UAM SMB Minutes" = "UAM SMB Minutes"; + +/* */ +"Start new Profile" = "Start new Profile"; + +/* */ +"Save as Profile" = "Save as Profile"; + +/* Alert */ +"Cancel Profile Override" = "Cancel Profile Override?"; + +/* Alert */ +"Cancel Temp Target" = "Cancel Temp Target"; + +/* Alert */ +"Return to Normal?" = "Return to Normal?"; + +/* */ +"This will change settings back to your normal profile." = "This will change settings back to your normal profile."; + +/* Start Profile Alert */ +"Start Profile" = "Start Profile"; + +/* */ +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; + +/* */ +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile."; + +/* Change Target glucose in profile settings */ +"Override Profile Target" = "Override Profile Target"; + +/* Alert string. Keep spaces. */ +" SMBs are disabled either by schedule or during the entire duration." = " SMBs are disabled either by schedule or during the entire duration."; + +/* Alert strings. Keep spaces */ +" infinite duration." = " infinite duration."; + +/* Service Section */ +"App Icons" = "App Icons"; + +/* */ +"iAPS Icon" = "iAPS Icon"; + +/* Service Section */ +"Statistics and Home View" = "Statistics and Home View"; + +/* Alert text */ +"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; + +/* */ +"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; + +/* */ +"Delete Glucose?" = "Delete Glucose?"; + +/* */ +"Meal Presets" = "Meal Presets"; + +/* */ +"Empty" = "Empty"; + +/* */ +"Delete Selected Preset" = "Delete Selected Preset"; + +/* */ +"Enter Meal Preset Name" = "Enter Meal Preset Name"; + +/* */ +"Name Of Dish" = "Name Of Dish"; + +/* Save Carbs and continue to bolus recommendation */ +"Save and continue" = "Save and continue"; + +/* */ +"Save as Preset" = "Save as Preset"; + +/* */ +"Predictions" = "Predictions"; + +/* Watch Config Option */ +"Display Protein & Fat" = "Display Protein & Fat"; + +/* ----------------------- New Bolus Calculator ---------------------------*/ + +/* Warning about bolus recommendation. Title */ +"Warning!" = "Warning!"; + +/* Alert to confirm bolus amount to add */ +"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; + +/* */ +"Eventual Glucose" = "Eventual Glucose"; + +/* */ +"Please wait" = "Please wait"; + +/* */ +"Glucose, " = "Glucose, "; + +/* */ +"Target Glucose" = "Target Glucose"; + +/* */ +"Percentage setting" = "Percentage setting"; + +/* */ +"Insulin Sensitivity" = "Insulin Sensitivity"; + +/* Formula displayed in Bolus info pop-up. Make translation short! */ +"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; + +/* */ +"Formula:" = "Formula:"; + +/* Bolus pop-up footer */ +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; + +/* Hide pop-up */ +"Hide" = "Hide"; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"which is below your Threshold (" = "which is below your Threshold ("; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; + +//* Bolus pop-up / Alert string. Make translations concise! */ +". Climbing: " = ". Climbing: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +". Falling: " = ". Falling: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; + +/* Bolus pop-up / Alert string. Make translations concise! */ +". Changing: " = ". Changing: "; + +/* Add insulin without bolusing alert */ +" without bolusing" = " without bolusing"; + +/* ------------------------------------------------------------------------------------------- + DASH strings +*/ +"Attach Pod" = "Attach Pod"; + +"Deactivate Pod" = "Deactivate Pod"; + +/* */ +"Deactivating..." = "Deactivating..."; + +"Pair Pod" = "Pair Pod"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Previous Pod Information"; + +/* Text for confidence reminders navigation link */ +"Confidence Reminders" = "Confidence Reminders"; + +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; + +/* button title for saving low reservoir reminder while saving */ +"Saving..." = "Saving..."; + +/* button title for saving low reservoir reminder */ +"Save" = "Save"; + +/* Alert title for error when updating confidence reminder preference */ +"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; + +/* */ +"No Error" = "No Error"; + +/* description label for active time pod details row */ +"Active Time"= "Active Time"; + +/* Title string for BeepPreference.silent */ +"Disabled" = "Disabled"; + +/* Title string for BeepPreference.manualCommands */ +"Enabled" = "Enabled"; + +/* Title string for BeepPreference.extended */ +"Extended" = "Extended"; + +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "No confidence reminders are used."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; + +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Expiration Reminder Default"; + +/* */ +"Expiration Reminder" = "Expiration Reminder"; + +/* */ +"Low Reservoir" = "Low Reservoir"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* */ +"Low Reservoir Reminder" = "Low Reservoir Reminder"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; + +/* Label text for temporary basal rate summary */ +"Rate" = "Rate"; + +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ for %2$@"; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; + +/* Button text for setting manual temporary basal rate*/ +"Set Temporary Basal" = "Set Temporary Basal"; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporary Basal"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal Failed"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Missing Config"; + +/* Alert format string for missing temp basal configuration. */ +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; + +/* description label for active time pod details row */ +"Active Time" = "Active Time"; + +/* description label for total delivery pod details row */ +"Total Delivery" = "Total Delivery"; + +/* */ +"Add Omnipod Dash" = "Add Omnipod Dash"; + +/* */ +"Insert Cannula" = "Insert Cannula"; + +/* */ +"Check Cannula" = "Check Cannula"; + +/* */ +"Setup Complete" = "Setup Complete"; + +/* */ +"Insulin Suspended" = "Insulin Suspended"; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Suspending insulin delivery..."; + +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Resume Insulin Delivery"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Resuming insulin delivery..."; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; + +//* -----------------------------------------------------------------------*/ + +/* ----------------------Statistics strings -------------------------------*/ + +/* */ +"Today" = "Today"; + +/* */ +"Day" = "Day"; + +/* */ +"Week" = "Week"; + +/* */ +"Month" = "Month"; + +/* */ +"Total" = "Total"; + +/* Headline Statistics */ +"Statistics" = "Statistics"; + +/* Option in preferences */ +"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; + +/* Low Glucose Threshold in Statistics settings */ +"Low" = "Low"; + +/* High Glucose Threshold in Statistics settings */ +"High" = "High"; + +/* In Range */ +"In Range" = "In Range"; + +/* Display % */ +"Change HbA1c Unit" = "Change HbA1c Unit"; + +/* */ +"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; + +/* */ +"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; + +/* */ +"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; + +/* */ +"Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; + +/* */ +"Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; + +/* */ +"2 hours" = "2 hours"; + +/* */ +"4 hours" = "4 hours"; + +/* */ +"6 hours" = "6 hours"; + +/* */ +"12 hours" = "12 hours"; + +/* */ +"24 hours" = "24 hours"; + +/* Average BG = */ +"Average" = "Average"; + +/* Median BG */ +"Median" = "Median"; + +/* CGM readings in statView */ +"Readings" = "Readings"; + +/* CGM readings in statView */ +"Readings / 24h" = "Readings / 24h"; + +/* Days of saved readings*/ +"Days" = "Days"; + +/* Normal BG (within TIR) */ +"Normal" = "Normal"; + +/* Title High BG in statPanel */ +"High (>" = "High (>"; + +/* Title Low BG in statPanel */ +"Low (<" = "Low (<"; + +/* SD */ +"SD" = "SD"; + +/* CV */ +"CV" = "CV"; + +/* Estimated HbA1c */ +"HbA1c" = "HbA1c"; + +/* Total number of days of data for HbA1c estimation, part 1/2*/ +"All" = "All"; + +/* Total number of days of data for HbA1c estimation, part 2/2*/ +"days" = "days"; + +/* Nr of Loops in statPanel */ +"Loops" = "Loops"; + +/* Loop Errors in statPanel */ +"Errors" = "Errors"; + +/* Average loop interval */ +"Interval" = "Interval"; + +/* Median loop interval */ +"Duration" = "Duration"; + +/* "Display SD */ +"Display SD instead of CV" = "Display SD instead of CV"; + +/* Description for display SD */ +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; + +/* How often to update the statistics */ +"Update every number of minutes:" = "Update every number of minutes:"; + +/* Description for update interval for statistics */ +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; + +/* Duration displayed in statPanel */ +"Past 24 Hours " = "Past 24 Hours "; + +/* Duration displayed in statPanel */ +"Past Week " = "Past Week "; + +/* Duration displayed in statPanel */ +"Past Month " = "Past Month "; + +/* Duration displayed in statPanel */ +"Past 90 Days " = "Past 90 Days "; + +/* Duration displayed in statPanel */ +"All Past Days of Data " = "All Past Days of Data "; + +/* "Display Loop statistics in statPanel */ +"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; + +/* Description for Display Loop statistics */ +"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; + +/* Description for Override HbA1c unit */ +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; + +/* HbA1c for all glucose storage days */ +"all" = "all"; + +/* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ + +"CGM Configuration" = "CGM Configuration"; + +"Heartbeat" = "Heartbeat"; + +"CGM address :" = "CGM address :"; + +"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; + +"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; + +/* New Experimental feature */ +"Experimental" = "Experimental"; + +/* Smoothing of CGM readings */ +"Smooth Glucose Value" = "Smooth Glucose Value"; + + /* ----------------------------------------------------------------------------------------------------------- + + Infotexts from openaps.docs and androidaps.docs + iAPS +*/ + +/* Headline Rewind Resets Autosens */ +"Rewind Resets Autosens" = "Rewind Resets Autosens"; + +/* ”Rewind Resets Autosens” */ +"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."; + +/* Headline "High Temptarget Raises Sensitivity" */ +"High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; + +/* ”High Temptarget Raises Sensitivity" */ +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)."; + +/* Headline ”Low Temptarget Lowers Sensitivity" */ +"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; + +/* ”Low Temptarget Lowers Sensitivity" */ +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)."; + +/* Headline ”Sensitivity Raises Target" */ +"Sensitivity Raises Target" = "Sensitivity Raises Target"; + +/* ”Sensitivity Raises Target" */ +"When true, raises BG target when autosens detects sensitivity" = "When true, raises BG target when autosens detects sensitivity"; + +/* Headline ”Resistance Lowers Target" */ +"Resistance Lowers Target" = "Resistance Lowers Target"; + +/* ”Resistance Lowers Target" */ +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Defaults to false. When true, will lower BG target when autosens detects resistance"; + +/* Headline ”Advanced Target Adjustments" */ +"Advanced Target Adjustments" = "Advanced Target Adjustments"; + +/* ”Advanced Target Adjustments" */ +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone."; + +/* Headline "Exercise Mode" */ +"Exercise Mode" = "Exercise Mode"; + +/* "Exercise Mode" */ +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity"; + +/* Headline "Wide BG Target Range" */ +"Wide BG Target Range" = "Wide BG Target Range"; + +/* "Wide BG Target Range" */ +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs."; + +/* Headline "Skip Neutral Temps" */ +"Skip Neutral Temps" = "Skip Neutral Temps"; + +/* "Skip Neutral Temps" */ +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means OpenAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications form the 'rig', that may wake you up during the night. "; + +/* Headline "Unsuspend If No Temp” */ +"Unsuspend If No Temp" = "Unsuspend If No Temp"; + +/* "Unsuspend If No Temp” */ +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended."; + +/* Headline "Enable UAM" */ +"Enable UAM" = "Enable UAM"; + +/* "Enable UAM" */ +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier."; + +/* Headline "Enable SMB With COB" */ +"Enable SMB With COB" = "Enable SMB With COB"; + +/* Enable SMB With COB" */ +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "This enables supermicrobolus (SMB) while carbs on board (COB) are positive."; + +/* Headline "Enable SMB With Temptarget” */ +"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; + +/* "Enable SMB With Temptarget” */ +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB."; + +/* Headline "Enable SMB Always" */ +"Enable SMB Always" = "Enable SMB Always"; + +/* "Enable SMB Always" */ +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)."; + +/* Headline "Enable SMB After Carbs" */ +"Enable SMB After Carbs" = "Enable SMB After Carbs"; + +/* "Enable SMB After Carbs" */ +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)."; + +/* Enable "Allow SMB With High Temptarget" */ +"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; + +/* Headline "Allow SMB With High Temptarget" */ +"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; + +/* "Allow SMB With High Temptarget" */ +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)."; + +/* Headline "Use Custom Peak Time” */ +"Use Custom Peak Time" = "Use Custom Peak Time"; + +/* "Use Custom Peak Time” */ +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Defaults to false. Setting to true allows changing insulinPeakTime"; + +/* Headline "Suspend Zeros IOB” */ +"Suspend Zeros IOB" = "Suspend Zeros IOB"; + +/* "Suspend Zeros IOB” */ +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added."; + +/* Headline "Max IOB" */ +"Max IOB" = "Max IOB"; + +/* "Max IOB" */ +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)."; + +/* Headline "Max Daily Safety Multiplier" */ +"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; + +/* "Max Daily Safety Multiplier" */ +"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; + +/* Headline "Current Basal Safety Multiplier" */ +"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; + +/* "Current Basal Safety Multiplier" */ +"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; + +/* Headline "Autosens Max" */ +"Autosens Max" = "Autosens Max"; + +/* "Autosens Max" */ +"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target."; + +/* Headline "Autosens Min" */ +"Autosens Min" = "Autosens Min"; + +/* "Autosens Min" */ +"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets."; + +/* Headline "Half Basal Exercise Target" */ +"Half Basal Exercise Target" = "Half Basal Exercise Target"; + +/* "Half Basal Exercise Target" */ +"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes."; + +/* Headline "Max COB" */ +"Max COB" = "Max COB"; + +/* "Max COB" */ +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; + +/* Headline "Bolus Snooze DIA Divisor" */ +"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; + +/* "Bolus Snooze DIA Divisor" */ +"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)."; + +/* Headline "Min 5m Carbimpact" */ +"Min 5m Carbimpact" = "Min 5m Carbimpact"; + +/* "Min 5m Carbimpact" */ +"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g."; + +/* Headline "Autotune ISF Adjustment Fraction" */ +"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; + +/* "Autotune ISF Adjustment Fraction" */ +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; + +/* Headline "Remaining Carbs Fraction" */ +"Remaining Carbs Fraction" = "Remaining Carbs Fraction"; + +/* "Remaining Carbs Fraction" */ +"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; + +/* Headline "Remaining Carbs Cap" */ +"Remaining Carbs Cap" = "Remaining Carbs Cap"; + +/* "Remaining Carbs Cap" */ +"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; + +/* Headline ”Max SMB Basal Minutes" */ +"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; + +/* ”Max SMB Basal Minutes" */ +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; + +/* Headline "Max UAM SMB Basal Minutes" */ +"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; + +/* "Max UAM SMB Basal Minutes" */ +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; + +/* Headline "SMB Interval" */ +"SMB Interval" = "SMB Interval"; + +/* "SMB Interval" */ +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; + +/* Headline "Bolus Increment" */ +"Bolus Increment" = "Bolus Increment"; + +/* "Bolus Increment" */ +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; + +/* Headline "Insulin Peak Time" */ +"Insulin Peak Time" = "Insulin Peak Time"; + +/* "Insulin Peak Time" */ +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops."; + +/* Headline "Carbs Req Threshold" */ +"Carbs Req Threshold" = "Carbs Req Threshold"; + +/* "Carbs Req Threshold" */ +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold."; + +/* Headline "Noisy CGM Target Multiplier" */ +"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; + +/* "Noisy CGM Target Multiplier" */ +"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data"; + +/* Headline "SMB DeliveryRatio" */ +"SMB DeliveryRatio" = "SMB DeliveryRatio"; + +/* SMB DeliveryRatio */ +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; + +// Dynamic ISF + CR Settings: + +/* Headline "Adjust Dynamic ISF constant" */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Adjust Dynamic ISF constant */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Enable Dynamic ISF, Headline */ +"Enable Dynamic ISF" = "Enable Dynamic ISF"; + +/* Headline "Enable Dynamic ISF" */ +"Enable Dynamic ISF" = "Enable Dynamic ISF"; + +/* Enable Dynamic ISF */ +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; + +/* Headline "Enable Dynamic CR" */ +"Enable Dynamic CR" = "Enable Dynamic CR"; + +/* Enable Dynamic CR */ +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; + +/* Headline "Adjust Dynamic ISF constant" */ +"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; + +/* Adjust Dynamic ISF constant */ +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; + + +/* Headline "Use Sigmoid Function" */ +"Use Sigmoid Function" = "Use Sigmoid Function"; + +/* Use Sigmoid Function */ +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; + + +/* Headline "Threshold Setting" */ +"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; + +/* Threshold Setting */ +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; + +/* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ +"Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; + +/* Weight of past 24 hours of insulin */ +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; + +/* Headline "Adjust basal" */ +"Adjust basal" = "Adjust basal"; + +/* Enable adjustment of basal profile */ +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; + +/* Headline "Max Delta-BG Threshold SMB" */ +"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; + +/* Max Delta-BG Threshold SMB */ +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; + +/* Headline "... When Blood Glucose Is Over (mg/dl):" */ +"... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; + +/* ... When Blood Glucose Is Over (mg/dl): */ +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; + +/* Headline "Enable SMB With High BG" */ +"Enable SMB With High BG" = "Enable SMB With High BG"; + +/* "Enable SMB With High BG" */ +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; + +/* Headline "Dynamic settings" */ +"Dynamic settings" = "Dynamic settings"; + +/* Insulin curve */ +"Insulin curve" = "Insulin curve"; + +/* Headline "Adjustment Factor" */ +"Adjustment Factor" = "Adjustment Factor"; From 89f9f8f9a9bc2ff3b88d0f68c962211b4bebd8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:31:54 +0100 Subject: [PATCH 318/405] Update crowdin.yml Update the exported languages to include Hungarian and Vietnamese --- crowdin.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crowdin.yml b/crowdin.yml index dcad207805..7c3d3cbdbc 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -19,6 +19,8 @@ export_languages: - pt-PT - pt-BR - sk + - vi + - hu files: - source: /FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings translation: /FreeAPS/Sources/Localizations/Main/%osx_locale%.lproj/Localizable.strings From 6c4948aae1a2dac06de933a02fa75d16b268d1d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:31:54 +0100 Subject: [PATCH 319/405] Update crowdin.yml Update the exported languages to include Hungarian and Vietnamese --- crowdin.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crowdin.yml b/crowdin.yml index dcad207805..7c3d3cbdbc 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -19,6 +19,8 @@ export_languages: - pt-PT - pt-BR - sk + - vi + - hu files: - source: /FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings translation: /FreeAPS/Sources/Localizations/Main/%osx_locale%.lproj/Localizable.strings From cfa89ebb74808738a909a21e808d77ae26a60c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:38:20 +0100 Subject: [PATCH 320/405] Swedish Crowdin translations (#444) --- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 590c0c91d8..fbdb6909ff 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Använd lokal server som glukoskälla"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Detta möjliggör uppladdning av statistik till Nightscout. För att dela denna statistik se länk nedan:\n"; /* */ "Edit settings json" = "Ändra debug-inställningar"; From e75ac0c7316ad5f438f6c9edaa266e0ff0899612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:58:40 +0100 Subject: [PATCH 321/405] Crowdin updates (#445) Chinese Simplified, Hungarian and Vietnamese. --- .../CGMBLEKit/vi.lproj/Localizable.strings | 4 +- .../CGMBLEKitUI/hu.lproj/Localizable.strings | 10 +- .../hu.lproj/TransmitterManagerSetup.strings | 3 +- .../CGMBLEKitUI/vi.lproj/Localizable.strings | 14 + .../vi.lproj/TransmitterManagerSetup.strings | 17 +- .../hu.lproj/Localizable.strings | 15 +- .../vi.lproj/Localizable.strings | 81 +++ .../G7SensorKit/hu.lproj/Localizable.strings | 129 ++++ .../G7SensorKit/vi.lproj/Localizable.strings | 129 ++++ .../Resources/vi.lproj/Localizable.strings | 45 +- .../Resources/hu.lproj/Localizable.strings | 16 +- .../Resources/vi.lproj/Localizable.strings | 79 ++- .../hu.lproj/Localizable.strings | 40 +- .../vi.lproj/Localizable.strings | 81 ++- .../zh-Hans.lproj/Localizable.strings | 2 +- .../Resources/hu.lproj/Localizable.strings | 9 +- .../Resources/vi.lproj/Localizable.strings | 257 +++++++- .../Resources/hu.lproj/Localizable.strings | 33 +- .../Resources/vi.lproj/Localizable.strings | 532 ++++++++++++++- .../hu.lproj/Localizable.strings | 8 +- .../vi.lproj/Localizable.strings | 58 +- .../Main/hu.lproj/Localizable.strings | 612 +++++++++--------- .../Main/vi.lproj/Localizable.strings | 554 ++++++++-------- 23 files changed, 1974 insertions(+), 754 deletions(-) create mode 100644 Dependencies/G7SensorKit/hu.lproj/Localizable.strings create mode 100644 Dependencies/G7SensorKit/vi.lproj/Localizable.strings diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings index d3cc20db07..329ab73b31 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings @@ -13,6 +13,9 @@ /* Describes a functioning transmitter */ "OK" = "OK"; +/* invlid config error description */ +"Peripheral command was invalid" = "Câu lệnh không hợp lệ"; + /* Timeout error description */ "Peripheral did not respond in time" = "Ngoại vi không đáp ứng kịp thời"; @@ -36,4 +39,3 @@ /* Error description */ "Unknown characteristic" = "Đặc điểm không xác định"; - diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings index 8ed9ea5712..a38f99d487 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings @@ -5,17 +5,17 @@ "Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; /* The title of the cancel action in an action sheet */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* Title describing glucose date */ -"Date" = "Date"; +"Date" = "Dátum"; /* Button title to delete CGM Title text for the button to remove a CGM from Loop */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "CGM kitörlése"; /* Title describing glucose value */ -"Glucose" = "Glucose"; +"Glucose" = "Glükóz"; /* Describes a glucose value adjusted to reflect a recent calibration */ "Glucose (Adjusted)" = "Glucose (Adjusted)"; @@ -51,7 +51,7 @@ Title text for the button to remove a CGM from Loop */ "Transmitter Age" = "Transmitter Age"; /* The title text for the Dexcom G5/G6 transmitter ID config value */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "Jeladó ID"; /* Title describing glucose trend */ "Trend" = "Trend"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings index 41859f853c..a71c1f12af 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings @@ -1,4 +1,3 @@ - /* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */ "5oU-vK-JHQ.text" = "Credentials"; @@ -12,7 +11,7 @@ "Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; /* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */ -"Qub-6B-0aB.headerTitle" = "Transmitter ID"; +"Qub-6B-0aB.headerTitle" = "Jeladó ID"; /* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */ "k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings index 216f9233ac..e2071ad2db 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings @@ -26,12 +26,24 @@ Title text for the button to remove a CGM from Loop */ /* Section title for latest glucose reading */ "Latest Reading" = "Kết quả đọc mới nhất"; +/* Section title for latest connection date */ +"Latest Connection" = "Kết nối gần đây nhất"; + /* Button title to open CGM app */ "Open App" = "Mở ứng dụng"; /* Title describing sensor session age */ "Session Age" = "Thời gian sử dụng sensor"; +/* Section title for remote data synchronization */ +"Remote Data Synchronization" = "Đồng bộ hoá dữ liệu từ xa"; + +/* Title describing sensor expiration */ +"Sensor Expires" = "Cảm biến hết hạn"; + +/* Title describing past sensor expiration */ +"Sensor Expired" = "Cảm biến đã hết hạn"; + /* Title describing CGM calibration and battery state */ "Status" = "Tình trạng"; @@ -44,3 +56,5 @@ Title text for the button to remove a CGM from Loop */ /* Title describing glucose trend */ "Trend" = "Xu hướng"; +/* The title text for the upload glucose switch cell */ +"Upload Readings" = "Glucose đang tải lên"; diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings index 58ada30485..f05016023c 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings @@ -5,20 +5,19 @@ "Dds-49-o7G.title" = "Cài đặt Transmitter"; /* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */ -"GOT-KQ-cEh.text" = "Detail"; +"GOT-KQ-cEh.text" = "Chi tiết"; + +/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */ +"Qub-6B-0aB.footerTitle" = "Số ID của Transmitter có thể được tìm thấy trên vỏ hộp hoặc bên hông hộp và trong phần Menu cài đặt cũng như trên ứng dụng của điện thoại."; + +/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */ +"Qub-6B-0aB.headerTitle" = "Số ID của Transmitter"; /* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */ "k1N-Rg-XDy.footerTitle" = "Dữ liệu có thể được tải xuống qua đường truyền Internet trên ứng dụng Share khi kết nối với transmitter bị đứt."; /* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */ -"k1N-Rg-XDy.headerTitle" = "Dexcom Share"; +"k1N-Rg-XDy.headerTitle" = "Dữ liệu từ Dexcom Share"; /* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */ "nKX-TW-GhD.placeholder" = "Nhập 6 số ID của Transmitter"; - -/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */ -"Qub-6B-0aB.footerTitle" = "Số ID của Transmitter có thể được tìm thấy trên vỏ hộp hoặc bên hông hộp và trong phần Menu cài đặt cũng như trên ứng dụng của điện thoại."; - -/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */ -"Qub-6B-0aB.headerTitle" = "Số ID của Transmitter"; - diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings index 8fb5899d15..d5a77fe52d 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings @@ -11,10 +11,10 @@ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* No comment provided by engineer. */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* title for g7 settings connection status when connected */ "Connected" = "Connected"; @@ -26,17 +26,17 @@ "Continue" = "Continue"; /* Button label for removing CGM */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "CGM kitörlése"; /* Navigation bar title for G7SettingsView Title on WelcomeView */ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Done"; +"Done" = "Kész"; /* Field label */ -"Glucose" = "Glucose"; +"Glucose" = "Glükóz"; /* title for g7 settings row showing sensor grace period end time */ "Grace Period End" = "Grace Period End"; @@ -60,7 +60,7 @@ "LOW" = "LOW"; /* title for g7 settings row showing BLE Name */ -"Name" = "Name"; +"Name" = "Megnevezés"; /* No comment provided by engineer. */ "Scan for new sensor" = "Scan for new sensor"; @@ -105,7 +105,7 @@ "Signal\nLoss" = "Signal\nLoss"; /* Field label */ -"Time" = "Time"; +"Time" = "Idő"; /* Field label */ "Trend" = "Trend"; @@ -115,4 +115,3 @@ /* G7 Progress bar label when sensor in warmup */ "Warmup completes" = "Warmup completes"; - diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings index a042412b9f..2db1aee77e 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings @@ -7,6 +7,9 @@ /* No comment provided by engineer. */ "Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?"; +/* No comment provided by engineer. */ +"Bluetooth" = "Bluetooth"; + /* Button text to cancel G7 setup */ "Cancel" = "Hủy bỏ"; @@ -25,12 +28,90 @@ /* Button label for removing CGM */ "Delete CGM" = "Xóa CGM"; +/* Navigation bar title for G7SettingsView + Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* No comment provided by engineer. */ +"Done" = "Hoàn thành"; + /* Field label */ "Glucose" = "Đường huyết"; +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "CAO"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Kết nối gần đây nhất"; + +/* No comment provided by engineer. */ +"Last Reading" = "Kết quả đọc gần nhất"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "THẤP"; + /* title for g7 settings row showing BLE Name */ "Name" = "Tên"; +/* No comment provided by engineer. */ +"Scan for new sensor" = "Scan for new sensor"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Đang quét"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Đang tìm kiếm cảm biến"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for sensor failed */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Cảm biến hết hạn"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Cảm biến đã hết hạn"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Lỗi cảm biến"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Start sensor"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/* Field label */ +"Time" = "Thời gian"; + /* Field label */ "Trend" = "Xu hướng"; +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Glucose đang tải lên"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; diff --git a/Dependencies/G7SensorKit/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..8e190c6197 --- /dev/null +++ b/Dependencies/G7SensorKit/hu.lproj/Localizable.strings @@ -0,0 +1,129 @@ +/* Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* Button title for starting setup */ +"Continue" = "Continue"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Mégse"; + +/* Error description for unreliable state */ +"Glucose data is unavailable" = "Glucose data is unavailable"; + +/* The description of sensor algorithm state when sensor is ok. */ +"Sensor is OK" = "Sensor is OK"; + +/* The description of sensor algorithm state when sensor is stopped." */ +"Sensor is stopped" = "Sensor is stopped"; + +/* The description of sensor algorithm state when sensor is warming up. */ +"Sensor is warming up" = "Sensor is warming up"; + +/* The description of sensor algorithm state when sensor is expired. */ +"Sensor expired" = "Sensor expired"; + +/* The description of sensor algorithm state when sensor failed. */ +"Sensor failed" = "Sensor failed"; + +/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */ +"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Sensor Start"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Sensor Expiration"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* Field label */ +"Glucose" = "Glükóz"; + +"Last Reading" = "Last Reading"; + +"Time" = "Idő"; + +"Trend" = "Trend"; + +"Bluetooth" = "Bluetooth"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Megnevezés"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Scanning"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Connected"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Connecting"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Last Connect"; + +/* Configuration */ +"Configuration" = "Beállítások"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Upload Readings"; + +/* Button */ +"Scan for new sensor" = "Scan for new sensor"; + +/* Button label for removing CGM */ +"Delete CGM" = "CGM kitörlése"; + +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "LOW"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "HIGH"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/min"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Searching for sensor"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Sensor expired"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Sensor failed"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for signal loss */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/*G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; diff --git a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings new file mode 100644 index 0000000000..7cca3ef4b9 --- /dev/null +++ b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings @@ -0,0 +1,129 @@ +/* Title on WelcomeView */ +"Dexcom G7" = "Dexcom G7"; + +/* Descriptive text on G7StartupView */ +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; + +/* Button title for starting setup */ +"Continue" = "Tiếp tục"; + +/* Button text to cancel G7 setup */ +"Cancel" = "Bỏ qua"; + +/* Error description for unreliable state */ +"Glucose data is unavailable" = "Dữ liệu đường huyết không có sẵn"; + +/* The description of sensor algorithm state when sensor is ok. */ +"Sensor is OK" = "Sensor is OK"; + +/* The description of sensor algorithm state when sensor is stopped." */ +"Sensor is stopped" = "Cảm biến đã dừng hoạt động"; + +/* The description of sensor algorithm state when sensor is warming up. */ +"Sensor is warming up" = "Cảm biến đang khởi động"; + +/* The description of sensor algorithm state when sensor is expired. */ +"Sensor expired" = "Cảm biến đã hết hạn"; + +/* The description of sensor algorithm state when sensor failed. */ +"Sensor failed" = "Lỗi cảm biến"; + +/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */ +"Sensor is in unknown state %1$d" = "Trạng thái cảm biến không xác định %1$d"; + +/* title for g7 settings row showing sensor start time */ +"Sensor Start" = "Khởi động Cảm biến"; + +/* title for g7 settings row showing sensor expiration time */ +"Sensor Expiration" = "Cảm biến hết hạn"; + +/* title for g7 settings row showing sensor grace period end time */ +"Grace Period End" = "Grace Period End"; + +/* Field label */ +"Glucose" = "Đường huyết"; + +"Last Reading" = "Kết quả đọc gần nhất"; + +"Time" = "Thời gian"; + +"Trend" = "Xu hướng Glucose"; + +"Bluetooth" = "Bluetooth"; + +/* title for g7 settings row showing BLE Name */ +"Name" = "Tên"; + +/* title for g7 settings connection status when scanning */ +"Scanning" = "Đang quét"; + +/* title for g7 settings connection status when connected */ +"Connected" = "Đã kết nối"; + +/* title for g7 settings connection status when connecting */ +"Connecting" = "Đang kết nối"; + +/* title for g7 settings row showing sensor last connect time */ +"Last Connect" = "Kết nối gần đây nhất"; + +/* Configuration */ +"Configuration" = "Cấu hình"; + +/* title for g7 config settings to upload readings */ +"Upload Readings" = "Glucose đang tải lên"; + +/* Button */ +"Scan for new sensor" = "Scan for new sensor"; + +/* Button label for removing CGM */ +"Delete CGM" = "Xoá CGM"; + +/* No glucose value representation (3 dashes for mg/dL) */ +"– – –" = "– – –"; +/* String displayed instead of a glucose value below the CGM range */ +"LOW" = "THẤP"; + +/* String displayed instead of a glucose value above the CGM range */ +"HIGH" = "CAO"; + +/* Format string for glucose trend per minute. (1: glucose value and unit) */ +"%@/min" = "%@/phút"; + +/* G7 Progress bar label when searching for sensor */ +"Searching for sensor" = "Đang tìm kiếm cảm biến"; + +/* G7 Progress bar label when sensor expired */ +"Sensor expired" = "Cảm biến đã hết hạn"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + +/* G7 Progress bar label when sensor in warmup */ +"Warmup completes" = "Warmup completes"; + +/* G7 Progress bar label when sensor failed */ +"Sensor failed" = "Lỗi cảm biến"; + +/* G7 Progress bar label when sensor lifetime progress showing */ +"Sensor expires" = "Sensor expires"; + +/* G7 Progress bar label when sensor grace period progress showing */ +"Grace period remaining" = "Grace period remaining"; + +/* G7 Status highlight text for searching for sensor */ +"Searching for\nSensor" = "Searching for\nSensor"; + +/* G7 Status highlight text for sensor expired */ +"Sensor\nExpired" = "Sensor\nExpired"; + +/* G7 Status highlight text for signal loss */ +"Sensor\nFailed" = "Sensor\nFailed"; + +/* G7 Status highlight text for signal loss */ +"Signal\nLoss" = "Signal\nLoss"; + +/*G7 Status highlight text for sensor error */ +"Sensor\nIssue" = "Sensor\nIssue"; + +/* G7 Status highlight text for sensor warmup */ +"Sensor\nWarmup" = "Sensor\nWarmup"; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings index d211ccd4f8..397c86b20c 100644 --- a/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings @@ -1,9 +1,3 @@ -/* Low reservoir alert format string. (1: Number of units remaining) */ -"%1$@ U left" = "%1$@ U còn lại"; - -/* Low reservoir alert with time remaining format string. (1: Number of units remaining)(2: approximate time remaining) */ -"%1$@ U left: %2$@" = "%1$@ U còn lại: %2$@"; - /* Communications error for a bolus currently running */ "A bolus is already in progress" = "Liều bolus đang được thực hiện"; @@ -19,22 +13,9 @@ /* The format string description of a BasalProfileStartPumpEvent. (1: The index of the profile)(2: The basal rate) */ "Basal Profile %1$@: %2$@ U/hour" = "Hồ sơ Basal %1$@: %2$@ U/giờ"; -/* Event title for bolus - Pump Event title for UnfinalizedDose with doseType of .bolus */ -"Bolus" = "Bolus"; - /* Pump error code when bolus is in progress */ "Bolus in progress" = "Liều Bolus đang được thực hiện"; -/* The notification alert describing a low pump battery */ -"Change the pump battery immediately" = "Thay pin máy bơm ngay"; - -/* The notification alert describing an empty pump reservoir */ -"Change the pump reservoir now" = "Thay ngăn chứa insulin bây giờ"; - -/* Event title for ChangeTimePumpEvent */ -"Change Time" = "Thay đổi thời gian"; - /* Suggestions for diagnosing a command refused pump error */ "Check that the pump is not suspended or priming, or has a percent temp basal type" = "Kiểm tra và đảm bảo bơm không tạm ngưng hoặc đang bơm hoặc đang thực hiện liều basal tạm thời"; @@ -50,11 +31,8 @@ /* Error description */ "Device Error" = "Thiết bị lỗi"; -/* Default alert dismissal */ -"Dismiss" = "Từ bỏ"; - /* Describing the pump history insulin data source */ -"Event History" = "Event History"; +"Event History" = "Lược sử tác vụ trước đó"; /* Format string for failure reason. (1: The operation being performed) (2: The response data) */ "Invalid response during %1$@: %2$@" = "Phản ứng không phù hợp trong khoảng %1$@: %2$@"; @@ -62,9 +40,6 @@ /* Describing the battery chemistry as Lithium */ "Lithium" = "Lithium"; -/* Event title for JournalEntryPumpLowBatteryPumpEvent */ -"Low Battery" = "pin yếu"; - /* Recovery suggestion */ "Make sure your RileyLink is nearby and powered on" = "Đảm bảo RileyLink bên cạnh và đã được bật"; @@ -80,12 +55,6 @@ /* Describing the North America pump region */ "North America" = "North America"; -/* Acknowledge button label for RileyLink low battery alert */ -"OK" = "OK"; - -/* The notification title for a low pump battery */ -"Pump Battery Low" = "Pin của bơm thấp"; - /* No comment provided by engineer. */ "Pump did not respond" = "Bơm không phản hồi"; @@ -95,12 +64,6 @@ /* No comment provided by engineer. */ "Pump is suspended" = "Bơm đang được tạm ngưng"; -/* The notification title for an empty pump reservoir */ -"Pump Reservoir Empty" = "Ngăn chứa hết insulin"; - -/* The notification title for a low pump reservoir */ -"Pump Reservoir Low" = "Ngăn chứa insulin thấp"; - /* No comment provided by engineer. */ "Pump responded unexpectedly" = "Bơm phản ứng bất ngờ"; @@ -108,14 +71,11 @@ "PumpMessage(%1$@, %2$@, %3$@, %4$@)" = "PumpMessage(%1$@, %2$@, %3$@, %4$@)"; /* Describing the reservoir insulin data source */ -"Reservoir" = "Reservoir"; +"Reservoir" = "Ngăn chứa insulin"; /* Error description */ "RileyLink radio tune failed" = "RileyLink radio thất bại"; -/* Event title for starting scheduled basal */ -"Scheduled Basal" = "Đã lên chương trình cho liều Basal"; - /* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */ "Temporary Basal: %1$.3f U/hour" = "Liều Basal tạm thời: %1$.3f U/giờ"; @@ -136,4 +96,3 @@ /* Describing the worldwide pump region */ "World-Wide" = "World-Wide"; - diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings index ebe3f71382..945bb50d8f 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/hu.lproj/Localizable.strings @@ -38,7 +38,7 @@ "Bolusing: %1$@\n" = "Bolusing: %1$@\n"; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* Title text for suspend resume button when temp basal canceling */ "Canceling Temp Basal" = "Canceling Temp Basal"; @@ -53,10 +53,10 @@ "Choose the type of battery you are using in your pump for better alerting about low battery conditions." = "Choose the type of battery you are using in your pump for better alerting about low battery conditions."; /* The title of the configuration section in MinimedPumpManager settings */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* Button title to connect to pump during setup */ -"Connect" = "Connect"; +"Connect" = "Csatlakozás"; /* Text for continue button */ "Continue" = "Continue"; @@ -66,7 +66,7 @@ "Delete Pump" = "Delete Pump"; /* Header for devices section of RileyLinkSetupView */ -"Devices" = "Devices"; +"Devices" = "Eszközök"; /* Description for option to not use MySentry */ "Do not use MySentry" = "Do not use MySentry"; @@ -114,7 +114,7 @@ "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models."; /* Value string for MySentry config when MySentry is not being used */ -"No" = "No"; +"No" = "Nem"; /* Message display when no response from tuning pump */ "No response" = "No response"; @@ -200,13 +200,13 @@ "Tuning radio…" = "Tuning radio…"; /* Units for showing temp basal rate */ -"U/hr" = "U/hr"; +"U/hr" = "U/óra"; /* Text to indicate battery percentage is unknown */ "unknown" = "unknown"; /* Text shown in basal rate space when delivery status is unknown */ -"Unknown" = "Unknown"; +"Unknown" = "Ismeretlen"; /* Description for option to use MySentry navigation title for pump battery type selection @@ -214,7 +214,7 @@ "Use MySentry" = "Use MySentry"; /* Value string for MySentry config when MySentry is being used */ -"Yes" = "Yes"; +"Yes" = "Igen"; /* Button text to confirm pump time sync */ "Yes, Sync to Current Time" = "Yes, Sync to Current Time"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings index 8bae1bda17..9673f6c744 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings @@ -1,8 +1,11 @@ +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + /* Format string for reservoir volume. (1: The localized volume) */ "%@U" = "%@U"; /* The format string for displaying a frequency tune trial. Extra spaces added for emphesis: (1: frequency in MHz)(2: success count)(3: total count)(4: average RSSI) */ -"%1$@ %2$@/%3$@ %4$@" = "%1$@ %2$@/%3$@ %4$@"; +"%1$@ %2$@/%3$@ %4$@" = "%1$@ %2$@/%3$@ %4$@"; /* The format string describing number of basal schedule entries: (1: number of entries) */ "%1$@ basal schedule entries\n" = "%1$@ Lịch biểu liều nền\n"; @@ -16,9 +19,15 @@ /* String format for value with units (1: value, 2: separator, 3: units) */ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Adjusting Pump Time..."; + /* Instructions on selecting battery chemistry type */ "Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Pin kềm và pin lithium phân rã ở các mức độ khác nhau. Pin kềm có xu hướng giảm điện áp tuyến tính theo thời gian trong khi pin lithium có xu hướng duy trì điện áp cho đến khi hết nửa vòng đời. Trong điều kiện sử dụng bình thường trên bơm Minimed (loại X22 hay X15) khi chạy Loop, pin kiềm có thể dùng được trong khoảng 4 đến 5 ngày trong khi pin lithium dùng dc 2 tuần. Việc lựa chọn này được sử dụng theo các mức phân rã điện áp khác nhau cho mỗi loại pin hóa học và sẽ có cảnh báo đối với người dùng khi pin hỏng đạt khoảng từ 8-10 giờ."; +/* Text to confirm delete this pump */ +"Are you sure you want to delete this Pump?" = "Bạn có chắc muốn xóa bơm này không?"; + /* The format string describing pump battery voltage: (1: battery voltage) */ "Battery: %1$@ volts\n" = "Pin: %1$@ volts\n"; @@ -34,9 +43,15 @@ /* Title text for suspend resume button when temp basal canceling */ "Canceling Temp Basal" = "Đang hủy liều Basal tạm thời"; +/* Text shown in basal rate space when basal is changing */ +"Changing" = "Đang thay đổi"; + /* Progress message for changing pump time. */ "Changing time…" = "Đang thay đổi giờ…"; +/* Instructions on selecting battery chemistry type */ +"Choose the type of battery you are using in your pump for better alerting about low battery conditions." = "Chọn loại pin bạn đang sử dụng trong máy bơm để cảnh báo tốt hơn về tình trạng pin yếu."; + /* The title of the configuration section in MinimedPumpManager settings */ "Configuration" = "Cấu hình"; @@ -53,12 +68,18 @@ /* Header for devices section of RileyLinkSetupView */ "Devices" = "Thiết bị"; +/* Description for option to not use MySentry */ +"Do not use MySentry" = "Do not use MySentry"; + /* The alert title for a resume error */ "Error Resuming" = "Lỗi khi đang tái thực hiện"; /* The alert title for a suspend error */ "Error Suspending" = "Lỗi khi đang tạm ngưng"; +/* The alert title for an error while synching time */ +"Error Syncing Time" = "Lỗi đồng bộ thời gian"; + /* Progress message for fetching pump glucose. */ "Fetching glucose…" = "Đang lấy dữ liệu đường huyết…"; @@ -71,15 +92,36 @@ /* The title of the cell showing the pump firmware version */ "Firmware Version" = "Chương trình cơ sở"; +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulin\nSuspended"; + /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Khối lượng tiêm insulin"; /* Instructions on selecting an insulin data source */ "Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option." = "Việc tiêm insulin có thể được quyết định từ bơm bằng cách kết hợp giải thuật dữ liệu của người sử dụng và so sánh với khối lượngngăn chứa insulin theo thời gian. Việc đọc các dữ liệu cũ sẽ đảm bảo biểu đồ đường huyết luôn được tính chính xác và tải dữ liệu điều trị cập nhật lên Nightscout, nhưng lại tăng việc tiêu hao pin cũng như lỗi giao tiếp tần số radio cao hơn việc chỉ đọc mỗi dữ liệu ngăn chứa insulin. Trong trường hợp nguồn dữ liệu không được lựa chọn vì bất kỳ lý do gì thì phần mềm sẽ quay sang lựa chọn khác."; +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin còn lại"; + +/* Text for confidence reminders navigation link */ +"Insulin Type" = "Loại Insulin"; + +/* Format string fof navigation bar title for MinimedPumpSettingsView (1: model number) */ +"Medtronic %1$@" = "Medtronic %1$@"; + +/* Instructions on selecting setting for MySentry */ +"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models."; + +/* Value string for MySentry config when MySentry is not being used */ +"No" = "No"; + /* Message display when no response from tuning pump */ "No response" = "Không có phản hồi nào"; +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "Không, Giữ nguyên máy bơm"; + /* Pump find device instruction */ "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device"; @@ -87,6 +129,9 @@ Text for medtronic pump preferred data source */ "Preferred Data Source" = "Nguồn dữ liệu được ưa thích"; +/* Text for medtronic pump battery percent remaining */ +"Pump Battery Remaining" = "Pin còn lại của Bơm"; + /* navigation title for pump battery type selection Text for medtronic pump battery type */ "Pump Battery Type" = "Loại pin của bơm"; @@ -94,6 +139,9 @@ /* The title text for the pump ID config value */ "Pump ID" = "Số ID của bơm"; +/* The title of the command to change pump time zone */ +"Pump Time" = "Thời gian của Bơm"; + /* Progress message for reading basal schedule */ "Reading basal schedule…" = "Đang đọc lịch biểu liều nền…"; @@ -101,7 +149,7 @@ "Reading pump status…" = "Đang đọc tình trạng bơm…"; /* The title of the cell showing the pump region */ -"Region" = "Region"; +"Region" = "Khu vực"; /* Title text for button to resume insulin delivery */ "Resume Delivery" = "Tiếp tục lại việc tiêm insulin"; @@ -115,6 +163,9 @@ /* Title of insulin delivery section */ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; +/* Title text for insulin type confirmation page */ +"Select the type of insulin that you will be using in this pump." = "Select the type of insulin that you will be using in this pump."; + /* Progress message for sending button press to pump. */ "Sending button press…" = "Đang gửi nút bấm…"; @@ -133,6 +184,15 @@ /* Title text for button when insulin delivery is in the process of being stopped */ "Suspending" = "Đang tạm ngưng"; +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + +/* Message for pod sync time action sheet */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; + +/* Title for pod sync time action sheet. */ +"Time Change Detected" = "Time Change Detected"; + /* The label indicating the results of each frequency trial */ "Trials" = "Các thử nghiệm"; @@ -142,6 +202,19 @@ /* Units for showing temp basal rate */ "U/hr" = "U/giờ"; +/* Text to indicate battery percentage is unknown */ +"unknown" = "unknown"; + /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Không nhận ra"; +/* Description for option to use MySentry + navigation title for pump battery type selection + Text for medtronic pump to use MySentry */ +"Use MySentry" = "Use MySentry"; + +/* Value string for MySentry config when MySentry is being used */ +"Yes" = "Có"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index 2612ff2e95..8cb982a2a1 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -4,8 +4,8 @@ Created by Jon Mårtensson on 2022-08-28. Copyright © 2022 Randall Knutson. All rights reserved. */ - /* Alert content title for multiCommand pod alert */ + "Multiple Command Alert" = "Multiple Command Alert"; /* Alert content title for userPodExpiration pod alert */ @@ -123,13 +123,13 @@ "hour" = "hour"; /* Unit for plural hours in pod life remaining */ -"hours" = "hours"; +"hours" = "óra"; /* Unit for singular minute in pod life remaining */ "minute" = "minute"; /* Unit for plural minutes in pod life remaining */ -"minutes" = "minutes"; +"minutes" = "perc"; /* Title of insulin delivery section */ "Insulin Delivery" = "Insulin Delivery"; @@ -147,7 +147,7 @@ "Device Details" = "Device Details"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; @@ -285,16 +285,16 @@ "Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Felfüggesztés"; /* */ "Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; /* */ -"Resume" = "Resume"; +"Resume" = "Visszatérés"; /* */ -"Bolus" = "Bolus"; +"Bolus" = "Bólus"; /* */ "Cancel Bolus" = "Cancel Bolus"; @@ -324,7 +324,7 @@ "Activity" = "Activity"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* Title for previous pod page */ "Previous Pod" = "Previous Pod"; @@ -376,10 +376,8 @@ /* Button text for 1 hour suspend duration" */ "1 hour" = "1 hour"; - - /* Button text for 1 hour 30 minute suspend duration */ +/* Button text for 1 hour 30 minute suspend duration */ "1 hour 30 minutes" = "1 hour 30 minutes"; - /* Button text for 2 hour suspend duration */ "2 hours" = "2 hours"; @@ -444,7 +442,7 @@ "Paired" = "Paired"; /* Cancel button text in navigation bar on pair pod UI */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* Alert title for cancel pairing modal */ "Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; @@ -501,10 +499,10 @@ "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "Igen"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "Nem"; /* Pod pairing action button text while pairing */ "Pairing..." = "Pairing..."; @@ -525,7 +523,7 @@ "Scheduled Reminder" = "Scheduled Reminder"; /* Label for expiration reminder row */ -"Time" = "Time"; +"Time" = "Idő"; /* Action button title to continue at Setup Complete */ "Finish Setup" = "Finish Setup"; @@ -574,12 +572,11 @@ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; - /* navigation title for notification settings */ "Notification Settings" = "Notification Settings"; /* Label for scheduled reminder value row */ -"Time" = "Time"; +"Time" = "Idő"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -589,7 +586,6 @@ /* The action string on pod status page when pod data is stale */ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; - /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; @@ -615,14 +611,13 @@ "Rate" = "Rate"; /* Insulin unit per hour */ -"U/hr" = "U/hr"; +"U/hr" = "U/óra"; /* Summary string for temporary basal rate configuration page */ "%1$@ for %2$@" = "%1$@ for %2$@"; /* Description text on manual temp basal action sheet */ "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; - /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Set Temporary Basal"; @@ -654,7 +649,7 @@ "No\nDelivery" = "No\nDelivery"; /* description label for active time pod details row */ -"Active Time"= "Active Time"; +"Active Time" = "Active Time"; /* description label for total delivery pod details row */ "Total Delivery" = "Total Delivery"; @@ -693,7 +688,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* Text for continue button on PodSetupView */ "Continue" = "Continue"; @@ -817,7 +812,6 @@ /* button title when retrieving pump manager details */ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; - /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 6cdb095bde..06b51f615f 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -4,8 +4,8 @@ Created by Jon Mårtensson on 2022-08-28. Copyright © 2022 Randall Knutson. All rights reserved. */ - /* Alert content title for multiCommand pod alert */ + "Multiple Command Alert" = "Multiple Command Alert"; /* Alert content title for userPodExpiration pod alert */ @@ -75,7 +75,7 @@ "Pod Activated" = "Pod Activated"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Cài đặt thông báo"; /* */ "Confidence Reminders" = "Confidence Reminders"; @@ -123,13 +123,13 @@ "hour" = "hour"; /* Unit for plural hours in pod life remaining */ -"hours" = "hours"; +"hours" = "giờ"; /* Unit for singular minute in pod life remaining */ "minute" = "minute"; /* Unit for plural minutes in pod life remaining */ -"minutes" = "minutes"; +"minutes" = "phút"; /* Title of insulin delivery section */ "Insulin Delivery" = "Insulin Delivery"; @@ -240,7 +240,7 @@ "Signal Loss" = "Signal Loss"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Liều Basal thủ công"; /* */ "Insert Cannula" = "Insert Cannula"; @@ -294,7 +294,7 @@ "Resume" = "Resume"; /* */ -"Bolus" = "Bolus"; +"Bolus" = "Liều bolus"; /* */ "Cancel Bolus" = "Cancel Bolus"; @@ -376,10 +376,8 @@ /* Button text for 1 hour suspend duration" */ "1 hour" = "1 hour"; - - /* Button text for 1 hour 30 minute suspend duration */ +/* Button text for 1 hour 30 minute suspend duration */ "1 hour 30 minutes" = "1 hour 30 minutes"; - /* Button text for 2 hour suspend duration */ "2 hours" = "2 hours"; @@ -435,7 +433,7 @@ "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -444,7 +442,7 @@ "Paired" = "Paired"; /* Cancel button text in navigation bar on pair pod UI */ -"Cancel" = "Cancel"; +"Cancel" = "Bỏ qua"; /* Alert title for cancel pairing modal */ "Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; @@ -501,10 +499,10 @@ "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "Có"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "Không"; /* Pod pairing action button text while pairing */ "Pairing..." = "Pairing..."; @@ -525,7 +523,7 @@ "Scheduled Reminder" = "Scheduled Reminder"; /* Label for expiration reminder row */ -"Time" = "Time"; +"Time" = "Thời gian"; /* Action button title to continue at Setup Complete */ "Finish Setup" = "Finish Setup"; @@ -573,13 +571,12 @@ "Critical Alerts" = "Critical Alerts"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; - +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; /* navigation title for notification settings */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Cài đặt thông báo"; /* Label for scheduled reminder value row */ -"Time" = "Time"; +"Time" = "Thời gian"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -589,7 +586,6 @@ /* The action string on pod status page when pod data is stale */ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; - /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; @@ -612,7 +608,7 @@ "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; /* Label text for temporary basal rate summary */ -"Rate" = "Rate"; +"Rate" = "Tỷ lệ"; /* Insulin unit per hour */ "U/hr" = "U/hr"; @@ -622,7 +618,6 @@ /* Description text on manual temp basal action sheet */ "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; - /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Set Temporary Basal"; @@ -654,7 +649,7 @@ "No\nDelivery" = "No\nDelivery"; /* description label for active time pod details row */ -"Active Time"= "Active Time"; +"Active Time" = "Active Time"; /* description label for total delivery pod details row */ "Total Delivery" = "Total Delivery"; @@ -693,7 +688,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Bỏ qua"; /* Text for continue button on PodSetupView */ "Continue" = "Continue"; @@ -717,7 +712,7 @@ "Low Reservoir" = "Low Reservoir"; /* */ -"Save" = "Save"; +"Save" = "Lưu"; /* hr (short for hour) */ "hr" = "hr"; @@ -787,3 +782,41 @@ /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ "Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; + +/* DASH Pod time ago since last status */ +"%@ ago" = "%@ trước đó"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; + +/* navigation title for Silnce Pod */ +"Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 3cbedef6ab..f349bab503 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -249,7 +249,7 @@ "Inserting..." = "Inserting..."; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "重试"; /* Cannula insertion button text while checking insertion */ "Checking..." = "Checking..."; diff --git a/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings index 0e1b974d1c..a2771255f6 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/hu.lproj/Localizable.strings @@ -27,7 +27,7 @@ "Below 50 units" = "Below 50 units"; /* Pump Event title for UnfinalizedDose with doseType of .bolus */ -"Bolus" = "Bolus"; +"Bolus" = "Bólus"; /* Error message shown when operation could not be completed due to existing bolus in progress */ "Bolus in progress" = "Bolus in progress"; @@ -36,7 +36,7 @@ "Bolus: %1$@U %2$@ %3$@ %4$@" = "Bolus: %1$@U %2$@ %3$@ %4$@"; /* Delivery status when bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Beadás"; /* Delivery status when bolusing and temp basal is running */ "Bolusing with temp basal" = "Bolusing with temp basal"; @@ -313,7 +313,7 @@ "Reminder initialized" = "Reminder initialized"; /* Pump Event title for UnfinalizedDose with doseType of .resume */ -"Resume" = "Resume"; +"Resume" = "Visszatérés"; /* Recovery suggestion when pod is suspended */ "Resume delivery" = "Resume delivery"; @@ -340,7 +340,7 @@ "Signal strength too high" = "Signal strength too high"; /* Pump Event title for UnfinalizedDose with doseType of .suspend */ -"Suspend" = "Suspend"; +"Suspend" = "Felfüggesztés"; /* Alert content body for suspendInProgress pod alert Alert content title for suspendInProgress pod alert */ @@ -426,4 +426,3 @@ /* Description waiting for pairing reminder */ "Waiting for pairing reminder" = "Waiting for pairing reminder"; - diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 5700365dd7..95e5232e61 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -1,11 +1,33 @@ +/* Description for an inactive alert modifier */ +" (inactive)" = " (inactive)"; + +/* Format string for low battery alert body for RileyLink. (1: device name) */ +"\"%1$@\" has a low battery" = "\"%1$@\" has a low battery"; + +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; + +/* Format string for activation time exceeded + Pod state when activation not completed in the time allowed */ +"Activation time exceeded" = "Activation time exceeded"; + +/* Description for auto-off */ +"Auto-off" = "Auto-Off"; + /* Description for auto-off alarm */ "Auto-off alarm" = "Auto-off alarm"; +/* Pod state when basal initialized */ +"Basal initialized" = "Basal initialized"; + /* Pod state when running below fifty units */ "Below 50 units" = "Dưới 50 units"; /* Pump Event title for UnfinalizedDose with doseType of .bolus */ -"Bolus" = "Bolus"; +"Bolus" = "Liều bolus"; /* Error message shown when operation could not be completed due to existing bolus in progress */ "Bolus in progress" = "Liều Bolus đang được thực hiện"; @@ -25,48 +47,158 @@ /* String describing a dose that was certainly scheduled */ "Certain" = "Chắc chắn"; +/* Alert content body for podExpireImminent pod alert */ +"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; + +/* Alert content body for podExpiring pod alert */ +"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; + +/* Format string for invalid message error code (1: error code number) */ +"Command error %1$u" = "Command error %1$u"; + +/* Status highlight that delivery is uncertain. */ +"Comms Issue" = "Comms Issue"; + +/* Error message when command is rejected because an unacknowledged command is pending. */ +"Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; + +/* Description for BeepPreference.manualCommands */ +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; + +/* Description for BeepPreference.extended */ +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; + +/* The title for AlarmCode.other notification */ +"Critical Pod Error" = "Critical Pod Error"; + +/* Recovery suggestion when unexpected address received */ +"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Đã hủy kích hoạt"; +/* Title string for BeepPreference.silent */ +"Disabled" = "Disabled"; + /* Description for Empty reservoir pod fault */ "Empty reservoir" = "Ngăn chứa insulin rỗng"; /* Error message shown when empty response from pod was received */ "Empty response from pod" = "Không có phản hồi từ pod"; -/* Title string for BeepPreference.manualCommands */ -"Enabled" = "Được cấp quyền"; - /* Pod state error event logged shutting down */ "Error event logged, shutting down" = "Lỗi đăng nhập, đang tắt"; /* Description for expiration alert */ "Expiration alert" = "Thông báo hết hạn"; +/* Title string for BeepPreference.extended */ +"Extended" = "Extended"; + +/* Delivery status when extended bolus is running */ +"Extended bolus running" = "Extended bolus running"; + +/* Delivery status when extended bolus and temp basal is running */ +"Extended bolus running with temp basal" = "Extended bolus running with temp basal"; + +/* Pod state when fault event has occurred */ +"Fault event occurred" = "Fault event occurred"; + +/* Status highlight that when pod is deactivating. */ +"Finish Deactivation" = "Finish Deactivation"; + +/* Status highlight that when pod is activating. */ +"Finish Pairing" = "Finish Pairing"; + /* Description for finish setup */ "Finish setup " = "Hoàn tất cấu hình"; +/* Description for finish setup reminder */ +"Finish setup reminder" = "Finish setup reminder"; + /* Pod inititialized */ "Initialized" = "Đã được khởi tạo"; +/* Pod state when inserting cannula */ +"Inserting cannula" = "Inserting cannula"; + +/* The default notification body for AlarmCodes */ +"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; + +/* Status highlight that insulin delivery was suspended. */ +"Insulin Suspended" = "Insulin Suspended"; + +/* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ +"Insulin type not configured" = "Insulin type not configured"; + /* The format string for Internal pod fault (1: The fault code value) */ "Internal pod fault %1$03d" = "Lỗi bên trong pod %1$03d"; /* The format string describing a bolus that was interrupted. (1: The amount delivered)(2: The amount scheduled)(3: Start time of the dose)(4: duration)(5: scheduled certainty) */ "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@"; +/* Error message for when unexpected address is received (1: received address) (2: expected address) */ +"Invalid address 0x%x. Expected 0x%x" = "Invalid address 0x%x. Expected 0x%x"; + +/* Description for MessageError invalidAddress */ +"Invalid address: (%1$@)" = "Invalid address: (%1$@)"; + +/* Description for MessageError invalidCrc */ +"Invalid CRC" = "Invalid CRC"; + +/* Error description for OmniBLEPumpManagerError.invalidSetting */ +"Invalid Setting" = "Invalid Setting"; + +/* Alert content title for lowReservoir pod alert */ +"Low Reservoir" = "Low Reservoir"; + +/* Format string for description for low reservoir advisory (1: reminder units) */ +"Low reservoir advisory (%1$gU)" = "Low reservoir advisory (%1$gU)"; + /* Description for low reservoir alarm */ "Low reservoir advisory alarm" = "Báo động ngăn chứa insulin thấp"; +/* Title for RileyLink low battery alert */ +"Low RileyLink Battery" = "Low RileyLink Battery"; + /* Recovery suggestion when no RileyLink is available */ "Make sure your RileyLink is nearby and powered on" = "Đảm bảo RileyLink bên cạnh và đã được bật"; +/* Status highlight when manual temp basal is running. */ +"Manual Basal" = "Liều Basal thủ công"; + +/* Pod memory initialized */ +"Memory initialized" = "Memory initialized"; + +/* Recovery suggestion for PodCommsError.tooManyPodsFound */ +"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; + +/* Alert content body for multiCommand pod alert + Alert content title for multiCommand pod alert */ +"Multiple Command Alert" = "Multiple Command Alert"; + /* Pod alert state when no alerts are active */ "No alerts" = "Không có cảnh báo nào"; +/* Description for BeepPreference.silent */ +"No confidence reminders are used." = "No confidence reminders are used."; + +/* Description for Fault Event Code .noFaults */ +"No faults" = "No faults"; + +/* Status highlight message for emptyReservoir alarm. + Status highlight that a pump is out of insulin. */ +"No Insulin" = "No Insulin"; + +/* Status highlight that when no pod is paired. */ +"No Pod" = "No Pod"; + /* Error message shown when no pod is paired */ "No pod paired" = "Không có pod nào được kết nối"; +/* Error message for PodCommsError.noPodsFound */ +"No pods found" = "No pods found"; + /* Error message shown when no response from pod was received */ "No response from pod" = "Không có tín hiệu phản hồi từ pod"; @@ -77,31 +209,51 @@ Pod state when running above fifty units */ "Normal" = "Bình thường"; +/* Description for MessageError notEnoughData */ +"Not enough data" = "Not enough data"; + /* Description for Occlusion detected pod fault */ "Occlusion detected" = "Occlusion detected"; -/* Acknowledge button label for RileyLink low battery alert - Alert acknowledgment OK button */ -"OK" = "OK"; - /* Generic title of the omnipod pump manager */ "Omnipod" = "Omnipod"; /* Pod status after pairing */ "Paired" = "Đã được ghép đôi"; +/* Pod status when pairing completed */ +"Pairing completed" = "Pairing completed"; + +/* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ +"Parsing Error: %1$@ in (%2$@)" = "Parsing Error: %1$@ in (%2$@)"; + +/* Recovery suggestion on unexpected pod change */ +"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; + /* Recovery suggestion when no response is received from pod */ "Please bring your pod closer to the RileyLink and try again" = "Đề nghị để pod gần với Rileylink và thử lại lần nữa"; +/* Alert content body for finishSetupReminder pod alert */ +"Please finish pairing your pod." = "Please finish pairing your pod."; + /* Recover suggestion shown when no pod is paired */ "Please pair a new pod" = "Đề nghị ghép đôi pod mới"; +/* Recovery suggestion when pairing signal strength is too high */ +"Please reposition the RileyLink further from the pod" = "Please reposition the RileyLink further from the pod"; + +/* Recovery suggestion when pairing signal strength is too low */ +"Please reposition the RileyLink relative to the pod" = "Please reposition the RileyLink relative to the pod"; + /* Error message shown when user cannot pair because pod is already paired */ "Pod already paired" = "Pod đã được ghép đôi"; /* Error message shown when prime is attempted, but pod is already primed */ "Pod already primed" = "Pod đã được mồi"; +/* Status highlight message for other alarm. */ +"Pod Error" = "Pod Error"; + /* Description for expiration advisory alarm */ "Pod expiration advisory alarm" = "Cảnh báo pod hết hạn"; @@ -111,6 +263,9 @@ /* Description for Pod expired pod fault */ "Pod expired" = "Pod đã hết hạn"; +/* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ +"Pod expires in %1$@." = "Pod expires in %1$@."; + /* Format string for pod fault code */ "Pod Fault: %1$@" = "Pod lỗi: %1$@"; @@ -123,40 +278,98 @@ /* Error message action could not be performed because pod is suspended */ "Pod is suspended" = "Pod bị tạm ngưng"; +/* Status highlight message for occlusion alarm. */ +"Pod Occlusion" = "Pod Occlusion"; + +/* Alert content title for finishSetupReminder pod alert */ +"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; + +/* Error message shown when pod sends ack instead of response */ +"Pod sent ack instead of response" = "Pod sent ack instead of response"; + /* Pod state when prime or cannula insertion has not completed in the time allotted */ "Pod setup window expired" = "Cửa sổ cấu hình pod hết hạn"; +/* Description for pod suspended reminder */ +"Pod suspended reminder" = "Pod suspended reminder"; + +/* Format string for poor pod signal strength */ +"Poor signal strength" = "Poor signal strength"; + /* Delivery status when pod is priming Pod status when priming */ "Priming" = "Đang mồi"; +/* Pod state when priming completed */ +"Priming completed" = "Priming completed"; + /* Pod state when ready for basal programming */ "Ready for basal programming" = "Sẵn sàng cho việc tính toán liều basal"; /* Pod state when ready for cannula insertion */ "Ready to insert cannula" = "Sẵn sàng cho việc gắn cannula"; +/* Pod pairing reminder initialized */ +"Reminder initialized" = "Reminder initialized"; + +/* Pump Event title for UnfinalizedDose with doseType of .resume */ +"Resume" = "Resume"; + +/* Recovery suggestion when pod is suspended */ +"Resume delivery" = "Resume delivery"; + +/* Alert content title for suspendEnded pod alert */ +"Resume Insulin" = "Resume Insulin"; + /* The format string describing a resume. (1: Time)(2: Scheduled certainty */ "Resume: %1$@ %2$@" = "Tái lập: %1$@ %2$@"; /* Delivery status when basal is running */ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; +/* Description for shutdown imminent */ +"Shutdown imminent" = "Shutdown imminent"; + /* Description for shutdown imminent alarm */ "Shutdown imminent alarm" = "Tắt báo động sắp xảy ra"; +/* Status highlight when communications with the pod haven't happened recently. */ +"Signal Loss" = "Signal Loss"; + +/* Format string for pod signal strength too high */ +"Signal strength too high" = "Signal strength too high"; + +/* Pump Event title for UnfinalizedDose with doseType of .suspend */ +"Suspend" = "Suspend"; + +/* Alert content body for suspendInProgress pod alert + Alert content title for suspendInProgress pod alert */ +"Suspend In Progress Reminder" = "Suspend In Progress Reminder"; + +/* Description for suspend time expired */ +"Suspend time expired" = "Suspend time expired"; + +/* Delivery status when insulin delivery is suspended */ +"Suspended" = "Đã tạm ngưng"; + /* The format string describing a suspend. (1: Time)(2: Scheduled certainty */ "Suspend: %1$@ %2$@" = "Tạm ngưng: %1$@ %2$@"; /* Delivery status when insulin delivery is suspended */ "Suspended" = "Đã tạm ngưng"; +/* Alert notification body for suspendEnded pod alert user notification */ +"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; + /* Pod tank fill completed */ "Tank fill completed" = "Hoàn tất nạp"; /* Pod power to motor activated */ "Tank power activated" = "Pod được kích hoạt"; +/* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ +"Temp Basal" = "Temp Basal"; + /* Error message shown when temp basal could not be set due to existing temp basal in progress */ "Temp basal in progress" = "Liều basal tạm thời đang tiến hành"; @@ -166,18 +379,45 @@ /* The format string describing a temp basal. (1: The rate)(2: Start time)(3: duration)(4: volume)(5: scheduled certainty */ "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ U/giờ %2$@ %3$@ %4$@ U %5$@"; +/* Alert content body for suspendEnded pod alert */ +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; + +/* Alert content body for timeOffsetChangeDetected pod alert */ +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; + +/* Alert content title for timeOffsetChangeDetected pod alert */ +"Time Change Detected" = "Time Change Detected"; + /* The format string for pod expiration notification body (1: time until expiration) */ "Time to replace your pod! Your pod will expire in %1$@" = "Thời gian thay pod của bạn! Pod của bạn sẽ hết hạn trong %1$@"; +/* Error message for PodCommsError.tooManyPodsFound */ +"Too many pods found" = "Too many pods found"; + +/* Recovery suggestion when ack received instead of response */ +"Try again" = "Try again"; + /* String describing a dose that was possibly scheduled */ "Uncertain" = "Không chắc chắn"; +/* Description for MessageError invalidSequence */ +"Unexpected message sequence number" = "Unexpected message sequence number"; + +/* Format string for unexpected pod change */ +"Unexpected pod change" = "Unexpected pod change"; + /* Error message shown when empty response from pod was received */ "Unexpected response from pod" = "Phản hồi bất thường từ pod"; /* The format string for Unknown pod fault (1: The fault code value) */ "Unknown pod fault %1$03d" = "Lỗi không xác định của pod %1$03d"; +/* Format string for description of MessageError unknownValue. (1: value) (2: Type) */ +"Unknown Value (%1$@) for type %2$@" = "Unknown Value (%1$@) for type %2$@"; + +/* Format string for description of MessageError validationFailed. (1: description of validation failure) */ +"Validation failed: %1$@" = "Validation failed: %1$@"; + /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ "Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liệu bolus hiện tại hoàn tất hoặc hủy liều bolus"; @@ -186,4 +426,3 @@ /* Description waiting for pairing reminder */ "Waiting for pairing reminder" = "Đang chờ đợi câu thông báo ghép đôi"; - diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings index 72cedeb38c..31660bf330 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings @@ -78,7 +78,7 @@ "Adjusting Pump Time..." = "Adjusting Pump Time..."; /* The title of the cell showing alarm status */ -"Alarms" = "Alarms"; +"Alarms" = "Riasztások"; /* Alert title for cancel pairing modal */ "Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; @@ -114,7 +114,7 @@ "Bolus Delivery" = "Bolus Delivery"; /* The title of the cancel action in an action sheet */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* Button title to cancel manual basal */ "Cancel Manual Basal" = "Cancel Manual Basal"; @@ -156,7 +156,7 @@ "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* The title of the configuration section in settings */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* Button title for confirm attachment option */ "Confirm" = "Confirm"; @@ -206,7 +206,7 @@ "Device Information" = "Device Information"; /* Header for devices section of RileyLinkSetupView */ -"Devices" = "Devices"; +"Devices" = "Eszközök"; /* Title text for button to disable bolus beeps */ "Disable Bolus Beeps" = "Disable Bolus Beeps"; @@ -216,7 +216,7 @@ "Discard Pod" = "Discard Pod"; /* No comment provided by engineer. */ -"Done" = "Done"; +"Done" = "Kész"; /* Title text for button to enable bolus beeps */ "Enable Bolus Beeps" = "Enable Bolus Beeps"; @@ -291,7 +291,7 @@ "hour" = "hour"; /* Unit for plural hours in pod life remaining */ -"hours" = "hours"; +"hours" = "óra"; /* Alert message body for confirm pod attachment */ "If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; @@ -373,7 +373,7 @@ "minute" = "minute"; /* Unit for plural minutes in pod life remaining */ -"minutes" = "minutes"; +"minutes" = "perc"; /* Alert title for missing temp basal configuration */ "Missing Config" = "Missing Config"; @@ -387,7 +387,7 @@ "Next" = "Next"; /* Button label for user to answer cannula was not properly inserted */ -"No" = "No"; +"No" = "Nem"; /* Text shown in insulin remaining space when no pod is paired */ "No\nDelivery" = "No\nDelivery"; @@ -588,7 +588,7 @@ "Saving..." = "Saving..."; /* The detail text of the basal row when pod is running scheduled basal */ -"Schedule" = "Schedule"; +"Schedule" = "Ütemezés"; /* Title of insulin delivery section */ "Scheduled Basal" = "Scheduled Basal"; @@ -704,7 +704,7 @@ /* Label for expiration reminder row Label for scheduled expiration reminder row Label for scheduled reminder value row */ -"Time" = "Time"; +"Time" = "Idő"; /* Title for pod sync time action sheet. title for time change detected notice */ @@ -720,7 +720,7 @@ "Total Delivery" = "Total Delivery"; /* Units for showing temp basal rate */ -"U/hr" = "U/hr"; +"U/hr" = "U/óra"; /* Instructions when pod cannot be deactivated */ "Unable to deactivate pod. Please continue and pair a new one." = "Unable to deactivate pod. Please continue and pair a new one."; @@ -742,13 +742,13 @@ "Unfinished deactivation" = "Unfinished deactivation"; /* The detail text for delivered insulin when no measurement is available */ -"Unknown" = "Unknown"; +"Unknown" = "Ismeretlen"; /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; /* Button label for user to answer cannula was properly inserted */ -"Yes" = "Yes"; +"Yes" = "Igen"; /* Button title for confirm deactivation option */ "Yes, Deactivate Pod" = "Yes, Deactivate Pod"; @@ -775,10 +775,10 @@ "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; - /* navigation title for Silnce Pod" */ -"Silence Pod" = "Silence Pod"; + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; /* title for pod details page */ "Pod Details" = "Pod Details"; @@ -791,7 +791,6 @@ /* button title when retrieving pump manager details */ "Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; - /* button title to refresh pump manager details */ "Refresh Pump Manager Details" = "Refresh Pump Manager Details"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index a78f4f7010..32fb5c3821 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -1,6 +1,15 @@ +/* No comment provided by engineer. */ +"—" = "—"; + /* Format string for last status date on pod details screen */ "%@ ago" = "%@ trước đó"; +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + +/* No comment provided by engineer. */ +"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now."; + /* Format string for delivered insulin. (1: The localized amount) Format string for insulin remaining in reservoir. (1: The localized amount) */ "%@ U" = "%@ U"; @@ -26,6 +35,12 @@ /* Format string for reservoir volume. (1: The localized volume) */ "%@U" = "%@U"; +/* Summary string for temporary basal rate configuration page */ +"%1$@ for %2$@" = "%1$@ for %2$@"; + +/* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ +"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display."; + /* Accessibility format string for (1: localized volume)(2: time) */ "%1$@ units remaining at %2$@" = "%1$@ units vẫn đang còn lúc %2$@"; @@ -35,24 +50,60 @@ /* The format string for displaying an offset from a time zone: (1: GMT)(2: -)(3: 4:00) */ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; +/* Format string for reservoir level above max measurable threshold. (1: measurable reservoir threshold) (2: units) */ +"%1$@+ %2$@" = "%1$@+ %2$@"; + +/* Format string for total delivery on pod details screen */ +"%g U" = "%g U"; + +/* Button text for 1 hour suspend duration */ +"1 hour" = "1 hour"; + +/* Button text for 1 hour 30 minute suspend duration */ +"1 hour 30 minutes" = "1 hour 30 minutes"; + +/* Button text for 2 hour suspend duration */ +"2 hours" = "2 hours"; + +/* Button text for 30 minute suspend duration */ +"30 minutes" = "30 minutes"; + /* The title of the cell showing the pod activated at time */ "Active Time" = "Thời gian Hoạt động"; /* Section header for activity section */ "Activity" = "Hoạt động"; +/* Text indicating ongoing pump time synchronization */ +"Adjusting Pump Time..." = "Adjusting Pump Time..."; + /* The title of the cell showing alarm status */ "Alarms" = "Cảnh báo"; +/* Alert title for cancel pairing modal */ +"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; + /* Confirmation message for shutting down a pod */ "Are you sure you want to shutdown this pod?" = "Bạn có chắc muốn tắt pod này?"; +/* No comment provided by engineer. */ +"Are you sure you want to skip Omnipod Onboarding?" = "Are you sure you want to skip Omnipod Onboarding?"; + /* Confirmation message for removing Omnipod PumpManager */ "Are you sure you want to stop using Omnipod?" = "Bạn có chắc muốn dừng sử dụng Omnipod?"; /* The title text for the address assigned to the pod */ "Assigned Address" = "Địa chỉ được chỉ định"; +/* Title for Attach Pod screen */ +"Attach Pod" = "Attach Pod"; + +/* Description string above progress indicator while attempting to re-establish communication from an unacknowledged command */ +"Attemping to re-establish communication" = "Attemping to re-establish communication"; + +/* Back button text on DeliveryUncertaintyRecoveryView */ +"Back" = "Back"; + /* The title of the cell showing pod basal status */ "Basal Delivery" = "Liều tiêm basal"; @@ -65,18 +116,66 @@ /* The title of the cancel action in an action sheet */ "Cancel" = "Hủy bỏ"; +/* Button title to cancel manual basal */ +"Cancel Manual Basal" = "Cancel Manual Basal"; + +/* Insert cannula action button accessibility label when cannula insertion succeeded */ +"Cannula inserted successfully. Continue." = "Cannula inserted successfully. Continue."; + +/* The action string on pod status page when pod expired */ +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; + +/* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; + /* The title of the command to change pump time zone */ "Change Time Zone" = "Thay đổi múi giờ"; /* Progress message for changing pod time. */ "Changing time…" = "Đang thay đổi giờ…"; +/* Title for check cannula screen */ +"Check Cannula" = "Check Cannula"; + +/* Label text for step three of attach pod instructions */ +"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; + +/* Insert cannula action button accessibility label checking insertion */ +"Checking Insertion" = "Checking Insertion"; + +/* Cannula insertion button text while checking insertion */ +"Checking..." = "Checking..."; + +/* Title for uncertainty recovered screen */ +"Comms Recovered" = "Comms Recovered"; + +/* Text for confidence reminders navigation link */ +"Confidence Reminders" = "Confidence Reminders"; + +/* Help text for BeepPreferenceSelectionView */ +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; + /* The title of the configuration section in settings */ "Configuration" = "Cấu hình"; +/* Button title for confirm attachment option */ +"Confirm" = "Confirm"; + +/* Alert title for confirm pod attachment */ +"Confirm Pod Attachment" = "Confirm Pod Attachment"; + /* The title of the continue action in an action sheet */ "Continue" = "Tiếp tục"; +/* Title for critical alerts description */ +"Critical Alerts" = "Critical Alerts"; + +/* Unit for singular day in pod life remaining */ +"day" = "day"; + +/* Unit for plural days in pod life remaining */ +"days" = "days"; + /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Hủy kích hoạt"; @@ -87,12 +186,22 @@ /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; +/* Deactivate pod action button accessibility label while deactivating */ +"Deactivating." = "Deactivating."; + +/* Action button description while deactivating */ +"Deactivating..." = "Deactivating..."; + /* Button title to delete Omnipod PumpManager */ "Delete Omnipod" = "Xóa Omnipod"; /* Title text for delivery limits */ "Delivery Limits" = "Giới hạn liều tiêm"; +/* Text for device details disclosure row + title for device details page */ +"Device Details" = "Device Details"; + /* The title of the device information section in settings */ "Device Information" = "Thông tin thiết bị"; @@ -102,6 +211,13 @@ /* Title text for button to disable bolus beeps */ "Disable Bolus Beeps" = "Vô hiệu tiếng Beep liều bolus"; +/* Pairing interface navigation bar button text for discard pod action + Text for discard pod button */ +"Discard Pod" = "Discard Pod"; + +/* No comment provided by engineer. */ +"Done" = "Hoàn thành"; + /* Title text for button to enable bolus beeps */ "Enable Bolus Beeps" = "Bật tiếng Beep liều bolus"; @@ -123,21 +239,63 @@ /* The title of the cell showing the pod expiration reminder date */ "Expiration Reminder" = "Nhắc nhở Hết hạn"; +/* Label text for expiration reminder default row */ +"Expiration Reminder Default" = "Expiration Reminder Default"; + /* The title of the cell showing the pod expiration after expiry */ "Expired" = "Đã hết hạn"; /* The title of the cell showing the pod expiration */ "Expires" = "Hết hạn"; +/* Alert title for failing to cancel manual basal error */ +"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; + +/* Alert title for resume error */ +"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; + +/* Alert title for time sync error */ +"Failed to Set Pump Time" = "Failed to Set Pump Time"; + +/* Alert title for suspend error */ +"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; + +/* Alert title for error when updating confidence reminder preference */ +"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; + +/* Alert title for error when updating expiration reminder */ +"Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; + +/* Alert title for error when updating low reservoir reminder */ +"Failed to Update Low Reservoir Reminder" = "Failed to Update Low Reservoir Reminder"; + /* Pod life HUD view label */ "Fault" = "Lỗi"; +/* Label text for step 1 of pair pod instructions */ +"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; + +/* Settings page link description when next lifecycle action is to finish deactivation */ +"Finish deactivation" = "Finish deactivation"; + /* The title of the command to finish pod setup */ "Finish pod setup" = "Hoàn tất thiết lập pod"; +/* Action button title to continue at Setup Complete */ +"Finish Setup" = "Finish Setup"; + /* Accessibility format string for (1: localized volume)(2: time) */ "Greater than %1$@ units remaining at %2$@" = "Nhiều hơn %1$@ units vẫn còn lúc %2$@"; +/* Unit for singular hour in pod life remaining */ +"hour" = "hour"; + +/* Unit for plural hours in pod life remaining */ +"hours" = "giờ"; + +/* Alert message body for confirm pod attachment */ +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; + /* Instructions when deactivating pod that has been paired, but not attached. */ "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Thiết lập pod không hoàn thành phải được hủy rước khi tiến hành ghép đôi pod mới. Đề nghị hủy và loại pod."; @@ -147,32 +305,148 @@ /* Button title to insert cannula during setup */ "Insert Cannula" = "Lắp Cannula"; +/* Label text indicating insertion finished. */ +"Inserted" = "Inserted"; + +/* Insert cannula action button accessibility label while pairing */ +"Inserting. Please wait." = "Inserting. Please wait."; + +/* Cannula insertion button text while inserting */ +"Inserting..." = "Inserting..."; + +/* Text shown in insulin delivery space when insulin suspended */ +"Insulin\nSuspended" = "Insulin\nSuspended"; + /* The title of the cell showing delivered insulin */ "Insulin Delivered" = "Insulin đã được tiêm"; /* Title of insulin delivery section */ "Insulin Delivery" = "Insulin Delivery"; +/* The action string on pod status page when pod faulted */ +"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; + +/* Message for suspend duration selection action sheet */ +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; + +/* Header for insulin remaining on pod settings screen */ +"Insulin Remaining" = "Insulin Remaining"; + +/* Text for confidence reminders navigation link + Title for insulin type selection screen */ +"Insulin Type" = "Insulin Type"; + /* The error message shown when Loop's basal schedule has an unsupported rate */ "Invalid entry" = "Lỗi nhập không hợp lệ"; +/* Question to confirm the cannula is inserted properly */ +"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; + +/* Label text for step 2 of pair pod instructions */ +"Keep the RileyLink about 6 inches from the pod during pairing." = "Keep the RileyLink about 6 inches from the pod during pairing."; + +/* description label for last status date pod details row */ +"Last Status" = "Last Status"; + +/* Description text on manual temp basal action sheet */ +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; + /* The title of the cell showing the pod lot id */ "Lot" = "Lot"; +/* description label for lot number pod details row */ +"Lot Number" = "LOT Nummer"; + +/* Label text for low reservoir value row + Navigation bar title for LowReservoirReminderSetupView + Title for LowReservoirReminderSetupView */ +"Low Reservoir" = "Low Reservoir"; + +/* Label for low reservoir reminder row + Title for low reservoir reminder edit page */ +"Low Reservoir Reminder" = "Low Reservoir Reminder"; + +/* The action string on pod status page when pod data is stale */ +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; + +/* Unit for singular minute in pod life remaining */ +"minute" = "minute"; + +/* Unit for plural minutes in pod life remaining */ +"minutes" = "phút"; + +/* Alert title for missing temp basal configuration */ +"Missing Config" = "Missing Config"; + +/* String shown on pod details for active time when conversion fails. + String shown on pod details for last status date when not available. + String shown on pod details for total delivery when not available. */ +"NA" = "NV"; + +/* Text of continue button on ExpirationReminderSetupView */ +"Next" = "Next"; + +/* Button label for user to answer cannula was not properly inserted */ +"No" = "Không"; + +/* Text shown in insulin remaining space when no pod is paired */ +"No\nDelivery" = "No\nDelivery"; + +/* Error message for reservoir view when reservoir empty */ +"No Insulin" = "No Insulin"; + +/* Label for pod life state when no pod paired + Text shown in insulin remaining space when no pod is paired */ +"No Pod" = "No Pod"; + +/* Value text for no expiration reminder */ +"No Reminder" = "No Reminder"; + +/* Continue pairing button title of in pairing cancel modal */ +"No, Continue With Pod" = "No, Continue With Pod"; + +/* Button text to cancel pump time sync */ +"No, Keep Pump As Is" = "No, Keep Pump As Is"; + /* The detail text for bolus delivery when no bolus is being delivered */ "None" = "None"; +/* navigation title for notification settings + Text for pod details disclosure row */ +"Notification Settings" = "Cài đặt thông báo"; + +/* No comment provided by engineer. */ +"Numbers" = "Numbers"; + +/* Title for omnipod reminders section */ +"Omnipod Reminders" = "Omnipod Reminders"; + /* Button title to pair with pod during setup */ "Pair" = "Ghép đôi"; /* The title of the command to pair new pod */ "Pair New Pod" = "Ghép đôi pod mới"; +/* Navigation bar title for PairPodView + Pod pairing action button text while ready to pair + Settings page link description when next lifecycle action is to pair new pod + Title for pod pairing screen */ +"Pair Pod" = "Pair Pod"; + +/* Pairing action button accessibility label while ready to pair */ +"Pair pod." = "Pair pod."; + /* Label text indicating pairing finished. */ "Paired" = "Đã được ghép đôi"; -/* The text of the loading label when pairing */ -"Pairing…" = "Đang ghép đôi…"; +/* Pairing action button accessibility label while pairing */ +"Pairing." = "Pairing."; + +/* Pod pairing action button text while pairing */ +"Pairing..." = "Pairing..."; + +/* No comment provided by engineer. */ +"Percent = %lf" = "Percent = %lf"; /* The title of the cell showing the pod pi version */ "PI Version" = "PI Version"; @@ -183,27 +457,98 @@ /* Progress message for play test beeps. */ "Play Test Beeps…" = "Kiểm tra tiếng Beep…"; +/* Alert message body for confirm pod attachment */ +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; + +/* Instructions for deactivate pod when pod not on body */ +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; + +/* Instructions for deactivate pod when pod is on body */ +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; + /* The title of the cell showing the pod pm version */ "PM Version" = "PM Version"; +/* description label for activated at time pod details row + Label for pod insertion row */ +"Pod Activated" = "Pod Activated"; + /* Label describing pod age view */ "Pod Age" = "Pod Age"; +/* Deactivate pod action button accessibility label when deactivation complete */ +"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; + +/* Error message for reservoir view during general pod fault */ +"Pod Error" = "Pod Error"; + /* Label for pod life state when within pod expiration window */ "Pod expired" = "Pod đã hết hạn"; +/* Error message for reservoir view when pod expired + Label for pod expiration row, past tense */ +"Pod Expired" = "Pod Expired"; + +/* Label for pod expiration row */ +"Pod Expires" = "Pod Expires"; + +/* Label for pod life state when time remaining */ +"Pod expires in" = "Pod expires in"; + +/* description label for pod fault details */ +"Pod Fault Details" = "Pod Fault Details"; + +/* Error message for reservoir view when pod occlusion checks failed */ +"Pod Occlusion" = "Pod Occlusion"; + +/* Pairing action button accessibility label when pairing succeeded */ +"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; + /* Title of the pod settings view controller */ "Pod Settings" = "Các thiết lập cho pod"; +/* Title for PodSetupView */ +"Pod Setup" = "Pod Setup"; + +/* Label text for step one of attach pod instructions */ +"Prepare site." = "Prepare site."; + +/* title for previous pod page */ +"Previous Pod" = "Previous Pod"; + +/* Text for previous pod information row */ +"Previous Pod Information" = "Previous Pod Information"; + /* The text of the loading label when pod is primed */ "Primed" = "Đã được mồi"; +/* Pairing action button accessibility label while priming */ +"Priming. Please wait." = "Priming. Please wait."; + +/* Pod pairing action button text while priming */ +"Priming..." = "Priming..."; + /* The text of the loading label when priming */ "Priming…" = "Đang mồi…"; +/* The title of the command to change pump time zone */ +"Pump Time" = "Pump Time"; + +/* Label text for basal rate summary */ +"Rate" = "Tỷ lệ"; + /* Label describing time remaining view */ "Remaining" = "Đang còn lại"; +/* Title for remove pod modal */ +"Remove Pod from Body" = "Remove Pod from Body"; + +/* Title for Omnipod PumpManager deletion action sheet. */ +"Remove Pump" = "Remove Pump"; + +/* Label text for step two of attach pod instructions */ +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; + /* Label indicating pod replacement necessary The title of the command to replace pod */ "Replace Pod" = "Thay thế Pod"; @@ -214,6 +559,12 @@ /* The title of the cell showing reservoir status */ "Reservoir" = "Reservoir"; +/* Text for suspend resume button when insulin delivery is suspended */ +"Resume Insulin Delivery" = "Resume Insulin Delivery"; + +/* Text for suspend resume button when insulin delivery is resuming */ +"Resuming insulin delivery..." = "Resuming insulin delivery..."; + /* Action button description for deactivate after failed attempt Cannula insertion button text while showing error Pod pairing action button text while showing error */ @@ -222,6 +573,9 @@ /* Button title for retrying pod deactivation */ "Retry Pod Deactivation" = "Hủy kích hoạt pod lại"; +/* bodyText for RileyLinkSetupView */ +"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink allows for communication with the pump over Bluetooth"; + /* Navigation title for RileyLinkSetupView */ "RileyLink Setup" = "Cài đặt RileyLink"; @@ -229,15 +583,43 @@ Title of button to sync basal profile when no pod paired */ "Save" = "Lưu"; +/* button title for saving low reservoir reminder while saving + button title for saving scheduled reminder while saving */ +"Saving..." = "Đang lưu..."; + /* The detail text of the basal row when pod is running scheduled basal */ "Schedule" = "Kế hoạch"; /* Title of insulin delivery section */ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; +/* Card title for scheduled reminder + Scheduled reminder card title on NotificationSettingsView + Title for scheduled expiration reminder edit page + Title of SetupCompleteView */ +"Scheduled Reminder" = "Scheduled Reminder"; + +/* Title text for insulin type confirmation page */ +"Select the type of insulin that you will be using in this pod." = "Select the type of insulin that you will be using in this pod."; + +/* description label for sequence number pod details row */ +"Sequence Number" = "Sequence Number"; + +/* Button text for setting manual temporary basal rate */ +"Set Temporary Basal" = "Set Temporary Basal"; + +/* Button title to set temporary basal rate */ +"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; + /* Title for setup complete screen */ "Setup Complete" = "Cấu hình hoàn thành"; +/* Error message for reservoir view during general pod fault */ +"Signal Loss" = "Signal Loss"; + +/* No comment provided by engineer. */ +"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; + /* The title of the status section in settings */ "Status" = "Tình trạng"; @@ -247,30 +629,176 @@ /* Title for suspend duration selection action sheet */ "Suspend Delivery" = "Tạm ngưng liều insulin"; +/* Text for suspend resume button when insulin delivery active */ +"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; + /* The detail text of the basal row when pod is suspended */ "Suspended" = "Đã tạm ngưng"; +/* Label for suspended at time */ +"Suspended At" = "Suspended At"; + +/* Text for suspend resume button when insulin delivery is suspending */ +"Suspending insulin delivery..." = "Suspending insulin delivery..."; + /* Title text for the button to delete Omnipod PumpManager */ "Switch from Omnipod Pumps" = "Chuyển đổ từ bơm Omnipod"; +/* Label for PumpManager deletion button */ +"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; + +/* The title of the command to change pump time zone */ +"Sync to Current Time" = "Sync to Current Time"; + /* Title of button to sync basal profile from pod */ "Sync With Pod" = "Sync với Pod"; +/* Label text for step one of insert cannula instructions */ +"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; + +/* Navigation Title for ManualTempBasalEntryView */ +"Temporary Basal" = "Temporary Basal"; + +/* Alert title for a failure to set temporary basal */ +"Temporary Basal Failed" = "Temporary Basal Failed"; + /* The title of the command to run the test command */ "Test Command" = "Thử nghiệm câu lệnh"; /* Progress message for testing commands. */ "Testing Commands…" = "Thử nghiệm câu lệnh…"; +/* Footer text for omnipod reminders section */ +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; + +/* Description text on ExpirationReminderSetupView */ +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; + +/* Description text on LowReservoirReminderSetupView */ +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; + +/* Footer text for low reservoir value row */ +"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; + +/* Description text for critical alerts */ +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; + +/* Message for pod sync time action sheet */ +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; + +/* description for time change detected notice */ +"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump."; + +/* Description of proper cannula insertion */ +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; + +/* Format string for recovery suggestion during deactivate pod. */ +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; + +/* Footer text for scheduled reminder area */ +"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; + +/* Alert format string for missing temp basal configuration. */ +"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate."; + +/* Label for expiration reminder row + Label for scheduled expiration reminder row + Label for scheduled reminder value row */ +"Time" = "Thời gian"; + +/* Title for pod sync time action sheet. + title for time change detected notice */ +"Time Change Detected" = "Time Change Detected"; + +/* No comment provided by engineer. */ +"Toggle sign" = "Toggle sign"; + /* The error message shown when Loop's basal schedule has more entries than the pod can support */ "Too many entries" = "Quá nhiều mục"; +/* description label for total delivery pod details row */ +"Total Delivery" = "Total Delivery"; + /* Units for showing temp basal rate */ "U/hr" = "U/giờ"; /* Instructions when pod cannot be deactivated */ "Unable to deactivate pod. Please continue and pair a new one." = "Không thể hủy kích hoạt pod. Đề nghị tiếp tục và ghép đôi pod mới."; +/* Title of delivery uncertainty recovery page */ +"Unable to Reach Pod" = "Unable to Reach Pod"; + + +/* Alert format string for a failure to set temporary basal. (1: error description) */ +"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; + +/* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; + +/* Label for pod life state when pod not fully activated */ +"Unfinished Activation" = "Unfinished Activation"; + +/* Label for pod life state when pod not fully deactivated */ +"Unfinished deactivation" = "Unfinished deactivation"; + /* The detail text for delivered insulin when no measurement is available */ "Unknown" = "Không nhận ra"; +/* Label text for step two of insert cannula instructions */ +"Wait until insertion is completed." = "Wait until insertion is completed."; + +/* Button label for user to answer cannula was properly inserted */ +"Yes" = "Có"; + +/* Button title for confirm deactivation option */ +"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; + +/* Button text to confirm pump time sync */ +"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; + +/* bodyText for PodSetupView */ +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; + +/* Format string for instructions for setup complete view. (1: app name) */ +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; + +/* Alert message body for confirm pod attachment */ +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; + +/* Title string for SilencePodPreference.enabled */ +"Silenced" = "Silenced"; + +/* Description for SilencePodPreference.disabled */ +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; + +/* Description for SilencePodPreference.enabled */ +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; + +/* Help text for Silence Pod view */ +/* navigation title for Silnce Pod" */ + +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. +Silence Pod" = "Silence Pod"; + +/* title for pod details page */ +"Pod Details" = "Pod Details"; + +/* Text for previous pod details row" */ +"Previous Pod Details" = "Previous Pod Details"; + +/* Text for pump manager details navigation link */ +"Pump Manager Details" = "Pump Manager Details"; + +/* button title when retrieving pump manager details */ +"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +/* button title to refresh pump manager details */ +"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; + +/* Alert title for error when updating silence pod preference */ +"Failed to update silence pod preference." = "Failed to update silence pod preference."; + +/* Section header for diagnostic section */ +"Diagnostics" = "Diagnostics"; + +/* Text for read pod status navigation link */ +"Read Pod Status" = "Read Pod Status"; diff --git a/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings index 56422d08ea..ca01e606ff 100644 --- a/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings +++ b/Dependencies/rileylink_ios/RileyLinkKitUI/hu.lproj/Localizable.strings @@ -29,7 +29,7 @@ "Connection Monitoring" = "Connection Monitoring"; /* The title of the cell showing BLE connection state */ -"Connection State" = "Connection State"; +"Connection State" = "Kapcsolat állapota"; /* The title of the cell for connection vibration */ "Connection Vibration" = "Connection Vibration"; @@ -38,7 +38,7 @@ "Device" = "Device"; /* The title of the devices table section in RileyLink settings */ -"Devices" = "Devices"; +"Devices" = "Eszközök"; /* The disconnected state */ "Disconnected" = "Disconnected"; @@ -53,7 +53,7 @@ "Firmware" = "Firmware"; /* The title of the cell showing current rileylink frequency */ -"Frequency" = "Frequency" ; +"Frequency" = "Frequency"; /* The title of the command to fetch RileyLink statistics */ "Get RileyLink Statistics" = "Get RileyLink Statistics"; @@ -71,7 +71,7 @@ "Low Battery Alert" = "Low Battery Alert"; /* The title of the cell showing device name */ -"Name" = "Name"; +"Name" = "Megnevezés"; /* Detail text when battery alert disabled. Text indicating LED Mode is off */ diff --git a/Dependencies/rileylink_ios/RileyLinkKitUI/vi.lproj/Localizable.strings b/Dependencies/rileylink_ios/RileyLinkKitUI/vi.lproj/Localizable.strings index 6b23c8795c..cae429cca3 100644 --- a/Dependencies/rileylink_ios/RileyLinkKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/rileylink_ios/RileyLinkKitUI/vi.lproj/Localizable.strings @@ -1,8 +1,20 @@ +/* Unit format string for an RSSI value in decibles */ +"%@ dB" = "%@ dB"; + /* Unit format string for an value in percent */ "%@%%" = "%@%%"; +/* The title of the section for alerts */ +"Alert" = "Cảnh báo"; + +/* Text indicating LED Mode is auto */ +"Auto" = "Tự động"; + +/* The title of the cell showing battery level */ +"Battery level" = "Mức pin"; + /* The title of the section describing commands */ -"Commands" = "Commands"; +"Commands" = "Các câu lệnh"; /* The connected state */ "Connected" = "Đã kết nối"; @@ -10,9 +22,18 @@ /* The in-progress connecting state */ "Connecting" = "Đang kết nối"; +/* The title of the cell for connection LED */ +"Connection LED" = "Đèn báo kết nối"; + +/* The title of the section for connection monitoring */ +"Connection Monitoring" = "Giám sát kết nối"; + /* The title of the cell showing BLE connection state */ "Connection State" = "Tình trạng kết nối"; +/* The title of the cell for connection vibration */ +"Connection Vibration" = "Báo rung khi kết nối"; + /* The title of the section describing the device */ "Device" = "Thiết bị"; @@ -29,19 +50,35 @@ "Find Device" = "Tìm kiếm thiết bị"; /* The title of the cell showing firmware version */ -"Firmware" = "Firmware"; +"Firmware" = "Chương trình cơ sở"; /* The title of the cell showing current rileylink frequency */ "Frequency" = "Tần số"; +/* The title of the command to fetch RileyLink statistics */ +"Get RileyLink Statistics" = "Các thống kê của RileyLink"; + /* Progress message for getting statistics. */ "Get Statistics…" = "Lấy các thống kê…"; +/* The title of the cell showing Lighten Red LED */ +"Lighten Red LED" = "Sáng đèn Đỏ"; + +/* The title of the cell showing Lighten Yellow LED */ +"Lighten Yellow LED" = "Sáng đèn Vàng"; + +/* The title of the cell showing battery level */ +"Low Battery Alert" = "Cảnh báo pin yếu"; + /* The title of the cell showing device name */ "Name" = "Tên"; +/* Detail text when battery alert disabled. + Text indicating LED Mode is off */ +"Off" = "Tắt"; + /* Text indicating LED Mode is on */ -"On" = "On"; +"On" = "Bật"; /* RileyLink setup description */ "RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink cho phép giao tiếp với bơm thông qua chuẩn kết nối bluetooth năng lượng thấp."; @@ -49,6 +86,21 @@ /* The title of the cell showing BLE signal strength (RSSI) */ "Signal Strength" = "Cường độ tín hiệu"; +/* The title of the section for orangelink commands + The title of the section for rileylink commands */ +"Test Commands" = "Thử nghiệm câu lệnh"; + +/* The title of the cell showing Test Vibration */ +"Test Vibration" = "Thử nghiệm độ rung"; + +/* The title of the command to update diagnostic LEDs */ +"Toggle Diagnostic LEDs" = "Cho phép chuẩn đoán LEDs"; + +/* Progress message for changing diagnostic LED mode */ +"Updating diagnostic LEDs mode" = "Cập nhật chế độ đèn LED chẩn đoán"; + /* The title of the cell showing uptime */ "Uptime" = "Thời gian hoạt động"; +/* The title of the cell showing ORL */ +"Voltage" = "Điện áp"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index 223233f580..afbdce2ac6 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -4,185 +4,185 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; +"Add insulin without actually bolusing" = "Inzulin hozzáadása tényleges adagolás nélkül"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Add %@ without bolusing"; +"Add %@ without bolusing" = "%@ hozzáadása, nolus nélkül"; -"Bolus" = "Bolus"; +"Bolus" = "Bólus"; -"Close" = "Close"; +"Close" = "Bezár"; /* Continue after added carbs without bolus */ -"Continue without bolus" = "Continue without bolus"; +"Continue without bolus" = "Folytatás bólus nélkül"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount több mint a Max Bólus beállítás! \nBiztos, hogy hozzá szeretnéd adni "; /* Header */ -"Enact Bolus" = "Enact Bolus"; +"Enact Bolus" = "Bólus beadása"; /* Button */ -"Enact bolus" = "Enact bolus"; +"Enact bolus" = "Bólus beadása"; /* */ -"Insulin recommended" = "Insulin recommended"; +"Insulin recommended" = "Ajánlott inzulin"; /* */ -"Insulin required" = "Insulin required"; +"Insulin required" = "Szükséges inzulin"; /* Bolus screen */ -"Recommendation" = "Recommendation"; +"Recommendation" = "Ajánlat"; /* Button */ -"Clear" = "Clear"; +"Clear" = "Töröl"; /* Button */ -"Done" = "Done"; +"Done" = "Kész"; /* */ -"Wait please" = "Wait please"; +"Wait please" = "Kérlek várj"; /* */ -"Agree and continue" = "Agree and Continue"; +"Agree and continue" = "Elfogadás és folytatás"; /* Bolus progress view */ "of" = "of"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Enacted at"; +"Enacted at" = "Beadva"; /* Headline in suggested pop up (at: at what time) */ -"Suggested at" = "Suggested at"; +"Suggested at" = "Ajánlva"; /* Headline in enacted pop up (at: at what time) */ - "Error at" = "Error at"; +"Error at" = "Hiba"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Étel összegzése"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Étel javítása"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Étel hozzáadás"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bólus összegzése"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Kalkuláció"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Zsíros étel"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Teljes bólus"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Tört-rész"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Zsíros étel faktor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Eredmény"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "A beadott értek limitálva lett a max Bólus beállítással, ami %d%@"; /* Bolus View Continue Button */ -"Continue" = "Continue"; +"Continue" = "Tovább"; /* Home title */ -"Home" = "Home"; +"Home" = "Kezdőlap"; /* Looping in progress */ -"looping" = "looping"; +"looping" = "loop-olás"; /* min ago since last loop */ -"min ago" = "min ago"; +"min ago" = "perc. ezelőtt"; /* Status Title */ -"No suggestion" = "No suggestion"; +"No suggestion" = "Nincs javaslat"; /* Replace pod text in Header */ -"Replace pod" = "Replace pod"; +"Replace pod" = "Pod cseréje"; /* Add carbs screen */ -"Add Carbs" = "Add Carbs"; +"Add Carbs" = "Szénhidrát hozzáadása"; /* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ -"Add Carbs " = "Add Carbs "; +"Add Carbs " = "Szénhidrát hozzáadása "; /* */ -"Amount Carbs" = "Amount Carbs"; +"Amount Carbs" = "Szénhidrát mennyiség"; /* Grams unit */ -"grams" = "grams"; +"grams" = "gramm"; /* */ -"Carbs required" = "Carbs required"; +"Carbs required" = "Szénhidrát szükséges"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Elmentett étel"; /* */ -"Are you sure?" = "Are you sure?"; +"Are you sure?" = "Biztos vagy benne?"; /* Bottom target temp */ -"Bottom target" = "Bottom target"; +"Bottom target" = "Alsó cél"; /* Cancel preset name */ -"Cancel" = "Cancel"; +"Cancel" = "Mégse"; /* */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Átmeneti cél kikapcsolása"; /* Custom temp target */ -"Custom" = "Custom"; +"Custom" = "Egyéni"; /* */ -"Date" = "Date"; +"Date" = "Dátum"; /* */ -"Delete" = "Delete"; +"Delete" = "Törlés"; /* Delete preset temp target */ -"Delete preset \"%@\"" = "Delete preset \"%@\""; +"Delete preset \"%@\"" = "Törölni az előre definiált \"%@\""; /* Duration of target temp or temp basal */ "Duration" = "Duration"; /* */ -"Enact Temp Target" = "Enact Temp Target"; +"Enact Temp Target" = "Átmeneti cél bekapcsolása"; /* */ -"Target" = "Target"; +"Target" = "Cél"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Bázis inzulin és érzékenység aránya"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "Az alacsonyabb \"Fél bázis cél\" beállítás csökkenti a bázis értéket és korábban emeli az ISF-et, alacsonyabb célcukorszint mellett."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Az Ön beállítása: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Az Autosens.max korlátozza a maximális végpontot"; /* */ -"Enter preset name" = "Enter preset name"; +"Enter preset name" = "Előbeállítás nevének megadása"; /* Preset name */ -"Name" = "Name"; +"Name" = "Megnevezés"; /* minutes of target temp */ -"minutes" = "minutes"; +"minutes" = "perc"; /* */ -"Presets" = "Presets"; +"Presets" = "Előbeállítások"; /* Save preset name */ "Save" = "Save"; @@ -191,16 +191,16 @@ "Save as Preset" = "Save as Preset"; /* Delete Meal Preset */ -"Delete Preset" = "Delete Preset"; +"Delete Preset" = "Előbeállítás törlése"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Delete preset '%@'?"; +"Delete preset '%@'?" = "Törli a(z) '%@' előbeállítást?"; /* Button */ -"No" = "No"; +"No" = "Nem"; /* Button */ -"Yes" = "Yes"; +"Yes" = "Igen"; /* + Button */ "[ +1 ]" = "[ +1 ]"; @@ -209,43 +209,43 @@ "[ -1 ]" = "[ -1 ]"; /* Upper temp target limit */ -"Top target" = "Top target"; +"Top target" = "Legfelső célpont"; /* Temp target set for ... minutes */ -"for" = "for"; +"for" = "ehhez"; /* Temp target set for ... minutes */ -"min" = "min"; +"min" = "perc"; /* */ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Basal profile"; +"Basal profile" = "Bázis profil"; /* */ -"Carb ratio" = "Carb ratio"; +"Carb ratio" = "Szénhidrát arány"; /* */ -"Delete autotune data" = "Delete autotune data"; +"Delete autotune data" = "Autotune adatok törlése"; /* */ -"Run now" = "Run now"; +"Run now" = "Futtatás"; /* */ -"Last run" = "Last run"; +"Last run" = "Utolsó futtatás"; /* */ -"Sensitivity" = "Sensitivity"; +"Sensitivity" = "Érzékenység"; /* */ -"Use Autotune" = "Use Autotune"; +"Use Autotune" = "Autotune használata"; /* Add profile basal */ -"Add" = "Add"; +"Add" = "Hozzáad"; /* */ -"Basal Profile" = "Basal Profile"; +"Basal Profile" = "Bázis Profil"; /* Rate basal profile */ "Rate" = "Rate"; @@ -257,185 +257,185 @@ "Saving..." = "Saving..."; /* */ -"Schedule" = "Schedule"; +"Schedule" = "Ütemezés"; /* */ -"starts at" = "starts at"; +"starts at" = "kezdődik"; /* Time basal profile */ -"Time" = "Time"; +"Time" = "Idő"; /* */ -"Calculated Ratio" = "Calculated Ratio"; +"Calculated Ratio" = "Kiszámított arány"; /* Carb Ratios header */ -"Carb Ratios" = "Carb Ratios"; +"Carb Ratios" = "Szénhidrát arány"; /* */ -"Ratio" = "Ratio"; +"Ratio" = "Arány"; /* */ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Kiszámított érzékenység"; /* */ -"Insulin Sensitivities" = "Insulin Sensitivities"; +"Insulin Sensitivities" = "Inzulin érzékenység"; /* */ -"Sensitivity Ratio" = "Sensitivity Ratio"; +"Sensitivity Ratio" = "Érzékenységi arány"; /* */ -"Dismiss" = "Dismiss"; +"Dismiss" = "Mégsem"; /* */ -"Important message" = "Important message"; +"Important message" = "Fontos üzenet"; /* */ -"Amount" = "Amount"; +"Amount" = "Mennyiség"; /* */ -"Cancel Temp Basal" = "Cancel Temp Basal"; +"Cancel Temp Basal" = "Átmeneti Bázis Kikapcsolása"; /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Beadni"; /* */ -"Manual Temp Basal" = "Manual Temp Basal"; +"Manual Temp Basal" = "Átmeneti Kézi Bázis"; /* Allow uploads to different services */ -"Allow uploads" = "Allow uploads"; +"Allow uploads" = "Feltöltés engedélyezése"; /* API secret in NS */ -"API secret" = "API secret"; +"API secret" = "Titkos API-kód"; /* Connect to NS */ -"Connect" = "Connect"; +"Connect" = "Csatlakozás"; /* Connected to NS */ -"Connected!" = "Connected!"; +"Connected!" = "Csatlakozva!"; /* Connecting to NS */ -"Connecting..." = "Connecting..."; +"Connecting..." = "Csatlakozás..."; /* */ -"Invalid URL" = "Invalid URL"; +"Invalid URL" = "Érvénytelen URL"; /* */ -"Local glucose source" = "Local glucose source"; +"Local glucose source" = "Lokális glükózforrás"; /* Header */ -"Nightscout Config" = "Nightscout Config"; +"Nightscout Config" = "Nightscout Beállítás"; /* */ -"Port" = "Port"; +"Port" = "Portszám"; /* */ "URL" = "URL"; /**/ -"Use local glucose server" = "Use local glucose server"; +"Use local glucose server" = "Lokális glukóz szerver használata"; /* Enable Statistics */ "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; /* */ -"Edit settings json" = "Edit settings json"; +"Edit settings json" = "Json beállítások javítása"; /* */ -"Glucose units" = "Glucose units"; +"Glucose units" = "Vércukor mértékegysége"; /* */ -"Preferences" = "Preferences"; +"Preferences" = "Személyes beállítások"; /* Recommended Insulin Fraction in preferences */ -"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; +"Recommended Insulin Fraction" = "Ajánlott inzulin részegység"; /* Do you want to show bolus screen after added carbs? */ -"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; +"Skip Bolus screen after carbs" = "Bólus képernyő kihagyása szénhidrát után"; /* Allow remote control from NS */ -"Remote control" = "Remote control"; +"Remote control" = "Távirányítás"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nMost kérlek alaposan nézd át a beállításokat:\n\n* Bázis Ceállítások\n * Szénhidrát Arány\n * Cukorszint Célpont\n * Inzulin Érzékenység\n * DIA\n\n iAPS beállítások > Konfiguráció.\n\nHelytelen vagy rossz beállításoknak halálos következményei lehetnek."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Ez átállítja valamely, vagy az összes pumpa beállítását. Biztos vagy benne, hogy szeretnéd importálni a beállításokat a Nightscout-ból?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nÉrvénytelen Nightscout Bázis Beállítások. \n\nImport megszakítva. Kérlek ellenőrizd a Nightscout bázis profil beállításait!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nA beállítások importálva lettek, de nem lehetett őket elmenteni a pumpára (Nincs pumpa). Ellenőrizd a bázis beállításokat es nyomj a ´Pumpára mentés´ gombra hogy sinkronizáld az új bázis beállításokat"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Importálási hiba"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Igen, Importálni"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Import beállítások Nightscout-ról"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Beállítások importálása?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Importálás Nightscout-ról"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Beállítások importálva"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nEltérő cukor egységek a Nightscout és a pumpa beállításai között. A beállítások importálása megszüntetve."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Nem találom az alapértelmezett Nightscout profilt."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Cukorszint teszt"; /* Add Medtronic pump */ -"Add Medtronic" = "Add Medtronic"; +"Add Medtronic" = "Medtronic hozzáadása"; /* Add Omnipod pump */ -"Add Omnipod" = "Add Omnipod"; +"Add Omnipod" = "Omnipod hozzáadása"; /* Add Simulator pump */ -"Add Simulator" = "Add Simulator"; +"Add Simulator" = "Szimulátor hozzáadása"; /* Insulin model */ -"Model" = "Model"; +"Model" = "Típus"; /* */ -"Pump config" = "Pump config"; +"Pump config" = "Pumpa beállítások"; /* */ -"Delivery limits" = "Delivery limits"; +"Delivery limits" = "Adagolási határértékek"; /* */ -"Duration of Insulin Action" = "Duration of Insulin Action"; +"Duration of Insulin Action" = "Inzulin hatásának hossza"; /* hours of duration of insulin activity */ -"hours" = "hours"; +"hours" = "óra"; /* Max setting */ -"Max Basal" = "Max Basal"; +"Max Basal" = "Maximum bázis"; /* Max setting */ -"Max Bolus" = "Max Bolus"; +"Max Bolus" = "Maximum bólus"; /* Max setting */ -"Max Carbs" = "Max Carbs"; +"Max Carbs" = "Maximum szénhidrát"; /* */ -"Pump Settings" = "Pump Settings"; +"Pump Settings" = "Pumpa beállítások"; /* Insulin unit per hour */ -"U/hr" = "U/hr"; +"U/hr" = "U/óra"; /* Unit in number of units delivered (keep the space character!) */ " U" = " U"; @@ -447,10 +447,10 @@ Enact a temp Basal or a temp target */ "U" = "U"; /* Unit per hour with space */ -" U/hr" = " U/hr"; +" U/hr" = " U/óra"; /* Number of units per hour*/ -"%@ U/hr" = "%@ U/hr"; +"%@ U/hr" = "%@ U/óra"; /* Number of units insulin delivered */ "%@ U" = "%@ U"; @@ -465,181 +465,181 @@ Enact a temp Basal or a temp target */ "g" = "g"; /* when 0 U/hr */ -"0 U/hr" = "0 U/hr"; +"0 U/hr" = "0 U/óra"; /* abbreviation for days */ -"d" = "d"; +"d" = "n"; /* abbreviation for hours */ -"h" = "h"; +"h" = "ó"; /* abbreviation for minutes */ -"m" = "m"; +"m" = "p"; /* */ -"Closed loop" = "Closed loop"; +"Closed loop" = "Zárt loop"; /* */ -"Configuration" = "Configuration"; +"Configuration" = "Beállítások"; /* */ -"Devices" = "Devices"; +"Devices" = "Eszközök"; /* */ -"Pump" = "Pump"; +"Pump" = "Pumpa"; /* */ -"Watch" = "Watch"; +"Watch" = "Óra"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Óra Beállítások"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Megjelenítés az órán"; /* */ -"Garmin Watch" = "Garmin Watch"; +"Garmin Watch" = "Garmin Óra"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Eszköz hozzáadása"; /* */ -"Glucose Target" = "Glucose Target"; +"Glucose Target" = "Glukóz cél"; /* */ -"Heart Rate" = "Heart Rate"; +"Heart Rate" = "Szívritmus"; /* */ -"Steps" = "Steps"; +"Steps" = "Lépések"; /* */ "ISF" = "ISF"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "Az iAPS használatához telepíteni kell a Garmin Connect alkalmazást.\n A letöltéshez látogasson el az App Store áruházba"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin nem elérhető"; /* */ -"Services" = "Services"; +"Services" = "Szolgáltatások"; /* */ -"Settings" = "Settings"; +"Settings" = "Beállítások"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Ajánlott Bolus százalékos aránya"; /* 2 log files to share */ -"Share logs" = "Share logs"; +"Share logs" = "Napló (log) megosztása"; /* Upper target */ -"High target" = "High target"; +"High target" = "Magas célpont"; /* Lower target */ -"Low target" = "Low target"; +"Low target" = "Alacsony célpont"; /* When bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Beadás"; /* */ -"Pump suspended" = "Pump suspended"; +"Pump suspended" = "Pumpa felfüggesztve"; /* */ "Middleware" = "Middleware"; /* Header */ -"History" = "History"; +"History" = "Elözmény"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Feltöltés"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Feltöltés engedélyezése"; /* Type of CGM or glucose source */ -"Type" = "Type"; +"Type" = "Típus"; /* CGM */ "CGM" = "CGM"; /* CGM Transmitter ID */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "Jeladó ID"; /* Other CGM setting */ -"Other" = "Other"; +"Other" = "Egyéb"; /* Whatch app alert */ -"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; +"Set temp targets presets on iPhone first" = "Először állítsa be az iPhone-on az előre beállított átmeneti célokat"; /* Updating Watch app */ -"Updating..." = "Updating..."; +"Updating..." = "Frissítés..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp Targets"; +"Temp Targets" = "Átmeneti célértékek"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Szénhidrát törlése?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Inzulin törlése?"; /* Treatments list */ -"Treatments" = "Treatments"; +"Treatments" = "Kezelések"; /* " min" in Treatments list */ -" min" = " min"; +" min" = " perc"; /* */ -"Unable to change anything" = "Unable to change anything"; +"Unable to change anything" = "Nem tudok semmit változtatni"; /* Calendar and Libre transmitter settings --------------- */ /* */ -"Configure Libre Transmitter" = "Configure Libre Transmitter"; +"Configure Libre Transmitter" = "Libre Jeladó beállítása"; /* */ -"Calibrations" = "Calibrations"; +"Calibrations" = "Kalibráció"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Események létrehozása a Naptárban"; /* */ -"Calendar" = "Calendar"; +"Calendar" = "Naptár"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Automatikus"; /* External insulin treatments */ -"External" = "External"; +"External" = "Külső"; /* */ -"Other" = "Other"; +"Other" = "Egyéb"; /* */ -"Libre Transmitter" = "Libre Transmitter"; +"Libre Transmitter" = "Libre jeladó"; /* */ -"Libre Transmitters" = "Libre Transmitters"; +"Libre Transmitters" = "Libre jeladók"; /* */ -"Bluetooth Transmitters" = "Bluetooth Transmitters"; +"Bluetooth Transmitters" = "Bluetooth jeladók"; /* */ -"Modes" = "Modes"; +"Modes" = "Üzemmód"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; /* */ -"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; +"Select the third party transmitter you want to connect to" = "Válassza ki a harmadik féltől származó adókészüléket, amelyhez csatlakozni kíván"; /* State was restored */ -"State was restored" = "State was restored"; +"State was restored" = "Állapot helyreállítva"; /* The short unit display string for millimoles of glucose per liter */ "mmol/L" = "mmol/L"; @@ -648,187 +648,187 @@ Enact a temp Basal or a temp target */ "mg/dL" = "mg/dL"; /* */ -"Add calibration" = "Add calibration"; +"Add calibration" = "Kalibrálás hozzáadása"; /* When adding capillary glucose meater reading */ -"Meter glucose" = "Meter glucose"; +"Meter glucose" = "Cukor mérő"; /* */ "Info" = "Info"; /*v*/ -"Slope" = "Slope"; +"Slope" = "Lejtő"; /* */ -"Intercept" = "Intercept"; +"Intercept" = "Elfogni"; /* */ -"Chart" = "Chart"; +"Chart" = "Grafikon"; /* */ -"Remove" = "Remove"; +"Remove" = "Eltávolítás"; /* */ -"Remove Last" = "Remove Last"; +"Remove Last" = "Utolsó eltávolítása"; /* */ -"Remove All" = "Remove All"; +"Remove All" = "Összes eltávolítása"; /* */ -"About the Process"= "About the Process"; +"About the Process" = "Erről a folyamatról"; /* */ -"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; +"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Kérjük, győződjön meg róla, hogy a Libre 2 érzékelője már aktiválva van és befejezte a bemelegedést. Ha más alkalmazások is csatlakoznak az szenzorhoz bluetooth-on keresztül, akkor ezeket le kell kapcsolni vagy el kell távolítani. \n\n Csak egy alkalmazás kommunikálhat az szenzorral bluetooth-on keresztül. Ezután nyomja meg az alábbi \"párolás és csatlakozás\" gombot a folyamat elindításához. Kérjük, vegye figyelembe, hogy a bluetooth-kapcsolat néhány percig is eltarthat, mire működésbe lép."; /* */ -"Pairinginfo" = "Pairinginfo"; +"Pairinginfo" = "Párolás információ"; /* */ -"PatchInfo" = "PatchInfo"; +"PatchInfo" = "Patch információ"; /* */ -"Calibrationinfo" = "Calibrationinfo"; +"Calibrationinfo" = "Kalibrácóinfó"; /* */ -"Unknown" = "Unknown"; +"Unknown" = "Ismeretlen"; /* */ -"Not paired yet" = "Not paired yet"; +"Not paired yet" = "Nincs még párosítva"; /* */ -"Pair Sensor & connect" = "Pair Sensor & connect"; +"Pair Sensor & connect" = "Párosítsd a szenzort & csatlakozz"; /* */ -"Phone NFC required!" = "Phone NFC required!"; +"Phone NFC required!" = "A telefon NFC-je szükséges!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "A telefon vagy az alkalmazás nem engedélyezi az NFC kommunikációt, ami a libre2 szenzorral való párosításhoz szükséges"; /* Bluetooth Power Off */ -"Bluetooth Power Off" = "Bluetooth Power Off"; +"Bluetooth Power Off" = "Bluetooth kikapcsolása"; /* Please turn on Bluetooth */ -"Please turn on Bluetooth" = "Please turn on Bluetooth"; +"Please turn on Bluetooth" = "Kérem, kapcsolja be a bluetooth-t"; /* No Libre Transmitter Selected */ -"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; +"No Libre Transmitter Selected" = "Nincs Libre Adokészülék kiválasztva"; /* Delete Transmitter and start anew. */ -"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; +"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Törölje a CGMManager-t és kezdje újra. A libreoopweb hitelesítő adatai megmaradnak"; /* Invalid libre checksum */ -"Invalid libre checksum" = "Invalid libre checksum"; +"Invalid libre checksum" = "Hibás libre ellenőrzés"; /* Libre sensor was incorrectly read, CRCs were not valid */ -"Libre sensor was incorrectly read, CRCs were not valid"= "Libre sensor was incorrectly read, CRCs were not valid"; +"Libre sensor was incorrectly read, CRCs were not valid" = "A Libre szenzort helytelenül olvastam, a CRC-k nem voltak érvényesek"; /* Glucose */ -"Glucose" = "Glucose"; +"Glucose" = "Glükóz"; /* LOWALERT! */ -"LOWALERT!" = "LOWALERT!"; +"LOWALERT!" = "ALACSONY FIGYELMEZTETÉS!"; /* HIGHALERT! */ -"HIGHALERT!" = "HIGHALERT!"; +"HIGHALERT!" = "MAGAS FIGYELMEZTETÉS!"; /* (Snoozed)*/ -"(Snoozed)" = "(Snoozed)"; +"(Snoozed)" = "(Késleltetve)"; /* Glucose: %@ */ -"Glucose: %@" = "Glucose: %@"; +"Glucose: %@" = "Glukóz: %@"; /* Transmitter: %@%% */ -"Transmitter: %@%%" = "Transmitter: %@%%"; +"Transmitter: %@%%" = "Jeladó: %@%%"; /* No Sensor Detected */ -"No Sensor Detected" = "No Sensor Detected"; +"No Sensor Detected" = "Nem érzékelek szenzort"; /* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ -"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "Ez egy időszakos probléma lehet, de kérjük, ellenőrizze, hogy a jeladó szorosan rögzítve van-e az érzékelő felett"; /* New Sensor Detected */ -"New Sensor Detected" = "New Sensor Detected"; +"New Sensor Detected" = "Új szenzort érzékelek"; /* Please wait up to 30 minutes before glucose readings are available! */ -"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; +"Please wait up to 30 minutes before glucose readings are available!" = "Kérjük, várjon legfeljebb 30 percet, mielőtt a vércukorszintmérés elérhetővé válik!"; /* Invalid Glucose sample detected, try again later */ -"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; +"Invalid Glucose sample detected, try again later" = "Érvénytelen glükózminta észlelve, próbálja meg később újra"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Az érzékelő átmenetileg megállt, leesett, vagy túl hideg vagy túl meleg van"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Invalid Sensor Detected"; +"Invalid Sensor Detected" = "Érvénytelen szenzort észlelek"; /* Detected sensor seems not to be a libre 1 sensor! */ -"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; +"Detected sensor seems not to be a libre 1 sensor!" = "Úgy tűnik, hogy az érzékelő nem libre 1 érzékelő!"; /* Detected sensor is invalid: %@ */ -"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; +"Detected sensor is invalid: %@" = "Az érzékelő érvénytelen: %@"; /* Low Battery */ -"Low battery" = "Low battery"; +"Low battery" = "Alacsony akkufeszültség"; /* */ -"Invalid sensor" = "Invalid sensor"; +"Invalid sensor" = "Érvénytelen szenzor"; /* */ -"Sensor change" = "Sensor change"; +"Sensor change" = "Szenzorcsere"; /* */ -"Sensor expires soon" = "Sensor expires soon"; +"Sensor expires soon" = "Szenzor hamarosan lejár"; /* Battery is running low %@, consider charging your %@ device as soon as possible */ -"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Az akkumulátor lemerülőben van %@, fontolja meg a %@ készülék mielőbbi feltöltését"; /* Extracting calibrationdata from sensor */ -"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; +"Extracting calibrationdata from sensor" = "Kalibrációs adatok kinyerése az szenzorból"; /* Sensor Ending Soon */ -"Sensor Ending Soon" = "Sensor Ending Soon"; +"Sensor Ending Soon" = "Szenzor hamarosan lejár"; /* Current Sensor is Ending soon! Sensor Life left in %@ */ -"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; +"Current Sensor is Ending soon! Sensor Life left in %@" = "A jelenlegi érzékelő hamarosan lejár! Az érzékelő élettartama %@"; /* */ "Libre Bluetooth" = "Libre Bluetooth"; /* */ -"Snooze Alerts" = "Snooze Alerts"; +"Snooze Alerts" = "Risztások késleltetése"; /* */ -"Last measurement" = "Last measurement"; +"Last measurement" = "Utolsó mérés"; /* */ -"Sensor Footer checksum" = "Sensor Footer checksum"; +"Sensor Footer checksum" = "Szenzor lábléc összeg"; /* */ -"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; +"Last Blood Sugar prediction" = "Utolsó vércukor-előrejelzés"; /* */ -"CurrentBG" = "CurrentBG"; +"CurrentBG" = "JelenlegiBG"; /* */ -"Sensor Info" = "Sensor Info"; +"Sensor Info" = "Szenzor infó"; /* */ -"Sensor Age" = "Sensor Age"; +"Sensor Age" = "Szenzor élettartalma"; /* */ -"Sensor Age Left" = "Sensor Age Left"; +"Sensor Age Left" = "Fennmaradó szenzor idő"; /* */ -"Sensor Endtime" = "Sensor Endtime"; +"Sensor Endtime" = "Szenzor kikapcsolás ideje"; /* */ -"Sensor State" = "Sensor State"; +"Sensor State" = "Szenzorállapot"; /* */ -"Sensor Serial" = "Sensor Serial"; +"Sensor Serial" = "Szenzor széria száma"; /* */ -"Transmitter Info" = "Transmitter Info"; +"Transmitter Info" = "Jeladó Információ"; /* */ "Hardware" = "Hardware"; @@ -837,76 +837,76 @@ Enact a temp Basal or a temp target */ "Firmware" = "Firmware"; /* */ -"Connection State" = "Connection State"; +"Connection State" = "Kapcsolat állapota"; /* */ -"Transmitter Type" = "Transmitter Type"; +"Transmitter Type" = "Jeladó Típusa"; /* */ -"Sensor Type" = "Sensor Type"; +"Sensor Type" = "Szenzor típusa"; /* */ -"Factory Calibration Parameters" = "Factory Calibration Parameters"; +"Factory Calibration Parameters" = "Gyári kalibrációs paraméterek"; /* */ "Valid for footer" = "Valid for footer"; /* */ -"Edit calibrations" = "Edit calibrations"; +"Edit calibrations" = "Kalibrációk szerkesztése"; /* */ -"edit calibration clicked" = "edit calibration clicked"; +"edit calibration clicked" = "kalibráció szerkesztése kattintva"; /* */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "CGM kitörlése"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; +"Are you sure you want to remove this cgm from loop?" = "Biztosan eltávolítja ezt a szenzort a loopból?"; /* */ -"There is no undo" = "There is no undo"; +"There is no undo" = "Nincs visszavonás"; /* */ -"Advanced" = "Advanced"; +"Advanced" = "Haladó"; /* */ -"Alarms" = "Alarms"; +"Alarms" = "Riasztások"; /* */ -"Glucose Settings" = "Glucose Settings"; +"Glucose Settings" = "Glükóz beállítások"; /* */ -"Notifications" = "Notifications"; +"Notifications" = "Értesítések"; /* */ -"Export logs" = "Export logs"; +"Export logs" = "Log exportálása"; /* */ -"Export not available" = "Export not available"; +"Export not available" = "Az exportálás nem elérhető"; /* */ -"Log export requires ios 15" = "Log export requires ios 15"; +"Log export requires ios 15" = "Log exportálásához iOS 15-re van szükség"; /* */ -"Got it!" = "Got it!"; +"Got it!" = "Rendben!"; /* */ -"Saved to %@" = "Saved to %@"; +"Saved to %@" = "Elmentve a %@"; /* */ -"No logs available" = "No logs available"; +"No logs available" = "Nincs elérhető log"; /* */ -"Glucose Notification visibility" = "Glucose Notification visibility"; +"Glucose Notification visibility" = "Glükóz értesítés láthatósága"; /* */ -"Always Notify Glucose" = "Always Notify Glucose"; +"Always Notify Glucose" = "Mindig jelezze a cukorszintet"; /* */ -"Notify per reading" = "Notify per reading"; +"Notify per reading" = "Értesítés olvasásonként"; /* */ -"Value" = "Value"; +"Value" = "Érték"; /* */ "Adds Phone Battery" = "Adds Phone Battery"; @@ -1023,22 +1023,22 @@ Enact a temp Basal or a temp target */ "Battery" = "Battery"; /* */ - "Also add source info" = "Also add source info"; +"Also add source info" = "Also add source info"; - /* */ - "Carbs Required Threshold" = "Carbs Required Threshold"; +/* */ +"Carbs Required Threshold" = "Carbs Required Threshold"; - /* */ - "Carbs required: %d g" = "Carbs required: %d g"; +/* */ +"Carbs required: %d g" = "Carbs required: %d g"; - /* */ - "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; +/* */ +"To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; - /* */ - "iAPS not active" = "iAPS not active"; +/* */ +"iAPS not active" = "iAPS not active"; - /* */ - "Last loop was more than %d min ago" = "Last loop was more than %d min ago"; +/* */ +"Last loop was more than %d min ago" = "Last loop was more than %d min ago"; /* Glucose badge */ "Show glucose on the app badge" = "Show glucose on the app badge"; @@ -1068,22 +1068,22 @@ Enact a temp Basal or a temp target */ "Temp Basal" = "Temp Basal"; /* */ -"Temp Target" = "Temp Target"; +"Temp Target" = "Átmeneti célpont"; /* */ -"Resume" = "Resume"; +"Resume" = "Visszatérés"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Felfüggesztés"; /* */ -"Animated Background" = "Animated Background"; +"Animated Background" = "Animált háttérkép"; /* Sensor day(s) */ -" day(s)" = " day(s)"; +" day(s)" = " nap(ok)"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Display HR on Watch"; +"Display HR on Watch" = "Megjelenítés az órán"; /* Headers for settings ----------------------- */ @@ -1126,8 +1126,8 @@ Enact a temp Basal or a temp target */ "Online or internal server" = "Online or internal server"; /* -------------- Developer settings ---------------------- */ - /* Debug options */ + "Developer" = "Developer"; /* Debug option view NS Upload Profile */ @@ -1203,16 +1203,15 @@ Enact a temp Basal or a temp target */ /* */ "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; - /* New ALerts ------------------------- */ - - /* Info title */ - "Info" = "Info"; +/* New ALerts ------------------------- */ +/* Info title */ +"Info" = "Info"; - /* Warning title */ - "Warning" = "Warning"; +/* Warning title */ +"Warning" = "Warning"; - /* Error title */ - "Error" = "Error"; +/* Error title */ +"Error" = "Error"; /* Manual temp basal mode */ "Manual" = "Manual"; @@ -1236,8 +1235,8 @@ Enact a temp Basal or a temp target */ "Total" = "Total"; /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ - /* Enable FPU */ + "Enable" = "Enable"; /* Header */ @@ -1342,7 +1341,7 @@ Enact a temp Basal or a temp target */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Átmeneti cél kikapcsolása"; /* Alert */ "Return to Normal?" = "Return to Normal?"; @@ -1414,8 +1413,8 @@ Enact a temp Basal or a temp target */ "Display Protein & Fat" = "Display Protein & Fat"; /* ----------------------- New Bolus Calculator ---------------------------*/ - /* Warning about bolus recommendation. Title */ + "Warning!" = "Warning!"; /* Alert to confirm bolus amount to add */ @@ -1470,7 +1469,7 @@ Enact a temp Basal or a temp target */ ". Falling: " = ". Falling: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; /* Bolus pop-up / Alert string. Make translations concise! */ ". Changing: " = ". Changing: "; @@ -1511,7 +1510,7 @@ Enact a temp Basal or a temp target */ "No Error" = "No Error"; /* description label for active time pod details row */ -"Active Time"= "Active Time"; +"Active Time" = "Active Time"; /* Title string for BeepPreference.silent */ "Disabled" = "Disabled"; @@ -1551,7 +1550,6 @@ Enact a temp Basal or a temp target */ /* The action string on pod status page when pod data is stale */ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; - /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; @@ -1563,7 +1561,6 @@ Enact a temp Basal or a temp target */ /* Description text on manual temp basal action sheet */ "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; - /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Set Temporary Basal"; @@ -1619,10 +1616,10 @@ Enact a temp Basal or a temp target */ "Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; //* -----------------------------------------------------------------------*/ - /* ----------------------Statistics strings -------------------------------*/ - /* */ + + "Today" = "Today"; /* */ @@ -1789,17 +1786,16 @@ Enact a temp Basal or a temp target */ /* New Experimental feature */ "Experimental" = "Experimental"; - /* Smoothing of CGM readings */ "Smooth Glucose Value" = "Smooth Glucose Value"; - /* ----------------------------------------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------------------------------------- Infotexts from openaps.docs and androidaps.docs iAPS */ - /* Headline Rewind Resets Autosens */ + "Rewind Resets Autosens" = "Rewind Resets Autosens"; /* ”Rewind Resets Autosens” */ @@ -2031,8 +2027,8 @@ Enact a temp Basal or a temp target */ "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; // Dynamic ISF + CR Settings: - /* Headline "Adjust Dynamic ISF constant" */ + "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 223233f580..22e06aad09 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -4,161 +4,161 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Add insulin without actually bolusing"; +"Add insulin without actually bolusing" = "Tự thêm liều insulin và bỏ qua liều bolus thực tế"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Add %@ without bolusing"; +"Add %@ without bolusing" = "Thêm %@ và bỏ qua liều bolus"; -"Bolus" = "Bolus"; +"Bolus" = "Liều bolus"; -"Close" = "Close"; +"Close" = "Đóng lại"; /* Continue after added carbs without bolus */ -"Continue without bolus" = "Continue without bolus"; +"Continue without bolus" = "Tiếp tục và bỏ qua liều bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm \nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm Cảnh báo khi dùng liều cao mà không bolus"; /* Header */ -"Enact Bolus" = "Enact Bolus"; +"Enact Bolus" = "Tiêm liều bolus"; /* Button */ -"Enact bolus" = "Enact bolus"; +"Enact bolus" = "Tiêm liều bolus"; /* */ -"Insulin recommended" = "Insulin recommended"; +"Insulin recommended" = "Liều insulin được đề nghị"; /* */ -"Insulin required" = "Insulin required"; +"Insulin required" = "Liều insulin được yêu cầu"; /* Bolus screen */ -"Recommendation" = "Recommendation"; +"Recommendation" = "LIỀU KHUYẾN NGHỊ"; /* Button */ -"Clear" = "Clear"; +"Clear" = "Bỏ"; /* Button */ -"Done" = "Done"; +"Done" = "Hoàn thành"; /* */ -"Wait please" = "Wait please"; +"Wait please" = "Xin đợi chốc lát"; /* */ -"Agree and continue" = "Agree and Continue"; +"Agree and continue" = "Đồng ý và tiếp tục"; /* Bolus progress view */ -"of" = "of"; +"of" = "của"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Enacted at"; +"Enacted at" = "Thực hiện ở"; /* Headline in suggested pop up (at: at what time) */ -"Suggested at" = "Suggested at"; +"Suggested at" = "Đề xuất ở"; /* Headline in enacted pop up (at: at what time) */ - "Error at" = "Error at"; +"Error at" = "Lỗi ở"; /* Bolus View Meal Summary Header */ -"Meal Summary" = "Meal Summary"; +"Meal Summary" = "Tóm tắt bữa ăn"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Chỉnh sửa bữa ăn"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Thêm bữa ăn"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Tóm tắt liều bolus"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Các tính toán"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Bữa ăn nhiều béo"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Liều bolus đầy đủ"; /* For the Bolus View pop-up */ -"Fraction" = "Fraction"; +"Fraction" = "Chia cho"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fatty Meal Factor"; +"Fatty Meal Factor" = "Chỉ số bữa ăn nhiều béo"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Kết quả"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Liều thêm vào bị giới hạn bởi liều Max bolus %d%@"; /* Bolus View Continue Button */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* Home title */ -"Home" = "Home"; +"Home" = "Trở về"; /* Looping in progress */ "looping" = "looping"; /* min ago since last loop */ -"min ago" = "min ago"; +"min ago" = "phút trước đó"; /* Status Title */ -"No suggestion" = "No suggestion"; +"No suggestion" = "Không có gợi ý nào"; /* Replace pod text in Header */ -"Replace pod" = "Replace pod"; +"Replace pod" = "Đề nghị thay pod"; /* Add carbs screen */ -"Add Carbs" = "Add Carbs"; +"Add Carbs" = "Thêm Carbs"; /* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ -"Add Carbs " = "Add Carbs "; +"Add Carbs " = "Thêm Carbs"; /* */ -"Amount Carbs" = "Amount Carbs"; +"Amount Carbs" = "Khối lượng Carbs"; /* Grams unit */ "grams" = "grams"; /* */ -"Carbs required" = "Carbs required"; +"Carbs required" = "Lượng Carbs được yêu cầu"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Lưu thực phẩm"; /* */ -"Are you sure?" = "Are you sure?"; +"Are you sure?" = "Bạn có chắc?"; /* Bottom target temp */ -"Bottom target" = "Bottom target"; +"Bottom target" = "Mục tiêu dưới cùng"; /* Cancel preset name */ -"Cancel" = "Cancel"; +"Cancel" = "Bỏ qua"; /* */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; /* Custom temp target */ -"Custom" = "Custom"; +"Custom" = "THÔNG LỆ"; /* */ -"Date" = "Date"; +"Date" = "Ngày"; /* */ -"Delete" = "Delete"; +"Delete" = "Xóa"; /* Delete preset temp target */ -"Delete preset \"%@\"" = "Delete preset \"%@\""; +"Delete preset \"%@\"" = "Xóa cài đặt trước \"%@\""; /* Duration of target temp or temp basal */ -"Duration" = "Duration"; +"Duration" = "Khoảng thời gian"; /* */ -"Enact Temp Target" = "Enact Temp Target"; +"Enact Temp Target" = "Bỏ qua mục tiêu tạm thời"; /* */ -"Target" = "Target"; +"Target" = "Mục tiêu"; /* */ "Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; @@ -176,31 +176,31 @@ "Enter preset name" = "Enter preset name"; /* Preset name */ -"Name" = "Name"; +"Name" = "Tên"; /* minutes of target temp */ -"minutes" = "minutes"; +"minutes" = "phút"; /* */ -"Presets" = "Presets"; +"Presets" = "Mẫu thiết lặp"; /* Save preset name */ -"Save" = "Save"; +"Save" = "Lưu"; /* */ "Save as Preset" = "Save as Preset"; /* Delete Meal Preset */ -"Delete Preset" = "Delete Preset"; +"Delete Preset" = "Xoá mẫu thiết lập"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Delete preset '%@'?"; +"Delete preset '%@'?" = "Bạn có muốn xóa thiết lập sẵn '%@' không?"; /* Button */ -"No" = "No"; +"No" = "Không"; /* Button */ -"Yes" = "Yes"; +"Yes" = "Có"; /* + Button */ "[ +1 ]" = "[ +1 ]"; @@ -215,7 +215,7 @@ "for" = "for"; /* Temp target set for ... minutes */ -"min" = "min"; +"min" = "phút"; /* */ "Autotune" = "Autotune"; @@ -224,55 +224,55 @@ "Basal profile" = "Basal profile"; /* */ -"Carb ratio" = "Carb ratio"; +"Carb ratio" = "Tỷ lệ Carb"; /* */ "Delete autotune data" = "Delete autotune data"; /* */ -"Run now" = "Run now"; +"Run now" = "Chạy ngay"; /* */ "Last run" = "Last run"; /* */ -"Sensitivity" = "Sensitivity"; +"Sensitivity" = "Độ nhạy"; /* */ "Use Autotune" = "Use Autotune"; /* Add profile basal */ -"Add" = "Add"; +"Add" = "Thêm vào"; /* */ "Basal Profile" = "Basal Profile"; /* Rate basal profile */ -"Rate" = "Rate"; +"Rate" = "Tỷ lệ"; /* */ -"Save on Pump" = "Save on Pump"; +"Save on Pump" = "Lưu vào bơm"; /* */ -"Saving..." = "Saving..."; +"Saving..." = "Đang lưu..."; /* */ -"Schedule" = "Schedule"; +"Schedule" = "Lịch trình"; /* */ -"starts at" = "starts at"; +"starts at" = "bắt đầu lúc"; /* Time basal profile */ -"Time" = "Time"; +"Time" = "Thời gian"; /* */ "Calculated Ratio" = "Calculated Ratio"; /* Carb Ratios header */ -"Carb Ratios" = "Carb Ratios"; +"Carb Ratios" = "Tỷ lệ Carb"; /* */ -"Ratio" = "Ratio"; +"Ratio" = "Tỷ lệ"; /* */ "Autosens" = "Autosens"; @@ -281,158 +281,158 @@ "Calculated Sensitivity" = "Calculated Sensitivity"; /* */ -"Insulin Sensitivities" = "Insulin Sensitivities"; +"Insulin Sensitivities" = "Độ nhạy của Insulin"; /* */ "Sensitivity Ratio" = "Sensitivity Ratio"; /* */ -"Dismiss" = "Dismiss"; +"Dismiss" = "Từ bỏ"; /* */ -"Important message" = "Important message"; +"Important message" = "Tin nhắn quan trọng"; /* */ -"Amount" = "Amount"; +"Amount" = "Số lượng"; /* */ -"Cancel Temp Basal" = "Cancel Temp Basal"; +"Cancel Temp Basal" = "Huỷ bỏ Temp Basal"; /* Enact Enact a temp Basal or a temp target */ "Enact" = "Enact"; /* */ -"Manual Temp Basal" = "Manual Temp Basal"; +"Manual Temp Basal" = "Liều Basal thủ công"; /* Allow uploads to different services */ "Allow uploads" = "Allow uploads"; /* API secret in NS */ -"API secret" = "API secret"; +"API secret" = "Khóa API"; /* Connect to NS */ -"Connect" = "Connect"; +"Connect" = "Kết nối"; /* Connected to NS */ -"Connected!" = "Connected!"; +"Connected!" = "Đã kết nối"; /* Connecting to NS */ -"Connecting..." = "Connecting..."; +"Connecting..." = "Đang kết nối..."; /* */ -"Invalid URL" = "Invalid URL"; +"Invalid URL" = "URL không xác thực"; /* */ -"Local glucose source" = "Local glucose source"; +"Local glucose source" = "NGUỒN GLUCOSE NỘI TẠI"; /* Header */ -"Nightscout Config" = "Nightscout Config"; +"Nightscout Config" = "Cấu hình Nightscout"; /* */ -"Port" = "Port"; +"Port" = "Cổng"; /* */ "URL" = "URL"; /**/ -"Use local glucose server" = "Use local glucose server"; +"Use local glucose server" = "Sử dụng nguồn glucose nội tại"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Điều này cho phép tải lên các dữ liệu.json lên Nightscout mà có thể được sử dụng bởi Dự án Community Statictics và Demographics. \n\\Tham gia vào Community Statistics là tùy chọn và yêu cầu đăng ký riêng tại:\n"; /* */ -"Edit settings json" = "Edit settings json"; +"Edit settings json" = "Chỉnh sửa cấu hình json"; /* */ -"Glucose units" = "Glucose units"; +"Glucose units" = "Đơn vị glucose"; /* */ -"Preferences" = "Preferences"; +"Preferences" = "Sở thích"; /* Recommended Insulin Fraction in preferences */ -"Recommended Insulin Fraction" = "Recommended Insulin Fraction"; +"Recommended Insulin Fraction" = "Insulin được đề xuất"; /* Do you want to show bolus screen after added carbs? */ -"Skip Bolus screen after carbs" = "Skip Bolus screen after carbs"; +"Skip Bolus screen after carbs" = "Bỏ qua màn hình bolus sau carbs"; /* Allow remote control from NS */ -"Remote control" = "Remote control"; +"Remote control" = "Điều khiển từ xa"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\n Bây giờ xin hãy xác minh lại tất cả các cài đặt của bạn kỹ lưỡng:\n\n* Cài đặt liều nền\n * Carb Ratios\n * Các mục tiêu đường huyết \n * Độ nhạy của Insulin\n * DIA\n\n trong iAPS Settings > Configuration.\n\n Cấu hình không hợp lệ hoặc tồi có thể có tác động thảm họa."; /* Profile Import Alert */ -"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?"; +"This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Việc này có thể thay thế một vài hoặc tất cả những cấu hình bơm hiện tại của bạn. Bạn có chắc bạn muốn nhập cấu hình từ Nightscout?"; /* Import Error */ -"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!"; +"\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nCác cấu hình liều nền trên Nightscout không hợp lệ.\n\n Việc cập nhật bị bỏ. Đề nghị bạn kiểm tra cấu hình liều nền trên Nightscout!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\n Các cấu hình đã được nhập nhưng liều nền không được lưu vào bơm (Không có bơm). Kiểm tra cấu hình liều nền của bạn và nhấn 'Lưu vào bơm' để đồng hóa cấu hình liều nền mới"; /* Import Error Headline */ -"Import Error" = "Import Error"; +"Import Error" = "Cập nhật lỗi"; /* */ -"Yes, Import" = "Yes, Import"; +"Yes, Import" = "Đồng ý, hãy cập nhật"; /* */ -"Import settings from Nightscout" = "Import settings from Nightscout"; +"Import settings from Nightscout" = "Cập nhật cấu hình từ Nightscout"; /* */ -"Import settings?" = "Import settings?"; +"Import settings?" = "Cập nhật các cấu hình?"; /* */ -"Import from Nightscout" = "Import from Nightscout"; +"Import from Nightscout" = "Cập nhật từ Nightscout"; /* */ -"Settings imported" = "Settings imported"; +"Settings imported" = "Các cấu hình đã được cập nhật"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Can't find the default Nightscout Profile."; +"Can't find the default Nightscout Profile." = "Không thể tìm thấy Profile Nightscout mặc định."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Blood Glucose Test"; +"Blood Glucose Test" = "Xét nghiệm đường huyết"; /* Add Medtronic pump */ -"Add Medtronic" = "Add Medtronic"; +"Add Medtronic" = "Thêm Medtronic"; /* Add Omnipod pump */ -"Add Omnipod" = "Add Omnipod"; +"Add Omnipod" = "Thêm Omnipod"; /* Add Simulator pump */ -"Add Simulator" = "Add Simulator"; +"Add Simulator" = "Thêm phần mô phỏng"; /* Insulin model */ "Model" = "Model"; /* */ -"Pump config" = "Pump config"; +"Pump config" = "Cấu hình bơm"; /* */ -"Delivery limits" = "Delivery limits"; +"Delivery limits" = "Các giới hạn liều tiêm"; /* */ -"Duration of Insulin Action" = "Duration of Insulin Action"; +"Duration of Insulin Action" = "Khoảng thời gian Insulin tác động"; /* hours of duration of insulin activity */ -"hours" = "hours"; +"hours" = "giờ"; /* Max setting */ -"Max Basal" = "Max Basal"; +"Max Basal" = "Liều nền tối đa"; /* Max setting */ -"Max Bolus" = "Max Bolus"; +"Max Bolus" = "Liều bolus tối đa"; /* Max setting */ -"Max Carbs" = "Max Carbs"; +"Max Carbs" = "Khối lượng carbs tối đa"; /* */ -"Pump Settings" = "Pump Settings"; +"Pump Settings" = "Cấu hình bơm"; /* Insulin unit per hour */ "U/hr" = "U/hr"; @@ -612,13 +612,13 @@ Enact a temp Basal or a temp target */ "Calendar" = "Calendar"; /* Automatic delivered treatments */ -"Automatic" = "Automatic"; +"Automatic" = "Tự động"; /* External insulin treatments */ -"External" = "External"; +"External" = "Bên ngoài"; /* */ -"Other" = "Other"; +"Other" = "Khác"; /* */ "Libre Transmitter" = "Libre Transmitter"; @@ -630,16 +630,16 @@ Enact a temp Basal or a temp target */ "Bluetooth Transmitters" = "Bluetooth Transmitters"; /* */ -"Modes" = "Modes"; +"Modes" = "Các cách thức"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; /* */ -"Select the third party transmitter you want to connect to" = "Select the third party transmitter you want to connect to"; +"Select the third party transmitter you want to connect to" = "Đề nghị chọn transmitter của bên thứ ba mà bạn muốn kết nối đến"; /* State was restored */ -"State was restored" = "State was restored"; +"State was restored" = "Trạng thái vừa được khôi phục"; /* The short unit display string for millimoles of glucose per liter */ "mmol/L" = "mmol/L"; @@ -648,118 +648,118 @@ Enact a temp Basal or a temp target */ "mg/dL" = "mg/dL"; /* */ -"Add calibration" = "Add calibration"; +"Add calibration" = "Thêm kết quả hiệu chuẩn"; /* When adding capillary glucose meater reading */ -"Meter glucose" = "Meter glucose"; +"Meter glucose" = "Máy đo đường huyết"; /* */ -"Info" = "Info"; +"Info" = "Thông tin"; /*v*/ -"Slope" = "Slope"; +"Slope" = "Độ dốc"; /* */ -"Intercept" = "Intercept"; +"Intercept" = "Chặn"; /* */ -"Chart" = "Chart"; +"Chart" = "Biểu đồ"; /* */ -"Remove" = "Remove"; +"Remove" = "Loại bỏ"; /* */ -"Remove Last" = "Remove Last"; +"Remove Last" = "Loại bỏ mục sau cùng"; /* */ -"Remove All" = "Remove All"; +"Remove All" = "Loại bỏ tất cả"; /* */ -"About the Process"= "About the Process"; +"About the Process" = "Về quá trình"; /* */ -"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working."; +"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Xin chắc chắn rằng Libre 2 của bạn đã được kích hoạt and hoàn thành khởi động. Nếu bạn đang có app nào kết nối với cảm biến qua bluetooth thì nên đóng các app này lại hoặc gỡ các app khỏi máy.\n\n Bạn chỉ được dùng 01 app để kết nối với cảm biến qua bluetooth. Sau đó nhấn \"pairing and connection\" để tiếp tục. Bluetooth có thể mất vài phút để kết nối trước khi bắt đầu hoạt động."; /* */ -"Pairinginfo" = "Pairinginfo"; +"Pairinginfo" = "Thông in ghép nối"; /* */ -"PatchInfo" = "PatchInfo"; +"PatchInfo" = "Thông tin bản vá lỗi"; /* */ -"Calibrationinfo" = "Calibrationinfo"; +"Calibrationinfo" = "Thông tin hiệu chuẩn"; /* */ -"Unknown" = "Unknown"; +"Unknown" = "Không xác định"; /* */ -"Not paired yet" = "Not paired yet"; +"Not paired yet" = "Chưa được ghép nối"; /* */ -"Pair Sensor & connect" = "Pair Sensor & connect"; +"Pair Sensor & connect" = "Ghép nối sensor & kết nối"; /* */ -"Phone NFC required!" = "Phone NFC required!"; +"Phone NFC required!" = "Bật NFC của điện thoại lên!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Điện thoại hoặc app của bạn không hỗ trợ NFC ghép nối với libre2"; /* Bluetooth Power Off */ -"Bluetooth Power Off" = "Bluetooth Power Off"; +"Bluetooth Power Off" = "Tắt bluetooth"; /* Please turn on Bluetooth */ -"Please turn on Bluetooth" = "Please turn on Bluetooth"; +"Please turn on Bluetooth" = "Xin mở bluetooth lên"; /* No Libre Transmitter Selected */ -"No Libre Transmitter Selected" = "No Libre Transmitter Selected"; +"No Libre Transmitter Selected" = "Không có Libre Transmitter nào được chọn"; /* Delete Transmitter and start anew. */ -"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Delete CGMManager and start anew. Your libreoopweb credentials will be preserved"; +"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Xóa CGMManager và tạo mới. Các thông tin xác thực libreoopweb của bạn sẽ được bảo quản"; /* Invalid libre checksum */ -"Invalid libre checksum" = "Invalid libre checksum"; +"Invalid libre checksum" = "Tổng kiểm tra libre không hợp lệ"; /* Libre sensor was incorrectly read, CRCs were not valid */ -"Libre sensor was incorrectly read, CRCs were not valid"= "Libre sensor was incorrectly read, CRCs were not valid"; +"Libre sensor was incorrectly read, CRCs were not valid" = "Cảm biến libre không được đọc đúng, CRCs không hợp lệ"; /* Glucose */ -"Glucose" = "Glucose"; +"Glucose" = "Đường huyết"; /* LOWALERT! */ -"LOWALERT!" = "LOWALERT!"; +"LOWALERT!" = "CẢNH BÁO THẤP!"; /* HIGHALERT! */ -"HIGHALERT!" = "HIGHALERT!"; +"HIGHALERT!" = "CẢNH BÁO CAO!"; /* (Snoozed)*/ "(Snoozed)" = "(Snoozed)"; /* Glucose: %@ */ -"Glucose: %@" = "Glucose: %@"; +"Glucose: %@" = "Đường huyết: %@"; /* Transmitter: %@%% */ "Transmitter: %@%%" = "Transmitter: %@%%"; /* No Sensor Detected */ -"No Sensor Detected" = "No Sensor Detected"; +"No Sensor Detected" = "Không phát hiện được cảm biến"; /* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ -"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor"; +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "Có sự gián đoạn tạm thời, đề nghị kiểm tra lại transmitter đã được gắn chặt lên sensor"; /* New Sensor Detected */ -"New Sensor Detected" = "New Sensor Detected"; +"New Sensor Detected" = "Phát hiện được sensor mới"; /* Please wait up to 30 minutes before glucose readings are available! */ -"Please wait up to 30 minutes before glucose readings are available!" = "Please wait up to 30 minutes before glucose readings are available!"; +"Please wait up to 30 minutes before glucose readings are available!" = "Đợi 30 phút trước khi đường huyết được hiển thị!"; /* Invalid Glucose sample detected, try again later */ -"Invalid Glucose sample detected, try again later" = "Invalid Glucose sample detected, try again later"; +"Invalid Glucose sample detected, try again later" = "Mẫu đường huyết không hợp lệ, thử lại sau"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor might have temporarily stopped, fallen off or is too cold or too warm"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor có khả năng tạm dừng, bong khỏi hoặc quá lạnh hoặc quá nóng"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Invalid Sensor Detected"; +"Invalid Sensor Detected" = "Sensor không hợp lệ"; /* Detected sensor seems not to be a libre 1 sensor! */ "Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; @@ -912,13 +912,13 @@ Enact a temp Basal or a temp target */ "Adds Phone Battery" = "Adds Phone Battery"; /* */ -"Adds Transmitter Battery" = "Adds Transmitter Battery"; +"Adds Transmitter Battery" = "Thêm pin của Transmitter"; /* */ -"Also vibrate" = "Also vibrate"; +"Also vibrate" = "Rung"; /* */ -"Additional notification types" = "Additional notification types"; +"Additional notification types" = "Thêm các loại thông báo"; /* */ "Misc" = "Misc"; @@ -927,136 +927,136 @@ Enact a temp Basal or a temp target */ "Unit override" = "Unit override"; /* */ -"Low" = "Low"; +"Low" = "Thấp"; /* */ -"High" = "High"; +"High" = "Cao"; /* */ -"glucose" = "glucose"; +"glucose" = "đường huyết"; /* */ -"Schedule " = "Schedule "; +"Schedule " = "Lịch trình "; /* */ -"tapped save schedules" = "tapped save schedules"; +"tapped save schedules" = "nhấn và lưu lịch trình"; /* */ -"Error" = "Error"; +"Error" = "Lỗi"; /* */ -"Some ui element was incorrectly specified" = "Some ui element was incorrectly specified"; +"Some ui element was incorrectly specified" = "Một vại yếu tố ui đã không được chỉ định"; /* */ -"Success" = "Success"; +"Success" = "Thành công"; /* */ -"Schedules were saved successfully!" = "Schedules were saved successfully!"; +"Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; /* */ -"High Glucose Alarm active" = "High Glucose Alarm active"; +"High Glucose Alarm active" = "High Glucose Alarm đang hoạt động"; /* */ -"Low Glucose Alarm active" = "Low Glucose Alarm active"; +"Low Glucose Alarm active" = "Low Glucose Alarm đang hoạt động"; /* */ -"No Glucose Alarm active" = "No Glucose Alarm active"; +"No Glucose Alarm active" = "No Glucose Alarm đang hoạt động"; /* */ -"snoozing until %@" = "snoozing until %@"; +"snoozing until %@" = "tạm yên cho đến khi %@"; /* */ -"not snoozing" = "not snoozing"; +"not snoozing" = "không ẩn"; /* */ -"nothing to see here" = "nothing to see here"; +"nothing to see here" = "không có gì xem ở đây"; /* */ -"snooze from testview clicked" = "snooze from testview clicked"; +"snooze from testview clicked" = "đã nhấp vào tạm ẩn từ chế độ xem thử nghiệm"; /* */ -"will snooze for %@ until %@" = "will snooze for %@ until %@"; +"will snooze for %@ until %@" = "sẽ tạm ẩn cho %@ đến khi %@"; /* */ -"Click to Snooze Alerts" = "Click to Snooze Alerts"; +"Click to Snooze Alerts" = "Chọn để ẩn các cảnh báo"; /* */ -"Strength" = "Strength"; +"Strength" = "Sức mạnh"; /* */ -"Hold the top of your iPhone near the sensor to pair" = "Hold the top of your iPhone near the sensor to pair"; +"Hold the top of your iPhone near the sensor to pair" = "Giữ đầu iPhone gần sensor để ghép nối"; /* */ -"Sensor not found" = "Sensor not found"; +"Sensor not found" = "Không phát hiện sensor"; /* */ -"Also play alert sound" = "Also play alert sound"; +"Also play alert sound" = "Đồng thời bật âm thanh"; /* */ -"Notification Settings" = "Notification Settings"; +"Notification Settings" = "Cài đặt thông báo"; /* */ -"Found devices: %d" = "Found devices: %d"; +"Found devices: %d" = "Tìm thấy thiết bị: %d"; /* */ -"Backfill options" = "Backfill options"; +"Backfill options" = "Tùy chọn chèn lấp"; /* */ -"Backfilling from trend is currently not well supported by Loop" = "Backfilling from trend is currently not well supported by Loop"; +"Backfilling from trend is currently not well supported by Loop" = "Việc chèn lấp theo xu hướng hiện không được Loop hỗ trợ tốt"; /* */ -"Backfill from history" = "Backfill from history"; +"Backfill from history" = "Chèn lấp từ lịch sử"; /* */ -"Backfill from trend" = "Backfill from trend"; +"Backfill from trend" = "Chèn lấp từ xu hướng"; /* */ -"Debug options" = "Debug options"; +"Debug options" = "Tùy chọn gỡ lỗi"; /* */ -"Adds a lot of data to the Issue Report " = "Adds a lot of data to the Issue Report "; +"Adds a lot of data to the Issue Report " = "Thêm nhiều dữ liệu vào Issue Report "; /* */ -"Persist sensordata" = "Persist sensordata"; +"Persist sensordata" = "Duy trì dữ liệu cảm biến"; /* */ -"Battery" = "Battery"; +"Battery" = "Pin"; /* */ - "Also add source info" = "Also add source info"; +"Also add source info" = "Cũng thêm thông tin nguồn"; - /* */ - "Carbs Required Threshold" = "Carbs Required Threshold"; +/* */ +"Carbs Required Threshold" = "Ngưỡng yêu cầu của lượng Carbs"; - /* */ - "Carbs required: %d g" = "Carbs required: %d g"; +/* */ +"Carbs required: %d g" = "Lượng carbs yêu cầu: %d g"; - /* */ - "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs"; +/* */ +"To prevent LOW required %d g of carbs" = "Để hạn chế LOW yêu cầu %d g carbs"; - /* */ - "iAPS not active" = "iAPS not active"; +/* */ +"iAPS not active" = "iAPS chưa hoạt động"; - /* */ - "Last loop was more than %d min ago" = "Last loop was more than %d min ago"; +/* */ +"Last loop was more than %d min ago" = "Loop dừng hoạt động hơn %d phút trước"; /* Glucose badge */ -"Show glucose on the app badge" = "Show glucose on the app badge"; +"Show glucose on the app badge" = "Thể hiện đường huyết lên trên app"; /* */ "Backfill glucose" = "Backfill glucose"; /* About this source */ -"About this source" = "About this source"; +"About this source" = "Thông tin nguồn này"; /* */ -"Bolus failed" = "Bolus failed"; +"Bolus failed" = "Liều bolus thất bại"; /* "Max Bolus Exceeded label" */ -"Max Bolus exceeded!" = "Max Bolus exceeded!"; +"Max Bolus exceeded!" = "Liều Max Bolus đã vượt quá mong đợi!"; /* */ -"Bolus failed or inaccurate. Check pump history before repeating." = "Bolus failed or inaccurate. Check pump history before repeating."; +"Bolus failed or inaccurate. Check pump history before repeating." = "Liều bolus thất bại hoặc không chính xác. Kiểm tra lại bơm trước khi lặp lại."; /* */ "Carbs" = "Carbs"; @@ -1126,8 +1126,8 @@ Enact a temp Basal or a temp target */ "Online or internal server" = "Online or internal server"; /* -------------- Developer settings ---------------------- */ - /* Debug options */ + "Developer" = "Developer"; /* Debug option view NS Upload Profile */ @@ -1149,7 +1149,7 @@ Enact a temp Basal or a temp target */ "Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; /* */ -"Save on Pump" = "Save on Pump"; +"Save on Pump" = "Lưu vào bơm"; /* Debug option view Pump History */ "Pump History" = "Pump History"; @@ -1203,16 +1203,15 @@ Enact a temp Basal or a temp target */ /* */ "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; - /* New ALerts ------------------------- */ - - /* Info title */ - "Info" = "Info"; +/* New ALerts ------------------------- */ +/* Info title */ +"Info" = "Thông tin"; - /* Warning title */ - "Warning" = "Warning"; +/* Warning title */ +"Warning" = "Warning"; - /* Error title */ - "Error" = "Error"; +/* Error title */ +"Error" = "Lỗi"; /* Manual temp basal mode */ "Manual" = "Manual"; @@ -1221,60 +1220,60 @@ Enact a temp Basal or a temp target */ "SMB" = "SMB"; /* A manually entered dose of external insulin */ -"External Insulin" = "External Insulin"; +"External Insulin" = "Liều insulin tiêm ngoài"; /* Status highlight when manual temp basal is running. */ -"Manual Basal" = "Manual Basal"; +"Manual Basal" = "Liều Basal thủ công"; /* Current Manual Temp basal */ -" - Manual Basal ⚠️" = " - Manual Basal ⚠️"; +" - Manual Basal ⚠️" = " - Liều Basal thủ công⚠️"; /* Total AT / Scheduled basal insulin */ -" U/day" = " U/day"; +" U/day" = " U/ngày"; /* Total AT / Scheduled basal insulin */ -"Total" = "Total"; +"Total" = "Tổng số"; /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ - /* Enable FPU */ -"Enable" = "Enable"; + +"Enable" = "Cho phép"; /* Header */ -"Conversion settings" = "Conversion settings"; +"Conversion settings" = "Cài đặt chuyển đổi"; /* Delay */ -"Delay In Minutes" = "Delay In Minutes"; +"Delay In Minutes" = "Tạm ngừng trong số phút"; /* Duration */ -"Maximum Duration In Hours" = "Maximum Duration In Hours"; +"Maximum Duration In Hours" = "Khoảng thời gian tối đa tính theo giờ"; /* Interval */ -"Interval In Minutes" = "Interval In Minutes"; +"Interval In Minutes" = "Khoảng thời gian tính bằng phút"; /* Override */ "Override With A Factor Of " = "Override With A Factor Of "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và protein thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Fat and Protein"; +"Fat and Protein" = "Chất béo và protein"; /* Display fat and protein entities */ "Fat & Protein" = "Fat & Protein"; /* */ -"Hide Fat & Protein" = "Hide Fat & Protein"; +"Hide Fat & Protein" = "Ẩn Fat & Protein"; /* Add Fat */ -"Fat" = "Fat"; +"Fat" = "Chất béo"; /* Add Protein */ "Protein" = "Protein"; /* Service Section */ -"Fat And Protein Conversion" = "Fat And Protein Conversion"; +"Fat And Protein Conversion" = "Chuyển đổi chất béo và protein"; /* Service Section */ "Profile Override" = "Profile Override"; @@ -1283,24 +1282,24 @@ Enact a temp Basal or a temp target */ "Override Profiles" = "Override Profiles"; /* */ -"Normal " = "Normal "; +"Normal " = "Bình thường "; -"Currently no Override active" = "Currently no Override active"; +"Currently no Override active" = "Hiện tại không có Override hoạt động"; /* */ -"Total Insulin Adjustment" = "Total Insulin Adjustment"; +"Total Insulin Adjustment" = "Tổng số điều chỉnh Insulin"; /* */ "Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; /* */ -"Enable indefinitely" = "Enable indefinitely"; +"Enable indefinitely" = "Kích hoạt vô thời hạn"; /* */ "Override Profile target" = "Override Profile target"; /* */ -"Disable SMBs" = "Disable SMBs"; +"Disable SMBs" = "Vô hiệu hóa SMBs"; /* Your normal Profile. Use a short string */ "Normal Profile" = "Normal Profile"; @@ -1312,67 +1311,67 @@ Enact a temp Basal or a temp target */ "Profiles" = "Profiles"; /* */ -"More options" = "More options"; +"More options" = "Các lựa chọn khác"; /* */ -"Schedule when SMBs are Off" = "Schedule when SMBs are Off"; +"Schedule when SMBs are Off" = "Lịch trình khi SMBs tắt"; /* */ -"Change ISF and CR" = "Change ISF and CR"; +"Change ISF and CR" = "Thay đổi ISF và CR"; /* */ -"Change ISF" = "Change ISF"; +"Change ISF" = "Thay đổi ISF"; /* */ -"Change CR" = "Change CR"; +"Change CR" = "Thay đổi CR"; /* */ -"SMB Minutes" = "SMB Minutes"; +"SMB Minutes" = "SMB theo phút"; /* */ -"UAM SMB Minutes" = "UAM SMB Minutes"; +"UAM SMB Minutes" = "UAM SMB theo phút"; /* */ -"Start new Profile" = "Start new Profile"; +"Start new Profile" = "Bắt đầu profile mới"; /* */ -"Save as Profile" = "Save as Profile"; +"Save as Profile" = "Lưu profile"; /* Alert */ "Cancel Profile Override" = "Cancel Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Cancel Temp Target"; +"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; /* Alert */ -"Return to Normal?" = "Return to Normal?"; +"Return to Normal?" = "Quay lại bình thường?"; /* */ -"This will change settings back to your normal profile." = "This will change settings back to your normal profile."; +"This will change settings back to your normal profile." = "Việc này sẽ thay đổi cấu hình trở lại profile bình thường của bạn."; /* Start Profile Alert */ -"Start Profile" = "Start Profile"; +"Start Profile" = "Bắt đầu profile"; /* */ -"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."; +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Liều basal sẽ được điều chỉnh theo tỷ lệ phần trăm override trong khi ISF và CR sẽ được điều chỉnh ngược lại."; /* */ -"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile."; +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Việc sử dụng override này sẽ thay đổi profile và/hoặc Target Glucose của bạn được sử dụng cho looping trong suốt thời gian được chọn. Chọn \"Start Profile\" sẽ cho phép bạn lập profile mới và chỉnh sửa profile hiện hữu đang hoạt động."; /* Change Target glucose in profile settings */ "Override Profile Target" = "Override Profile Target"; /* Alert string. Keep spaces. */ -" SMBs are disabled either by schedule or during the entire duration." = " SMBs are disabled either by schedule or during the entire duration."; +" SMBs are disabled either by schedule or during the entire duration." = " SBMs bị vô hiệu theo lịch trình hoặc theo toàn bộ thời gian."; /* Alert strings. Keep spaces */ -" infinite duration." = " infinite duration."; +" infinite duration." = " thời gian không xác định."; /* Service Section */ -"App Icons" = "App Icons"; +"App Icons" = "Biểu tượng app"; /* */ -"iAPS Icon" = "iAPS Icon"; +"iAPS Icon" = "biểu tượng iAPS"; /* Service Section */ "Statistics and Home View" = "Statistics and Home View"; @@ -1414,8 +1413,8 @@ Enact a temp Basal or a temp target */ "Display Protein & Fat" = "Display Protein & Fat"; /* ----------------------- New Bolus Calculator ---------------------------*/ - /* Warning about bolus recommendation. Title */ + "Warning!" = "Warning!"; /* Alert to confirm bolus amount to add */ @@ -1470,7 +1469,7 @@ Enact a temp Basal or a temp target */ ". Falling: " = ". Falling: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; /* Bolus pop-up / Alert string. Make translations concise! */ ". Changing: " = ". Changing: "; @@ -1499,10 +1498,10 @@ Enact a temp Basal or a temp target */ "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; /* button title for saving low reservoir reminder while saving */ -"Saving..." = "Saving..."; +"Saving..." = "Đang lưu..."; /* button title for saving low reservoir reminder */ -"Save" = "Save"; +"Save" = "Lưu"; /* Alert title for error when updating confidence reminder preference */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; @@ -1511,7 +1510,7 @@ Enact a temp Basal or a temp target */ "No Error" = "No Error"; /* description label for active time pod details row */ -"Active Time"= "Active Time"; +"Active Time" = "Active Time"; /* Title string for BeepPreference.silent */ "Disabled" = "Disabled"; @@ -1551,19 +1550,17 @@ Enact a temp Basal or a temp target */ /* The action string on pod status page when pod data is stale */ "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; - /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; /* Label text for temporary basal rate summary */ -"Rate" = "Rate"; +"Rate" = "Tỷ lệ"; /* Summary string for temporary basal rate configuration page */ "%1$@ for %2$@" = "%1$@ for %2$@"; /* Description text on manual temp basal action sheet */ "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; - /* Button text for setting manual temporary basal rate*/ "Set Temporary Basal" = "Set Temporary Basal"; @@ -1619,10 +1616,10 @@ Enact a temp Basal or a temp target */ "Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; //* -----------------------------------------------------------------------*/ - /* ----------------------Statistics strings -------------------------------*/ - /* */ + + "Today" = "Today"; /* */ @@ -1635,7 +1632,7 @@ Enact a temp Basal or a temp target */ "Month" = "Month"; /* */ -"Total" = "Total"; +"Total" = "Tổng số"; /* Headline Statistics */ "Statistics" = "Statistics"; @@ -1644,10 +1641,10 @@ Enact a temp Basal or a temp target */ "Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; /* Low Glucose Threshold in Statistics settings */ -"Low" = "Low"; +"Low" = "Thấp"; /* High Glucose Threshold in Statistics settings */ -"High" = "High"; +"High" = "Cao"; /* In Range */ "In Range" = "In Range"; @@ -1734,7 +1731,7 @@ Enact a temp Basal or a temp target */ "Interval" = "Interval"; /* Median loop interval */ -"Duration" = "Duration"; +"Duration" = "Khoảng thời gian"; /* "Display SD */ "Display SD instead of CV" = "Display SD instead of CV"; @@ -1789,17 +1786,16 @@ Enact a temp Basal or a temp target */ /* New Experimental feature */ "Experimental" = "Experimental"; - /* Smoothing of CGM readings */ "Smooth Glucose Value" = "Smooth Glucose Value"; - /* ----------------------------------------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------------------------------------- Infotexts from openaps.docs and androidaps.docs iAPS */ - /* Headline Rewind Resets Autosens */ + "Rewind Resets Autosens" = "Rewind Resets Autosens"; /* ”Rewind Resets Autosens” */ @@ -2031,8 +2027,8 @@ Enact a temp Basal or a temp target */ "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; // Dynamic ISF + CR Settings: - /* Headline "Adjust Dynamic ISF constant" */ + "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ From cdf0daf9331c83761e068169936037b56c8a3907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Wed, 3 Jan 2024 18:02:28 +0100 Subject: [PATCH 322/405] Add missing strings --- .../Main/en.lproj/Localizable.strings | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 223233f580..bef35518e4 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2047,32 +2047,87 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; + +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From 2ba8a3b9a4a0d8b73c04aa9ec738879bdea01fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 3 Jan 2024 20:03:28 +0100 Subject: [PATCH 323/405] Crowdin updates (#446) Vietnamese etc. --- .../vi.lproj/Localizable.strings | 26 +- .../G7SensorKit/vi.lproj/Localizable.strings | 26 +- .../Resources/vi.lproj/Localizable.strings | 27 +- .../vi.lproj/Localizable.strings | 472 +++++------ .../Resources/vi.lproj/Localizable.strings | 152 ++-- .../Resources/vi.lproj/Localizable.strings | 300 +++---- FreeAPS/Resources/vi.lproj/InfoPlist.strings | 14 +- .../Main/ar.lproj/Localizable.strings | 66 +- .../Main/da.lproj/Localizable.strings | 66 +- .../Main/de.lproj/Localizable.strings | 66 +- .../Main/es.lproj/Localizable.strings | 66 +- .../Main/fi.lproj/Localizable.strings | 66 +- .../Main/fr.lproj/Localizable.strings | 66 +- .../Main/he.lproj/Localizable.strings | 66 +- .../Main/hu.lproj/Localizable.strings | 66 +- .../Main/it.lproj/Localizable.strings | 66 +- .../Main/nb.lproj/Localizable.strings | 66 +- .../Main/nl.lproj/Localizable.strings | 66 +- .../Main/pl.lproj/Localizable.strings | 66 +- .../Main/pt-BR.lproj/Localizable.strings | 66 +- .../Main/pt-PT.lproj/Localizable.strings | 66 +- .../Main/ru.lproj/Localizable.strings | 66 +- .../Main/sk.lproj/Localizable.strings | 66 +- .../Main/sv.lproj/Localizable.strings | 66 +- .../Main/tr.lproj/Localizable.strings | 66 +- .../Main/uk.lproj/Localizable.strings | 66 +- .../Main/vi.lproj/Localizable.strings | 780 ++++++++++-------- .../Main/zh-Hans.lproj/Localizable.strings | 66 +- 28 files changed, 2127 insertions(+), 990 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings index 2db1aee77e..21559a57b6 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings @@ -39,10 +39,10 @@ "Glucose" = "Đường huyết"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Thời gian ân huệ kết thúc"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Thời gian ân huệ còn lại"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "CAO"; @@ -54,7 +54,7 @@ "Last Reading" = "Kết quả đọc gần nhất"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "THẤP"; @@ -63,28 +63,28 @@ "Name" = "Tên"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan để thay sensor"; /* title for g7 settings connection status when scanning */ "Scanning" = "Đang quét"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Đang tìm kiếm \n sensor"; /* G7 Progress bar label when searching for sensor */ "Searching for sensor" = "Đang tìm kiếm cảm biến"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\n hết hạn"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\n thất bại"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\n có vấn đề"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Sensor\n đang khởi động"; /* title for g7 settings row showing sensor expiration time */ "Sensor Expiration" = "Cảm biến hết hạn"; @@ -93,16 +93,16 @@ "Sensor expired" = "Cảm biến đã hết hạn"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor hết hạn"; /* G7 Progress bar label when sensor failed */ "Sensor failed" = "Lỗi cảm biến"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Bắt đầu sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Tín hiệu\n mất"; /* Field label */ "Time" = "Thời gian"; @@ -114,4 +114,4 @@ "Upload Readings" = "Glucose đang tải lên"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; diff --git a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings index 7cca3ef4b9..917eec144f 100644 --- a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor."; /* Button title for starting setup */ "Continue" = "Tiếp tục"; @@ -38,7 +38,7 @@ "Sensor Expiration" = "Cảm biến hết hạn"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Thời gian ân huệ kết thúc"; /* Field label */ "Glucose" = "Đường huyết"; @@ -73,7 +73,7 @@ "Upload Readings" = "Glucose đang tải lên"; /* Button */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan để thay sensor"; /* Button label for removing CGM */ "Delete CGM" = "Xoá CGM"; @@ -96,34 +96,34 @@ "Sensor expired" = "Cảm biến đã hết hạn"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; /* G7 Progress bar label when sensor failed */ "Sensor failed" = "Lỗi cảm biến"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor hết hạn"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Thời gian ân huệ còn lại"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Đang tìm kiếm \n sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\n hết hạn"; /* G7 Status highlight text for signal loss */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\n thất bại"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Tín hiệu\n mất"; /*G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\n có vấn đề"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Sensor\n đang khởi động"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings index 9673f6c744..602c6fee27 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings @@ -20,7 +20,7 @@ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian bơm..."; /* Instructions on selecting battery chemistry type */ "Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Pin kềm và pin lithium phân rã ở các mức độ khác nhau. Pin kềm có xu hướng giảm điện áp tuyến tính theo thời gian trong khi pin lithium có xu hướng duy trì điện áp cho đến khi hết nửa vòng đời. Trong điều kiện sử dụng bình thường trên bơm Minimed (loại X22 hay X15) khi chạy Loop, pin kiềm có thể dùng được trong khoảng 4 đến 5 ngày trong khi pin lithium dùng dc 2 tuần. Việc lựa chọn này được sử dụng theo các mức phân rã điện áp khác nhau cho mỗi loại pin hóa học và sẽ có cảnh báo đối với người dùng khi pin hỏng đạt khoảng từ 8-10 giờ."; @@ -69,7 +69,7 @@ "Devices" = "Thiết bị"; /* Description for option to not use MySentry */ -"Do not use MySentry" = "Do not use MySentry"; +"Do not use MySentry" = "Không sử dụng MySentry"; /* The alert title for a resume error */ "Error Resuming" = "Lỗi khi đang tái thực hiện"; @@ -93,7 +93,7 @@ "Firmware Version" = "Chương trình cơ sở"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* Title of insulin delivery section */ "Insulin Delivery" = "Khối lượng tiêm insulin"; @@ -111,10 +111,10 @@ "Medtronic %1$@" = "Medtronic %1$@"; /* Instructions on selecting setting for MySentry */ -"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models."; +"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Các mẫu máy bơm Medtronic 523, 723, 554 và 754 có một tính năng gọi là 'MySentry', phát sóng định kỳ mức pin của bình chứa và máy bơm. Việc lắng nghe các chương trình phát sóng này cho phép Loop liên lạc với máy bơm ít thường xuyên hơn, điều này có thể tăng tuổi thọ pin của máy bơm. Tuy nhiên, khi sử dụng tính năng này, RileyLink sẽ hoạt động lâu hơn và sử dụng nhiều pin hơn. Việc bật tính năng này có thể kéo dài tuổi thọ pin của máy bơm, trong khi việc tắt tính năng này có thể kéo dài tuổi thọ pin RileyLink. Cài đặt này bị bỏ qua đối với các kiểu máy bơm khác."; /* Value string for MySentry config when MySentry is not being used */ -"No" = "No"; +"No" = "Không"; /* Message display when no response from tuning pump */ "No response" = "Không có phản hồi nào"; @@ -123,7 +123,8 @@ "No, Keep Pump As Is" = "Không, Giữ nguyên máy bơm"; /* Pump find device instruction */ -"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device"; +"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "Trên máy bơm của bạn, hãy đi tới \"Find Device\". Chọn Main Menu >\Utilities >\\Connect Devices >\\Other Devices >\\On >\\Find Device. +Bơm sẽ tìm thấy chỉ định"; /* navigation title for pump battery type selection Text for medtronic pump preferred data source */ @@ -164,7 +165,7 @@ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Title text for insulin type confirmation page */ -"Select the type of insulin that you will be using in this pump." = "Select the type of insulin that you will be using in this pump."; +"Select the type of insulin that you will be using in this pump." = "Chọn loại insulin bạn sẽ sử dụng trong máy bơm này."; /* Progress message for sending button press to pump. */ "Sending button press…" = "Đang gửi nút bấm…"; @@ -185,13 +186,13 @@ "Suspending" = "Đang tạm ngưng"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* Title for pod sync time action sheet. */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Đã phát hiện thay đổi thời gian"; /* The label indicating the results of each frequency trial */ "Trials" = "Các thử nghiệm"; @@ -203,7 +204,7 @@ "U/hr" = "U/giờ"; /* Text to indicate battery percentage is unknown */ -"unknown" = "unknown"; +"unknown" = "không xác định"; /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Không nhận ra"; @@ -211,10 +212,10 @@ /* Description for option to use MySentry navigation title for pump battery type selection Text for medtronic pump to use MySentry */ -"Use MySentry" = "Use MySentry"; +"Use MySentry" = "Sử dụng MySentry"; /* Value string for MySentry config when MySentry is being used */ "Yes" = "Có"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 06b51f615f..7486629962 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -9,70 +9,70 @@ "Multiple Command Alert" = "Multiple Command Alert"; /* Alert content title for userPodExpiration pod alert */ -"Pod Expiration Reminder" = "Pod Expiration Reminder"; +"Pod Expiration Reminder" = "Lời Nhắc Pod Hết hạn"; /* Alert content title for podExpiring pod alert */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Tiếp tục lại việc tiêm insulin"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod ghép nối không thành công"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* Alert content body for multiCommand pod alert */ "Multiple Command Alert" = "Multiple Command Alert"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod sẽ hết hạn trong: %1$@."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Thay pod ngay. Pod đã hoạt động 72 giờ qua."; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Thay pod ngay. Insulin sẽ ngừng trong 1 giờ tới."; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin hoặc ít hơn còn lại trong Pod. Thay Pod ngay."; /* Alert content body for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Thời gian tạm ngưng insulin đã kết thúc.\n\n Bạn có thể phục hồi việc tiêm thuốc từ màn hình chính hoặc từ màn hình cài đặt bơm. Sẽ có thông báo nhắc trong vòng 15 phút."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Đề nghị hoàn thành ghép đôi pod."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Thời gian trên bơm khác so với thời gian thực tế. Bạn có thể xem thời gian trên bơm và sync thời gian hiện hành trong cài đặt."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Thời gian tạm dừng hết. Mở ứng dụng và tiếp tục lại."; /* Action button default text for PodAlerts */ "Ok" = "Ok"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod hết hạn"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* */ "Notification Settings" = "Cài đặt thông báo"; @@ -81,422 +81,422 @@ "Confidence Reminders" = "Confidence Reminders"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Tạm dừng insulin"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod đã hết hạn"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Kết nối Pod."; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Đang ghép đôi."; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Đang priming. Xin chờ."; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod ghép đôi thành công. Tiếp tục."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "ngày"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "ngày"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "giờ"; /* Unit for plural hours in pod life remaining */ "hours" = "giờ"; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "phút"; /* Unit for plural minutes in pod life remaining */ "minutes" = "phút"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Khối lượng tiêm insulin"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Section header for activity section */ -"Activity" = "Activity"; +"Activity" = "Hoạt động"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Chi tiết thiết bị"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod đã hết hạn"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Pod life HUD view label */ -"Fault" = "Fault"; +"Fault" = "Lỗi"; /* Label describing pod age view */ "Pod Age" = "Pod Age"; /* Label describing time remaining view */ -"Remaining" = "Remaining"; +"Remaining" = "Đang còn lại"; /* Label indicating pod replacement necessary */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "Không có pod nào được kết nối"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod đã được ghép đôi"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Loại insulin chưa được khai báo"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; +"Pod is not in a state ready for cannula insertion." = "Pod không sẵn sàng để gắn cannula."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Cài đặt không tồn tại"; /* Recovery suggestion shown when no pod is paired */ -"Please pair a new pod" = "Please pair a new pod"; +"Please pair a new pod" = "Đề nghị ghép đôi pod mới"; /* Generic title of the OmniBLE pump manager */ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Câu lệnh có vấn đề"; /* */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Hoàn tất ghép đôi"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Status highlight message for emptyReservoir alarm. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pod Occlusion"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Liều Basal thủ công"; /* */ -"Insert Cannula" = "Insert Cannula"; +"Insert Cannula" = "Thay Cannula"; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Đang gắn..."; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "Thử lại"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Đang kiểm tra..."; /* */ -"Check cannula insertion finished" = "Check cannula insertion finished"; +"Check cannula insertion finished" = "Kiểm tra việc gắn cannula hoàn tất"; /* */ -"Get pod status" = "Get pod status"; +"Get pod status" = "Lấy thông tin pod"; /* */ -"Save Basal Profile" = "Save Basal Profile"; +"Save Basal Profile" = "Lưu profile basal"; /* */ -"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; +"Save basal profile failed: %{public}@" = "Lưu profile basal gặp lỗi: %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; +"Skipping Play Test Beeps due to bolus still in progress." = "Bỏ qua việc kiểm tra bíp do đang thực hiện liều bolus."; /* */ -"Play Test Beeps" = "Play Test Beeps"; +"Play Test Beeps" = "Kiểm tra bíp"; /* */ -"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; +"Skipping Read Pulse Log due to bolus still in progress." = "Bỏ qua nhật ký đọc xung do liều bolus chưa hoàn thành."; /* */ -"Read Pulse Log" = "Read Pulse Log"; +"Read Pulse Log" = "Đọc nhật ký do xung"; /* */ -"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; +"Set Confirmation Beeps to %s" = "Cài đặt tiếng Bíp mức %s"; /* */ -"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; +"Set Confirmation Beeps Preference" = "Cài đặt tiếng Bíp"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* */ -"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; +"Failed to suspend: %{public}@" = "Tạm ngưng thất bại: %{public}@"; /* */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* */ "Bolus" = "Liều bolus"; /* */ -"Cancel Bolus" = "Cancel Bolus"; +"Cancel Bolus" = "Hủy bỏ liều bolus"; /* Alert acknowledgment OK button */ "OK" = "OK"; /* The title for Empty Reservoir alarm notification */ -"Empty Reservoir" = "Empty Reservoir"; +"Empty Reservoir" = "Hết thuốc"; /* The title for Occlusion alarm notification */ -"Occlusion Detected" = "Occlusion Detected"; +"Occlusion Detected" = "Phát hiện tắc nghẽn"; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Pod lỗi nghiêm trọng"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Cài đặt liều nền tạm thời"; /* Section header for activity section */ -"Activity" = "Activity"; +"Activity" = "Hoạt động"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* Title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Pod trước"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Thời gian của Bơm"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian của bơm..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Chuyển đổi sang bơm khác"; /* Title for pod sync time action sheet. */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Không, Giữ nguyên"; /* Title for Omnipod DASH PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Thay bơm"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; +"Are you sure you want to stop using Omnipod DASH?" = "Bạn có chắc muốn dừng sử dụng Omnipod DASH?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Delete Omnipod DASH"; +"Delete Omnipod DASH" = "Xóa Omnipod DASH"; /* Text for confidence reminders navigation link" */ -"Insulin Type" = "Insulin Type"; +"Insulin Type" = "Loại Insulin"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Title for suspend duration selection action sheet */ -"Suspend Delivery" = "Suspend Delivery"; +"Suspend Delivery" = "Tạm ngưng liều insulin"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Việc tiêm insulin sẽ bị dừng cho đến khi bạn tiếp tục theo cách thủ công. Vậy khi nào bạn muốn Loop nhắc bạn tiếp tục tiêm?"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 phút"; /* Button text for 1 hour suspend duration" */ -"1 hour" = "1 hour"; +"1 hour" = "1 giờ"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 giờ 30 phút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Không thể tiêm insulin trở lại"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Không thể cài đặt thời gian cho bơm"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Không thể hủy liều basal thủ công"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, gỡ bỏ pod ra khỏi cơ thể và ghép nối pod mới."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, bạn có thể ghép nối pod mới."; /* Deactivate pod action button */ -"Deactivate Pod" = "Deactivate Pod"; +"Deactivate Pod" = "Hủy kích hoạt Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Đang hủy kích hoạt."; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod hủy kích hoạt thành công. Tiếp tục."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "Thử lại"; /* Action button description when deactivated */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Đã xảy ra sự cố khi giao tiếp với Pod. Nếu sự cố này vẫn tiếp diễn, hãy nhấn vào Discard Pod. Sau đó, bạn có thể kích hoạt Pod mới."; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Loại bỏ pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Gỡ pod khỏi cơ thể"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod có thể đang tiêm insulin.\n Gỡ pod khỏi người sau đó nhấn \"Continue.\""; /* Insulin Unit */ "U" = "U"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng khi pod hết hạn 8 giờ tới hoặc khi không còn insulin."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Dùng loại insulin U-100."; /* Label text for step 2 of pair pod instructions */ -"Listen for 2 beeps." = "Listen for 2 beeps."; +"Listen for 2 beeps." = "Nghe 2 tiếng bíp."; /* Label text indicating pairing finished.*/ -"Paired" = "Paired"; +"Paired" = "Đã ghép đôi"; /* Cancel button text in navigation bar on pair pod UI */ "Cancel" = "Bỏ qua"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Bạn có chắc chắn muốn hủy cấu hình pod?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Nếu bạn hủy cấu hình pod, pod hiện tại sẽ bị hủy kích hoạt và sẽ không sử dụng được nữa."; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Có, hủy kích hoạt pod"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Không, tiếp tục"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Chuẩn bị vị trí."; /* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; /* Action button title for attach pod view */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* */ "Attach Pod" = "Attach Pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Xác nhận pod đã gắn chặt"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Confirm” khi Pod đã gắn chặt."; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Xác nhận"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Chạm phía dưới để bắt đầu gắn cannula."; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Đã gắn"; /* Check Cannula */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Việc gắn cannual chuẩn chưa?"; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Ô vuông trên đầu của pod sẽ nháy đỏ khi cannual được gắn chuẩn vào trong cơ thể."; /* Button label for user to answer cannula was properly inserted */ "Yes" = "Có"; @@ -505,19 +505,19 @@ "No" = "Không"; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Đang ghép đôi..."; /* Pod pairing action button text while priming */ "Priming..." = "Priming..."; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; /* Pod state when pod has been deactivated */ -"Deactivated" = "Deactivated"; +"Deactivated" = "Đã hủy kích hoạt"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Pod đã sẵn sàng hoạt động.\n\n%1$@ sẽ nhắc nhở bạn thay đổi khi pod hết hạn. Bạn có thể thay khi nào tiện."; /* */ "Scheduled Reminder" = "Scheduled Reminder"; @@ -526,52 +526,52 @@ "Time" = "Thời gian"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Hoàn thành cài đặt"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Thiết lập xong"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; /* Error message description for PeripheralManagerError.notReady */ -"Peripheral Not Ready" = "Peripheral Not Ready"; +"Peripheral Not Ready" = "Thiết bị ngoại vi chưa sẵn sàng"; /* Error message description for PeripheralManagerError.incorrectResponse */ -"Incorrect Response" = "Incorrect Response"; +"Incorrect Response" = "Phản hồi không chuẩn"; /* Error message description for PeripheralManagerError.timeout */ -"Timeout" = "Timeout"; +"Timeout" = "Hết thời gian"; /* Error message description for PeripheralManagerError.emptyValue */ -"Empty Value" = "Empty Value"; +"Empty Value" = "Giá trị trống"; /* Error message description for PeripheralManagerError.unknownCharacteristic */ -"Unknown Characteristic" = "Unknown Characteristic"; +"Unknown Characteristic" = "Đặc điểm không xác định"; /* Error message description for PeripheralManagerError.nack */ -"Nack" = "Nack"; +"Nack" = "Không có gì"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Lời nhắc của Omnipod"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Ứng dụng cấu hình lời nhắc trên pod để thông báo trước cho bạn khi pod hết hạn. Đặt số giờ bạn muốn cấu hình khi ghép nối pod mới."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Đây là lời nhắc mà bạn đã lên lịch khi ghép nối Pod hiện tại của mình."; /* */ "Scheduled Reminder" = "Scheduled Reminder"; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Ứng dụng nhắc nhở bạn khi lượng insulin trong pod đạt đến mức này."; /* Description text for critical alerts */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Cảnh báo nghiêm trọng"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Lời nhắc ở trên sẽ không phát ra âm thanh nếu thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb.\n\n Có nhiều cách cảnh báo khác nhau phát ra âm thanh ngay cả khi thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb."; /* navigation title for notification settings */ "Notification Settings" = "Cài đặt thông báo"; @@ -582,30 +582,30 @@ "No Reminder" = "No Reminder"; /* Label for low reservoir reminder row */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Title string for BeepPreference.manualCommands */ -"Enabled" = "Enabled"; +"Enabled" = "Cho phép"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for temporary basal rate summary */ "Rate" = "Tỷ lệ"; @@ -614,54 +614,54 @@ "U/hr" = "U/hr"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Không\n Tiêm"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* description label for device name pod details row */ -"Device Name" = "Device Name"; +"Device Name" = "Tên thiết bị"; /* description label for lot number pod details row */ -"Lot Number" = "Lot Number"; +"Lot Number" = "Số Lô"; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Số thứ tự"; /* description label for firmware version pod details row */ "Firmware Version" = "Firmware Version"; @@ -670,153 +670,153 @@ "BLE Firmware Version" = "BLE Firmware Version"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Trạng thái cuối"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Thông tin lỗi Pod"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Cấu hình Pod"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy bỏ"; /* Text for continue button on PodSetupView */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* Are you sure you want to skip Omnipod Onboarding? */ "Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Ứng dụng sẽ thông báo trước cho bạn thời gian pod hết hạn.\n\n Kéo xuống để thiết lập số giờ để ứng dụng thông báo."; /* Text of continue button on ExpirationReminderSetupView" */ -"Next" = "Next"; +"Next" = "Kế tiếp"; /* */ "Expiration Reminder" = "Expiration Reminder"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* */ "Save" = "Lưu"; /* hr (short for hour) */ -"hr" = "hr"; +"hr" = "giờ"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Hủy bỏ liều basal thủ công"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Đảm bảo rằng Pod của bạn đang ở gần và thử lại."; /* Error message shown when the pod is not connected */ -"Pod not connected" = "Pod not connected"; +"Pod not connected" = "Pod chưa được kết nối"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Tạm ngưng tại"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Không tìm thấy Pod"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Phát hiện quá nhiều pod"; /* Recovery suggestion when no response is received from pod */ -"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; +"Make sure iPhone is nearby the active pod" = "Đảm bảo rằng iPhone gần với pod đang kích hoạt"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Thử lại"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Chuyển pod đến vị trí mới và thử lại."; /* Recovery suggestion for PodCommsError.noPodsFound */ -"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; +"Make sure your pod is filled and nearby." = "Đảm bảo pod đã chứa đầy thuốc và gần bên."; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; +"Please reposition iPhone further from the pod" = "Đặt iPhone xa khỏi pod"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; +"Please reposition iPhone relative to the pod" = "Đặt iPhone lại gần pod"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Chỉ mang pod gốc trong phạm vi hoạt động hoặc hủy kích hoạt pod gốc"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Có nhiễu xuyên âm. Vui lòng di chuyển đến địa điểm mới"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Đảm bảo rằng Pod của bạn đang ở gần và thử lại."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liều bolus hiện tại hoàn tất hoặc hủy liều bolus"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liều bolus hiện tại hoàn tất hoặc hủy liều bolus"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Chờ đợi liều basal tạm thời hoàn tất hoặc chọn ngưng để hủy"; /* DASH Pod time ago since last status */ "%@ ago" = "%@ trước đó"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Im lặng"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Chế độ hoạt động bình thường trong đó tiếng bíp của Pod được dùng cho mọi cảnh báo của Pod và khi lời nhắc được bật."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tất cả các cảnh báo của Pod đều không sử dụng tiếng bíp và tiếng bíp nhắc nhở sẽ bị chặn. Pod sẽ chỉ phát ra tiếng bíp khi Pod gặp lỗi nghiêm trọng và khi thực hiện kiểm tra tiếng bíp.\n\n⚠️Cảnh báo - Bất cứ khi nào Pod ở chế độ im lặng, nó phải được đặt trong phạm vi hoạt động của Bluetooth để nhận thông báo về các cảnh báo của Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Chế độ Silence Pod sẽ chặn tất cả tiếng bíp và lời nhắc nhở."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Pod im lặng"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Các thông tin của Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Thông tin của Pod trước đó"; /* Text for pump manager details navigation link */ "Pump Manager Details" = "Pump Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Pump Manager..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Làm mới Pump Manager Details"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Chẩn đoán"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Đọc tình trạng pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 95e5232e61..97e98360f9 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -1,27 +1,27 @@ /* Description for an inactive alert modifier */ -" (inactive)" = " (inactive)"; +" (inactive)" = " (không hoạt động)"; /* Format string for low battery alert body for RileyLink. (1: device name) */ -"\"%1$@\" has a low battery" = "\"%1$@\" has a low battery"; +"\"%1$@\" has a low battery" = "\"%1$@\" gần hết pin"; /* Unit format string for an RSSI value in decibles */ "%@ dB" = "%@ dB"; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin hoặc ít hơn còn lại trong Pod. Thay Pod ngay."; /* Format string for activation time exceeded Pod state when activation not completed in the time allowed */ -"Activation time exceeded" = "Activation time exceeded"; +"Activation time exceeded" = "Đã quá thời gian kích hoạt"; /* Description for auto-off */ -"Auto-off" = "Auto-Off"; +"Auto-off" = "Tự động tắt"; /* Description for auto-off alarm */ -"Auto-off alarm" = "Auto-off alarm"; +"Auto-off alarm" = "Tự động tắt cảnh báo"; /* Pod state when basal initialized */ -"Basal initialized" = "Basal initialized"; +"Basal initialized" = "Liều basal được khởi tạo"; /* Pod state when running below fifty units */ "Below 50 units" = "Dưới 50 units"; @@ -48,37 +48,37 @@ "Certain" = "Chắc chắn"; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Thay pod ngay. Insulin sẽ ngừng trong 1 giờ tới."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Thay pod ngay. Pod đã hoạt động 72 giờ qua."; /* Format string for invalid message error code (1: error code number) */ -"Command error %1$u" = "Command error %1$u"; +"Command error %1$u" = "Câu lệnh lỗi %1$u"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Câu lệnh có vấn đề"; /* Error message when command is rejected because an unacknowledged command is pending. */ -"Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; +"Communication issue: Unacknowledged command pending." = "Sự cố giao tiếp: Lệnh chưa được xác nhận đang chờ xử lý."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Pod lỗi nghiêm trọng"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Có nhiễu xuyên âm. Vui lòng di chuyển đến địa điểm mới"; /* Pod state when pod has been deactivated */ "Deactivated" = "Đã hủy kích hoạt"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Description for Empty reservoir pod fault */ "Empty reservoir" = "Ngăn chứa insulin rỗng"; @@ -93,43 +93,43 @@ "Expiration alert" = "Thông báo hết hạn"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Delivery status when extended bolus is running */ -"Extended bolus running" = "Extended bolus running"; +"Extended bolus running" = "Mở rộng chạy liều bolus"; /* Delivery status when extended bolus and temp basal is running */ -"Extended bolus running with temp basal" = "Extended bolus running with temp basal"; +"Extended bolus running with temp basal" = "Mở rộng chạy liều bolus với liều nền tạm thời"; /* Pod state when fault event has occurred */ -"Fault event occurred" = "Fault event occurred"; +"Fault event occurred" = "Đã có lỗi"; /* Status highlight that when pod is deactivating. */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Status highlight that when pod is activating. */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Hoàn tất ghép đôi"; /* Description for finish setup */ "Finish setup " = "Hoàn tất cấu hình"; /* Description for finish setup reminder */ -"Finish setup reminder" = "Finish setup reminder"; +"Finish setup reminder" = "Hoàn tất thiết lập lời nhắc"; /* Pod inititialized */ "Initialized" = "Đã được khởi tạo"; /* Pod state when inserting cannula */ -"Inserting cannula" = "Inserting cannula"; +"Inserting cannula" = "Thay cannula"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Loại insulin chưa được khai báo"; /* The format string for Internal pod fault (1: The fault code value) */ "Internal pod fault %1$03d" = "Lỗi bên trong pod %1$03d"; @@ -138,28 +138,28 @@ "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@"; /* Error message for when unexpected address is received (1: received address) (2: expected address) */ -"Invalid address 0x%x. Expected 0x%x" = "Invalid address 0x%x. Expected 0x%x"; +"Invalid address 0x%x. Expected 0x%x" = "Địa chỉ không tồn tại 0x%x. Dự kiến 0x%x"; /* Description for MessageError invalidAddress */ -"Invalid address: (%1$@)" = "Invalid address: (%1$@)"; +"Invalid address: (%1$@)" = "Địa chỉ không tồn tại: (%1$@)"; /* Description for MessageError invalidCrc */ -"Invalid CRC" = "Invalid CRC"; +"Invalid CRC" = "CRC không tồn tại"; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Cài đặt không tồn tại"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Format string for description for low reservoir advisory (1: reminder units) */ -"Low reservoir advisory (%1$gU)" = "Low reservoir advisory (%1$gU)"; +"Low reservoir advisory (%1$gU)" = "Báo động hết thuốc (%1$gU)"; /* Description for low reservoir alarm */ "Low reservoir advisory alarm" = "Báo động ngăn chứa insulin thấp"; /* Title for RileyLink low battery alert */ -"Low RileyLink Battery" = "Low RileyLink Battery"; +"Low RileyLink Battery" = "Báo động pin RileyLink thấp"; /* Recovery suggestion when no RileyLink is available */ "Make sure your RileyLink is nearby and powered on" = "Đảm bảo RileyLink bên cạnh và đã được bật"; @@ -168,10 +168,10 @@ "Manual Basal" = "Liều Basal thủ công"; /* Pod memory initialized */ -"Memory initialized" = "Memory initialized"; +"Memory initialized" = "Bộ nhớ được khởi tạo"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Chuyển pod đến vị trí mới và thử lại."; /* Alert content body for multiCommand pod alert Alert content title for multiCommand pod alert */ @@ -181,23 +181,23 @@ "No alerts" = "Không có cảnh báo nào"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for Fault Event Code .noFaults */ -"No faults" = "No faults"; +"No faults" = "Không có lỗi"; /* Status highlight message for emptyReservoir alarm. Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Error message shown when no pod is paired */ "No pod paired" = "Không có pod nào được kết nối"; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Không tìm thấy Pod"; /* Error message shown when no response from pod was received */ "No response from pod" = "Không có tín hiệu phản hồi từ pod"; @@ -210,10 +210,10 @@ "Normal" = "Bình thường"; /* Description for MessageError notEnoughData */ -"Not enough data" = "Not enough data"; +"Not enough data" = "Không đủ dữ liệu"; /* Description for Occlusion detected pod fault */ -"Occlusion detected" = "Occlusion detected"; +"Occlusion detected" = "Phát hiện tắc nghẽn"; /* Generic title of the omnipod pump manager */ "Omnipod" = "Omnipod"; @@ -222,28 +222,28 @@ "Paired" = "Đã được ghép đôi"; /* Pod status when pairing completed */ -"Pairing completed" = "Pairing completed"; +"Pairing completed" = "Ghép đôi hoàn thành"; /* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ -"Parsing Error: %1$@ in (%2$@)" = "Parsing Error: %1$@ in (%2$@)"; +"Parsing Error: %1$@ in (%2$@)" = "Lỗi cú pháp: %1$@ in (%2$@)"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Chỉ mang pod gốc trong phạm vi hoạt động hoặc hủy kích hoạt pod gốc"; /* Recovery suggestion when no response is received from pod */ "Please bring your pod closer to the RileyLink and try again" = "Đề nghị để pod gần với Rileylink và thử lại lần nữa"; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Đề nghị hoàn thành ghép đôi pod."; /* Recover suggestion shown when no pod is paired */ "Please pair a new pod" = "Đề nghị ghép đôi pod mới"; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition the RileyLink further from the pod" = "Please reposition the RileyLink further from the pod"; +"Please reposition the RileyLink further from the pod" = "Đặt RileyLink xa khỏi pod"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition the RileyLink relative to the pod" = "Please reposition the RileyLink relative to the pod"; +"Please reposition the RileyLink relative to the pod" = "Đặt RileyLink lại gần pod"; /* Error message shown when user cannot pair because pod is already paired */ "Pod already paired" = "Pod đã được ghép đôi"; @@ -252,7 +252,7 @@ "Pod already primed" = "Pod đã được mồi"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Description for expiration advisory alarm */ "Pod expiration advisory alarm" = "Cảnh báo pod hết hạn"; @@ -264,7 +264,7 @@ "Pod expired" = "Pod đã hết hạn"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod sẽ hết hạn trong: %1$@."; /* Format string for pod fault code */ "Pod Fault: %1$@" = "Pod lỗi: %1$@"; @@ -282,26 +282,26 @@ "Pod Occlusion" = "Pod Occlusion"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod ghép nối không thành công"; /* Error message shown when pod sends ack instead of response */ -"Pod sent ack instead of response" = "Pod sent ack instead of response"; +"Pod sent ack instead of response" = "Pod gửi ack thay vì phản hồi"; /* Pod state when prime or cannula insertion has not completed in the time allotted */ "Pod setup window expired" = "Cửa sổ cấu hình pod hết hạn"; /* Description for pod suspended reminder */ -"Pod suspended reminder" = "Pod suspended reminder"; +"Pod suspended reminder" = "Lời nhắc Pod tạm dừng"; /* Format string for poor pod signal strength */ -"Poor signal strength" = "Poor signal strength"; +"Poor signal strength" = "Tín hiệu yếu"; /* Delivery status when pod is priming Pod status when priming */ "Priming" = "Đang mồi"; /* Pod state when priming completed */ -"Priming completed" = "Priming completed"; +"Priming completed" = "Priming hoàn tất"; /* Pod state when ready for basal programming */ "Ready for basal programming" = "Sẵn sàng cho việc tính toán liều basal"; @@ -310,16 +310,16 @@ "Ready to insert cannula" = "Sẵn sàng cho việc gắn cannula"; /* Pod pairing reminder initialized */ -"Reminder initialized" = "Reminder initialized"; +"Reminder initialized" = "Lời nhắc đã được khởi tạo"; /* Pump Event title for UnfinalizedDose with doseType of .resume */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* Recovery suggestion when pod is suspended */ -"Resume delivery" = "Resume delivery"; +"Resume delivery" = "Tiếp tục lại việc tiêm insulin"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Tiếp tục lại việc tiêm insulin"; /* The format string describing a resume. (1: Time)(2: Scheduled certainty */ "Resume: %1$@ %2$@" = "Tái lập: %1$@ %2$@"; @@ -328,26 +328,26 @@ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Description for shutdown imminent */ -"Shutdown imminent" = "Shutdown imminent"; +"Shutdown imminent" = "Tắt báo động sắp xảy ra"; /* Description for shutdown imminent alarm */ "Shutdown imminent alarm" = "Tắt báo động sắp xảy ra"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* Format string for pod signal strength too high */ -"Signal strength too high" = "Signal strength too high"; +"Signal strength too high" = "Sóng tín hiệu quá cao"; /* Pump Event title for UnfinalizedDose with doseType of .suspend */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* Alert content body for suspendInProgress pod alert Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Description for suspend time expired */ -"Suspend time expired" = "Suspend time expired"; +"Suspend time expired" = "Thời gian tạm dừng hết hạn"; /* Delivery status when insulin delivery is suspended */ "Suspended" = "Đã tạm ngưng"; @@ -359,7 +359,7 @@ "Suspended" = "Đã tạm ngưng"; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Thời gian tạm dừng hết. Mở ứng dụng và tiếp tục lại."; /* Pod tank fill completed */ "Tank fill completed" = "Hoàn tất nạp"; @@ -380,31 +380,31 @@ "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ U/giờ %2$@ %3$@ %4$@ U %5$@"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Thời gian tạm ngưng insulin đã kết thúc.\n\n Bạn có thể phục hồi việc tiêm thuốc từ màn hình chính hoặc từ màn hình cài đặt bơm. Sẽ có thông báo nhắc trong vòng 15 phút."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Thời gian trên bơm khác so với thời gian thực tế. Bạn có thể xem thời gian trên bơm và sync thời gian hiện hành trong cài đặt."; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* The format string for pod expiration notification body (1: time until expiration) */ "Time to replace your pod! Your pod will expire in %1$@" = "Thời gian thay pod của bạn! Pod của bạn sẽ hết hạn trong %1$@"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Phát hiện quá nhiều pod"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Thử lại"; /* String describing a dose that was possibly scheduled */ "Uncertain" = "Không chắc chắn"; /* Description for MessageError invalidSequence */ -"Unexpected message sequence number" = "Unexpected message sequence number"; +"Unexpected message sequence number" = "Thứ tự tin nhắn không mong đợi"; /* Format string for unexpected pod change */ -"Unexpected pod change" = "Unexpected pod change"; +"Unexpected pod change" = "Không mong đợi thay thế pod"; /* Error message shown when empty response from pod was received */ "Unexpected response from pod" = "Phản hồi bất thường từ pod"; @@ -413,10 +413,10 @@ "Unknown pod fault %1$03d" = "Lỗi không xác định của pod %1$03d"; /* Format string for description of MessageError unknownValue. (1: value) (2: Type) */ -"Unknown Value (%1$@) for type %2$@" = "Unknown Value (%1$@) for type %2$@"; +"Unknown Value (%1$@) for type %2$@" = "Giá trị không xác định (%1$@) cho loại %2$@"; /* Format string for description of MessageError validationFailed. (1: description of validation failure) */ -"Validation failed: %1$@" = "Validation failed: %1$@"; +"Validation failed: %1$@" = "Xác thực không thành công: %1$@"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ "Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liệu bolus hiện tại hoàn tất hoặc hủy liều bolus"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 32fb5c3821..76c78eb3c0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -8,7 +8,7 @@ "%@ dB" = "%@ dB"; /* No comment provided by engineer. */ -"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now."; +"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ đã khôi phục liên lạc với pod trên cơ thể bạn.\n\nHồ sơ tiêm insulin đã được cập nhật và phải khớp với việc tiêm thực sự.\n\nBạn có thể tiếp tục sử dụng %@ một cách bình thường ngay bây giờ."; /* Format string for delivered insulin. (1: The localized amount) Format string for insulin remaining in reservoir. (1: The localized amount) */ @@ -30,16 +30,16 @@ "%@%%" = "%@%%"; /* Format string for reservoir reading when above or equal to maximum reading. (1: The localized amount) */ -"%@+ U" = "%@+ U"; +"%@+ U" = "%@ U"; /* Format string for reservoir volume. (1: The localized volume) */ "%@U" = "%@U"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ -"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display."; +"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ đã không thể giao tiếp với pod trên cơ thể bạn kể từ %2$@.\n\nNếu không liên lạc với pod, ứng dụng không thể tiếp tục gửi lệnh tiêm insulin hoặc hiển thị thông tin chính xác, các thông tin gần đây về insulin đang hoạt động của bạn hoặc insulin được Pod tiêm.\n\nTheo dõi chặt chẽ lượng glucose của bạn trong 6 giờ tiếp theo hoặc hơn, vì có thể có hoặc không có insulin hoạt động tích cực trong cơ thể bạn mà %3$@ không thể hiển thị."; /* Accessibility format string for (1: localized volume)(2: time) */ "%1$@ units remaining at %2$@" = "%1$@ units vẫn đang còn lúc %2$@"; @@ -51,22 +51,22 @@ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; /* Format string for reservoir level above max measurable threshold. (1: measurable reservoir threshold) (2: units) */ -"%1$@+ %2$@" = "%1$@+ %2$@"; +"%1$@+ %2$@" = "%1$@ %2$@"; /* Format string for total delivery on pod details screen */ "%g U" = "%g U"; /* Button text for 1 hour suspend duration */ -"1 hour" = "1 hour"; +"1 hour" = "1 giờ"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 giờ 30 phút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 phút"; /* The title of the cell showing the pod activated at time */ "Active Time" = "Thời gian Hoạt động"; @@ -75,19 +75,19 @@ "Activity" = "Hoạt động"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian của bơm..."; /* The title of the cell showing alarm status */ "Alarms" = "Cảnh báo"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Bạn có chắc chắn muốn hủy cấu hình pod?"; /* Confirmation message for shutting down a pod */ "Are you sure you want to shutdown this pod?" = "Bạn có chắc muốn tắt pod này?"; /* No comment provided by engineer. */ -"Are you sure you want to skip Omnipod Onboarding?" = "Are you sure you want to skip Omnipod Onboarding?"; +"Are you sure you want to skip Omnipod Onboarding?" = "Bạn có chắc muốn bỏ qua?"; /* Confirmation message for removing Omnipod PumpManager */ "Are you sure you want to stop using Omnipod?" = "Bạn có chắc muốn dừng sử dụng Omnipod?"; @@ -99,10 +99,10 @@ "Attach Pod" = "Attach Pod"; /* Description string above progress indicator while attempting to re-establish communication from an unacknowledged command */ -"Attemping to re-establish communication" = "Attemping to re-establish communication"; +"Attemping to re-establish communication" = "Đang cố gắng thiết lập lại giao tiếp"; /* Back button text on DeliveryUncertaintyRecoveryView */ -"Back" = "Back"; +"Back" = "Quay Lại"; /* The title of the cell showing pod basal status */ "Basal Delivery" = "Liều tiêm basal"; @@ -117,16 +117,16 @@ "Cancel" = "Hủy bỏ"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Hủy bỏ liều basal thủ công"; /* Insert cannula action button accessibility label when cannula insertion succeeded */ -"Cannula inserted successfully. Continue." = "Cannula inserted successfully. Continue."; +"Cannula inserted successfully. Continue." = "Cannula gắn thành công. Tiếp tục."; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng khi pod hết hạn 8 giờ tới hoặc khi không còn insulin."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* The title of the command to change pump time zone */ "Change Time Zone" = "Thay đổi múi giờ"; @@ -135,43 +135,43 @@ "Changing time…" = "Đang thay đổi giờ…"; /* Title for check cannula screen */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; /* Insert cannula action button accessibility label checking insertion */ -"Checking Insertion" = "Checking Insertion"; +"Checking Insertion" = "Kiểm tra việc gắn"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Đang kiểm tra..."; /* Title for uncertainty recovered screen */ "Comms Recovered" = "Comms Recovered"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Lời nhắc độ tin cậy"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Lời nhắc là những tiếng bíp từ Pod có thể được sử dụng để xác nhận các lệnh đã chọn khi Pod không ở chế độ im lặng."; /* The title of the configuration section in settings */ "Configuration" = "Cấu hình"; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Xác nhận"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Xác nhận pod đã gắn chặt"; /* The title of the continue action in an action sheet */ "Continue" = "Tiếp tục"; /* Title for critical alerts description */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Cảnh báo nghiêm trọng"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "ngày"; /* Unit for plural days in pod life remaining */ "days" = "days"; @@ -187,10 +187,10 @@ "Deactivated" = "Đã hủy kích hoạt"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Đang hủy kích hoạt."; /* Action button description while deactivating */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; /* Button title to delete Omnipod PumpManager */ "Delete Omnipod" = "Xóa Omnipod"; @@ -200,7 +200,7 @@ /* Text for device details disclosure row title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Chi tiết thiết bị"; /* The title of the device information section in settings */ "Device Information" = "Thông tin thiết bị"; @@ -213,7 +213,7 @@ /* Pairing interface navigation bar button text for discard pod action Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Loại bỏ pod"; /* No comment provided by engineer. */ "Done" = "Hoàn thành"; @@ -249,16 +249,16 @@ "Expires" = "Hết hạn"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Không thể hủy liều basal thủ công"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Không thể tiêm insulin trở lại"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Không thể cài đặt thời gian cho bơm"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for error when updating confidence reminder preference */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; @@ -267,34 +267,34 @@ "Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; /* Alert title for error when updating low reservoir reminder */ -"Failed to Update Low Reservoir Reminder" = "Failed to Update Low Reservoir Reminder"; +"Failed to Update Low Reservoir Reminder" = "Thất bại cập nhật lời nhắc gần hết thuốc"; /* Pod life HUD view label */ "Fault" = "Lỗi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Dùng loại insulin U-100 cho pod. Lắng nghe 2 tiếng bíp."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* The title of the command to finish pod setup */ "Finish pod setup" = "Hoàn tất thiết lập pod"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Hoàn thành cài đặt"; /* Accessibility format string for (1: localized volume)(2: time) */ "Greater than %1$@ units remaining at %2$@" = "Nhiều hơn %1$@ units vẫn còn lúc %2$@"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "giờ"; /* Unit for plural hours in pod life remaining */ "hours" = "giờ"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Nếu bạn hủy cấu hình pod, pod hiện tại sẽ bị hủy kích hoạt và sẽ không sử dụng được nữa."; /* Instructions when deactivating pod that has been paired, but not attached. */ "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Thiết lập pod không hoàn thành phải được hủy rước khi tiến hành ghép đôi pod mới. Đề nghị hủy và loại pod."; @@ -306,77 +306,77 @@ "Insert Cannula" = "Lắp Cannula"; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Đã gắn"; /* Insert cannula action button accessibility label while pairing */ -"Inserting. Please wait." = "Inserting. Please wait."; +"Inserting. Please wait." = "Đang gắn. Chờ chút."; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Đang gắn..."; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* The title of the cell showing delivered insulin */ "Insulin Delivered" = "Insulin đã được tiêm"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Khối lượng tiêm insulin"; /* The action string on pod status page when pod faulted */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Việc tiêm insulin sẽ bị dừng cho đến khi bạn tiếp tục theo cách thủ công. Vậy khi nào bạn muốn Loop nhắc bạn tiếp tục tiêm?"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Text for confidence reminders navigation link Title for insulin type selection screen */ -"Insulin Type" = "Insulin Type"; +"Insulin Type" = "Loại Insulin"; /* The error message shown when Loop's basal schedule has an unsupported rate */ "Invalid entry" = "Lỗi nhập không hợp lệ"; /* Question to confirm the cannula is inserted properly */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Việc gắn cannual chuẩn chưa?"; /* Label text for step 2 of pair pod instructions */ -"Keep the RileyLink about 6 inches from the pod during pairing." = "Keep the RileyLink about 6 inches from the pod during pairing."; +"Keep the RileyLink about 6 inches from the pod during pairing." = "Để Rileylink cách pod 6 inches khi ghép đôi."; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Trạng thái cuối"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* The title of the cell showing the pod lot id */ -"Lot" = "Lot"; +"Lot" = "Lô"; /* description label for lot number pod details row */ -"Lot Number" = "LOT Nummer"; +"Lot Number" = "Số Lô"; /* Label text for low reservoir value row Navigation bar title for LowReservoirReminderSetupView Title for LowReservoirReminderSetupView */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Label for low reservoir reminder row Title for low reservoir reminder edit page */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "phút"; /* Unit for plural minutes in pod life remaining */ "minutes" = "phút"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* String shown on pod details for active time when conversion fails. String shown on pod details for last status date when not available. @@ -384,42 +384,42 @@ "NA" = "NV"; /* Text of continue button on ExpirationReminderSetupView */ -"Next" = "Next"; +"Next" = "Kế tiếp"; /* Button label for user to answer cannula was not properly inserted */ "No" = "Không"; /* Text shown in insulin remaining space when no pod is paired */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Không\n Tiêm"; /* Error message for reservoir view when reservoir empty */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Label for pod life state when no pod paired Text shown in insulin remaining space when no pod is paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Không, tiếp tục"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Không, Giữ nguyên"; /* The detail text for bolus delivery when no bolus is being delivered */ -"None" = "None"; +"None" = "Không"; /* navigation title for notification settings Text for pod details disclosure row */ "Notification Settings" = "Cài đặt thông báo"; /* No comment provided by engineer. */ -"Numbers" = "Numbers"; +"Numbers" = "Số"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Lời nhắc của Omnipod"; /* Button title to pair with pod during setup */ "Pair" = "Ghép đôi"; @@ -431,25 +431,25 @@ Pod pairing action button text while ready to pair Settings page link description when next lifecycle action is to pair new pod Title for pod pairing screen */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Kết nối Pod."; /* Label text indicating pairing finished. */ "Paired" = "Đã được ghép đôi"; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Đang ghép đôi."; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Đang ghép đôi..."; /* No comment provided by engineer. */ -"Percent = %lf" = "Percent = %lf"; +"Percent = %lf" = "Phần trăm = %lf"; /* The title of the cell showing the pod pi version */ -"PI Version" = "PI Version"; +"PI Version" = "Đời PI"; /* The title of the command to play test beeps */ "Play Test Beeps" = "Kiểm tra tiếng Beep"; @@ -458,72 +458,72 @@ "Play Test Beeps…" = "Kiểm tra tiếng Beep…"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Confirm” khi Pod đã gắn chặt."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, bạn có thể ghép nối pod mới."; /* Instructions for deactivate pod when pod is on body */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, gỡ bỏ pod ra khỏi cơ thể và ghép nối pod mới."; /* The title of the cell showing the pod pm version */ -"PM Version" = "PM Version"; +"PM Version" = "Phiên bản PM"; /* description label for activated at time pod details row Label for pod insertion row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* Label describing pod age view */ "Pod Age" = "Pod Age"; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod hủy kích hoạt thành công. Tiếp tục."; /* Error message for reservoir view during general pod fault */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Label for pod life state when within pod expiration window */ "Pod expired" = "Pod đã hết hạn"; /* Error message for reservoir view when pod expired Label for pod expiration row, past tense */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Label for pod expiration row */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod hết hạn"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Thông tin lỗi Pod"; /* Error message for reservoir view when pod occlusion checks failed */ "Pod Occlusion" = "Pod Occlusion"; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod ghép đôi thành công. Tiếp tục."; /* Title of the pod settings view controller */ "Pod Settings" = "Các thiết lập cho pod"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Cấu hình Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Chuẩn bị vị trí."; /* title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Pod trước"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* The text of the loading label when pod is primed */ "Primed" = "Đã được mồi"; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Đang priming. Xin chờ."; /* Pod pairing action button text while priming */ "Priming..." = "Priming..."; @@ -532,7 +532,7 @@ "Priming…" = "Đang mồi…"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Thời gian của Bơm"; /* Label text for basal rate summary */ "Rate" = "Tỷ lệ"; @@ -541,13 +541,13 @@ "Remaining" = "Đang còn lại"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Gỡ pod khỏi cơ thể"; /* Title for Omnipod PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Thay bơm"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -557,13 +557,13 @@ "Replace Pod Now" = "Thay thế pod ngay"; /* The title of the cell showing reservoir status */ -"Reservoir" = "Reservoir"; +"Reservoir" = "Ngăn chứa insulin"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Action button description for deactivate after failed attempt Cannula insertion button text while showing error @@ -574,7 +574,7 @@ "Retry Pod Deactivation" = "Hủy kích hoạt pod lại"; /* bodyText for RileyLinkSetupView */ -"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink allows for communication with the pump over Bluetooth"; +"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink cho phép giao tiếp với bơm thông qua kết nối bluetooth"; /* Navigation title for RileyLinkSetupView */ "RileyLink Setup" = "Cài đặt RileyLink"; @@ -600,22 +600,22 @@ "Scheduled Reminder" = "Scheduled Reminder"; /* Title text for insulin type confirmation page */ -"Select the type of insulin that you will be using in this pod." = "Select the type of insulin that you will be using in this pod."; +"Select the type of insulin that you will be using in this pod." = "Chọn loại insulin bạn sẽ sử dụng cho pod."; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Số thứ tự"; /* Button text for setting manual temporary basal rate */ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Cài đặt liều nền tạm thời"; /* Title for setup complete screen */ "Setup Complete" = "Cấu hình hoàn thành"; /* Error message for reservoir view during general pod fault */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* No comment provided by engineer. */ "Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; @@ -630,37 +630,37 @@ "Suspend Delivery" = "Tạm ngưng liều insulin"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Tạm dừng insulin"; /* The detail text of the basal row when pod is suspended */ "Suspended" = "Đã tạm ngưng"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Tạm ngưng tại"; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Title text for the button to delete Omnipod PumpManager */ "Switch from Omnipod Pumps" = "Chuyển đổ từ bơm Omnipod"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Chuyển đổi sang bơm khác"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Title of button to sync basal profile from pod */ "Sync With Pod" = "Sync với Pod"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Chạm phía dưới để bắt đầu gắn cannula."; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* The title of the command to run the test command */ "Test Command" = "Thử nghiệm câu lệnh"; @@ -669,37 +669,37 @@ "Testing Commands…" = "Thử nghiệm câu lệnh…"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Ứng dụng cấu hình lời nhắc trên pod để thông báo trước cho bạn khi pod hết hạn. Đặt số giờ bạn muốn cấu hình khi ghép nối pod mới."; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Ứng dụng sẽ thông báo trước cho bạn thời gian pod hết hạn.\n\n Kéo xuống để thiết lập số giờ để ứng dụng thông báo."; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Ứng dụng nhắc nhở bạn khi lượng insulin trong pod đạt đến mức này."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Lời nhắc ở trên sẽ không phát ra âm thanh nếu thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb.\n\n Có nhiều cách cảnh báo khác nhau phát ra âm thanh ngay cả khi thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb."; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* description for time change detected notice */ -"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump."; +"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Thời gian của máy bơm sẽ kiểm soát cài đặt trị liệu theo lịch trình của bạn. Cuộn xuống đến Pump Time để xem lại chênh lệch thời gian và cấu hình bơm của bạn."; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Ô vuông trên đầu của pod sẽ nháy đỏ khi cannual được gắn chuẩn vào trong cơ thể."; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Đã xảy ra sự cố khi giao tiếp với Pod. Nếu sự cố này vẫn tiếp diễn, hãy nhấn vào Discard Pod. Sau đó, bạn có thể kích hoạt Pod mới."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Đây là lời nhắc mà bạn đã lên lịch khi ghép nối Pod hiện tại của mình."; /* Alert format string for missing temp basal configuration. */ -"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate."; +"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "Máy bơm này chưa được cấu hình với maximum basal rate vì nó đã được thêm vào trước khi manual temp basal được đưa ra. Vui lòng đi tới Therapy Settings -> Delivery Limites và đặt Maximum Basal Rate mới."; /* Label for expiration reminder row Label for scheduled expiration reminder row @@ -708,7 +708,7 @@ /* Title for pod sync time action sheet. title for time change detected notice */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* No comment provided by engineer. */ "Toggle sign" = "Toggle sign"; @@ -717,7 +717,7 @@ "Too many entries" = "Quá nhiều mục"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* Units for showing temp basal rate */ "U/hr" = "U/giờ"; @@ -726,79 +726,79 @@ "Unable to deactivate pod. Please continue and pair a new one." = "Không thể hủy kích hoạt pod. Đề nghị tiếp tục và ghép đôi pod mới."; /* Title of delivery uncertainty recovery page */ -"Unable to Reach Pod" = "Unable to Reach Pod"; +"Unable to Reach Pod" = "Không thể thấy pod"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* The detail text for delivered insulin when no measurement is available */ "Unknown" = "Không nhận ra"; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Button label for user to answer cannula was properly inserted */ "Yes" = "Có"; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Có, hủy kích hoạt pod"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Pod đã sẵn sàng hoạt động.\n\n%1$@ sẽ nhắc nhở bạn thay đổi khi pod hết hạn. Bạn có thể thay khi nào tiện."; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod có thể đang tiêm insulin.\n Gỡ pod khỏi người sau đó nhấn \"Continue.\""; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Im lặng"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Chế độ hoạt động bình thường trong đó tiếng bíp của Pod được dùng cho mọi cảnh báo của Pod và khi lời nhắc được bật."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tất cả các cảnh báo của Pod đều không sử dụng tiếng bíp và tiếng bíp nhắc nhở sẽ bị chặn. Pod sẽ chỉ phát ra tiếng bíp khi Pod gặp lỗi nghiêm trọng và khi thực hiện kiểm tra tiếng bíp.\n\n⚠️Cảnh báo - Bất cứ khi nào Pod ở chế độ im lặng, nó phải được đặt trong phạm vi hoạt động của Bluetooth để nhận thông báo về các cảnh báo của Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Pod im lặng"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Các thông tin của Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Thông tin của Pod trước đó"; /* Text for pump manager details navigation link */ "Pump Manager Details" = "Pump Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Pump Manager..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Làm mới Pump Manager Details"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Không thể cập nhật im lặng cho pod."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Chẩn đoán"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Đọc tình trạng pod"; diff --git a/FreeAPS/Resources/vi.lproj/InfoPlist.strings b/FreeAPS/Resources/vi.lproj/InfoPlist.strings index 490542f424..f76b341f89 100644 --- a/FreeAPS/Resources/vi.lproj/InfoPlist.strings +++ b/FreeAPS/Resources/vi.lproj/InfoPlist.strings @@ -1,20 +1,20 @@ /* Privacy - NFC Scan Usage Description */ -"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; +"NFCReaderUsageDescription" = "NFC được sử dụng để quét các cảm biến Libre."; /* Privacy - Bluetooth Always Usage Description */ -"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth được sử dụng để liên lạc với máy bơm insulin và các thiết bị theo dõi đường huyết liên tục/CGM."; /* Privacy - Bluetooth Peripheral Usage Description */ -"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothPeripheralUsageDescription" = "Bluetooth được sử dụng để liên lạc với máy bơm insulin và các thiết bị theo dõi đường huyết liên tục/CGM."; /* Privacy - Face ID Usage Description */ -"NSFaceIDUsageDescription" = "For authorized acces to bolus"; +"NSFaceIDUsageDescription" = "Được cấp quyền truy cập vào bolus"; /* Privacy - Calendars Usage Description */ -"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; +"NSCalendarsUsageDescription" = "Lịch \nCalendar được sử dụng để tạo ra một sự kiện glucose mới."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthUpdateUsageDescription" = "Ứng dụng sức khỏe \nHealth được sử dụng để lưu trữ đường huyết, insulin và carbohydrate"; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthShareUsageDescription" = "Ứng dụng sức khỏe \nHealth được sử dụng để lưu trữ đường huyết, insulin và carbohydrate"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index ca145504a9..da774d4aa8 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index e4563fe627..16f3151df8 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 45453e9745..20c296dd03 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Berechnet einen neuen ISF mit jedem Loop-Zyklus. Die neue ISF basiert auf dem aktuellen BG, TDD des Insulins (nach 24 Stunden oder einem gewichteten Durchschnitt) und einem Anpassungsfaktor (Standardeinstellung ist 1).\n\nDynamic ISF und CR Verhältnisse werden durch Ihre autosens.min/max Limits begrenzt.\n\nDas dynamische Verhältnis ersetzt das autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic Ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Nutze Dynamic CR. Das dynamische Verhältnis wird für CR wie folgt verwendet:\n\n Bei Verhältnis > 1: dynCR = (newRatio - 1) / 2 + 1.\nWenn Verhältnis < 1: dynCR = CR/dynCR.\n\nNicht verwenden mit hohem Insulinanteil (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Dynamische Verhältnisse um eine Konstante anpassen. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF für einen hohen oder niedrigen BG. Die maximale Korrektur wird durch die Autosens min/max-Einstellungen bestimmt. Für die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen. Für die logarithmische Formel gibt es weniger Konsens, aber ein Anfangswert von 0,5 - 0,8 ist für die meisten Benutzer angemessener."; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Verwenden Sie eine sigmoid Funktion für ISF (und für CR, wenn aktiviert), anstelle der Standard-logarithmischen Formel. Erfordert die Aktivierung der dynamischen ISF-Einstellung in den Einstellungen\n\nDie Veränderungsanpassung passt die Neigung der Kurve an (Y: Dynamisches Verhältnis, X: Blutzucker). Ein niedrigerer Wert ==> weniger steil == weniger aggressiv.\n\nDie autosens.min/max Einstellungen bestimmen sowohl die max/min Grenzen für das dynamische Verhältnis UND wie sehr das dynamische Verhältnis angepasst wird. Wenn AF ist der Hang der Kurve, die Autosen. in/max ist die Höhe des Diagramms, das Y-Intervall, wo Y: dynamisches Verhältnis. Die Kurve hat immer eine S-Form, egal welche autosense.min/max Einstellungen verwendet werden, was bedeutet, dass diese Einstellungen große Folgen für das Ergebnis des berechneten dynamischen ISF haben. Bitte sei vorsichtig, einen zu hohen autosens.max Wert zu setzen. Mit einer korrekten Profil-ISF-Einstellung werden Sie wahrscheinlich nie mehr als 1 benötigen.\n\nEin Autosens.max Limit > 1.5 ist nicht ratsam, wenn Sie die sigmoid Funktion benutzen."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Grenzwerteinstellung (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Der Standardschwellenwert in FAX hängt von Ihrem aktuellen Minimum für BG ab, wie folgt:\n\nWenn Ihr Minimum BG Ziel = 90 mg/dl -> Schwellenwert = 65 mg/dl,\n\nwenn Minimum BG Ziel = 100 mg/dl -> Schwellenwert = 70 mg/dl,\n\nMinimum BG Ziel = 110 mg/dl -> Schwellenwert = 75 mg/dl,\n\nund wenn Minimum BG Ziel = 130 mg/dl -> Schwellenwert = 85 mg/dl.\n\nMit dieser Einstellung können Sie die Standardeinstellung auf einen höheren Schwellenwert für die Schleife mit dynISF ändern. Gültige Werte sind 65 mg/dl<= Grenzwert <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index e489430b00..829a02a18d 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2049,32 +2049,86 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 96b524b21d..461a31c1f3 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index afe5413713..9db7cd1186 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculer une nouvelle SI à chaque cycle de boucle. Le nouveau FSI sera basé sur la glycémie actuelle, le TDD d'insuline (après 24 heures ou une moyenne pondérée) et un facteur d'ajustement (valeur par défaut est 1).\n\nLes ratios ISF et CR dynamiques seront limités par vos limites autosens.min/max.\n\nRatio dynamique remplace le ratio autosens.ratio : Nouveau SI = FI statique / Ratio dynamique,\nRatio dynamique = profil. fr * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Activer CR dynamique"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Utiliser le CR. dynamique. Le ratio dynamique sera utilisé pour CR comme suit:\n\n Quand ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nRatio < 1 : dynCR = CR/dynCR.\n\nN'utilisez pas de toghether avec une fraction d'insuline élevée (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Ajuster les ratios dynamiques par une constante. La valeur par défaut est de 0,5. Plus la valeur est élevée, plus la correction de votre SI sera grande ou faible glycémie. La correction maximale est déterminée par les paramètres min/max d'Autosens. Pour la fonction Sigmoid un facteur de réglage de 0.4 - 0.5 est recommandé pour commencer. Pour la formule logaritmique threre est moins consensuel, mais commencer avec 0.5 - 0.8 est plus approprié pour la plupart des utilisateurs"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Utiliser la fonction Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Utilisez une fonction sigmoid pour ISF (et pour CR, quand activé), au lieu de la formule logarithmique par défaut. Nécessite que le paramètre ISF dynamique soit activé dans les paramètres\n\nLe paramètre Ajustement ajuste la pente de la courbe (Y : ratio dynamique, X: Glucose de sang). Une valeur inférieure ==> moins raide, == moins agressive.\n\nL'autosens. Les paramètres in/max déterminent à la fois les limites max/min pour le ratio dynamique ET combien le rapport dynamique est ajusté. Si AF est la pente de la courbe, l’autosens. in/max est la hauteur du graphique, l'intervalle Y, où le rapport dynamique, la courbe aura toujours une forme sigmoïde, peu importe l'autosens. Les paramètres in/max sont utilisés, ce qui signifie que ces paramètres ont de grandes conséquences sur le résultat de la SI dynamique calculée. Soyez prudent en définissant une valeur autosens.max trop élevée. Avec un réglage correct du profil ISF, vous n'aurez probablement jamais besoin qu'il soit supérieur à 1.\n\nUne limite Autosens.max > 1.5 n'est pas recommandée lors de l'utilisation de la fonction sigmoid."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Réglage du seuil (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Le seuil par défaut du iAPS dépend de votre cible de glycémie minimale actuelle, comme suit :\n\nSi votre cible de glycémie minimale = 90 mg/dl -> seuil = 65 mg/dl,\n\nsi cible Glycémie minimale = 100 mg/dl -> seuil = 70 mg/dl,\n\nobjectif minimum de glycémie = 110 mg/dl -> seuil = 75 mg/dl,\n\net si l'objectif de glycémie minimum = 130 mg/dl -> seuil = 85 mg/dl.\n\nCe paramètre vous permet de changer le seuil par défaut pour la boucle avec dynISF. Les valeurs valides sont 65 mg/dl<= Seuil <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index ca145504a9..da774d4aa8 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index afbdce2ac6..9eec1ef85e 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 22ee03da7e..3859f8f0d5 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -2043,12 +2043,18 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calcola un nuovo ISF per ogni ciclo di loop. Il nuovo ISF sarà basato sulla glicemia attuale, sulla TDD dell’insulina (oltre 24 ore o media ponderata) e su un fattore di aggiustamento (valore predefinito è 1).\n\nI rapporti ISF e CR dinamici saranno limitati dai tuoi limiti autosens.min/max.\n\nIl rapporto dinamico sostituisce il rapporto autosens.ratio: New ISF = rapporto statico ISF / dinamico,\nRapporto dinamico = profilo. ens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinuti"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Abilita CR Dinamico"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Usa CR Dinamico. Il rapporto dinamico sarà utilizzato per CR come segue:\n\n Quando rapporto > 1: dynCR = (newRatio - 1) / 2 + 1.\nQuando il rapporto < 1: dynCR = CR/dynCR.\n\nNon usare insieme a frazione d'insulina elevata (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Regola i rapporti dinamici della costante ISF"; @@ -2056,20 +2062,68 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max. Per la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5. Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti Regola la costante ISF dinamica"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Usa Funzione Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Usa una funzione sigmoid per ISF (e per CR, quando abilitato), invece della formula Logaritmica predefinita. Richiede l'impostazione ISF dinamica per essere abilitata nelle impostazioni\n\nL'impostazione di regolazione regola la pendenza della curva (Y: Dynamic ratio, X: Colla Di Sangue). Un valore inferiore ==> meno ripido == meno aggressivo.\n\nGli autosens. le impostazioni in/max determinano sia i limiti max/min per il rapporto dinamico E quanto il rapporto dinamico viene regolato. Se AF è la pendenza della curva, gli autosensi. in/max è l'altezza del grafico, l'intervallo Y, dove Y: rapporto dinamico. La curva avrà sempre una forma di sigmoid, indipendentemente dagli autosensi. le impostazioni in/max sono usate, il che significa che queste impostazioni hanno grandi conseguenze per il risultato del ISF dinamico calcolato. Attenzione all'impostazione di un valore autosens.max troppo alto. Con una corretta impostazione ISF del profilo, probabilmente non avrete mai bisogno di essere superiore a 1.\n\nUn limite di Autosens.max > 1.5 non è consigliabile quando si utilizza la funzione sigmoid."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Impostazione Soglia (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "La soglia predefinita in FAX dipende dall'attuale obiettivo di glicemia minima, come segue:\n\nSe il vostro obiettivo minimo di glicemia = 90 mg/dl -> soglia = 65 mg/dl,\n\nse obiettivo minimo di glicemia = 100 mg/dl -> soglia = 70 mg/dl,\n\nobiettivo minimo di glicemia = 110 mg/dl -> soglia = 75 mg/dl,\n\ne se obiettivo minimo di glicemia = 130 mg/dl -> soglia = 85 mg/dl.\n\nQuesta impostazione ti permette di cambiare il valore predefinito ad una soglia più alta per il looping con dynISF. Valori validi sono 65 mg/dl<= Impostazione soglia <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Media ponderata di TDD. Peso delle ultime 24 ore:"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 74485febc7..724b172518 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beregn ny ISF ved hver loop-syklus. Ny ISF vil baseres på nåværende BS, TDD med insulin (siste 24 timer eller vektet gjennomsnitt) og en justeringsfaktor (standardverdi er 1).\n\nDynamisk ISF og CR-ratier vil bli begrenset av dine autosens-innstillinger.\n\nDynamisk ratio erstatter autosens-ratio: Ny ISF = Statisk ISF / Dyamisk ratio,\nDynamisk ratio = profile.sens * adjustmentFactor * tdd * Math.log(BS/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Bruk dynamisk CR. Dynamisk ratio brukes for CR som følger:\n\n Når ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nNår ratio < 1: dynCR = CR/dynCR.\n\nIkke bruk denne innstillingen sammen med en høy insulinbrøk (Insulin Fraction > 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Juster dynamisk forholdstall med en konstant. Standard er 0,5. Jo høyere verdien er, jo større blir korreksjonen av ISF ved høyt eller lavt BS. Maksimal korrigering bestemmes av min/maks innstillingene for Autosens. For Sigmoidfunksjon anbefales det å starte en justeringsfaktor på 0,4-0,5. For den logaritmiske formelens er det mindre konsensus, men å starte med 0.5 – 0,8 er anbefalt for de fleste brukere"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Terskelinnstilling (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Standard terskel i FAX er avhengig av ditt nåværende laveste BS-mål, som følger:\n\nDersom ditt laveste BS-mål = 90 mg/dL -> terskel = 65 mg/dL,\n\ndersom laveste BS-mål = 100 mg/dL -> terskel = 70 mg/dL,\n\nlaveste BS-mål = 110 mg/dL -> terskel = 75 mg/dL,\n\nog dersom laveste BS-mål = 130 mg/dL -> terskel = 85 mg/dL.\n\nDenne innstillingen tillater deg å endre til en høyere terskel for å loope med dynamisk ISF. Gyldige verdier er 65 mg/dL <= terskel-innstilling <= 120 mg/dL."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vektet snitt av TDD. Vekting av siste 24 timer:"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 253f0c9625..13c5866f92 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2047,7 +2047,7 @@ Dynamische ratio = profielgevoeligheid * aanpassingsfactor * TDD * Logaritme (BG InsulineFactor = 120 - Tijd tot insulinepiek in minuten./n/n Eenvoudiger gezegd, het systeem past de insulinegevoeligheid aan op basis van je recente insulinegebruik en huidige bloedsuikerspiegel. De aanpassingen zijn beperkt binnen bepaalde grenzen die je hebt ingesteld"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; /* Enable Dynamic CR */ @@ -2057,26 +2057,80 @@ Als de verhouding < 1 is: dynCR = CR/dynCR. Gebruik dit niet samen met een hoge insuline fractie (> 2).\n\n Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op basis van je recente verhoudingen. Het zorgt ervoor dat de aanpassingen niet te groot zijn en werkt niet goed als je een hoge insuline fractie hebt."; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Verander de dynamische verhoudingen met een vaste waarde, die standaard op 0,5 staat. Als je deze waarde verhoogt, zal de aanpassing van je ISF voor hoge of lage bloedsuikerwaarden groter zijn. De grootte van de correctie is beperkt door de instellingen voor Autosens min/max. Voor de Sigmoid-functie wordt een startwaarde van 0,4 tot 0,5 aanbevolen. Voor de logaritmische formule is er geen vastgestelde norm, maar voor de meeste gebruikers is een waarde tussen 0,5 en 0,8 passender."; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Gebruikt een Sigmoid functie voor ISF (en voor CR, indien ingeschakeld), in plaats van de standaard logaritmische formule. Vereist een geactiveerde dynamische ISF instelling.\n\nDe instelling aanpassing past de helling van de curve aan (Y: Dynamische verhouding, X: Bloedglucose). Een lagere waarde ==> minder steil = minder agressief.\n\nDe autosens.min/max instellingen bepalen zowel de max/min grenzen voor de dynamische ratio als hoeveel de dynamische ratio wordt aangepast. Als AF de helling van de curve is, is autosens.min/max de hoogte van de grafiek, het Y-interval, waarbij Y: dynamische verhouding. De curve zal altijd een sigmoïde vorm hebben, ongeacht de autosens.min/max instellingen, wat betekent dat deze instellingen grote gevolgen hebben voor het resultaat van de berekende dynamische ISF. Wees voorzichtig met het instellen van een te hoge autosens.max waarde. Met een goede profiel-ISF instelling zal het waarschijnlijk nooit nodig zijn deze hoger in te stellen dan 1,5.\n\nEen Autosens max grens > 1,5 is niet aan te raden bij gebruik van de Sigmoid functie."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Drempelinstelling (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 24dae30c1c..d8e4c41e7e 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2045,32 +2045,86 @@ Połączono z Nightscout!"; /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index a799515be0..6e72e14f32 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 01894b15ea..a8b0c751d7 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 1262bc1f46..ba4f5e80b6 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Считать новый ISF с каждым циклом петли. Новый ISF будет зависеть от текущего BG, TDD (за последние 24 часа или взвешенное среднее значение) и Adjustment Factor (по-умолчанию - 1).\n\nDynamic ratio ISF и CR будет ограничен настройками autosens.min/max.\n\nDynamic ratio заменяет autosens.ratio: Новый ISF = Постоянный ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включить динамический CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Использовать Dynamic CR. Dynamic ratio будет также влиять и на CR:\n\n Когда ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКогда ratio <1: dynCR = CR/dynCR.\n\nНе используйте совместно с высоким Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Отрегулируйте динамические коэффициенты на постоянную величину. Значение по умолчанию равно 0.5. Чем выше значение, тем больше будет коррекция вашего ISF для высокого или низкого BG. Максимальная коррекция определяется настройками Auto sens min/max. Для сигмовидной функции рекомендуется для начала использовать коэффициент регулировки 0.4 - 0.5. В отношении логарифмической формулы консенсуса меньше, но большинству пользователей более подходит начинать с 0.5 - 0.8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Использовать сигмоидную функцию для ISF (и для CR, если включено), вместо логарифмической функции. Требует включенного в настройках режима Dynamic ISF\n\nКоэффициент регулировки AF регулирует наклон кривой (Y: Динамическое соотношение, X: Глюкоза крови). Ниже значения ==> меньше крутизна == меньше агрессивность.\n\nAutosens минимум и максимум определяют оба - максимальный и минимальный лимиты для динамического соотношения и как сильно динамическое соотношение будет изменять ISF/CR. Коэффициент регулировки AF - это высота кривой, Y - интервал, где Y - динамическое соотношение. Кривая всегда будет иметь сигмовидную форму, не важно какой autosens минимум/максимум указаны. Это означает, что эти настройки имеют большие последствия для результата вычисляемого динамического ISF. Пожалуйста, будьте осторожны с высокими значениями параметра алгоритма максимума для autosens. При правильной настройке профиля ISF, никогда не понадобится значение выше 1,5.\n\nAn Предел Autosens максимум > 1,5 не рекомендуется при использовании сигмовидной функции."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Настройка порога (мг/дл)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 5be5c7cab3..7d9395ef08 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Pri každom cykle slučky vypočítajte novú hodnotu ISF. Nový ISF bude založený na aktuálnom BG, TDD inzulínu (posledných 24 hodín alebo vážený priemer) a korekčnom faktore (predvolená hodnota je 1).\n\nDynamický pomer ISF a CR bude obmedzený limitmi autosens.min/max.\n\nDynamický pomer nahrádza autosens.pomer: Nový ISF = statický ISF / dynamický pomer,\nDynamický pomer = profil.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Používajte dynamický CR. Dynamický pomer sa použije pre CR takto:\n\n Keď pomer > 1: dynCR = (newRatio - 1) / 2 + 1.\nKeď pomer < 1: dynCR = CR/dynCR.\n\nNepoužívajte spolu s vysokou inzulínovou frakciou (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Upravte dynamické pomery pomocou konštanty. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF pre vysoký alebo nízky BG. Maximálna korekcia je určená nastavením min/max v položke Autosens. Pre funkciu Sigmoid sa na začiatku odporúča korekčný faktor 0,4 - 0,5. Pre logaritmický vzorec existuje menej konsenzu, ale pre väčšinu používateľov je vhodnejšie začať s 0,5 - 0,8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Použitie sigmoidnej funkcie pre ISF (a pre CR, ak je povolená) namiesto predvoleného logaritmického vzorca. Vyžaduje, aby bolo v nastaveniach povolené nastavenie Dynamická ISF.\n\nNastavenie Adjustment (Úprava) upravuje sklon krivky (Y: dynamický pomer, X: glykémia). Nižšia hodnota ==> menej strmá == menej agresívna.\n\nNastavenie autosens.min/max určuje limity max/min pre dynamický pomer A tiež to, ako veľmi sa dynamický pomer upravuje. Ak AF je sklon krivky, autosens.min/max je výška grafu, interval Y, kde Y: dynamický pomer. Krivka bude mať vždy sigmoidný tvar bez ohľadu na to, aké nastavenia autosens.min/max sa použijú, čo znamená, že tieto nastavenia majú veľké dôsledky na výsledok vypočítaného dynamického ISF. Buďte opatrní pri nastavení príliš vysokej hodnoty autosens.max. Pri správnom nastavení profilu ISF ju pravdepodobne nikdy nebudete potrebovať vyššiu ako 1.5\n\nLimit autosens.max > 1.5 sa pri použití sigmoidnej funkcie neodporúča."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Nastavenie prahu (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index fbdb6909ff..7320d216b6 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Använd dynamisk kolhydratkvot. Den dynamiska kvoten kommer att beräknas som flöjer::\n\n när kvot > 1: dynamisk kolhydratkvot = (dynamiskISFkvot - 1) / 2 + 1.\nNär kvot < 1: dynamisk kolhydratkvot = inställd kolhydratkvot/dynamisk kolhydratkvot.\n\nUndvik att använda tillsamans med en inställning för \"Kvot av rekommenderad mängd insulin\" över 2"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Aktivera dynamisk insulinkänslighet (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Aktivera dynamisk insulinkvot (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ändra AF-konstant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Individuell justering (en multipel) av hur din insulinkänslighet räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal insulinkänslighet och minimal insulinkänslighet bestäms av Autosens min/max inställningar och av din schemalagda inställning för insulinkänslighet.\n\nFör S-formad dynamisk inställning rekommendaras att börja med 0.3-0-4. För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Använd S-formad dynamisk insulinkänslighet"; +/* Which dyn ISF function to use */ +"Formula" = "Formel"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Säkerhet"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Använd en sigmoidfunktion för ISF (och för CR, när det är aktiverat), istället för den logaritmiska standardformeln. Kräver att den dynamiska ISF-inställningen är aktiverad i inställningarna\n\nJusteringsinställningen justerar lutningen på kurvan (Y: Dynamiskt förhållande, X: Blodglukos). Ett lägre värde ==> mindre brant == mindre aggressiv.\n\nAutosens. in/max inställningar bestämmer både max/min gränsen för det dynamiska förhållandet OCH hur mycket det dynamiska förhållandet justeras. Om AF är sluttningen av kurvan, autosens. in/max är höjden på grafen, Y-intervallet, där Y: dynamiskt förhållande. Kurvan kommer alltid att ha en sigmoid form, oavsett vilken autosens. in/max inställningar används, vilket innebär att dessa inställningar har stora konsekvenser för resultatet av den beräknade dynamiska ISF. Var försiktig med att ställa in ett för högt autosens.max värde. Med en korrekt profil ISF inställning, kommer du förmodligen aldrig behöver det att vara högre än 1.\n\nEn autosens.max gräns > 1.5 är inte lämpligt när du använder sigmoid-funktionen."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Inställning för tröskelvärde (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Tröskelvärde"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Tröskelvärde för blodsocker beror på ditt nuvarande undre blodsockermålvärde, enligt följande:\n\nOm ditt målvräde = 5 mmol/l -> tröskelvörde = 3,6 mmol/l,\n\nOm ditt målvräde = 5,6 -> tröskelärde = 3,9 mmol/l,\n\nOm ditt målvräde = 6,1 mmol/l -> tröskelvärde = 4,2 mmol/l,\n\nOch om ditt målvräde = 7,2 mmol/l -> tröskelvärde = 4,7 mmol/l.\n\nDenna inställning tillåter dig att ändra trösklevärdet till en högre inställnig när du loopar med dynamiska kvoter. Giltiga värden är 3,6 - 6,7."; +/* Header */ +"Calculator settings" = "Boluskalkylatorinställning"; + +/* UI/UX option */ +"Display Predictions" = "Visa prognoser"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "För mindre iPhone-skärmar"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Visa och tillåt inmatning av fett och protein"; + +/* UI/UX option */ +"Add Meal View settings " = "Måltidsfönster "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Visa knapp för tillfälligt målvärde"; + +/* UI/UX option */ +"Home View Button Panel " = "Knappar på hemskärmen "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "Om du använder både profiler och tillfälliga målvärden"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Färga alltid blodsockervärdet (grön, gul etc)"; + +/* UI/UX option */ +"Header settings" = "Övre delen av hemfönstret"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalt färgas nuvarande blodsocker med rött endast ifall detta är under eller över dina inställningar för ett lågt eller högt blodsocker i dina notisinställningar"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Antal synliga timmar i hemfönstret"; + +/* Notification option */ +"Live Activity" = "Liveaktiviteter"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Liveaktivitet visar senaste blodsockeravläsning på låsskärmen och på Dynamic Island, om sådan finns på din iPhone-modell"; + +/* Notification option */ +"Show live activity" = "Visa Liveaktivitet"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Viktat Genomsnitt av TDD. Vikt de senaste 24 timmarna:"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 1ce8ea8ed5..4ffd98717f 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Her döngü döngüsünde yeni bir İDF hesaplayın. Yeni İDF, mevcut BG'ye dayalı olacaktır, GTD'unuz (son 24 saat veya ağırlıklı bir ortalama) ve bir Ayarlama Faktörüne (varsayılan 1'dir) dayalı olacaktır.\n\nDinamik İDF ve KHO oranları, autosens.min/maks limitlerinizle sınırlanacaktır. .\n\nDinamik oran, autosens.ratio'nun yerini alır: Yeni İDF = Statik İDF / Dinamik oran,\nDynamic oran = profile.sens * AdjustFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - İnsülinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dinamik KHO Etkinleştir"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Dinamik KHO kullanın. Dinamik oran, KHO için şu şekilde kullanılacaktır:\n\n Oran > 1 olduğunda: dynCR = (newRatio - 1) / 2 + 1.\nOran < 1 olduğunda: dynCR = CR/dynCR.\n\nYüksek İnsülin Fraksiyonu (> 2) ile birlikte kullanmayın."; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dinamik İDF sabitini ayarla"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid Fonksiyonunu Kullan"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Eşik Ayarı (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index a0208c0c2c..fb62144c6b 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Вважати новий ISF з кожним циклом петлі. Новий ISF буде залежати від поточного BG, TDD (за останні 24 години або зважене середнє значення) та Adjustment Factor (за замовчуванням - 1). nDynamic ratio замінює autosens.ratio: Новий ISF = Постійний ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPe"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Використовувати Dynamic CR. Dynamic ratio також впливатиме на CR:\n\n Коли ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКоли ratio <1: dynCR = CR/dynCR.\n\nНе використовуйте спільно з високим Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Налаштуйте динамічні коефіцієнти за константою. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF для високого або низького рівня ГК. Максимальна корекція визначається параметрами min/max Автосенс. Для сигмоподібної функції спочатку рекомендується коригуючий коефіцієнт 0,4 - 0,5. Для логарифмічної формули threre є менш узгодженим, але починати з 0,5 - 0,8 є більш прийнятним для більшості користувачів"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Використовуйте сигмоїдну функцію для ISF (та для CR, якщо ввімкнено), замість стандартної логарифмічної формули. У налаштуваннях потрібно ввімкнути параметр Dynamic ISF\n\nПараметр Adjustment регулює нахил кривої (Y: динамічне співвідношення, X: рівень глюкози в крові). Менше значення ==> менш крутий == менш агресивний.\n\nПараметри autosens.min/max визначають максимальні/мінімальні межі для динамічного коефіцієнта І наскільки динамічне співвідношення регулюється. Якщо AF – це нахил кривої, autosens.min/max – це висота графіка, Y-інтервал, де Y: динамічне співвідношення. Крива завжди матиме сигмоподібну форму, незалежно від того, які налаштування autosens.min/max використовуються, тобто ці налаштування мають великі наслідки для результату обчисленої динамічної ISF. Будьте обережні, встановлюючи занадто високе значення autosens.max. З правильним налаштуванням ISF профілю вам, ймовірно, ніколи не знадобиться, щоб воно було вищим за 1,5\n\nОбмеження Autosens.max > 1,5 не рекомендується під час використання сигмоїдної функції."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Порогове Значення (мг/дл)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Поріг, мг/дл, у FAX за замовчуванням залежить від Вашої поточної мінімальної мети BG, таким чином:\n\nЯкщо мінімальна мета BG = 5 ммоль/л -> поріг = 3,6 ммоль/л,\n\n мінімальна мета BG = 5.6 ммоль/л -> поріг = 3,9 ммоль/л, мінімальна мета BG = 6.1 ммоль/л -> поріг = 4,2 ммоль/л, якщо мінімальна мета BG = 7.2 ммоль/л -> поріг = 4,7 ммоль/л.\n\nЦе налаштування дозволяє збільшити рівень порога для більш безпечної роботи з dynISF. Валідним буде значення 65 мг/дл = 3,6 ммоль/л <= Threshold Setting <= 120 мг/дл = 6,7 ммоль/л."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 22e06aad09..c96a502430 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Tiếp tục và bỏ qua liều bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm \nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm Cảnh báo khi dùng liều cao mà không bolus"; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm "; /* Header */ "Enact Bolus" = "Tiêm liều bolus"; @@ -134,10 +134,10 @@ "Bottom target" = "Mục tiêu dưới cùng"; /* Cancel preset name */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy bỏ"; /* */ -"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Custom temp target */ "Custom" = "THÔNG LỆ"; @@ -161,19 +161,19 @@ "Target" = "Mục tiêu"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Tỷ lệ Insulin cơ bản và độ nhạy"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "Cài đặt '1/2 mục tiêu cơ bản' thấp hơn sẽ giảm mức cơ bản và tăng ISF sớm hơn, ở mức glucose mục tiêu thấp hơn."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Cài đặt của bạn: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "autosens.max Giới hạn điểm cuối tối đa mg/dl"; /* */ -"Enter preset name" = "Enter preset name"; +"Enter preset name" = "Nhập tên"; /* Preset name */ "Name" = "Tên"; @@ -188,7 +188,7 @@ "Save" = "Lưu"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; /* Delete Meal Preset */ "Delete Preset" = "Xoá mẫu thiết lập"; @@ -212,7 +212,7 @@ "Top target" = "Top target"; /* Temp target set for ... minutes */ -"for" = "for"; +"for" = "của"; /* Temp target set for ... minutes */ "min" = "phút"; @@ -221,31 +221,31 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Basal profile"; +"Basal profile" = "Hồ sơ liều nền (Basal)"; /* */ "Carb ratio" = "Tỷ lệ Carb"; /* */ -"Delete autotune data" = "Delete autotune data"; +"Delete autotune data" = "Xóa dữ liệu Autotune"; /* */ "Run now" = "Chạy ngay"; /* */ -"Last run" = "Last run"; +"Last run" = "Chạy lần trước"; /* */ "Sensitivity" = "Độ nhạy"; /* */ -"Use Autotune" = "Use Autotune"; +"Use Autotune" = "Sử dụng Autotune"; /* Add profile basal */ "Add" = "Thêm vào"; /* */ -"Basal Profile" = "Basal Profile"; +"Basal Profile" = "Hồ sơ liều nền (Basal)"; /* Rate basal profile */ "Rate" = "Tỷ lệ"; @@ -266,7 +266,7 @@ "Time" = "Thời gian"; /* */ -"Calculated Ratio" = "Calculated Ratio"; +"Calculated Ratio" = "Tỷ lệ được tính toán"; /* Carb Ratios header */ "Carb Ratios" = "Tỷ lệ Carb"; @@ -278,13 +278,13 @@ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Độ nhạy được tính toán"; /* */ "Insulin Sensitivities" = "Độ nhạy của Insulin"; /* */ -"Sensitivity Ratio" = "Sensitivity Ratio"; +"Sensitivity Ratio" = "Tỷ lệ độ nhạy"; /* */ "Dismiss" = "Từ bỏ"; @@ -300,13 +300,13 @@ /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Chấp nhận"; /* */ "Manual Temp Basal" = "Liều Basal thủ công"; /* Allow uploads to different services */ -"Allow uploads" = "Allow uploads"; +"Allow uploads" = "Cho phép tải lên"; /* API secret in NS */ "API secret" = "Khóa API"; @@ -465,46 +465,46 @@ Enact a temp Basal or a temp target */ "g" = "g"; /* when 0 U/hr */ -"0 U/hr" = "0 U/hr"; +"0 U/hr" = "U/hr"; /* abbreviation for days */ -"d" = "d"; +"d" = "ngày"; /* abbreviation for hours */ -"h" = "h"; +"h" = "giờ"; /* abbreviation for minutes */ -"m" = "m"; +"m" = "phút"; /* */ -"Closed loop" = "Closed loop"; +"Closed loop" = "Vòng lặp kín"; /* */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* */ -"Devices" = "Devices"; +"Devices" = "Thiết bị"; /* */ -"Pump" = "Pump"; +"Pump" = "Bơm"; /* */ -"Watch" = "Watch"; +"Watch" = "Đồng hồ"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Cấu hình đồng hồ"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Hiển thị trên đồng hồ"; /* */ "Garmin Watch" = "Garmin Watch"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Thêm thiết bị"; /* */ "Glucose Target" = "Glucose Target"; @@ -519,94 +519,94 @@ Enact a temp Basal or a temp target */ "ISF" = "ISF"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "Phải cài đặt ứng dụng Garmin Connect để sử dụng cho iAPS.\n Hãy truy cập App Store để tải xuống ứng dụng này"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin không có sẵn"; /* */ -"Services" = "Services"; +"Services" = "Dịch vụ"; /* */ -"Settings" = "Settings"; +"Settings" = "Cài đặt"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Tỷ lệ phần trăm Bolus được đề xuất"; /* 2 log files to share */ -"Share logs" = "Share logs"; +"Share logs" = "Chia sẻ nhật ký"; /* Upper target */ -"High target" = "High target"; +"High target" = "Mục tiêu cao"; /* Lower target */ -"Low target" = "Low target"; +"Low target" = "Mục tiêu thấp"; /* When bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Đang tiến hành bolus"; /* */ -"Pump suspended" = "Pump suspended"; +"Pump suspended" = "Bơm đã tạm ngưng"; /* */ -"Middleware" = "Middleware"; +"Middleware" = "Phần mềm trung gian"; /* Header */ -"History" = "History"; +"History" = "Lịch sử"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Tải lên"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Cho phép tải lên"; /* Type of CGM or glucose source */ -"Type" = "Type"; +"Type" = "Loại cảm biến"; /* CGM */ -"CGM" = "CGM"; +"CGM" = "Cảm biến đường huyết"; /* CGM Transmitter ID */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "Số ID của Transmitter"; /* Other CGM setting */ -"Other" = "Other"; +"Other" = "Khác"; /* Whatch app alert */ -"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; +"Set temp targets presets on iPhone first" = "Trước tiên hãy đặt mục tiêu tạm thời trên iPhone"; /* Updating Watch app */ -"Updating..." = "Updating..."; +"Updating..." = "Đang cập nhật..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp Targets"; +"Temp Targets" = "Temp targets"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Xóa Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Xóa Insulin?"; /* Treatments list */ -"Treatments" = "Treatments"; +"Treatments" = "Phương pháp điều trị"; /* " min" in Treatments list */ -" min" = " min"; +" min" = " phút"; /* */ -"Unable to change anything" = "Unable to change anything"; +"Unable to change anything" = "Không thể thay đổi"; /* Calendar and Libre transmitter settings --------------- */ /* */ -"Configure Libre Transmitter" = "Configure Libre Transmitter"; +"Configure Libre Transmitter" = "Cấu hình Libre Transmitter"; /* */ -"Calibrations" = "Calibrations"; +"Calibrations" = "Hiệu chuẩn (Calib)"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Tạo sự kiện trong Calendar"; /* */ "Calendar" = "Calendar"; @@ -762,154 +762,154 @@ Enact a temp Basal or a temp target */ "Invalid Sensor Detected" = "Sensor không hợp lệ"; /* Detected sensor seems not to be a libre 1 sensor! */ -"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; +"Detected sensor seems not to be a libre 1 sensor!" = "Cảm biến được phát hiện không phải là cảm biến libre 1!"; /* Detected sensor is invalid: %@ */ -"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; +"Detected sensor is invalid: %@" = "Cảm biến được phát hiện không hợp lệ: %@"; /* Low Battery */ -"Low battery" = "Low battery"; +"Low battery" = "Pin yếu"; /* */ -"Invalid sensor" = "Invalid sensor"; +"Invalid sensor" = "Lỗi nhập không hợp lệ"; /* */ -"Sensor change" = "Sensor change"; +"Sensor change" = "Thay đổi cảm biến"; /* */ -"Sensor expires soon" = "Sensor expires soon"; +"Sensor expires soon" = "Cảm biến sắp hết hạn"; /* Battery is running low %@, consider charging your %@ device as soon as possible */ -"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Pin sắp hết %@, hãy cân nhắc việc sạc thiết bị %@ của bạn càng sớm càng tốt"; /* Extracting calibrationdata from sensor */ -"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; +"Extracting calibrationdata from sensor" = "Trích xuất dữ liệu hiệu chuẩn từ cảm biến"; /* Sensor Ending Soon */ -"Sensor Ending Soon" = "Sensor Ending Soon"; +"Sensor Ending Soon" = "Cảm biến sắp kết thúc"; /* Current Sensor is Ending soon! Sensor Life left in %@ */ -"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; +"Current Sensor is Ending soon! Sensor Life left in %@" = "Cảm biến hiện tại sắp kết thúc! Tuổi thọ cảm biến còn lại trong %@"; /* */ "Libre Bluetooth" = "Libre Bluetooth"; /* */ -"Snooze Alerts" = "Snooze Alerts"; +"Snooze Alerts" = "Báo lại cảnh báo"; /* */ -"Last measurement" = "Last measurement"; +"Last measurement" = "Lần đo cuối cùng"; /* */ -"Sensor Footer checksum" = "Sensor Footer checksum"; +"Sensor Footer checksum" = "Tổng kiểm tra cảm biến"; /* */ -"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; +"Last Blood Sugar prediction" = "Dự đoán lượng đường trong máu"; /* */ -"CurrentBG" = "CurrentBG"; +"CurrentBG" = "Đường máu hiện tại"; /* */ -"Sensor Info" = "Sensor Info"; +"Sensor Info" = "Thông tin cảm biến"; /* */ -"Sensor Age" = "Sensor Age"; +"Sensor Age" = "Thời gian sử dụng sensor"; /* */ -"Sensor Age Left" = "Sensor Age Left"; +"Sensor Age Left" = "Thời gian còn lại của cảm biến"; /* */ -"Sensor Endtime" = "Sensor Endtime"; +"Sensor Endtime" = "Thời gian kết thúc cảm biến"; /* */ -"Sensor State" = "Sensor State"; +"Sensor State" = "Trạng thái cảm biến"; /* */ -"Sensor Serial" = "Sensor Serial"; +"Sensor Serial" = "Serial cảm biến"; /* */ -"Transmitter Info" = "Transmitter Info"; +"Transmitter Info" = "Số Id của Transmitter"; /* */ -"Hardware" = "Hardware"; +"Hardware" = "Phần cứng"; /* */ -"Firmware" = "Firmware"; +"Firmware" = "Phần mềm"; /* */ -"Connection State" = "Connection State"; +"Connection State" = "Tình trạng Kết nối"; /* */ -"Transmitter Type" = "Transmitter Type"; +"Transmitter Type" = "Loại Transmitter"; /* */ -"Sensor Type" = "Sensor Type"; +"Sensor Type" = "Loại cảm biến"; /* */ -"Factory Calibration Parameters" = "Factory Calibration Parameters"; +"Factory Calibration Parameters" = "Thông số hiệu chuẩn từ nhà máy"; /* */ -"Valid for footer" = "Valid for footer"; +"Valid for footer" = "Hợp lệ"; /* */ -"Edit calibrations" = "Edit calibrations"; +"Edit calibrations" = "Thêm kết quả hiệu chuẩn"; /* */ -"edit calibration clicked" = "edit calibration clicked"; +"edit calibration clicked" = "Nhấp vào để hiệu chuẩn"; /* */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Xóa CGM"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; +"Are you sure you want to remove this cgm from loop?" = "Bạn có chắc muốn xóa Cgm này khỏi Loop không?"; /* */ -"There is no undo" = "There is no undo"; +"There is no undo" = "Không thể hoàn tác"; /* */ -"Advanced" = "Advanced"; +"Advanced" = "Nâng cao"; /* */ -"Alarms" = "Alarms"; +"Alarms" = "Cảnh báo"; /* */ -"Glucose Settings" = "Glucose Settings"; +"Glucose Settings" = "Cài đặt đường huyết"; /* */ -"Notifications" = "Notifications"; +"Notifications" = "Thông báo"; /* */ -"Export logs" = "Export logs"; +"Export logs" = "Kết xuất nhật ký"; /* */ -"Export not available" = "Export not available"; +"Export not available" = "Không thể kết xuất"; /* */ -"Log export requires ios 15" = "Log export requires ios 15"; +"Log export requires ios 15" = "Kết xuất nhật ký yêu cấu ios 15 trở lên"; /* */ -"Got it!" = "Got it!"; +"Got it!" = "Đã hiểu!"; /* */ -"Saved to %@" = "Saved to %@"; +"Saved to %@" = "Đã lưu vào %@"; /* */ -"No logs available" = "No logs available"; +"No logs available" = "Không có nhật ký"; /* */ -"Glucose Notification visibility" = "Glucose Notification visibility"; +"Glucose Notification visibility" = "Khả năng hiển thị thông báo Glucose"; /* */ -"Always Notify Glucose" = "Always Notify Glucose"; +"Always Notify Glucose" = "Luôn thông báo Glucose"; /* */ -"Notify per reading" = "Notify per reading"; +"Notify per reading" = "Thông báo cho mỗi lần đọc"; /* */ -"Value" = "Value"; +"Value" = "Giá trị"; /* */ -"Adds Phone Battery" = "Adds Phone Battery"; +"Adds Phone Battery" = "Thêm Pin điện thoại"; /* */ "Adds Transmitter Battery" = "Thêm pin của Transmitter"; @@ -1062,50 +1062,50 @@ Enact a temp Basal or a temp target */ "Carbs" = "Carbs"; /* Food Type / Meal Note */ -"Note" = "Note"; +"Note" = "Lưu ý"; /* */ "Temp Basal" = "Temp Basal"; /* */ -"Temp Target" = "Temp Target"; +"Temp Target" = "Mục tiêu tạm thời"; /* */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* */ "Animated Background" = "Animated Background"; /* Sensor day(s) */ -" day(s)" = " day(s)"; +" day(s)" = " ngày(s)"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Display HR on Watch"; +"Display HR on Watch" = "Hiển thị trên đồng hồ"; /* Headers for settings ----------------------- */ -"OpenAPS main settings" = "OpenAPS main settings"; +"OpenAPS main settings" = "Cài đặt chính của OpenAPS"; -"OpenAPS SMB settings" = "OpenAPS SMB settings"; +"OpenAPS SMB settings" = "Cài đặt SMB OpenAPS"; -"OpenAPS targets settings" = "OpenAPS targets settings"; +"OpenAPS targets settings" = "Cài đặt mục tiêu OpenAPS"; -"OpenAPS other settings" = "OpenAPS other settings"; +"OpenAPS other settings" = "Cài đặt khác OpenAPS"; /* Glucose Simulator CGM */ -"Glucose Simulator" = "Glucose Simulator"; +"Glucose Simulator" = "Mô phỏng Glucose"; /* Restored state message */ -"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@"; +"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Đã khôi phục trạng thái Bluetooth (APS đã khởi động lại?). Đã tìm thấy %d thiết bị ngoại vi và được kết nối với %@ bằng mã định danh %@"; /* Shared app group xDrip4iOS */ -"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; +"Using shared app group with external CGM app xDrip4iOS" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài GlucoseDirect"; /* Dexcom G6 app */ "Dexcom G6 app" = "Dexcom G6 app"; @@ -1120,30 +1120,30 @@ Enact a temp Basal or a temp target */ "Simple simulator" = "Simple simulator"; /* Direct connection with Libre 1 transmitters or Libre 2 */ -"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Kết nối trực tiếp với bộ phát Libre 1 hoặc cảm biến Libre 2 của Châu Âu"; /* Online or internal server */ -"Online or internal server" = "Online or internal server"; +"Online or internal server" = "Máy chủ trực tuyến hoặc nội bộ"; /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Developer"; +"Developer" = "Nhà phát triển"; /* Debug option view NS Upload Profile */ -"NS Upload Profile" = "NS Upload Profile"; +"NS Upload Profile" = "Tải hồ sơ lên NS"; /* Debug option view NS Uploaded Profile */ -"NS Uploaded Profile" = "NS Uploaded Profile"; +"NS Uploaded Profile" = "Hồ sơ đã tải lên NS"; /* Debug option view Autosense */ "Autosense" = "Autosense"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Độ nhạy động"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Chỉ Autotune Insulin cơ bản"; /* */ "Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; @@ -1152,72 +1152,72 @@ Enact a temp Basal or a temp target */ "Save on Pump" = "Lưu vào bơm"; /* Debug option view Pump History */ -"Pump History" = "Pump History"; +"Pump History" = "Lịch sử Bơm"; /* Debug option view Target Ranges */ -"Target ranges" = "Target ranges"; +"Target ranges" = "Phạm vi Mục tiêu"; /* Debug option view Temp targets */ -"Temp targets" = "Temp targets"; +"Temp targets" = "Mục tiêu tạm thời"; /* Debug option view Meal */ -"Meal" = "Meal"; +"Meal" = "Bữa ăn"; /* Debug option view Pump profile */ -"Pump profile" = "Pump profile"; +"Pump profile" = "Hồ sơ Bơm"; /* Debug option view Profile */ -"Profile" = "Profile"; +"Profile" = "Hồ sơ"; /* Debug option view Enacted */ -"Enacted" = "Enacted"; +"Enacted" = "Đã kích hoạt"; /* Debug option view Announcements (from NS) */ "Announcements" = "Announcements"; /* Debug option view Enacted announcements announcements (from NS) */ -"Enacted announcements" = "Enacted announcements"; +"Enacted announcements" = "Thông báo đã kích hoạt"; /* Debug option view Autotune */ "Autotune" = "Autotune"; /* Debug option view Target presets */ -"Target presets" = "Target presets"; +"Target presets" = "Mục tiêu đặt trước"; /* Debug option view */ -"Loop Cycles" = "Loop Cycles"; +"Loop Cycles" = "Chu kỳ vòng lặp"; /* Debug option view Glucose Data used for statistics */ -"Glucose Data used for statistics" = "Glucose Data used for statistics"; +"Glucose Data used for statistics" = "Dữ liệu Glucose được sử dụng để thống kê"; /* --------------- HealthKit intergration --------------------*/ /* */ "Apple Health" = "Apple Health"; /* */ -"Connect to Apple Health" = "Connect to Apple Health"; +"Connect to Apple Health" = "Kết nối Apple Health"; /* Show when have not permissions for writing to Health */ -"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Để ghi dữ liệu vào Apple Health, bạn phải cấp quyền trong Cài đặt > Sức khỏe > Truy cập dữ liệu"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Điều này cho phép iAPS đọc và ghi vào Apple Heath. Bạn cũng phải cấp quyền trong Cài đặt > Sức khỏe > Truy cập dữ liệu. Nếu bạn nhập giá trị glucose vào Apple Health, hãy mở iAPS để xác nhận giá trị đó hiển thị."; /* New ALerts ------------------------- */ /* Info title */ "Info" = "Thông tin"; /* Warning title */ -"Warning" = "Warning"; +"Warning" = "Cảnh báo"; /* Error title */ "Error" = "Lỗi"; /* Manual temp basal mode */ -"Manual" = "Manual"; +"Manual" = "Thủ công"; /* An Automatic delivered bolus (SMB) */ -"SMB" = "SMB"; +"SMB" = "Liều tiêm tự động (SMB)"; /* A manually entered dose of external insulin */ "External Insulin" = "Liều insulin tiêm ngoài"; @@ -1258,13 +1258,13 @@ Enact a temp Basal or a temp target */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và protein thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Chất béo và protein"; +"Fat and Protein" = "Chất béo và chất đạm"; /* Display fat and protein entities */ -"Fat & Protein" = "Fat & Protein"; +"Fat & Protein" = "Chất Béo & Đạm"; /* */ -"Hide Fat & Protein" = "Ẩn Fat & Protein"; +"Hide Fat & Protein" = "Ẩn chất Béo & Đạm"; /* Add Fat */ "Fat" = "Chất béo"; @@ -1273,7 +1273,7 @@ Enact a temp Basal or a temp target */ "Protein" = "Protein"; /* Service Section */ -"Fat And Protein Conversion" = "Chuyển đổi chất béo và protein"; +"Fat And Protein Conversion" = "Chuyển đổi chất béo và đạm"; /* Service Section */ "Profile Override" = "Profile Override"; @@ -1293,7 +1293,7 @@ Enact a temp Basal or a temp target */ "Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; /* */ -"Enable indefinitely" = "Kích hoạt vô thời hạn"; +"Enable indefinitely" = "Cấp phép không giới hạn"; /* */ "Override Profile target" = "Override Profile target"; @@ -1302,7 +1302,7 @@ Enact a temp Basal or a temp target */ "Disable SMBs" = "Vô hiệu hóa SMBs"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Normal Profile"; +"Normal Profile" = "Hồ sơ Normal"; /* Custom but unsaved Profile */ "Custom Profile" = "Custom Profile"; @@ -1338,10 +1338,10 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Lưu profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Hủy bỏ Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Alert */ "Return to Normal?" = "Quay lại bình thường?"; @@ -1374,128 +1374,128 @@ Enact a temp Basal or a temp target */ "iAPS Icon" = "biểu tượng iAPS"; /* Service Section */ -"Statistics and Home View" = "Statistics and Home View"; +"Statistics and Home View" = "Thống kê và xem"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Xóa Carb tương đương không?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Tất cả FPU của bữa ăn sẽ bị xóa."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Xóa Glucose không?"; /* */ -"Meal Presets" = "Meal Presets"; +"Meal Presets" = "Đặt trước bữa ăn"; /* */ -"Empty" = "Empty"; +"Empty" = "Trống rỗng"; /* */ -"Delete Selected Preset" = "Delete Selected Preset"; +"Delete Selected Preset" = "Xóa cài đặt trước đã chọn"; /* */ -"Enter Meal Preset Name" = "Enter Meal Preset Name"; +"Enter Meal Preset Name" = "Nhập tên trước bữa ăn"; /* */ -"Name Of Dish" = "Name Of Dish"; +"Name Of Dish" = "Tên món ăn"; /* Save Carbs and continue to bolus recommendation */ -"Save and continue" = "Save and continue"; +"Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Dự đoán"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Hiển thị chất đạm và chất béo"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ -"Warning!" = "Warning!"; +"Warning!" = "Cảnh báo!"; /* Alert to confirm bolus amount to add */ -"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; +"\n\nTap 'Add' to continue with selected amount." = "\n\nNhấn 'Thêm' để tiếp tục với số lượng đã chọn."; /* */ -"Eventual Glucose" = "Eventual Glucose"; +"Eventual Glucose" = "Glucose hiện tại"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Vui lòng chờ"; /* */ "Glucose, " = "Glucose, "; /* */ -"Target Glucose" = "Target Glucose"; +"Target Glucose" = "Đường huyết mục tiêu"; /* */ -"Percentage setting" = "Percentage setting"; +"Percentage setting" = "Cài đặt phần trăm"; /* */ -"Insulin Sensitivity" = "Insulin Sensitivity"; +"Insulin Sensitivity" = "Độ nhạy Insulin"; /* Formula displayed in Bolus info pop-up. Make translation short! */ -"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; +"(Eventual Glucose - Target) / ISF" = "(Glucose hiện tại - Mục tiêu) / ISF"; /* */ -"Formula:" = "Formula:"; +"Formula:" = "Công thức:"; /* Bolus pop-up footer */ -"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs và insulin trước đó được đưa vào dự đoán lượng đường, nhưng nếu Đường huyết hiện tại thấp hơn Đường huyết mục tiêu thì không nên tiêm một liều bolus."; /* Hide pop-up */ -"Hide" = "Hide"; +"Hide" = "Ẩn"; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose được dự đoán trước tiên sẽ giảm xuống "; /* Bolus pop-up / Alert string. Make translations concise! */ -"which is below your Threshold (" = "which is below your Threshold ("; +"which is below your Threshold (" = "nằm dưới Ngưỡng của bạn ("; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose tăng chậm hơn dự kiến. Hy vọng: "; //* Bolus pop-up / Alert string. Make translations concise! */ -". Climbing: " = ". Climbing: "; +". Climbing: " = ". Leo: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose đang giảm nhanh hơn dự kiến. Hy vọng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Falling: " = ". Falling: "; +". Falling: " = ". Lao xuóng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Glucose cuối cùng > Glucose mục tiêu, nhưng glucose đang thay đổi nhanh hơn dự kiến. Hy vọng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Changing: " = ". Changing: "; +". Changing: " = ". Đang thay đổi: "; /* Add insulin without bolusing alert */ -" without bolusing" = " without bolusing"; +" without bolusing" = "Thêm và bỏ qua liều bolus"; /* ------------------------------------------------------------------------------------------- DASH strings */ "Attach Pod" = "Attach Pod"; -"Deactivate Pod" = "Deactivate Pod"; +"Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Lời nhắc độ tin cậy"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Lời nhắc về độ tin cậy là những tiếng bíp từ Pod có thể được sử dụng để xác nhận các lệnh đã chọn khi Pod không ở chế độ im lặng."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Đang lưu..."; @@ -1507,28 +1507,28 @@ Enact a temp Basal or a temp target */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; /* */ -"No Error" = "No Error"; +"No Error" = "Không có lỗi"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Title string for BeepPreference.manualCommands */ -"Enabled" = "Enabled"; +"Enabled" = "Cho phép"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; @@ -1537,7 +1537,7 @@ Enact a temp Basal or a temp target */ "Expiration Reminder" = "Expiration Reminder"; /* */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -1546,99 +1546,99 @@ Enact a temp Basal or a temp target */ "Scheduled Reminder" = "Scheduled Reminder"; /* */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* Label text for temporary basal rate summary */ "Rate" = "Tỷ lệ"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* */ -"Add Omnipod Dash" = "Add Omnipod Dash"; +"Add Omnipod Dash" = "Thay Omnipod Dash"; /* */ -"Insert Cannula" = "Insert Cannula"; +"Insert Cannula" = "Thay Cannula"; /* */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Thiết lập xong"; /* */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; //* -----------------------------------------------------------------------*/ /* ----------------------Statistics strings -------------------------------*/ /* */ -"Today" = "Today"; +"Today" = "Hôm nay"; /* */ -"Day" = "Day"; +"Day" = "Ngày"; /* */ -"Week" = "Week"; +"Week" = "Tuần"; /* */ -"Month" = "Month"; +"Month" = "Tháng"; /* */ "Total" = "Tổng số"; /* Headline Statistics */ -"Statistics" = "Statistics"; +"Statistics" = "Thống kê"; /* Option in preferences */ -"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; +"Allow Upload of Statistics to NS" = "Cho phép tải thống kê lên NS"; /* Low Glucose Threshold in Statistics settings */ "Low" = "Thấp"; @@ -1647,19 +1647,19 @@ Enact a temp Basal or a temp target */ "High" = "Cao"; /* In Range */ -"In Range" = "In Range"; +"In Range" = "Trong phạm vi"; /* Display % */ -"Change HbA1c Unit" = "Change HbA1c Unit"; +"Change HbA1c Unit" = "Thay đổi đơn vị của HbA1c"; /* */ -"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; +"Display Chart X - Grid lines" = "Thể hiện biểu đồ dạng X-Grid"; /* */ -"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; +"Display Chart Y - Grid lines" = "Thể hiện biểu đồ dạng Y-Grid"; /* */ -"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; +"Display Chart Threshold lines for Low and High" = "Thể hiện các đường hiển thị Low và High"; /* */ "Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; @@ -1668,28 +1668,28 @@ Enact a temp Basal or a temp target */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; /* */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 giờ"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 giờ"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 giờ"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 giờ"; /* Average BG = */ -"Average" = "Average"; +"Average" = "Trung bình"; /* Median BG */ -"Median" = "Median"; +"Median" = "Trung Bình"; /* CGM readings in statView */ -"Readings" = "Readings"; +"Readings" = "Đang đọc"; /* CGM readings in statView */ "Readings / 24h" = "Readings / 24h"; @@ -1698,13 +1698,13 @@ Enact a temp Basal or a temp target */ "Days" = "Days"; /* Normal BG (within TIR) */ -"Normal" = "Normal"; +"Normal" = "Bình thường"; /* Title High BG in statPanel */ -"High (>" = "High (>"; +"High (>" = "Cao (>"; /* Title Low BG in statPanel */ -"Low (<" = "Low (<"; +"Low (<" = "Thấp (<"; /* SD */ "SD" = "SD"; @@ -1725,10 +1725,10 @@ Enact a temp Basal or a temp target */ "Loops" = "Loops"; /* Loop Errors in statPanel */ -"Errors" = "Errors"; +"Errors" = "Lỗi"; /* Average loop interval */ -"Interval" = "Interval"; +"Interval" = "Khoảng"; /* Median loop interval */ "Duration" = "Khoảng thời gian"; @@ -1737,57 +1737,57 @@ Enact a temp Basal or a temp target */ "Display SD instead of CV" = "Display SD instead of CV"; /* Description for display SD */ -"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Hiển thị Độ lệch chuẩn (SD) thay vì Hệ số biến thiên (CV) trong statPanel"; /* How often to update the statistics */ -"Update every number of minutes:" = "Update every number of minutes:"; +"Update every number of minutes:" = "Cập nhật theo từng phút:"; /* Description for update interval for statistics */ -"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Mặc định là 20 phút. Tần suất cập nhật và lưu stats.json cũng như tải mảng cuối cùng lên Nightscout khi được bật."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "Past 24 Hours "; +"Past 24 Hours " = "24 Giờ Qua "; /* Duration displayed in statPanel */ -"Past Week " = "Past Week "; +"Past Week " = "Một tuần qua "; /* Duration displayed in statPanel */ -"Past Month " = "Past Month "; +"Past Month " = "Một tháng qua "; /* Duration displayed in statPanel */ -"Past 90 Days " = "Past 90 Days "; +"Past 90 Days " = "90 ngày trước "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "All Past Days of Data "; +"All Past Days of Data " = "Tất cả dữ liệu những ngày qua "; /* "Display Loop statistics in statPanel */ -"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; +"Display Loop Cycle statistics" = "Hiển thị số liệu thống kê theo vòng tròn"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; +"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong statPanel trong Chế độ xem trang chủ"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong statPanlel. Đơn vị trong statPanel sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; /* HbA1c for all glucose storage days */ -"all" = "all"; +"all" = "Tất cả"; /* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ -"CGM Configuration" = "CGM Configuration"; +"CGM Configuration" = "Cấu hình CGM"; -"Heartbeat" = "Heartbeat"; +"Heartbeat" = "Nhịp tim"; -"CGM address :" = "CGM address :"; +"CGM address :" = "Địa chỉ CGM :"; -"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; +"CGM is not used as heartbeat." = "CGM không được sử dụng làm nhịp tim."; -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?"; /* New Experimental feature */ -"Experimental" = "Experimental"; +"Experimental" = "Thử nghiệm"; /* Smoothing of CGM readings */ -"Smooth Glucose Value" = "Smooth Glucose Value"; +"Smooth Glucose Value" = "Giá trị Glucose mịn"; /* ----------------------------------------------------------------------------------------------------------- @@ -1799,311 +1799,367 @@ Enact a temp Basal or a temp target */ "Rewind Resets Autosens" = "Rewind Resets Autosens"; /* ”Rewind Resets Autosens” */ -"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."; +"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "Tính năng này, được bật theo mặc định, sẽ đặt lại tỷ lệ cảm biến tự động về mức trung tính khi bạn tua lại máy bơm của mình, với giả định rằng điều này tương ứng với một sự thay đổi địa điểm có thể xảy ra. Autosens sẽ bắt đầu học lại độ nhạy kể từ thời điểm tua lại, quá trình này có thể mất tới 6 giờ. Nếu bạn thường tua lại máy bơm của mình một cách độc lập với những thay đổi ở địa điểm, bạn có thể cân nhắc việc tắt tính năng này."; /* Headline "High Temptarget Raises Sensitivity" */ "High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; /* ”High Temptarget Raises Sensitivity" */ -"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Fitness_mode. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ "Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ "Sensitivity Raises Target" = "Sensitivity Raises Target"; /* ”Sensitivity Raises Target" */ -"When true, raises BG target when autosens detects sensitivity" = "When true, raises BG target when autosens detects sensitivity"; +"When true, raises BG target when autosens detects sensitivity" = "Khi True, tăng mục tiêu BG khi cảm biến tự động phát hiện độ nhạy"; /* Headline ”Resistance Lowers Target" */ "Resistance Lowers Target" = "Resistance Lowers Target"; /* ”Resistance Lowers Target" */ -"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Defaults to false. When true, will lower BG target when autosens detects resistance"; +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Mặc định là False. Khi True, sẽ hạ mục tiêu BG khi cảm biến tự động phát hiện kháng cự"; /* Headline ”Advanced Target Adjustments" */ "Advanced Target Adjustments" = "Advanced Target Adjustments"; /* ”Advanced Target Adjustments" */ -"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone."; +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Tính năng này trước đây được bật theo mặc định nhưng bây giờ sẽ được mặc định là false (sẽ KHÔNG được bật tự động) trong oref0 0.6.0 trở lên. (Không cần điều này với 0.6.0). Tính năng này tự động giảm BG mục tiêu của oref0 khi BG hiện tại và BG cuối cùng ở mức cao. Điều này giúp ngăn chặn và giảm thiểu BG cao, nhưng tự động chuyển sang nhiệt độ thấp để đảm bảo BG đi xuống mục tiêu thực tế của bạn một cách suôn sẻ. Nếu bạn thấy hành vi này quá hung hăng, bạn có thể tắt tính năng này. Nếu bạn làm như vậy, vui lòng cho chúng tôi biết để chúng tôi có thể hiểu rõ hơn cài đặt nào phù hợp nhất với mọi người."; /* Headline "Exercise Mode" */ -"Exercise Mode" = "Exercise Mode"; +"Exercise Mode" = "Chế độ tập thể dục"; /* "Exercise Mode" */ -"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity"; +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Mặc định là False. Khi True, mục tiêu cao > 105 mg/dL sẽ điều chỉnh Tỷ lệ độ nhạy cho chế độ tập luyện. Từ đồng nghĩa với high_temptarget_raises_sensitive"; /* Headline "Wide BG Target Range" */ -"Wide BG Target Range" = "Wide BG Target Range"; +"Wide BG Target Range" = "Phạm vi mục tiêu BG rộng"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng wide_bg_target_range: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; /* Headline "Skip Neutral Temps" */ "Skip Neutral Temps" = "Skip Neutral Temps"; /* "Skip Neutral Temps" */ -"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means OpenAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications form the 'rig', that may wake you up during the night. "; +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Temp “trung tính” (giống như Temp cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; /* Headline "Unsuspend If No Temp” */ "Unsuspend If No Temp" = "Unsuspend If No Temp"; /* "Unsuspend If No Temp” */ -"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended."; +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Nhiều người thỉnh thoảng quên tiếp tục/hủy tạm dừng máy bơm sau khi kết nối lại. Nếu bạn là một trong số họ và sẵn sàng đặt nhiệt độ cơ bản bằng 0 một cách đáng tin cậy bất cứ khi nào tạm dừng và ngắt kết nối máy bơm của mình, thì tính năng này sẽ hỗ trợ bạn. Nếu được bật, nó sẽ tự động tiếp tục/hủy tạm dừng máy bơm nếu bạn quên làm như vậy trước khi hết nhiệt độ 0. Miễn là nhiệt độ bằng 0 vẫn đang chạy, nó sẽ khiến máy bơm bị treo."; /* Headline "Enable UAM" */ -"Enable UAM" = "Enable UAM"; +"Enable UAM" = "Kích hoạt UAM"; /* "Enable UAM" */ -"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier."; +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Khi bật tùy chọn này, thuật toán SMB có thể nhận ra các bữa ăn không báo trước. Điều này rất hữu ích nếu bạn quên thông báo cho iAPS về lượng carb của mình hoặc ước tính sai lượng carb của bạn và lượng carb đã nhập sai hoặc nếu một bữa ăn có nhiều chất béo và protein kéo dài hơn dự kiến. Nếu không có bất kỳ lượng carb nào được đưa vào, UAM có thể nhận ra mức tăng đường huyết nhanh chóng do carbs, adrenaline, v. v. gây ra và cố gắng điều chỉnh nó bằng SMB. Điều này cũng hoạt động theo cách ngược lại: nếu lượng glucose giảm nhanh, nó có thể dừng SMB sớm hơn."; /* Headline "Enable SMB With COB" */ -"Enable SMB With COB" = "Enable SMB With COB"; +"Enable SMB With COB" = "Kích hoạt SMB đối với COB"; /* Enable SMB With COB" */ -"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "This enables supermicrobolus (SMB) while carbs on board (COB) are positive."; +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép supermicrobolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; /* Headline "Enable SMB With Temptarget” */ -"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; +"Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; /* "Enable SMB With Temptarget” */ -"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB."; +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép supermicrobolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; /* Headline "Enable SMB Always" */ -"Enable SMB Always" = "Enable SMB Always"; +"Enable SMB Always" = "Luôn bật SMB"; /* "Enable SMB Always" */ -"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)."; +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật supermicrobolus (trừ khi bị tắt bởi high temptarget)."; /* Headline "Enable SMB After Carbs" */ -"Enable SMB After Carbs" = "Enable SMB After Carbs"; +"Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; /* "Enable SMB After Carbs" */ -"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)."; +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật supermicrobolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép supermicrobolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ -"Use Custom Peak Time" = "Use Custom Peak Time"; +"Use Custom Peak Time" = "Sử dụng Giờ cao điểm tùy chỉnh"; /* "Use Custom Peak Time” */ -"Defaults to false. Setting to true allows changing insulinPeakTime" = "Defaults to false. Setting to true allows changing insulinPeakTime"; +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi insulinPeakTime"; /* Headline "Suspend Zeros IOB” */ "Suspend Zeros IOB" = "Suspend Zeros IOB"; /* "Suspend Zeros IOB” */ -"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added."; +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; /* Headline "Max IOB" */ -"Max IOB" = "Max IOB"; +"Max IOB" = "IOB tối đa"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (max_daily_safety_multiplier và current_basal_safety_multiplier), max_iob được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ -"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; +"Max Daily Safety Multiplier" = "Hệ số an toàn hàng ngày tối đa"; /* "Max Daily Safety Multiplier" */ -"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là giới hạn an toàn quan trọng của OpenAPS. Cài đặt mặc định (có thể không cần điều chỉnh) là 3. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 3 lần tốc độ cơ bản hàng giờ cao nhất được lập trình trong máy bơm của người dùng hoặc, nếu được bật, sẽ được xác định bằng autotune."; /* Headline "Current Basal Safety Multiplier" */ -"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; +"Current Basal Safety Multiplier" = "Hệ số an toàn cơ bản(Basal) hiện tại"; /* "Current Basal Safety Multiplier" */ -"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là một giới hạn an toàn quan trọng khác của OpenAPS. Cài đặt mặc định (cũng khó có thể cần điều chỉnh) là 4. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 4 lần tốc độ cơ bản hàng giờ hiện tại được lập trình trong máy bơm của người dùng hoặc, nếu được bật, được xác định bằng autotune."; /* Headline "Autosens Max" */ -"Autosens Max" = "Autosens Max"; +"Autosens Max" = "Autosens tối đa"; /* "Autosens Max" */ -"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target."; +"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "Đây là giới hạn hệ số nhân cho autosens (và autotune) để đặt giới hạn tối đa 20% cho tỷ lệ cảm biến tự động có thể cao đến mức nào, từ đó xác định mức độ tự động điều chỉnh mức cơ bản cao, mức độ điều chỉnh ISF thấp và mức độ thấp của nó có thể đặt mục tiêu BG."; /* Headline "Autosens Min" */ -"Autosens Min" = "Autosens Min"; +"Autosens Min" = "Autosens tối thiểu"; /* "Autosens Min" */ -"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets."; +"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "Mặt khác của các giới hạn an toàn của autosens, đặt giới hạn về mức độ tự động thấp có thể điều chỉnh mức cơ bản và mức độ có thể điều chỉnh các mục tiêu ISF và BG."; /* Headline "Half Basal Exercise Target" */ "Half Basal Exercise Target" = "Half Basal Exercise Target"; /* "Half Basal Exercise Target" */ -"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes."; +"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Đặt thành một số, ví dụ: 160, có nghĩa là khi mục tiêu tạm thời là 160 mg/dL và tập thể dục_mode=true, hãy chạy 50% cơ bản ở mức này (120 = 75%; 140 = 60%). Điều này có thể được điều chỉnh để giúp bạn kiểm soát nhiều hơn các chế độ tập luyện của mình. +\"Mục tiêu tập thể dục nửa cơ bản\"."; /* Headline "Max COB" */ -"Max COB" = "Max COB"; +"Max COB" = "COB tối đa"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của maxCOB là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức maxCOB và giữ nó ở mức maxCOB cho đến khi lượng carb nhập vào trên maxCOB cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; /* "Bolus Snooze DIA Divisor" */ -"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)."; +"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Chế độ báo lại bolus được kích hoạt sau khi bạn thực hiện một bữa ăn nhanh, vì vậy vòng lặp sẽ không phản tác dụng với nhiệt độ thấp khi bạn vừa ăn. Ví dụ ở đây và mặc định là 2; vì vậy DIA 3 giờ có nghĩa là thời gian báo lại bolus sẽ giảm dần trong 1,5 giờ (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ "Min 5m Carbimpact" = "Min 5m Carbimpact"; /* "Min 5m Carbimpact" */ -"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g."; +"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Đây là cài đặt cho tác động hấp thụ carb mặc định trong 5 phút. Giá trị mặc định là 8 mg/dL/5 phút dự kiến. Điều này ảnh hưởng đến tốc độ phân hủy của COB trong các tình huống khi không thể nhìn thấy sự hấp thụ carb ở độ lệch BG. Giá trị mặc định là 8 mg/dL/5 phút tương ứng với tốc độ hấp thụ carb tối thiểu là 24g/giờ ở CSF là 4 mg/dL/g."; /* Headline "Autotune ISF Adjustment Fraction" */ -"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; +"Autotune ISF Adjustment Fraction" = "Phân số (AF) điều chỉnh ISF tự động điều chỉnh"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của fullNewISF và PumpISF. 1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF."; /* Headline "Remaining Carbs Fraction" */ "Remaining Carbs Fraction" = "Remaining Carbs Fraction"; /* "Remaining Carbs Fraction" */ -"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là tỷ lệ carbs mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy sự hấp thụ carb."; /* Headline "Remaining Carbs Cap" */ -"Remaining Carbs Cap" = "Remaining Carbs Cap"; +"Remaining Carbs Cap" = "Phần carb còn lại"; /* "Remaining Carbs Cap" */ -"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là lượng carb tối đa mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy khả năng hấp thụ carb."; /* Headline ”Max SMB Basal Minutes" */ -"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; +"Max SMB Basal Minutes" = "Số phút cơ bản(Basal) SMB tối đa"; /* ”Max SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa có thể được phân phối dưới dạng một SMB duy nhất không có COB. Điều này mang lại khả năng làm cho SMB trở nên hung hãn hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Không nên đặt giá trị này cao hơn 90 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "Max UAM SMB Basal Minutes" */ -"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; +"Max UAM SMB Basal Minutes" = "Số phút cơ bản(basal) UAM SMB tối đa"; /* "Max UAM SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa mà UAM có thể phân phối dưới dạng một SMB khi IOB vượt quá COB. Điều này mang lại khả năng khiến UAM trở nên hung hãn hơn hoặc ít hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Việc giảm giá trị sẽ khiến UAM giảm liều insulin cho mỗi SMB. Không nên đặt giá trị này cao hơn 60 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "SMB Interval" */ -"SMB Interval" = "SMB Interval"; +"SMB Interval" = "Khoảng thời gian SMB"; /* "SMB Interval" */ -"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Thời lượng tối thiểu tính bằng phút cho SMB mới kể từ SMB cuối cùng hoặc liều truyền thủ công"; /* Headline "Bolus Increment" */ -"Bolus Increment" = "Bolus Increment"; +"Bolus Increment" = "Tăng liều Bolus nhanh"; /* "Bolus Increment" */ -"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Số SMB được ban hành nhỏ nhất. Lượng tối thiểu đối với máy bơm Omnipod là 0,05 U, trong khi đối với máy bơm Medtronic, lượng này khác nhau đối với nhiều kiểu máy khác nhau, từ 0,025 U đến 0,10 U. Vui lòng kiểm tra lượng truyền nhanh tối thiểu mà máy bơm của bạn có thể cung cấp. Giá trị mặc định là 0,1."; /* Headline "Insulin Peak Time" */ -"Insulin Peak Time" = "Insulin Peak Time"; +"Insulin Peak Time" = "Thời gian cao điểm của insulin"; /* "Insulin Peak Time" */ -"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops."; +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Thời gian tác dụng hạ đường huyết tối đa của insulin, tính bằng phút. Lưu ý: Oref giả định đường cong cực nhanh (Lyumjev) và tác dụng nhanh (Fiasp) tối thiểu (35 & 50 phút) và tối đa (100 & 120 phút) insulinPeakTimes áp dụng. Việc sử dụng insulinPeakTime tùy chỉnh ngoài các giới hạn này sẽ dẫn đến sự cố với iAPS, tính toán vòng lặp dài hơn và có thể xảy ra vòng lặp màu đỏ."; /* Headline "Carbs Req Threshold" */ -"Carbs Req Threshold" = "Carbs Req Threshold"; +"Carbs Req Threshold" = "Ngưỡng yêu cầu của lượng Carbs"; /* "Carbs Req Threshold" */ -"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold."; +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Số gram carbsReq để kích hoạt quá trình đẩy. Mặc định là 1 (cho 1 gam carbohydrate). Có thể tăng lên nếu bạn chỉ muốn nhận Pushover cho carbsReq ở ngưỡng X."; /* Headline "Noisy CGM Target Multiplier" */ -"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; +"Noisy CGM Target Multiplier" = "Hệ số mục tiêu CGM Noisy"; /* "Noisy CGM Target Multiplier" */ -"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data"; +"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Mặc định là 1.3. Tăng mục tiêu lên số lượng này khi lặp lại dữ liệu CGM thô/noisy"; /* Headline "SMB DeliveryRatio" */ -"SMB DeliveryRatio" = "SMB DeliveryRatio"; +"SMB DeliveryRatio" = "Tỷ lệ phân phối SMB"; /* SMB DeliveryRatio */ -"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Giá trị mặc định: 0,5 Đây là một giới hạn an toàn quan trọng khác của OpenAPS và chỉ định tỷ lệ trong tổng lượng insulin cần thiết có thể được phân phối dưới dạng SMB. Tăng giá trị thử nghiệm này một cách chậm rãi và thận trọng."; // Dynamic ISF + CR Settings: /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Enable Dynamic ISF, Headline */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Tính toán ISF mới với mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên BG, TDD hiện tại của insulin (24 giờ qua hoặc mức trung bình có trọng số) và Hệ số điều chỉnh (mặc định là 1).\n\nTỷ lệ ISF và CR động sẽ bị giới hạn bởi giới hạn autosens.min/max của bạn.\n\nTỷ lệ động thay thế tỷ lệ autosens: ISF mới = ISF tĩnh / Tỷ lệ động,\nTỷ lệ động = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ -"Enable Dynamic CR" = "Enable Dynamic CR"; +/* Headline Enable Dynamic CR */ +"Enable Dynamic CR" = "Kích hoạt CR động"; /* Enable Dynamic CR */ -"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Sử dụng CR động. Tỷ lệ động sẽ được sử dụng cho CR như sau:\n\n Khi tỷ lệ > 1: dynCR = (newRatio - 1) / 2 + 1.\nKhi tỷ lệ < 1: dynCR = CR/dynCR.\n\nKhông sử dụng cùng với Tỷ lệ Insulin cao (> 2)"; + +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Điều chỉnh tỷ lệ động theo một hằng số. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF của bạn sẽ càng lớn đối với BG cao hay thấp. Hiệu chỉnh tối đa được xác định bởi cài đặt tối thiểu/tối đa của Autosens. Đối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu. Đối với công thức logarit, thre có ít sự đồng thuận hơn, nhưng bắt đầu bằng 0,5 - 0,8 thì phù hợp hơn với hầu hết người dùng"; +/* Headline Use Sigmoid Function */ +"Use Sigmoid Function" = "Sử dụng hàm Sigmoid (SF)"; -/* Headline "Use Sigmoid Function" */ -"Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; -/* Use Sigmoid Function */ -"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; +/* Use Sigmoid Function */ +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Sử dụng hàm sigmoid cho ISF (và cho CR, khi được bật), thay vì công thức logarit mặc định. Yêu cầu bật cài đặt ISF động trong cài đặt\n\nCài đặt Điều chỉnh điều chỉnh độ dốc của đường cong (Y: Tỷ lệ động, X: Đường huyết). Giá trị thấp hơn ==> ít dốc hơn == ít linh hoạt hơn.\n\nCài đặt autosens.min/max xác định cả giới hạn tối đa/phút cho tỷ lệ động VÀ mức độ điều chỉnh tỷ lệ động. Nếu AF là độ dốc của đường cong thì autosens.min/max là chiều cao của biểu đồ, khoảng Y, trong đó Y: tỷ lệ động. Đường cong sẽ luôn có dạng sigmoid, bất kể cài đặt autosens.min/max nào được sử dụng, nghĩa là những cài đặt này có hậu quả lớn đối với kết quả của ISF động được tính toán. Hãy cẩn thận khi đặt giá trị autosens.max quá cao. Với cài đặt ISF cấu hình phù hợp, bạn có thể sẽ không bao giờ cần nó cao hơn 1,5\n\nGiới hạn Autosens.max > 1,5 là không nên khi sử dụng chức năng sigmoid."; -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; + +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; /* Weight of past 24 hours of insulin */ -"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Phải > 0 và <= 1.\nMặc định là 0,65 (65 %) * TDD. Phần còn lại sẽ lấy từ mức trung bình của tổng dữ liệu (tối đa 14 ngày) của tất cả các phép tính TDD (35%). Để chỉ sử dụng 24 giờ qua, hãy đặt giá trị này thành 1.\n\nĐể tránh những biến động đột ngột, chẳng hạn như sau một bữa ăn thịnh soạn, tính toán TDD trung bình trong 2 giờ qua được sử dụng thay vì chỉ TDD hiện tại (24 giờ qua lúc thời điểm này). +​."; /* Headline "Adjust basal" */ -"Adjust basal" = "Adjust basal"; +"Adjust basal" = "Điều chỉnh cơ bản(basal)"; /* Enable adjustment of basal profile */ -"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Cho phép điều chỉnh mức cơ bản dựa trên tỷ lệ TDD hiện tại/TDD trung bình 7 ngày"; /* Headline "Max Delta-BG Threshold SMB" */ -"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; +"Max Delta-BG Threshold SMB" = "Ngưỡng tối đa Delta-BG SMB"; /* Max Delta-BG Threshold SMB */ -"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Mặc định là 0,2 (20%). Thay đổi phần trăm dương tối đa của cấp độ BG để sử dụng SMB, trên mức đó sẽ vô hiệu hóa SMB. Giới hạn mã hóa cứng là 40%. Đối với UAM vòng kín hoàn toàn nên sử dụng 30%. Quan sát nhật ký và cửa sổ bật lên (maxDelta 27 > 20% BG 100 - vô hiệu hóa SMB!)."; /* Headline "... When Blood Glucose Is Over (mg/dl):" */ "... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; /* ... When Blood Glucose Is Over (mg/dl): */ -"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Đặt giá trị EnableSMB_high_bg sẽ so sánh để kích hoạt SMB. Nếu BG > giá trị này, SMB sẽ kích hoạt."; /* Headline "Enable SMB With High BG" */ -"Enable SMB With High BG" = "Enable SMB With High BG"; +"Enable SMB With High BG" = "Kích hoạt SMB với BG cao"; /* "Enable SMB With High BG" */ -"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Dynamic settings"; +"Dynamic settings" = "Cài đặt động(Dynamic)"; /* Insulin curve */ -"Insulin curve" = "Insulin curve"; +"Insulin curve" = "Đường cong insulin"; /* Headline "Adjustment Factor" */ -"Adjustment Factor" = "Adjustment Factor"; +"Adjustment Factor" = "Yếu tố điều chỉnh (AF)"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 7d5e483142..913fd01e52 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2045,32 +2045,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From a1414fba7f56e69c9831518540fe7ce83defd4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 3 Jan 2024 22:54:09 +0100 Subject: [PATCH 324/405] Crowdin updates (#448) Ukrainian and Vietnamese --- .../Main/uk.lproj/Localizable.strings | 40 +++++++++---------- .../Main/vi.lproj/Localizable.strings | 40 +++++++++---------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index fb62144c6b..1de4e5eaca 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Використовувати Dynamic CR. Dynamic ratio також впливатиме на CR:\n\n Коли ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКоли ratio <1: dynCR = CR/dynCR.\n\nНе використовуйте спільно з високим Insulin Fraction (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Активація динамічної чутливості (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Активація динамічного співвідношення вуглеводів (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; @@ -2065,63 +2065,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Формула"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Загальна безпека"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Використовуйте сигмоїдну функцію для ISF (та для CR, якщо ввімкнено), замість стандартної логарифмічної формули. У налаштуваннях потрібно ввімкнути параметр Dynamic ISF\n\nПараметр Adjustment регулює нахил кривої (Y: динамічне співвідношення, X: рівень глюкози в крові). Менше значення ==> менш крутий == менш агресивний.\n\nПараметри autosens.min/max визначають максимальні/мінімальні межі для динамічного коефіцієнта І наскільки динамічне співвідношення регулюється. Якщо AF – це нахил кривої, autosens.min/max – це висота графіка, Y-інтервал, де Y: динамічне співвідношення. Крива завжди матиме сигмоподібну форму, незалежно від того, які налаштування autosens.min/max використовуються, тобто ці налаштування мають великі наслідки для результату обчисленої динамічної ISF. Будьте обережні, встановлюючи занадто високе значення autosens.max. З правильним налаштуванням ISF профілю вам, ймовірно, ніколи не знадобиться, щоб воно було вищим за 1,5\n\nОбмеження Autosens.max > 1,5 не рекомендується під час використання сигмоїдної функції."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Порогове значення"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Поріг, мг/дл, у FAX за замовчуванням залежить від Вашої поточної мінімальної мети BG, таким чином:\n\nЯкщо мінімальна мета BG = 5 ммоль/л -> поріг = 3,6 ммоль/л,\n\n мінімальна мета BG = 5.6 ммоль/л -> поріг = 3,9 ммоль/л, мінімальна мета BG = 6.1 ммоль/л -> поріг = 4,2 ммоль/л, якщо мінімальна мета BG = 7.2 ммоль/л -> поріг = 4,7 ммоль/л.\n\nЦе налаштування дозволяє збільшити рівень порога для більш безпечної роботи з dynISF. Валідним буде значення 65 мг/дл = 3,6 ммоль/л <= Threshold Setting <= 120 мг/дл = 6,7 ммоль/л."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Налаштування калькулятора"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Показати передбачення"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Менші екрани iPhone"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Відобразити та дозволити записи жиру та білка"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Додайте налаштування перегляду їжі"; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Показувати кнопку тимчасові цілі"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Панель кнопок домашнього перегляду"; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Якщо ви використовуєте профілі та тимчасові цілі"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Завжди кольорове значення глюкози (зелений, жовтий тощо)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Налаштування заголовка"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Зазвичай рівень глюкози забарвлюється в червоний колір лише тоді, коли рівень сповіщень перевищує або перебуває нижче для високого/низького рівня"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Дії наживо"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Показати дії наживо"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index c96a502430..6d2962032f 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -2051,10 +2051,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Sử dụng CR động. Tỷ lệ động sẽ được sử dụng cho CR như sau:\n\n Khi tỷ lệ > 1: dynCR = (newRatio - 1) / 2 + 1.\nKhi tỷ lệ < 1: dynCR = CR/dynCR.\n\nKhông sử dụng cùng với Tỷ lệ Insulin cao (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Kích hoạt độ nhạy động (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Kích hoạt Tỷ lệ Carb động (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; @@ -2066,63 +2066,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Sử dụng hàm Sigmoid (SF)"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Công thức"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "An toàn"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Sử dụng hàm sigmoid cho ISF (và cho CR, khi được bật), thay vì công thức logarit mặc định. Yêu cầu bật cài đặt ISF động trong cài đặt\n\nCài đặt Điều chỉnh điều chỉnh độ dốc của đường cong (Y: Tỷ lệ động, X: Đường huyết). Giá trị thấp hơn ==> ít dốc hơn == ít linh hoạt hơn.\n\nCài đặt autosens.min/max xác định cả giới hạn tối đa/phút cho tỷ lệ động VÀ mức độ điều chỉnh tỷ lệ động. Nếu AF là độ dốc của đường cong thì autosens.min/max là chiều cao của biểu đồ, khoảng Y, trong đó Y: tỷ lệ động. Đường cong sẽ luôn có dạng sigmoid, bất kể cài đặt autosens.min/max nào được sử dụng, nghĩa là những cài đặt này có hậu quả lớn đối với kết quả của ISF động được tính toán. Hãy cẩn thận khi đặt giá trị autosens.max quá cao. Với cài đặt ISF cấu hình phù hợp, bạn có thể sẽ không bao giờ cần nó cao hơn 1,5\n\nGiới hạn Autosens.max > 1,5 là không nên khi sử dụng chức năng sigmoid."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Cài đặt ngưỡng"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Thiết lập Tính toán"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Hiển thị dự đoán"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Màn hình iPhone nhỏ hơn"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Hiển thị và cho phép nhập các mục Chất béo và chất đạm"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Thêm cài đặt Chế độ xem bữa ăn "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Hiển thị nút tiêu tạm thời"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Bảng nút xem trang chủ "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Trong trường hợp bạn đang sử dụng cả hồ sơ và mục tiêu tạm thời"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Luôn tô màu Giá trị Glucose (xanh, vàng, v. v.)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Cài đặt tiêu đề"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Thông thường glucose chỉ có màu đỏ khi vượt quá hoặc dưới giới hạn thông báo của bạn về mức cao"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Hoạt động trực tiếp"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hoạt động trực tiếp hiển thị đường huyết trực tiếp trên màn hình khóa và trên đảo động (nếu có)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Hiển thị hoạt động trực tiếp"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From 84f444102ba450e9608c516e0cf165e80371d911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 4 Jan 2024 00:38:49 +0100 Subject: [PATCH 325/405] Crowdin (#449) Crowdin updates --- .../vi.lproj/Localizable.strings | 26 +- .../G7SensorKit/vi.lproj/Localizable.strings | 26 +- .../Resources/vi.lproj/Localizable.strings | 27 +- .../vi.lproj/Localizable.strings | 472 +++++------ .../Resources/vi.lproj/Localizable.strings | 152 ++-- .../Resources/vi.lproj/Localizable.strings | 300 +++---- FreeAPS/Resources/vi.lproj/InfoPlist.strings | 14 +- .../Main/ar.lproj/Localizable.strings | 66 +- .../Main/da.lproj/Localizable.strings | 66 +- .../Main/de.lproj/Localizable.strings | 66 +- .../Main/es.lproj/Localizable.strings | 66 +- .../Main/fi.lproj/Localizable.strings | 66 +- .../Main/fr.lproj/Localizable.strings | 66 +- .../Main/he.lproj/Localizable.strings | 66 +- .../Main/hu.lproj/Localizable.strings | 66 +- .../Main/it.lproj/Localizable.strings | 66 +- .../Main/nb.lproj/Localizable.strings | 66 +- .../Main/nl.lproj/Localizable.strings | 66 +- .../Main/pl.lproj/Localizable.strings | 66 +- .../Main/pt-BR.lproj/Localizable.strings | 66 +- .../Main/pt-PT.lproj/Localizable.strings | 66 +- .../Main/ru.lproj/Localizable.strings | 66 +- .../Main/sk.lproj/Localizable.strings | 66 +- .../Main/sv.lproj/Localizable.strings | 66 +- .../Main/tr.lproj/Localizable.strings | 66 +- .../Main/uk.lproj/Localizable.strings | 66 +- .../Main/vi.lproj/Localizable.strings | 780 ++++++++++-------- .../Main/zh-Hans.lproj/Localizable.strings | 66 +- 28 files changed, 2127 insertions(+), 990 deletions(-) diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings index 2db1aee77e..21559a57b6 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings @@ -39,10 +39,10 @@ "Glucose" = "Đường huyết"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Thời gian ân huệ kết thúc"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Thời gian ân huệ còn lại"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "CAO"; @@ -54,7 +54,7 @@ "Last Reading" = "Kết quả đọc gần nhất"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor."; /* String displayed instead of a glucose value below the CGM range */ "LOW" = "THẤP"; @@ -63,28 +63,28 @@ "Name" = "Tên"; /* No comment provided by engineer. */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan để thay sensor"; /* title for g7 settings connection status when scanning */ "Scanning" = "Đang quét"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Đang tìm kiếm \n sensor"; /* G7 Progress bar label when searching for sensor */ "Searching for sensor" = "Đang tìm kiếm cảm biến"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\n hết hạn"; /* G7 Status highlight text for sensor failed */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\n thất bại"; /* G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\n có vấn đề"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Sensor\n đang khởi động"; /* title for g7 settings row showing sensor expiration time */ "Sensor Expiration" = "Cảm biến hết hạn"; @@ -93,16 +93,16 @@ "Sensor expired" = "Cảm biến đã hết hạn"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor hết hạn"; /* G7 Progress bar label when sensor failed */ "Sensor failed" = "Lỗi cảm biến"; /* title for g7 settings row showing sensor start time */ -"Sensor Start" = "Start sensor"; +"Sensor Start" = "Bắt đầu sensor"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Tín hiệu\n mất"; /* Field label */ "Time" = "Thời gian"; @@ -114,4 +114,4 @@ "Upload Readings" = "Glucose đang tải lên"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; diff --git a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings index 7cca3ef4b9..917eec144f 100644 --- a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings @@ -2,7 +2,7 @@ "Dexcom G7" = "Dexcom G7"; /* Descriptive text on G7StartupView */ -"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management."; +"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor."; /* Button title for starting setup */ "Continue" = "Tiếp tục"; @@ -38,7 +38,7 @@ "Sensor Expiration" = "Cảm biến hết hạn"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Grace Period End"; +"Grace Period End" = "Thời gian ân huệ kết thúc"; /* Field label */ "Glucose" = "Đường huyết"; @@ -73,7 +73,7 @@ "Upload Readings" = "Glucose đang tải lên"; /* Button */ -"Scan for new sensor" = "Scan for new sensor"; +"Scan for new sensor" = "Scan để thay sensor"; /* Button label for removing CGM */ "Delete CGM" = "Xoá CGM"; @@ -96,34 +96,34 @@ "Sensor expired" = "Cảm biến đã hết hạn"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; /* G7 Progress bar label when sensor in warmup */ -"Warmup completes" = "Warmup completes"; +"Warmup completes" = "Khởi động hoàn tất"; /* G7 Progress bar label when sensor failed */ "Sensor failed" = "Lỗi cảm biến"; /* G7 Progress bar label when sensor lifetime progress showing */ -"Sensor expires" = "Sensor expires"; +"Sensor expires" = "Sensor hết hạn"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Grace period remaining"; +"Grace period remaining" = "Thời gian ân huệ còn lại"; /* G7 Status highlight text for searching for sensor */ -"Searching for\nSensor" = "Searching for\nSensor"; +"Searching for\nSensor" = "Đang tìm kiếm \n sensor"; /* G7 Status highlight text for sensor expired */ -"Sensor\nExpired" = "Sensor\nExpired"; +"Sensor\nExpired" = "Sensor\n hết hạn"; /* G7 Status highlight text for signal loss */ -"Sensor\nFailed" = "Sensor\nFailed"; +"Sensor\nFailed" = "Sensor\n thất bại"; /* G7 Status highlight text for signal loss */ -"Signal\nLoss" = "Signal\nLoss"; +"Signal\nLoss" = "Tín hiệu\n mất"; /*G7 Status highlight text for sensor error */ -"Sensor\nIssue" = "Sensor\nIssue"; +"Sensor\nIssue" = "Sensor\n có vấn đề"; /* G7 Status highlight text for sensor warmup */ -"Sensor\nWarmup" = "Sensor\nWarmup"; +"Sensor\nWarmup" = "Sensor\n đang khởi động"; diff --git a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings index 9673f6c744..602c6fee27 100644 --- a/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKitUI/Resources/vi.lproj/Localizable.strings @@ -20,7 +20,7 @@ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian bơm..."; /* Instructions on selecting battery chemistry type */ "Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Pin kềm và pin lithium phân rã ở các mức độ khác nhau. Pin kềm có xu hướng giảm điện áp tuyến tính theo thời gian trong khi pin lithium có xu hướng duy trì điện áp cho đến khi hết nửa vòng đời. Trong điều kiện sử dụng bình thường trên bơm Minimed (loại X22 hay X15) khi chạy Loop, pin kiềm có thể dùng được trong khoảng 4 đến 5 ngày trong khi pin lithium dùng dc 2 tuần. Việc lựa chọn này được sử dụng theo các mức phân rã điện áp khác nhau cho mỗi loại pin hóa học và sẽ có cảnh báo đối với người dùng khi pin hỏng đạt khoảng từ 8-10 giờ."; @@ -69,7 +69,7 @@ "Devices" = "Thiết bị"; /* Description for option to not use MySentry */ -"Do not use MySentry" = "Do not use MySentry"; +"Do not use MySentry" = "Không sử dụng MySentry"; /* The alert title for a resume error */ "Error Resuming" = "Lỗi khi đang tái thực hiện"; @@ -93,7 +93,7 @@ "Firmware Version" = "Chương trình cơ sở"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* Title of insulin delivery section */ "Insulin Delivery" = "Khối lượng tiêm insulin"; @@ -111,10 +111,10 @@ "Medtronic %1$@" = "Medtronic %1$@"; /* Instructions on selecting setting for MySentry */ -"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models."; +"Medtronic pump models 523, 723, 554, and 754 have a feature called 'MySentry' that periodically broadcasts the reservoir and pump battery levels. Listening for these broadcasts allows Loop to communicate with the pump less frequently, which can increase pump battery life. However, when using this feature the RileyLink stays awake more of the time and uses more of its own battery. Enabling this may lengthen pump battery life, while disabling it may lengthen RileyLink battery life. This setting is ignored for other pump models." = "Các mẫu máy bơm Medtronic 523, 723, 554 và 754 có một tính năng gọi là 'MySentry', phát sóng định kỳ mức pin của bình chứa và máy bơm. Việc lắng nghe các chương trình phát sóng này cho phép Loop liên lạc với máy bơm ít thường xuyên hơn, điều này có thể tăng tuổi thọ pin của máy bơm. Tuy nhiên, khi sử dụng tính năng này, RileyLink sẽ hoạt động lâu hơn và sử dụng nhiều pin hơn. Việc bật tính năng này có thể kéo dài tuổi thọ pin của máy bơm, trong khi việc tắt tính năng này có thể kéo dài tuổi thọ pin RileyLink. Cài đặt này bị bỏ qua đối với các kiểu máy bơm khác."; /* Value string for MySentry config when MySentry is not being used */ -"No" = "No"; +"No" = "Không"; /* Message display when no response from tuning pump */ "No response" = "Không có phản hồi nào"; @@ -123,7 +123,8 @@ "No, Keep Pump As Is" = "Không, Giữ nguyên máy bơm"; /* Pump find device instruction */ -"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device"; +"On your pump, go to the Find Device screen and select \"Find Device\".\n\nMain Menu >\nUtilities >\nConnect Devices >\nOther Devices >\nOn >\nFind Device" = "Trên máy bơm của bạn, hãy đi tới \"Find Device\". Chọn Main Menu >\Utilities >\\Connect Devices >\\Other Devices >\\On >\\Find Device. +Bơm sẽ tìm thấy chỉ định"; /* navigation title for pump battery type selection Text for medtronic pump preferred data source */ @@ -164,7 +165,7 @@ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Title text for insulin type confirmation page */ -"Select the type of insulin that you will be using in this pump." = "Select the type of insulin that you will be using in this pump."; +"Select the type of insulin that you will be using in this pump." = "Chọn loại insulin bạn sẽ sử dụng trong máy bơm này."; /* Progress message for sending button press to pump. */ "Sending button press…" = "Đang gửi nút bấm…"; @@ -185,13 +186,13 @@ "Suspending" = "Đang tạm ngưng"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* Title for pod sync time action sheet. */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Đã phát hiện thay đổi thời gian"; /* The label indicating the results of each frequency trial */ "Trials" = "Các thử nghiệm"; @@ -203,7 +204,7 @@ "U/hr" = "U/giờ"; /* Text to indicate battery percentage is unknown */ -"unknown" = "unknown"; +"unknown" = "không xác định"; /* Text shown in basal rate space when delivery status is unknown */ "Unknown" = "Không nhận ra"; @@ -211,10 +212,10 @@ /* Description for option to use MySentry navigation title for pump battery type selection Text for medtronic pump to use MySentry */ -"Use MySentry" = "Use MySentry"; +"Use MySentry" = "Sử dụng MySentry"; /* Value string for MySentry config when MySentry is being used */ "Yes" = "Có"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 06b51f615f..7486629962 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -9,70 +9,70 @@ "Multiple Command Alert" = "Multiple Command Alert"; /* Alert content title for userPodExpiration pod alert */ -"Pod Expiration Reminder" = "Pod Expiration Reminder"; +"Pod Expiration Reminder" = "Lời Nhắc Pod Hết hạn"; /* Alert content title for podExpiring pod alert */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Tiếp tục lại việc tiêm insulin"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod ghép nối không thành công"; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* Alert content body for multiCommand pod alert */ "Multiple Command Alert" = "Multiple Command Alert"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod sẽ hết hạn trong: %1$@."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Thay pod ngay. Pod đã hoạt động 72 giờ qua."; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Thay pod ngay. Insulin sẽ ngừng trong 1 giờ tới."; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin hoặc ít hơn còn lại trong Pod. Thay Pod ngay."; /* Alert content body for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Thời gian tạm ngưng insulin đã kết thúc.\n\n Bạn có thể phục hồi việc tiêm thuốc từ màn hình chính hoặc từ màn hình cài đặt bơm. Sẽ có thông báo nhắc trong vòng 15 phút."; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Đề nghị hoàn thành ghép đôi pod."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Thời gian trên bơm khác so với thời gian thực tế. Bạn có thể xem thời gian trên bơm và sync thời gian hiện hành trong cài đặt."; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Thời gian tạm dừng hết. Mở ứng dụng và tiếp tục lại."; /* Action button default text for PodAlerts */ "Ok" = "Ok"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod hết hạn"; /* */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* */ "Notification Settings" = "Cài đặt thông báo"; @@ -81,422 +81,422 @@ "Confidence Reminders" = "Confidence Reminders"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Tạm dừng insulin"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod đã hết hạn"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Settings page link description when next lifecycle action is to pair new pod */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Kết nối Pod."; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Đang ghép đôi."; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Đang priming. Xin chờ."; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod ghép đôi thành công. Tiếp tục."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "ngày"; /* Unit for plural days in pod life remaining */ -"days" = "days"; +"days" = "ngày"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "giờ"; /* Unit for plural hours in pod life remaining */ "hours" = "giờ"; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "phút"; /* Unit for plural minutes in pod life remaining */ "minutes" = "phút"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Khối lượng tiêm insulin"; /* */ -"Scheduled Basal" = "Scheduled Basal"; +"Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Section header for activity section */ -"Activity" = "Activity"; +"Activity" = "Hoạt động"; /* title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Chi tiết thiết bị"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Settings page link description when next lifecycle action is to replace pod */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* Label for pod life state when within pod expiration window */ -"Pod expired" = "Pod expired"; +"Pod expired" = "Pod đã hết hạn"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* Label for pod life state when no pod paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Pod life HUD view label */ -"Fault" = "Fault"; +"Fault" = "Lỗi"; /* Label describing pod age view */ "Pod Age" = "Pod Age"; /* Label describing time remaining view */ -"Remaining" = "Remaining"; +"Remaining" = "Đang còn lại"; /* Label indicating pod replacement necessary */ -"Replace Pod" = "Replace Pod"; +"Replace Pod" = "Thay pod"; /* Error message shown when no pod is paired */ -"No pod paired" = "No pod paired"; +"No pod paired" = "Không có pod nào được kết nối"; /* Error message shown when user cannot pair because pod is already paired */ -"Pod already paired" = "Pod already paired"; +"Pod already paired" = "Pod đã được ghép đôi"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Loại insulin chưa được khai báo"; /* Error message when cannula insertion fails because the pod is in an unexpected state */ -"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion."; +"Pod is not in a state ready for cannula insertion." = "Pod không sẵn sàng để gắn cannula."; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Cài đặt không tồn tại"; /* Recovery suggestion shown when no pod is paired */ -"Please pair a new pod" = "Please pair a new pod"; +"Please pair a new pod" = "Đề nghị ghép đôi pod mới"; /* Generic title of the OmniBLE pump manager */ "Omnipod DASH" = "Omnipod DASH"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Câu lệnh có vấn đề"; /* */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Hoàn tất ghép đôi"; /* Status highlight that when pod is deactivating */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Status highlight message for emptyReservoir alarm. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pod Occlusion"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* Status highlight when manual temp basal is running. */ "Manual Basal" = "Liều Basal thủ công"; /* */ -"Insert Cannula" = "Insert Cannula"; +"Insert Cannula" = "Thay Cannula"; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Đang gắn..."; /* Cannula insertion button text while showing error */ -"Retry" = "Retry"; +"Retry" = "Thử lại"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Đang kiểm tra..."; /* */ -"Check cannula insertion finished" = "Check cannula insertion finished"; +"Check cannula insertion finished" = "Kiểm tra việc gắn cannula hoàn tất"; /* */ -"Get pod status" = "Get pod status"; +"Get pod status" = "Lấy thông tin pod"; /* */ -"Save Basal Profile" = "Save Basal Profile"; +"Save Basal Profile" = "Lưu profile basal"; /* */ -"Save basal profile failed: %{public}@" = "Save basal profile failed: %{public}@"; +"Save basal profile failed: %{public}@" = "Lưu profile basal gặp lỗi: %{public}@"; /* */ -"Skipping Play Test Beeps due to bolus still in progress." = "Skipping Play Test Beeps due to bolus still in progress."; +"Skipping Play Test Beeps due to bolus still in progress." = "Bỏ qua việc kiểm tra bíp do đang thực hiện liều bolus."; /* */ -"Play Test Beeps" = "Play Test Beeps"; +"Play Test Beeps" = "Kiểm tra bíp"; /* */ -"Skipping Read Pulse Log due to bolus still in progress." = "Skipping Read Pulse Log due to bolus still in progress."; +"Skipping Read Pulse Log due to bolus still in progress." = "Bỏ qua nhật ký đọc xung do liều bolus chưa hoàn thành."; /* */ -"Read Pulse Log" = "Read Pulse Log"; +"Read Pulse Log" = "Đọc nhật ký do xung"; /* */ -"Set Confirmation Beeps to %s" = "Set Confirmation Beeps to %s"; +"Set Confirmation Beeps to %s" = "Cài đặt tiếng Bíp mức %s"; /* */ -"Set Confirmation Beeps Preference" = "Set Confirmation Beeps Preference"; +"Set Confirmation Beeps Preference" = "Cài đặt tiếng Bíp"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* */ -"Failed to suspend: %{public}@" = "Failed to suspend: %{public}@"; +"Failed to suspend: %{public}@" = "Tạm ngưng thất bại: %{public}@"; /* */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* */ "Bolus" = "Liều bolus"; /* */ -"Cancel Bolus" = "Cancel Bolus"; +"Cancel Bolus" = "Hủy bỏ liều bolus"; /* Alert acknowledgment OK button */ "OK" = "OK"; /* The title for Empty Reservoir alarm notification */ -"Empty Reservoir" = "Empty Reservoir"; +"Empty Reservoir" = "Hết thuốc"; /* The title for Occlusion alarm notification */ -"Occlusion Detected" = "Occlusion Detected"; +"Occlusion Detected" = "Phát hiện tắc nghẽn"; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Pod lỗi nghiêm trọng"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Cài đặt liều nền tạm thời"; /* Section header for activity section */ -"Activity" = "Activity"; +"Activity" = "Hoạt động"; /* Section header for configuration section */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* Title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Pod trước"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Thời gian của Bơm"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian của bơm..."; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Chuyển đổi sang bơm khác"; /* Title for pod sync time action sheet. */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Không, Giữ nguyên"; /* Title for Omnipod DASH PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Thay bơm"; /* Message for Omnipod DASH PumpManager deletion action sheet */ -"Are you sure you want to stop using Omnipod DASH?" = "Are you sure you want to stop using Omnipod DASH?"; +"Are you sure you want to stop using Omnipod DASH?" = "Bạn có chắc muốn dừng sử dụng Omnipod DASH?"; /* Button text to confirm Omnipod DASH PumpManager deletion */ -"Delete Omnipod DASH" = "Delete Omnipod DASH"; +"Delete Omnipod DASH" = "Xóa Omnipod DASH"; /* Text for confidence reminders navigation link" */ -"Insulin Type" = "Insulin Type"; +"Insulin Type" = "Loại Insulin"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Title for suspend duration selection action sheet */ -"Suspend Delivery" = "Suspend Delivery"; +"Suspend Delivery" = "Tạm ngưng liều insulin"; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Việc tiêm insulin sẽ bị dừng cho đến khi bạn tiếp tục theo cách thủ công. Vậy khi nào bạn muốn Loop nhắc bạn tiếp tục tiêm?"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 phút"; /* Button text for 1 hour suspend duration" */ -"1 hour" = "1 hour"; +"1 hour" = "1 giờ"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 giờ 30 phút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Không thể tiêm insulin trở lại"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Không thể cài đặt thời gian cho bơm"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Không thể hủy liều basal thủ công"; /* */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, gỡ bỏ pod ra khỏi cơ thể và ghép nối pod mới."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, bạn có thể ghép nối pod mới."; /* Deactivate pod action button */ -"Deactivate Pod" = "Deactivate Pod"; +"Deactivate Pod" = "Hủy kích hoạt Pod"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Đang hủy kích hoạt."; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod hủy kích hoạt thành công. Tiếp tục."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Retry"; +"Retry" = "Thử lại"; /* Action button description when deactivated */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Đã xảy ra sự cố khi giao tiếp với Pod. Nếu sự cố này vẫn tiếp diễn, hãy nhấn vào Discard Pod. Sau đó, bạn có thể kích hoạt Pod mới."; /* Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Loại bỏ pod"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Gỡ pod khỏi cơ thể"; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod có thể đang tiêm insulin.\n Gỡ pod khỏi người sau đó nhấn \"Continue.\""; /* Insulin Unit */ "U" = "U"; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng khi pod hết hạn 8 giờ tới hoặc khi không còn insulin."; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +"Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Dùng loại insulin U-100."; /* Label text for step 2 of pair pod instructions */ -"Listen for 2 beeps." = "Listen for 2 beeps."; +"Listen for 2 beeps." = "Nghe 2 tiếng bíp."; /* Label text indicating pairing finished.*/ -"Paired" = "Paired"; +"Paired" = "Đã ghép đôi"; /* Cancel button text in navigation bar on pair pod UI */ "Cancel" = "Bỏ qua"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Bạn có chắc chắn muốn hủy cấu hình pod?"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Nếu bạn hủy cấu hình pod, pod hiện tại sẽ bị hủy kích hoạt và sẽ không sử dụng được nữa."; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Có, hủy kích hoạt pod"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Không, tiếp tục"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Chuẩn bị vị trí."; /* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; /* Action button title for attach pod view */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* */ "Attach Pod" = "Attach Pod"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Xác nhận pod đã gắn chặt"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Confirm” khi Pod đã gắn chặt."; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Xác nhận"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Chạm phía dưới để bắt đầu gắn cannula."; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Đã gắn"; /* Check Cannula */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Việc gắn cannual chuẩn chưa?"; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Ô vuông trên đầu của pod sẽ nháy đỏ khi cannual được gắn chuẩn vào trong cơ thể."; /* Button label for user to answer cannula was properly inserted */ "Yes" = "Có"; @@ -505,19 +505,19 @@ "No" = "Không"; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Đang ghép đôi..."; /* Pod pairing action button text while priming */ "Priming..." = "Priming..."; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; /* Pod state when pod has been deactivated */ -"Deactivated" = "Deactivated"; +"Deactivated" = "Đã hủy kích hoạt"; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Pod đã sẵn sàng hoạt động.\n\n%1$@ sẽ nhắc nhở bạn thay đổi khi pod hết hạn. Bạn có thể thay khi nào tiện."; /* */ "Scheduled Reminder" = "Scheduled Reminder"; @@ -526,52 +526,52 @@ "Time" = "Thời gian"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Hoàn thành cài đặt"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Thiết lập xong"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; /* Error message description for PeripheralManagerError.notReady */ -"Peripheral Not Ready" = "Peripheral Not Ready"; +"Peripheral Not Ready" = "Thiết bị ngoại vi chưa sẵn sàng"; /* Error message description for PeripheralManagerError.incorrectResponse */ -"Incorrect Response" = "Incorrect Response"; +"Incorrect Response" = "Phản hồi không chuẩn"; /* Error message description for PeripheralManagerError.timeout */ -"Timeout" = "Timeout"; +"Timeout" = "Hết thời gian"; /* Error message description for PeripheralManagerError.emptyValue */ -"Empty Value" = "Empty Value"; +"Empty Value" = "Giá trị trống"; /* Error message description for PeripheralManagerError.unknownCharacteristic */ -"Unknown Characteristic" = "Unknown Characteristic"; +"Unknown Characteristic" = "Đặc điểm không xác định"; /* Error message description for PeripheralManagerError.nack */ -"Nack" = "Nack"; +"Nack" = "Không có gì"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Lời nhắc của Omnipod"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Ứng dụng cấu hình lời nhắc trên pod để thông báo trước cho bạn khi pod hết hạn. Đặt số giờ bạn muốn cấu hình khi ghép nối pod mới."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Đây là lời nhắc mà bạn đã lên lịch khi ghép nối Pod hiện tại của mình."; /* */ "Scheduled Reminder" = "Scheduled Reminder"; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Ứng dụng nhắc nhở bạn khi lượng insulin trong pod đạt đến mức này."; /* Description text for critical alerts */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Cảnh báo nghiêm trọng"; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if you device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Lời nhắc ở trên sẽ không phát ra âm thanh nếu thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb.\n\n Có nhiều cách cảnh báo khác nhau phát ra âm thanh ngay cả khi thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb."; /* navigation title for notification settings */ "Notification Settings" = "Cài đặt thông báo"; @@ -582,30 +582,30 @@ "No Reminder" = "No Reminder"; /* Label for low reservoir reminder row */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Title string for BeepPreference.manualCommands */ -"Enabled" = "Enabled"; +"Enabled" = "Cho phép"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for temporary basal rate summary */ "Rate" = "Tỷ lệ"; @@ -614,54 +614,54 @@ "U/hr" = "U/hr"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* Text shown in insulin remaining space when no pod is paired (Please keep the '\n' while translating!) */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Không\n Tiêm"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* description label for device name pod details row */ -"Device Name" = "Device Name"; +"Device Name" = "Tên thiết bị"; /* description label for lot number pod details row */ -"Lot Number" = "Lot Number"; +"Lot Number" = "Số Lô"; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Số thứ tự"; /* description label for firmware version pod details row */ "Firmware Version" = "Firmware Version"; @@ -670,153 +670,153 @@ "BLE Firmware Version" = "BLE Firmware Version"; /* description label for activated at timne pod details row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Trạng thái cuối"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Thông tin lỗi Pod"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Cấu hình Pod"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy bỏ"; /* Text for continue button on PodSetupView */ -"Continue" = "Continue"; +"Continue" = "Tiếp tục"; /* Are you sure you want to skip Omnipod Onboarding? */ "Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Ứng dụng sẽ thông báo trước cho bạn thời gian pod hết hạn.\n\n Kéo xuống để thiết lập số giờ để ứng dụng thông báo."; /* Text of continue button on ExpirationReminderSetupView" */ -"Next" = "Next"; +"Next" = "Kế tiếp"; /* */ "Expiration Reminder" = "Expiration Reminder"; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* */ "Save" = "Lưu"; /* hr (short for hour) */ -"hr" = "hr"; +"hr" = "giờ"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Hủy bỏ liều basal thủ công"; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Đảm bảo rằng Pod của bạn đang ở gần và thử lại."; /* Error message shown when the pod is not connected */ -"Pod not connected" = "Pod not connected"; +"Pod not connected" = "Pod chưa được kết nối"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Tạm ngưng tại"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Không tìm thấy Pod"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Phát hiện quá nhiều pod"; /* Recovery suggestion when no response is received from pod */ -"Make sure iPhone is nearby the active pod" = "Make sure iPhone is nearby the active pod"; +"Make sure iPhone is nearby the active pod" = "Đảm bảo rằng iPhone gần với pod đang kích hoạt"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Thử lại"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Chuyển pod đến vị trí mới và thử lại."; /* Recovery suggestion for PodCommsError.noPodsFound */ -"Make sure your pod is filled and nearby." = "Make sure your pod is filled and nearby."; +"Make sure your pod is filled and nearby." = "Đảm bảo pod đã chứa đầy thuốc và gần bên."; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition iPhone further from the pod" = "Please reposition iPhone further from the pod"; +"Please reposition iPhone further from the pod" = "Đặt iPhone xa khỏi pod"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition iPhone relative to the pod" = "Please reposition iPhone relative to the pod"; +"Please reposition iPhone relative to the pod" = "Đặt iPhone lại gần pod"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Chỉ mang pod gốc trong phạm vi hoạt động hoặc hủy kích hoạt pod gốc"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Có nhiễu xuyên âm. Vui lòng di chuyển đến địa điểm mới"; /* Recovery suggestion when no pod is available */ -"Make sure your pod is nearby and try again." = "Make sure your pod is nearby and try again."; +"Make sure your pod is nearby and try again." = "Đảm bảo rằng Pod của bạn đang ở gần và thử lại."; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liều bolus hiện tại hoàn tất hoặc hủy liều bolus"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ -"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus"; +"Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liều bolus hiện tại hoàn tất hoặc hủy liều bolus"; /* Recovery suggestion when operation could not be completed due to existing temp basal in progress */ -"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel"; +"Wait for existing temp basal to finish, or suspend to cancel" = "Chờ đợi liều basal tạm thời hoàn tất hoặc chọn ngưng để hủy"; /* DASH Pod time ago since last status */ "%@ ago" = "%@ trước đó"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Im lặng"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Chế độ hoạt động bình thường trong đó tiếng bíp của Pod được dùng cho mọi cảnh báo của Pod và khi lời nhắc được bật."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tất cả các cảnh báo của Pod đều không sử dụng tiếng bíp và tiếng bíp nhắc nhở sẽ bị chặn. Pod sẽ chỉ phát ra tiếng bíp khi Pod gặp lỗi nghiêm trọng và khi thực hiện kiểm tra tiếng bíp.\n\n⚠️Cảnh báo - Bất cứ khi nào Pod ở chế độ im lặng, nó phải được đặt trong phạm vi hoạt động của Bluetooth để nhận thông báo về các cảnh báo của Pod."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Chế độ Silence Pod sẽ chặn tất cả tiếng bíp và lời nhắc nhở."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Pod im lặng"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Các thông tin của Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Thông tin của Pod trước đó"; /* Text for pump manager details navigation link */ "Pump Manager Details" = "Pump Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Pump Manager..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Làm mới Pump Manager Details"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Chẩn đoán"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Đọc tình trạng pod"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 95e5232e61..97e98360f9 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -1,27 +1,27 @@ /* Description for an inactive alert modifier */ -" (inactive)" = " (inactive)"; +" (inactive)" = " (không hoạt động)"; /* Format string for low battery alert body for RileyLink. (1: device name) */ -"\"%1$@\" has a low battery" = "\"%1$@\" has a low battery"; +"\"%1$@\" has a low battery" = "\"%1$@\" gần hết pin"; /* Unit format string for an RSSI value in decibles */ "%@ dB" = "%@ dB"; /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */ -"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin or less remaining in Pod. Change Pod soon."; +"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin hoặc ít hơn còn lại trong Pod. Thay Pod ngay."; /* Format string for activation time exceeded Pod state when activation not completed in the time allowed */ -"Activation time exceeded" = "Activation time exceeded"; +"Activation time exceeded" = "Đã quá thời gian kích hoạt"; /* Description for auto-off */ -"Auto-off" = "Auto-Off"; +"Auto-off" = "Tự động tắt"; /* Description for auto-off alarm */ -"Auto-off alarm" = "Auto-off alarm"; +"Auto-off alarm" = "Tự động tắt cảnh báo"; /* Pod state when basal initialized */ -"Basal initialized" = "Basal initialized"; +"Basal initialized" = "Liều basal được khởi tạo"; /* Pod state when running below fifty units */ "Below 50 units" = "Dưới 50 units"; @@ -48,37 +48,37 @@ "Certain" = "Chắc chắn"; /* Alert content body for podExpireImminent pod alert */ -"Change Pod now. Insulin delivery will stop in 1 hour." = "Change Pod now. Insulin delivery will stop in 1 hour."; +"Change Pod now. Insulin delivery will stop in 1 hour." = "Thay pod ngay. Insulin sẽ ngừng trong 1 giờ tới."; /* Alert content body for podExpiring pod alert */ -"Change Pod now. Pod has been active for 72 hours." = "Change Pod now. Pod has been active for 72 hours."; +"Change Pod now. Pod has been active for 72 hours." = "Thay pod ngay. Pod đã hoạt động 72 giờ qua."; /* Format string for invalid message error code (1: error code number) */ -"Command error %1$u" = "Command error %1$u"; +"Command error %1$u" = "Câu lệnh lỗi %1$u"; /* Status highlight that delivery is uncertain. */ -"Comms Issue" = "Comms Issue"; +"Comms Issue" = "Câu lệnh có vấn đề"; /* Error message when command is rejected because an unacknowledged command is pending. */ -"Communication issue: Unacknowledged command pending." = "Communication issue: Unacknowledged command pending."; +"Communication issue: Unacknowledged command pending." = "Sự cố giao tiếp: Lệnh chưa được xác nhận đang chờ xử lý."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* The title for AlarmCode.other notification */ -"Critical Pod Error" = "Critical Pod Error"; +"Critical Pod Error" = "Pod lỗi nghiêm trọng"; /* Recovery suggestion when unexpected address received */ -"Crosstalk possible. Please move to a new location" = "Crosstalk possible. Please move to a new location"; +"Crosstalk possible. Please move to a new location" = "Có nhiễu xuyên âm. Vui lòng di chuyển đến địa điểm mới"; /* Pod state when pod has been deactivated */ "Deactivated" = "Đã hủy kích hoạt"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Description for Empty reservoir pod fault */ "Empty reservoir" = "Ngăn chứa insulin rỗng"; @@ -93,43 +93,43 @@ "Expiration alert" = "Thông báo hết hạn"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Delivery status when extended bolus is running */ -"Extended bolus running" = "Extended bolus running"; +"Extended bolus running" = "Mở rộng chạy liều bolus"; /* Delivery status when extended bolus and temp basal is running */ -"Extended bolus running with temp basal" = "Extended bolus running with temp basal"; +"Extended bolus running with temp basal" = "Mở rộng chạy liều bolus với liều nền tạm thời"; /* Pod state when fault event has occurred */ -"Fault event occurred" = "Fault event occurred"; +"Fault event occurred" = "Đã có lỗi"; /* Status highlight that when pod is deactivating. */ -"Finish Deactivation" = "Finish Deactivation"; +"Finish Deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* Status highlight that when pod is activating. */ -"Finish Pairing" = "Finish Pairing"; +"Finish Pairing" = "Hoàn tất ghép đôi"; /* Description for finish setup */ "Finish setup " = "Hoàn tất cấu hình"; /* Description for finish setup reminder */ -"Finish setup reminder" = "Finish setup reminder"; +"Finish setup reminder" = "Hoàn tất thiết lập lời nhắc"; /* Pod inititialized */ "Initialized" = "Đã được khởi tạo"; /* Pod state when inserting cannula */ -"Inserting cannula" = "Inserting cannula"; +"Inserting cannula" = "Thay cannula"; /* The default notification body for AlarmCodes */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ -"Insulin type not configured" = "Insulin type not configured"; +"Insulin type not configured" = "Loại insulin chưa được khai báo"; /* The format string for Internal pod fault (1: The fault code value) */ "Internal pod fault %1$03d" = "Lỗi bên trong pod %1$03d"; @@ -138,28 +138,28 @@ "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@"; /* Error message for when unexpected address is received (1: received address) (2: expected address) */ -"Invalid address 0x%x. Expected 0x%x" = "Invalid address 0x%x. Expected 0x%x"; +"Invalid address 0x%x. Expected 0x%x" = "Địa chỉ không tồn tại 0x%x. Dự kiến 0x%x"; /* Description for MessageError invalidAddress */ -"Invalid address: (%1$@)" = "Invalid address: (%1$@)"; +"Invalid address: (%1$@)" = "Địa chỉ không tồn tại: (%1$@)"; /* Description for MessageError invalidCrc */ -"Invalid CRC" = "Invalid CRC"; +"Invalid CRC" = "CRC không tồn tại"; /* Error description for OmniBLEPumpManagerError.invalidSetting */ -"Invalid Setting" = "Invalid Setting"; +"Invalid Setting" = "Cài đặt không tồn tại"; /* Alert content title for lowReservoir pod alert */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Format string for description for low reservoir advisory (1: reminder units) */ -"Low reservoir advisory (%1$gU)" = "Low reservoir advisory (%1$gU)"; +"Low reservoir advisory (%1$gU)" = "Báo động hết thuốc (%1$gU)"; /* Description for low reservoir alarm */ "Low reservoir advisory alarm" = "Báo động ngăn chứa insulin thấp"; /* Title for RileyLink low battery alert */ -"Low RileyLink Battery" = "Low RileyLink Battery"; +"Low RileyLink Battery" = "Báo động pin RileyLink thấp"; /* Recovery suggestion when no RileyLink is available */ "Make sure your RileyLink is nearby and powered on" = "Đảm bảo RileyLink bên cạnh và đã được bật"; @@ -168,10 +168,10 @@ "Manual Basal" = "Liều Basal thủ công"; /* Pod memory initialized */ -"Memory initialized" = "Memory initialized"; +"Memory initialized" = "Bộ nhớ được khởi tạo"; /* Recovery suggestion for PodCommsError.tooManyPodsFound */ -"Move to a new area away from any other pods and try again." = "Move to a new area away from any other pods and try again."; +"Move to a new area away from any other pods and try again." = "Chuyển pod đến vị trí mới và thử lại."; /* Alert content body for multiCommand pod alert Alert content title for multiCommand pod alert */ @@ -181,23 +181,23 @@ "No alerts" = "Không có cảnh báo nào"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for Fault Event Code .noFaults */ -"No faults" = "No faults"; +"No faults" = "Không có lỗi"; /* Status highlight message for emptyReservoir alarm. Status highlight that a pump is out of insulin. */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Status highlight that when no pod is paired. */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Error message shown when no pod is paired */ "No pod paired" = "Không có pod nào được kết nối"; /* Error message for PodCommsError.noPodsFound */ -"No pods found" = "No pods found"; +"No pods found" = "Không tìm thấy Pod"; /* Error message shown when no response from pod was received */ "No response from pod" = "Không có tín hiệu phản hồi từ pod"; @@ -210,10 +210,10 @@ "Normal" = "Bình thường"; /* Description for MessageError notEnoughData */ -"Not enough data" = "Not enough data"; +"Not enough data" = "Không đủ dữ liệu"; /* Description for Occlusion detected pod fault */ -"Occlusion detected" = "Occlusion detected"; +"Occlusion detected" = "Phát hiện tắc nghẽn"; /* Generic title of the omnipod pump manager */ "Omnipod" = "Omnipod"; @@ -222,28 +222,28 @@ "Paired" = "Đã được ghép đôi"; /* Pod status when pairing completed */ -"Pairing completed" = "Pairing completed"; +"Pairing completed" = "Ghép đôi hoàn thành"; /* Description for MessageError parsingError. (1: decription of error), (2: hexadecimal data starting at offset) */ -"Parsing Error: %1$@ in (%2$@)" = "Parsing Error: %1$@ in (%2$@)"; +"Parsing Error: %1$@ in (%2$@)" = "Lỗi cú pháp: %1$@ in (%2$@)"; /* Recovery suggestion on unexpected pod change */ -"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod"; +"Please bring only original pod in range or deactivate original pod" = "Chỉ mang pod gốc trong phạm vi hoạt động hoặc hủy kích hoạt pod gốc"; /* Recovery suggestion when no response is received from pod */ "Please bring your pod closer to the RileyLink and try again" = "Đề nghị để pod gần với Rileylink và thử lại lần nữa"; /* Alert content body for finishSetupReminder pod alert */ -"Please finish pairing your pod." = "Please finish pairing your pod."; +"Please finish pairing your pod." = "Đề nghị hoàn thành ghép đôi pod."; /* Recover suggestion shown when no pod is paired */ "Please pair a new pod" = "Đề nghị ghép đôi pod mới"; /* Recovery suggestion when pairing signal strength is too high */ -"Please reposition the RileyLink further from the pod" = "Please reposition the RileyLink further from the pod"; +"Please reposition the RileyLink further from the pod" = "Đặt RileyLink xa khỏi pod"; /* Recovery suggestion when pairing signal strength is too low */ -"Please reposition the RileyLink relative to the pod" = "Please reposition the RileyLink relative to the pod"; +"Please reposition the RileyLink relative to the pod" = "Đặt RileyLink lại gần pod"; /* Error message shown when user cannot pair because pod is already paired */ "Pod already paired" = "Pod đã được ghép đôi"; @@ -252,7 +252,7 @@ "Pod already primed" = "Pod đã được mồi"; /* Status highlight message for other alarm. */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Description for expiration advisory alarm */ "Pod expiration advisory alarm" = "Cảnh báo pod hết hạn"; @@ -264,7 +264,7 @@ "Pod expired" = "Pod đã hết hạn"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ -"Pod expires in %1$@." = "Pod expires in %1$@."; +"Pod expires in %1$@." = "Pod sẽ hết hạn trong: %1$@."; /* Format string for pod fault code */ "Pod Fault: %1$@" = "Pod lỗi: %1$@"; @@ -282,26 +282,26 @@ "Pod Occlusion" = "Pod Occlusion"; /* Alert content title for finishSetupReminder pod alert */ -"Pod Pairing Incomplete" = "Pod Pairing Incomplete"; +"Pod Pairing Incomplete" = "Pod ghép nối không thành công"; /* Error message shown when pod sends ack instead of response */ -"Pod sent ack instead of response" = "Pod sent ack instead of response"; +"Pod sent ack instead of response" = "Pod gửi ack thay vì phản hồi"; /* Pod state when prime or cannula insertion has not completed in the time allotted */ "Pod setup window expired" = "Cửa sổ cấu hình pod hết hạn"; /* Description for pod suspended reminder */ -"Pod suspended reminder" = "Pod suspended reminder"; +"Pod suspended reminder" = "Lời nhắc Pod tạm dừng"; /* Format string for poor pod signal strength */ -"Poor signal strength" = "Poor signal strength"; +"Poor signal strength" = "Tín hiệu yếu"; /* Delivery status when pod is priming Pod status when priming */ "Priming" = "Đang mồi"; /* Pod state when priming completed */ -"Priming completed" = "Priming completed"; +"Priming completed" = "Priming hoàn tất"; /* Pod state when ready for basal programming */ "Ready for basal programming" = "Sẵn sàng cho việc tính toán liều basal"; @@ -310,16 +310,16 @@ "Ready to insert cannula" = "Sẵn sàng cho việc gắn cannula"; /* Pod pairing reminder initialized */ -"Reminder initialized" = "Reminder initialized"; +"Reminder initialized" = "Lời nhắc đã được khởi tạo"; /* Pump Event title for UnfinalizedDose with doseType of .resume */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* Recovery suggestion when pod is suspended */ -"Resume delivery" = "Resume delivery"; +"Resume delivery" = "Tiếp tục lại việc tiêm insulin"; /* Alert content title for suspendEnded pod alert */ -"Resume Insulin" = "Resume Insulin"; +"Resume Insulin" = "Tiếp tục lại việc tiêm insulin"; /* The format string describing a resume. (1: Time)(2: Scheduled certainty */ "Resume: %1$@ %2$@" = "Tái lập: %1$@ %2$@"; @@ -328,26 +328,26 @@ "Scheduled Basal" = "Đã lên chương trình cho liều Basal"; /* Description for shutdown imminent */ -"Shutdown imminent" = "Shutdown imminent"; +"Shutdown imminent" = "Tắt báo động sắp xảy ra"; /* Description for shutdown imminent alarm */ "Shutdown imminent alarm" = "Tắt báo động sắp xảy ra"; /* Status highlight when communications with the pod haven't happened recently. */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* Format string for pod signal strength too high */ -"Signal strength too high" = "Signal strength too high"; +"Signal strength too high" = "Sóng tín hiệu quá cao"; /* Pump Event title for UnfinalizedDose with doseType of .suspend */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* Alert content body for suspendInProgress pod alert Alert content title for suspendInProgress pod alert */ "Suspend In Progress Reminder" = "Suspend In Progress Reminder"; /* Description for suspend time expired */ -"Suspend time expired" = "Suspend time expired"; +"Suspend time expired" = "Thời gian tạm dừng hết hạn"; /* Delivery status when insulin delivery is suspended */ "Suspended" = "Đã tạm ngưng"; @@ -359,7 +359,7 @@ "Suspended" = "Đã tạm ngưng"; /* Alert notification body for suspendEnded pod alert user notification */ -"Suspension time is up. Open the app and resume." = "Suspension time is up. Open the app and resume."; +"Suspension time is up. Open the app and resume." = "Thời gian tạm dừng hết. Mở ứng dụng và tiếp tục lại."; /* Pod tank fill completed */ "Tank fill completed" = "Hoàn tất nạp"; @@ -380,31 +380,31 @@ "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ U/giờ %2$@ %3$@ %4$@ U %5$@"; /* Alert content body for suspendEnded pod alert */ -"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes."; +"The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Thời gian tạm ngưng insulin đã kết thúc.\n\n Bạn có thể phục hồi việc tiêm thuốc từ màn hình chính hoặc từ màn hình cài đặt bơm. Sẽ có thông báo nhắc trong vòng 15 phút."; /* Alert content body for timeOffsetChangeDetected pod alert */ -"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings."; +"The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Thời gian trên bơm khác so với thời gian thực tế. Bạn có thể xem thời gian trên bơm và sync thời gian hiện hành trong cài đặt."; /* Alert content title for timeOffsetChangeDetected pod alert */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* The format string for pod expiration notification body (1: time until expiration) */ "Time to replace your pod! Your pod will expire in %1$@" = "Thời gian thay pod của bạn! Pod của bạn sẽ hết hạn trong %1$@"; /* Error message for PodCommsError.tooManyPodsFound */ -"Too many pods found" = "Too many pods found"; +"Too many pods found" = "Phát hiện quá nhiều pod"; /* Recovery suggestion when ack received instead of response */ -"Try again" = "Try again"; +"Try again" = "Thử lại"; /* String describing a dose that was possibly scheduled */ "Uncertain" = "Không chắc chắn"; /* Description for MessageError invalidSequence */ -"Unexpected message sequence number" = "Unexpected message sequence number"; +"Unexpected message sequence number" = "Thứ tự tin nhắn không mong đợi"; /* Format string for unexpected pod change */ -"Unexpected pod change" = "Unexpected pod change"; +"Unexpected pod change" = "Không mong đợi thay thế pod"; /* Error message shown when empty response from pod was received */ "Unexpected response from pod" = "Phản hồi bất thường từ pod"; @@ -413,10 +413,10 @@ "Unknown pod fault %1$03d" = "Lỗi không xác định của pod %1$03d"; /* Format string for description of MessageError unknownValue. (1: value) (2: Type) */ -"Unknown Value (%1$@) for type %2$@" = "Unknown Value (%1$@) for type %2$@"; +"Unknown Value (%1$@) for type %2$@" = "Giá trị không xác định (%1$@) cho loại %2$@"; /* Format string for description of MessageError validationFailed. (1: description of validation failure) */ -"Validation failed: %1$@" = "Validation failed: %1$@"; +"Validation failed: %1$@" = "Xác thực không thành công: %1$@"; /* Recovery suggestion when operation could not be completed due to existing bolus in progress */ "Wait for existing bolus to finish, or cancel bolus" = "Chờ đợi liệu bolus hiện tại hoàn tất hoặc hủy liều bolus"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 32fb5c3821..76c78eb3c0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -8,7 +8,7 @@ "%@ dB" = "%@ dB"; /* No comment provided by engineer. */ -"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now."; +"%@ has recovered communication with the pod on your body.\n\nInsulin delivery records have been updated and should match what has actually been delivered.\n\nYou may continue to use %@ normally now." = "%@ đã khôi phục liên lạc với pod trên cơ thể bạn.\n\nHồ sơ tiêm insulin đã được cập nhật và phải khớp với việc tiêm thực sự.\n\nBạn có thể tiếp tục sử dụng %@ một cách bình thường ngay bây giờ."; /* Format string for delivered insulin. (1: The localized amount) Format string for insulin remaining in reservoir. (1: The localized amount) */ @@ -30,16 +30,16 @@ "%@%%" = "%@%%"; /* Format string for reservoir reading when above or equal to maximum reading. (1: The localized amount) */ -"%@+ U" = "%@+ U"; +"%@+ U" = "%@ U"; /* Format string for reservoir volume. (1: The localized volume) */ "%@U" = "%@U"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Format string for main text of delivery uncertainty recovery page. (1: app name)(2: date of command)(3: app name) */ -"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display."; +"%1$@ has been unable to communicate with the pod on your body since %2$@.\n\nWithout communication with the pod, the app cannot continue to send commands for insulin delivery or display accurate, recent information about your active insulin or the insulin being delivered by the Pod.\n\nMonitor your glucose closely for the next 6 or more hours, as there may or may not be insulin actively working in your body that %3$@ cannot display." = "%1$@ đã không thể giao tiếp với pod trên cơ thể bạn kể từ %2$@.\n\nNếu không liên lạc với pod, ứng dụng không thể tiếp tục gửi lệnh tiêm insulin hoặc hiển thị thông tin chính xác, các thông tin gần đây về insulin đang hoạt động của bạn hoặc insulin được Pod tiêm.\n\nTheo dõi chặt chẽ lượng glucose của bạn trong 6 giờ tiếp theo hoặc hơn, vì có thể có hoặc không có insulin hoạt động tích cực trong cơ thể bạn mà %3$@ không thể hiển thị."; /* Accessibility format string for (1: localized volume)(2: time) */ "%1$@ units remaining at %2$@" = "%1$@ units vẫn đang còn lúc %2$@"; @@ -51,22 +51,22 @@ "%1$@%2$@%3$@" = "%1$@%2$@%3$@"; /* Format string for reservoir level above max measurable threshold. (1: measurable reservoir threshold) (2: units) */ -"%1$@+ %2$@" = "%1$@+ %2$@"; +"%1$@+ %2$@" = "%1$@ %2$@"; /* Format string for total delivery on pod details screen */ "%g U" = "%g U"; /* Button text for 1 hour suspend duration */ -"1 hour" = "1 hour"; +"1 hour" = "1 giờ"; /* Button text for 1 hour 30 minute suspend duration */ -"1 hour 30 minutes" = "1 hour 30 minutes"; +"1 hour 30 minutes" = "1 giờ 30 phút"; /* Button text for 2 hour suspend duration */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* Button text for 30 minute suspend duration */ -"30 minutes" = "30 minutes"; +"30 minutes" = "30 phút"; /* The title of the cell showing the pod activated at time */ "Active Time" = "Thời gian Hoạt động"; @@ -75,19 +75,19 @@ "Activity" = "Hoạt động"; /* Text indicating ongoing pump time synchronization */ -"Adjusting Pump Time..." = "Adjusting Pump Time..."; +"Adjusting Pump Time..." = "Đang điều chỉnh thời gian của bơm..."; /* The title of the cell showing alarm status */ "Alarms" = "Cảnh báo"; /* Alert title for cancel pairing modal */ -"Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; +"Are you sure you want to cancel Pod setup?" = "Bạn có chắc chắn muốn hủy cấu hình pod?"; /* Confirmation message for shutting down a pod */ "Are you sure you want to shutdown this pod?" = "Bạn có chắc muốn tắt pod này?"; /* No comment provided by engineer. */ -"Are you sure you want to skip Omnipod Onboarding?" = "Are you sure you want to skip Omnipod Onboarding?"; +"Are you sure you want to skip Omnipod Onboarding?" = "Bạn có chắc muốn bỏ qua?"; /* Confirmation message for removing Omnipod PumpManager */ "Are you sure you want to stop using Omnipod?" = "Bạn có chắc muốn dừng sử dụng Omnipod?"; @@ -99,10 +99,10 @@ "Attach Pod" = "Attach Pod"; /* Description string above progress indicator while attempting to re-establish communication from an unacknowledged command */ -"Attemping to re-establish communication" = "Attemping to re-establish communication"; +"Attemping to re-establish communication" = "Đang cố gắng thiết lập lại giao tiếp"; /* Back button text on DeliveryUncertaintyRecoveryView */ -"Back" = "Back"; +"Back" = "Quay Lại"; /* The title of the cell showing pod basal status */ "Basal Delivery" = "Liều tiêm basal"; @@ -117,16 +117,16 @@ "Cancel" = "Hủy bỏ"; /* Button title to cancel manual basal */ -"Cancel Manual Basal" = "Cancel Manual Basal"; +"Cancel Manual Basal" = "Hủy bỏ liều basal thủ công"; /* Insert cannula action button accessibility label when cannula insertion succeeded */ -"Cannula inserted successfully. Continue." = "Cannula inserted successfully. Continue."; +"Cannula inserted successfully. Continue." = "Cannula gắn thành công. Tiếp tục."; /* The action string on pod status page when pod expired */ -"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop 8 hours after the Pod has expired or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng khi pod hết hạn 8 giờ tới hoặc khi không còn insulin."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* The title of the command to change pump time zone */ "Change Time Zone" = "Thay đổi múi giờ"; @@ -135,43 +135,43 @@ "Changing time…" = "Đang thay đổi giờ…"; /* Title for check cannula screen */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* Label text for step three of attach pod instructions */ -"Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; +"Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; /* Insert cannula action button accessibility label checking insertion */ -"Checking Insertion" = "Checking Insertion"; +"Checking Insertion" = "Kiểm tra việc gắn"; /* Cannula insertion button text while checking insertion */ -"Checking..." = "Checking..."; +"Checking..." = "Đang kiểm tra..."; /* Title for uncertainty recovered screen */ "Comms Recovered" = "Comms Recovered"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Lời nhắc độ tin cậy"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Lời nhắc là những tiếng bíp từ Pod có thể được sử dụng để xác nhận các lệnh đã chọn khi Pod không ở chế độ im lặng."; /* The title of the configuration section in settings */ "Configuration" = "Cấu hình"; /* Button title for confirm attachment option */ -"Confirm" = "Confirm"; +"Confirm" = "Xác nhận"; /* Alert title for confirm pod attachment */ -"Confirm Pod Attachment" = "Confirm Pod Attachment"; +"Confirm Pod Attachment" = "Xác nhận pod đã gắn chặt"; /* The title of the continue action in an action sheet */ "Continue" = "Tiếp tục"; /* Title for critical alerts description */ -"Critical Alerts" = "Critical Alerts"; +"Critical Alerts" = "Cảnh báo nghiêm trọng"; /* Unit for singular day in pod life remaining */ -"day" = "day"; +"day" = "ngày"; /* Unit for plural days in pod life remaining */ "days" = "days"; @@ -187,10 +187,10 @@ "Deactivated" = "Đã hủy kích hoạt"; /* Deactivate pod action button accessibility label while deactivating */ -"Deactivating." = "Deactivating."; +"Deactivating." = "Đang hủy kích hoạt."; /* Action button description while deactivating */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; /* Button title to delete Omnipod PumpManager */ "Delete Omnipod" = "Xóa Omnipod"; @@ -200,7 +200,7 @@ /* Text for device details disclosure row title for device details page */ -"Device Details" = "Device Details"; +"Device Details" = "Chi tiết thiết bị"; /* The title of the device information section in settings */ "Device Information" = "Thông tin thiết bị"; @@ -213,7 +213,7 @@ /* Pairing interface navigation bar button text for discard pod action Text for discard pod button */ -"Discard Pod" = "Discard Pod"; +"Discard Pod" = "Loại bỏ pod"; /* No comment provided by engineer. */ "Done" = "Hoàn thành"; @@ -249,16 +249,16 @@ "Expires" = "Hết hạn"; /* Alert title for failing to cancel manual basal error */ -"Failed to Cancel Manual Basal" = "Failed to Cancel Manual Basal"; +"Failed to Cancel Manual Basal" = "Không thể hủy liều basal thủ công"; /* Alert title for resume error */ -"Failed to Resume Insulin Delivery" = "Failed to Resume Insulin Delivery"; +"Failed to Resume Insulin Delivery" = "Không thể tiêm insulin trở lại"; /* Alert title for time sync error */ -"Failed to Set Pump Time" = "Failed to Set Pump Time"; +"Failed to Set Pump Time" = "Không thể cài đặt thời gian cho bơm"; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for error when updating confidence reminder preference */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; @@ -267,34 +267,34 @@ "Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; /* Alert title for error when updating low reservoir reminder */ -"Failed to Update Low Reservoir Reminder" = "Failed to Update Low Reservoir Reminder"; +"Failed to Update Low Reservoir Reminder" = "Thất bại cập nhật lời nhắc gần hết thuốc"; /* Pod life HUD view label */ "Fault" = "Lỗi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Dùng loại insulin U-100 cho pod. Lắng nghe 2 tiếng bíp."; /* Settings page link description when next lifecycle action is to finish deactivation */ -"Finish deactivation" = "Finish deactivation"; +"Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; /* The title of the command to finish pod setup */ "Finish pod setup" = "Hoàn tất thiết lập pod"; /* Action button title to continue at Setup Complete */ -"Finish Setup" = "Finish Setup"; +"Finish Setup" = "Hoàn thành cài đặt"; /* Accessibility format string for (1: localized volume)(2: time) */ "Greater than %1$@ units remaining at %2$@" = "Nhiều hơn %1$@ units vẫn còn lúc %2$@"; /* Unit for singular hour in pod life remaining */ -"hour" = "hour"; +"hour" = "giờ"; /* Unit for plural hours in pod life remaining */ "hours" = "giờ"; /* Alert message body for confirm pod attachment */ -"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "If you cancel Pod setup, the current Pod will be deactivated and will be unusable."; +"If you cancel Pod setup, the current Pod will be deactivated and will be unusable." = "Nếu bạn hủy cấu hình pod, pod hiện tại sẽ bị hủy kích hoạt và sẽ không sử dụng được nữa."; /* Instructions when deactivating pod that has been paired, but not attached. */ "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Thiết lập pod không hoàn thành phải được hủy rước khi tiến hành ghép đôi pod mới. Đề nghị hủy và loại pod."; @@ -306,77 +306,77 @@ "Insert Cannula" = "Lắp Cannula"; /* Label text indicating insertion finished. */ -"Inserted" = "Inserted"; +"Inserted" = "Đã gắn"; /* Insert cannula action button accessibility label while pairing */ -"Inserting. Please wait." = "Inserting. Please wait."; +"Inserting. Please wait." = "Đang gắn. Chờ chút."; /* Cannula insertion button text while inserting */ -"Inserting..." = "Inserting..."; +"Inserting..." = "Đang gắn..."; /* Text shown in insulin delivery space when insulin suspended */ -"Insulin\nSuspended" = "Insulin\nSuspended"; +"Insulin\nSuspended" = "Insulin\n Đã tạm ngưng"; /* The title of the cell showing delivered insulin */ "Insulin Delivered" = "Insulin đã được tiêm"; /* Title of insulin delivery section */ -"Insulin Delivery" = "Insulin Delivery"; +"Insulin Delivery" = "Khối lượng tiêm insulin"; /* The action string on pod status page when pod faulted */ -"Insulin delivery stopped. Change Pod now." = "Insulin delivery stopped. Change Pod now."; +"Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Message for suspend duration selection action sheet */ -"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?"; +"Insulin delivery will be stopped until you resume manually. When would you like Loop to remind you to resume delivery?" = "Việc tiêm insulin sẽ bị dừng cho đến khi bạn tiếp tục theo cách thủ công. Vậy khi nào bạn muốn Loop nhắc bạn tiếp tục tiêm?"; /* Header for insulin remaining on pod settings screen */ -"Insulin Remaining" = "Insulin Remaining"; +"Insulin Remaining" = "Insulin còn lại"; /* Text for confidence reminders navigation link Title for insulin type selection screen */ -"Insulin Type" = "Insulin Type"; +"Insulin Type" = "Loại Insulin"; /* The error message shown when Loop's basal schedule has an unsupported rate */ "Invalid entry" = "Lỗi nhập không hợp lệ"; /* Question to confirm the cannula is inserted properly */ -"Is the cannula inserted properly?" = "Is the cannula inserted properly?"; +"Is the cannula inserted properly?" = "Việc gắn cannual chuẩn chưa?"; /* Label text for step 2 of pair pod instructions */ -"Keep the RileyLink about 6 inches from the pod during pairing." = "Keep the RileyLink about 6 inches from the pod during pairing."; +"Keep the RileyLink about 6 inches from the pod during pairing." = "Để Rileylink cách pod 6 inches khi ghép đôi."; /* description label for last status date pod details row */ -"Last Status" = "Last Status"; +"Last Status" = "Trạng thái cuối"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* The title of the cell showing the pod lot id */ -"Lot" = "Lot"; +"Lot" = "Lô"; /* description label for lot number pod details row */ -"Lot Number" = "LOT Nummer"; +"Lot Number" = "Số Lô"; /* Label text for low reservoir value row Navigation bar title for LowReservoirReminderSetupView Title for LowReservoirReminderSetupView */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Label for low reservoir reminder row Title for low reservoir reminder edit page */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Unit for singular minute in pod life remaining */ -"minute" = "minute"; +"minute" = "phút"; /* Unit for plural minutes in pod life remaining */ "minutes" = "phút"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* String shown on pod details for active time when conversion fails. String shown on pod details for last status date when not available. @@ -384,42 +384,42 @@ "NA" = "NV"; /* Text of continue button on ExpirationReminderSetupView */ -"Next" = "Next"; +"Next" = "Kế tiếp"; /* Button label for user to answer cannula was not properly inserted */ "No" = "Không"; /* Text shown in insulin remaining space when no pod is paired */ -"No\nDelivery" = "No\nDelivery"; +"No\nDelivery" = "Không\n Tiêm"; /* Error message for reservoir view when reservoir empty */ -"No Insulin" = "No Insulin"; +"No Insulin" = "Hết thuốc"; /* Label for pod life state when no pod paired Text shown in insulin remaining space when no pod is paired */ -"No Pod" = "No Pod"; +"No Pod" = "Không pod"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; /* Continue pairing button title of in pairing cancel modal */ -"No, Continue With Pod" = "No, Continue With Pod"; +"No, Continue With Pod" = "Không, tiếp tục"; /* Button text to cancel pump time sync */ -"No, Keep Pump As Is" = "No, Keep Pump As Is"; +"No, Keep Pump As Is" = "Không, Giữ nguyên"; /* The detail text for bolus delivery when no bolus is being delivered */ -"None" = "None"; +"None" = "Không"; /* navigation title for notification settings Text for pod details disclosure row */ "Notification Settings" = "Cài đặt thông báo"; /* No comment provided by engineer. */ -"Numbers" = "Numbers"; +"Numbers" = "Số"; /* Title for omnipod reminders section */ -"Omnipod Reminders" = "Omnipod Reminders"; +"Omnipod Reminders" = "Lời nhắc của Omnipod"; /* Button title to pair with pod during setup */ "Pair" = "Ghép đôi"; @@ -431,25 +431,25 @@ Pod pairing action button text while ready to pair Settings page link description when next lifecycle action is to pair new pod Title for pod pairing screen */ -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Pairing action button accessibility label while ready to pair */ -"Pair pod." = "Pair pod."; +"Pair pod." = "Kết nối Pod."; /* Label text indicating pairing finished. */ "Paired" = "Đã được ghép đôi"; /* Pairing action button accessibility label while pairing */ -"Pairing." = "Pairing."; +"Pairing." = "Đang ghép đôi."; /* Pod pairing action button text while pairing */ -"Pairing..." = "Pairing..."; +"Pairing..." = "Đang ghép đôi..."; /* No comment provided by engineer. */ -"Percent = %lf" = "Percent = %lf"; +"Percent = %lf" = "Phần trăm = %lf"; /* The title of the cell showing the pod pi version */ -"PI Version" = "PI Version"; +"PI Version" = "Đời PI"; /* The title of the command to play test beeps */ "Play Test Beeps" = "Kiểm tra tiếng Beep"; @@ -458,72 +458,72 @@ "Play Test Beeps…" = "Kiểm tra tiếng Beep…"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Confirm” khi Pod đã gắn chặt."; /* Instructions for deactivate pod when pod not on body */ -"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, bạn có thể ghép nối pod mới."; /* Instructions for deactivate pod when pod is on body */ -"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod."; +"Please deactivate the pod. When deactivation is complete, you may remove it and pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, gỡ bỏ pod ra khỏi cơ thể và ghép nối pod mới."; /* The title of the cell showing the pod pm version */ -"PM Version" = "PM Version"; +"PM Version" = "Phiên bản PM"; /* description label for activated at time pod details row Label for pod insertion row */ -"Pod Activated" = "Pod Activated"; +"Pod Activated" = "Pod đã kích hoạt"; /* Label describing pod age view */ "Pod Age" = "Pod Age"; /* Deactivate pod action button accessibility label when deactivation complete */ -"Pod deactivated successfully. Continue." = "Pod deactivated successfully. Continue."; +"Pod deactivated successfully. Continue." = "Pod hủy kích hoạt thành công. Tiếp tục."; /* Error message for reservoir view during general pod fault */ -"Pod Error" = "Pod Error"; +"Pod Error" = "Lỗi Pod"; /* Label for pod life state when within pod expiration window */ "Pod expired" = "Pod đã hết hạn"; /* Error message for reservoir view when pod expired Label for pod expiration row, past tense */ -"Pod Expired" = "Pod Expired"; +"Pod Expired" = "Pod đã hết hạn"; /* Label for pod expiration row */ -"Pod Expires" = "Pod Expires"; +"Pod Expires" = "Pod hết hạn"; /* Label for pod life state when time remaining */ -"Pod expires in" = "Pod expires in"; +"Pod expires in" = "Pod sẽ hết hạn trong"; /* description label for pod fault details */ -"Pod Fault Details" = "Pod Fault Details"; +"Pod Fault Details" = "Thông tin lỗi Pod"; /* Error message for reservoir view when pod occlusion checks failed */ "Pod Occlusion" = "Pod Occlusion"; /* Pairing action button accessibility label when pairing succeeded */ -"Pod paired successfully. Continue." = "Pod paired successfully. Continue."; +"Pod paired successfully. Continue." = "Pod ghép đôi thành công. Tiếp tục."; /* Title of the pod settings view controller */ "Pod Settings" = "Các thiết lập cho pod"; /* Title for PodSetupView */ -"Pod Setup" = "Pod Setup"; +"Pod Setup" = "Cấu hình Pod"; /* Label text for step one of attach pod instructions */ -"Prepare site." = "Prepare site."; +"Prepare site." = "Chuẩn bị vị trí."; /* title for previous pod page */ -"Previous Pod" = "Previous Pod"; +"Previous Pod" = "Pod trước"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* The text of the loading label when pod is primed */ "Primed" = "Đã được mồi"; /* Pairing action button accessibility label while priming */ -"Priming. Please wait." = "Priming. Please wait."; +"Priming. Please wait." = "Đang priming. Xin chờ."; /* Pod pairing action button text while priming */ "Priming..." = "Priming..."; @@ -532,7 +532,7 @@ "Priming…" = "Đang mồi…"; /* The title of the command to change pump time zone */ -"Pump Time" = "Pump Time"; +"Pump Time" = "Thời gian của Bơm"; /* Label text for basal rate summary */ "Rate" = "Tỷ lệ"; @@ -541,13 +541,13 @@ "Remaining" = "Đang còn lại"; /* Title for remove pod modal */ -"Remove Pod from Body" = "Remove Pod from Body"; +"Remove Pod from Body" = "Gỡ pod khỏi cơ thể"; /* Title for Omnipod PumpManager deletion action sheet. */ -"Remove Pump" = "Remove Pump"; +"Remove Pump" = "Thay bơm"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -557,13 +557,13 @@ "Replace Pod Now" = "Thay thế pod ngay"; /* The title of the cell showing reservoir status */ -"Reservoir" = "Reservoir"; +"Reservoir" = "Ngăn chứa insulin"; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Action button description for deactivate after failed attempt Cannula insertion button text while showing error @@ -574,7 +574,7 @@ "Retry Pod Deactivation" = "Hủy kích hoạt pod lại"; /* bodyText for RileyLinkSetupView */ -"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink allows for communication with the pump over Bluetooth"; +"RileyLink allows for communication with the pump over Bluetooth" = "RileyLink cho phép giao tiếp với bơm thông qua kết nối bluetooth"; /* Navigation title for RileyLinkSetupView */ "RileyLink Setup" = "Cài đặt RileyLink"; @@ -600,22 +600,22 @@ "Scheduled Reminder" = "Scheduled Reminder"; /* Title text for insulin type confirmation page */ -"Select the type of insulin that you will be using in this pod." = "Select the type of insulin that you will be using in this pod."; +"Select the type of insulin that you will be using in this pod." = "Chọn loại insulin bạn sẽ sử dụng cho pod."; /* description label for sequence number pod details row */ -"Sequence Number" = "Sequence Number"; +"Sequence Number" = "Số thứ tự"; /* Button text for setting manual temporary basal rate */ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Button title to set temporary basal rate */ -"Set Temporary Basal Rate" = "Set Temporary Basal Rate"; +"Set Temporary Basal Rate" = "Cài đặt liều nền tạm thời"; /* Title for setup complete screen */ "Setup Complete" = "Cấu hình hoàn thành"; /* Error message for reservoir view during general pod fault */ -"Signal Loss" = "Signal Loss"; +"Signal Loss" = "Mất tín hiệu"; /* No comment provided by engineer. */ "Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; @@ -630,37 +630,37 @@ "Suspend Delivery" = "Tạm ngưng liều insulin"; /* Text for suspend resume button when insulin delivery active */ -"Suspend Insulin Delivery" = "Suspend Insulin Delivery"; +"Suspend Insulin Delivery" = "Tạm dừng insulin"; /* The detail text of the basal row when pod is suspended */ "Suspended" = "Đã tạm ngưng"; /* Label for suspended at time */ -"Suspended At" = "Suspended At"; +"Suspended At" = "Tạm ngưng tại"; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Title text for the button to delete Omnipod PumpManager */ "Switch from Omnipod Pumps" = "Chuyển đổ từ bơm Omnipod"; /* Label for PumpManager deletion button */ -"Switch to other insulin delivery device" = "Switch to other insulin delivery device"; +"Switch to other insulin delivery device" = "Chuyển đổi sang bơm khác"; /* The title of the command to change pump time zone */ -"Sync to Current Time" = "Sync to Current Time"; +"Sync to Current Time" = "Đồng bộ thời gian hiện tại"; /* Title of button to sync basal profile from pod */ "Sync With Pod" = "Sync với Pod"; /* Label text for step one of insert cannula instructions */ -"Tap below to start cannula insertion." = "Tap below to start cannula insertion."; +"Tap below to start cannula insertion." = "Chạm phía dưới để bắt đầu gắn cannula."; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* The title of the command to run the test command */ "Test Command" = "Thử nghiệm câu lệnh"; @@ -669,37 +669,37 @@ "Testing Commands…" = "Thử nghiệm câu lệnh…"; /* Footer text for omnipod reminders section */ -"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod."; +"The app configures a reminder on the pod to notify you in advance of Pod expiration. Set the number of hours advance notice you would like to configure when pairing a new Pod." = "Ứng dụng cấu hình lời nhắc trên pod để thông báo trước cho bạn khi pod hết hạn. Đặt số giờ bạn muốn cấu hình khi ghép nối pod mới."; /* Description text on ExpirationReminderSetupView */ -"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have."; +"The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Ứng dụng sẽ thông báo trước cho bạn thời gian pod hết hạn.\n\n Kéo xuống để thiết lập số giờ để ứng dụng thông báo."; /* Description text on LowReservoirReminderSetupView */ -"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; +"The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; /* Footer text for low reservoir value row */ -"The App notifies you when the amount of insulin in the Pod reaches this level." = "The App notifies you when the amount of insulin in the Pod reaches this level."; +"The App notifies you when the amount of insulin in the Pod reaches this level." = "Ứng dụng nhắc nhở bạn khi lượng insulin trong pod đạt đến mức này."; /* Description text for critical alerts */ -"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode."; +"The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Lời nhắc ở trên sẽ không phát ra âm thanh nếu thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb.\n\n Có nhiều cách cảnh báo khác nhau phát ra âm thanh ngay cả khi thiết bị của bạn ở trạng thái Silent hoặc Do Not Disturb."; /* Message for pod sync time action sheet */ -"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?"; +"The time on your pump is different from the current time. Do you want to update the time on your pump to the current time?" = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Bạn có muốn cập nhật thời gian trên máy bơm của mình đến thời điểm hiện tại không?"; /* description for time change detected notice */ -"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump."; +"The time on your pump is different from the current time. Your pump’s time controls your scheduled therapy settings. Scroll down to Pump Time row to review the time difference and configure your pump." = "Thời gian trên máy bơm của bạn khác với thời gian hiện tại. Thời gian của máy bơm sẽ kiểm soát cài đặt trị liệu theo lịch trình của bạn. Cuộn xuống đến Pump Time để xem lại chênh lệch thời gian và cấu hình bơm của bạn."; /* Description of proper cannula insertion */ -"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin."; +"The window on the top of the Pod should be colored pink when the cannula is properly inserted into the skin." = "Ô vuông trên đầu của pod sẽ nháy đỏ khi cannual được gắn chuẩn vào trong cơ thể."; /* Format string for recovery suggestion during deactivate pod. */ -"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod."; +"There was a problem communicating with the pod. If this problem persists, tap Discard Pod. You can then activate a new Pod." = "Đã xảy ra sự cố khi giao tiếp với Pod. Nếu sự cố này vẫn tiếp diễn, hãy nhấn vào Discard Pod. Sau đó, bạn có thể kích hoạt Pod mới."; /* Footer text for scheduled reminder area */ -"This is a reminder that you scheduled when you paired your current Pod." = "This is a reminder that you scheduled when you paired your current Pod."; +"This is a reminder that you scheduled when you paired your current Pod." = "Đây là lời nhắc mà bạn đã lên lịch khi ghép nối Pod hiện tại của mình."; /* Alert format string for missing temp basal configuration. */ -"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate."; +"This Pump has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to Therapy Settings -> Delivery Limits and set a new Maximum Basal Rate." = "Máy bơm này chưa được cấu hình với maximum basal rate vì nó đã được thêm vào trước khi manual temp basal được đưa ra. Vui lòng đi tới Therapy Settings -> Delivery Limites và đặt Maximum Basal Rate mới."; /* Label for expiration reminder row Label for scheduled expiration reminder row @@ -708,7 +708,7 @@ /* Title for pod sync time action sheet. title for time change detected notice */ -"Time Change Detected" = "Time Change Detected"; +"Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* No comment provided by engineer. */ "Toggle sign" = "Toggle sign"; @@ -717,7 +717,7 @@ "Too many entries" = "Quá nhiều mục"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* Units for showing temp basal rate */ "U/hr" = "U/giờ"; @@ -726,79 +726,79 @@ "Unable to deactivate pod. Please continue and pair a new one." = "Không thể hủy kích hoạt pod. Đề nghị tiếp tục và ghép đôi pod mới."; /* Title of delivery uncertainty recovery page */ -"Unable to Reach Pod" = "Unable to Reach Pod"; +"Unable to Reach Pod" = "Không thể thấy pod"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Label for pod life state when pod not fully activated */ -"Unfinished Activation" = "Unfinished Activation"; +"Unfinished Activation" = "Kích hoạt chưa hoàn thành"; /* Label for pod life state when pod not fully deactivated */ -"Unfinished deactivation" = "Unfinished deactivation"; +"Unfinished deactivation" = "Vô hiệu hóa chưa hoàn tất"; /* The detail text for delivered insulin when no measurement is available */ "Unknown" = "Không nhận ra"; /* Label text for step two of insert cannula instructions */ -"Wait until insertion is completed." = "Wait until insertion is completed."; +"Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Button label for user to answer cannula was properly inserted */ "Yes" = "Có"; /* Button title for confirm deactivation option */ -"Yes, Deactivate Pod" = "Yes, Deactivate Pod"; +"Yes, Deactivate Pod" = "Có, hủy kích hoạt pod"; /* Button text to confirm pump time sync */ -"Yes, Sync to Current Time" = "Yes, Sync to Current Time"; +"Yes, Sync to Current Time" = "Có, đồng bộ với thời gian hiện tại"; /* bodyText for PodSetupView */ -"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; +"You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Format string for instructions for setup complete view. (1: app name) */ -"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you."; +"Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Pod đã sẵn sàng hoạt động.\n\n%1$@ sẽ nhắc nhở bạn thay đổi khi pod hết hạn. Bạn có thể thay khi nào tiện."; /* Alert message body for confirm pod attachment */ -"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“"; +"Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod có thể đang tiêm insulin.\n Gỡ pod khỏi người sau đó nhấn \"Continue.\""; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Im lặng"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Chế độ hoạt động bình thường trong đó tiếng bíp của Pod được dùng cho mọi cảnh báo của Pod và khi lời nhắc được bật."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Tất cả các cảnh báo của Pod đều không sử dụng tiếng bíp và tiếng bíp nhắc nhở sẽ bị chặn. Pod sẽ chỉ phát ra tiếng bíp khi Pod gặp lỗi nghiêm trọng và khi thực hiện kiểm tra tiếng bíp.\n\n⚠️Cảnh báo - Bất cứ khi nào Pod ở chế độ im lặng, nó phải được đặt trong phạm vi hoạt động của Bluetooth để nhận thông báo về các cảnh báo của Pod."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Pod im lặng"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Các thông tin của Pod"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Thông tin của Pod trước đó"; /* Text for pump manager details navigation link */ "Pump Manager Details" = "Pump Manager Details"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Pump Manager..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Làm mới Pump Manager Details"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Không thể cập nhật im lặng cho pod."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Chẩn đoán"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Đọc tình trạng pod"; diff --git a/FreeAPS/Resources/vi.lproj/InfoPlist.strings b/FreeAPS/Resources/vi.lproj/InfoPlist.strings index 490542f424..f76b341f89 100644 --- a/FreeAPS/Resources/vi.lproj/InfoPlist.strings +++ b/FreeAPS/Resources/vi.lproj/InfoPlist.strings @@ -1,20 +1,20 @@ /* Privacy - NFC Scan Usage Description */ -"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors."; +"NFCReaderUsageDescription" = "NFC được sử dụng để quét các cảm biến Libre."; /* Privacy - Bluetooth Always Usage Description */ -"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth được sử dụng để liên lạc với máy bơm insulin và các thiết bị theo dõi đường huyết liên tục/CGM."; /* Privacy - Bluetooth Peripheral Usage Description */ -"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices"; +"NSBluetoothPeripheralUsageDescription" = "Bluetooth được sử dụng để liên lạc với máy bơm insulin và các thiết bị theo dõi đường huyết liên tục/CGM."; /* Privacy - Face ID Usage Description */ -"NSFaceIDUsageDescription" = "For authorized acces to bolus"; +"NSFaceIDUsageDescription" = "Được cấp quyền truy cập vào bolus"; /* Privacy - Calendars Usage Description */ -"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events."; +"NSCalendarsUsageDescription" = "Lịch \nCalendar được sử dụng để tạo ra một sự kiện glucose mới."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthUpdateUsageDescription" = "Ứng dụng sức khỏe \nHealth được sử dụng để lưu trữ đường huyết, insulin và carbohydrate"; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Health App is used to store blood glucose, insulin and carbohydrates"; +"NSHealthShareUsageDescription" = "Ứng dụng sức khỏe \nHealth được sử dụng để lưu trữ đường huyết, insulin và carbohydrate"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index ca145504a9..da774d4aa8 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index e4563fe627..16f3151df8 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 45453e9745..20c296dd03 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Berechnet einen neuen ISF mit jedem Loop-Zyklus. Die neue ISF basiert auf dem aktuellen BG, TDD des Insulins (nach 24 Stunden oder einem gewichteten Durchschnitt) und einem Anpassungsfaktor (Standardeinstellung ist 1).\n\nDynamic ISF und CR Verhältnisse werden durch Ihre autosens.min/max Limits begrenzt.\n\nDas dynamische Verhältnis ersetzt das autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic Ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Nutze Dynamic CR. Das dynamische Verhältnis wird für CR wie folgt verwendet:\n\n Bei Verhältnis > 1: dynCR = (newRatio - 1) / 2 + 1.\nWenn Verhältnis < 1: dynCR = CR/dynCR.\n\nNicht verwenden mit hohem Insulinanteil (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Dynamische Verhältnisse um eine Konstante anpassen. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF für einen hohen oder niedrigen BG. Die maximale Korrektur wird durch die Autosens min/max-Einstellungen bestimmt. Für die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen. Für die logarithmische Formel gibt es weniger Konsens, aber ein Anfangswert von 0,5 - 0,8 ist für die meisten Benutzer angemessener."; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Verwenden Sie eine sigmoid Funktion für ISF (und für CR, wenn aktiviert), anstelle der Standard-logarithmischen Formel. Erfordert die Aktivierung der dynamischen ISF-Einstellung in den Einstellungen\n\nDie Veränderungsanpassung passt die Neigung der Kurve an (Y: Dynamisches Verhältnis, X: Blutzucker). Ein niedrigerer Wert ==> weniger steil == weniger aggressiv.\n\nDie autosens.min/max Einstellungen bestimmen sowohl die max/min Grenzen für das dynamische Verhältnis UND wie sehr das dynamische Verhältnis angepasst wird. Wenn AF ist der Hang der Kurve, die Autosen. in/max ist die Höhe des Diagramms, das Y-Intervall, wo Y: dynamisches Verhältnis. Die Kurve hat immer eine S-Form, egal welche autosense.min/max Einstellungen verwendet werden, was bedeutet, dass diese Einstellungen große Folgen für das Ergebnis des berechneten dynamischen ISF haben. Bitte sei vorsichtig, einen zu hohen autosens.max Wert zu setzen. Mit einer korrekten Profil-ISF-Einstellung werden Sie wahrscheinlich nie mehr als 1 benötigen.\n\nEin Autosens.max Limit > 1.5 ist nicht ratsam, wenn Sie die sigmoid Funktion benutzen."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Grenzwerteinstellung (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Der Standardschwellenwert in FAX hängt von Ihrem aktuellen Minimum für BG ab, wie folgt:\n\nWenn Ihr Minimum BG Ziel = 90 mg/dl -> Schwellenwert = 65 mg/dl,\n\nwenn Minimum BG Ziel = 100 mg/dl -> Schwellenwert = 70 mg/dl,\n\nMinimum BG Ziel = 110 mg/dl -> Schwellenwert = 75 mg/dl,\n\nund wenn Minimum BG Ziel = 130 mg/dl -> Schwellenwert = 85 mg/dl.\n\nMit dieser Einstellung können Sie die Standardeinstellung auf einen höheren Schwellenwert für die Schleife mit dynISF ändern. Gültige Werte sind 65 mg/dl<= Grenzwert <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index e489430b00..829a02a18d 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2049,32 +2049,86 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 96b524b21d..461a31c1f3 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index afe5413713..9db7cd1186 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculer une nouvelle SI à chaque cycle de boucle. Le nouveau FSI sera basé sur la glycémie actuelle, le TDD d'insuline (après 24 heures ou une moyenne pondérée) et un facteur d'ajustement (valeur par défaut est 1).\n\nLes ratios ISF et CR dynamiques seront limités par vos limites autosens.min/max.\n\nRatio dynamique remplace le ratio autosens.ratio : Nouveau SI = FI statique / Ratio dynamique,\nRatio dynamique = profil. fr * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Activer CR dynamique"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Utiliser le CR. dynamique. Le ratio dynamique sera utilisé pour CR comme suit:\n\n Quand ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nRatio < 1 : dynCR = CR/dynCR.\n\nN'utilisez pas de toghether avec une fraction d'insuline élevée (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Ajuster les ratios dynamiques par une constante. La valeur par défaut est de 0,5. Plus la valeur est élevée, plus la correction de votre SI sera grande ou faible glycémie. La correction maximale est déterminée par les paramètres min/max d'Autosens. Pour la fonction Sigmoid un facteur de réglage de 0.4 - 0.5 est recommandé pour commencer. Pour la formule logaritmique threre est moins consensuel, mais commencer avec 0.5 - 0.8 est plus approprié pour la plupart des utilisateurs"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Utiliser la fonction Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Utilisez une fonction sigmoid pour ISF (et pour CR, quand activé), au lieu de la formule logarithmique par défaut. Nécessite que le paramètre ISF dynamique soit activé dans les paramètres\n\nLe paramètre Ajustement ajuste la pente de la courbe (Y : ratio dynamique, X: Glucose de sang). Une valeur inférieure ==> moins raide, == moins agressive.\n\nL'autosens. Les paramètres in/max déterminent à la fois les limites max/min pour le ratio dynamique ET combien le rapport dynamique est ajusté. Si AF est la pente de la courbe, l’autosens. in/max est la hauteur du graphique, l'intervalle Y, où le rapport dynamique, la courbe aura toujours une forme sigmoïde, peu importe l'autosens. Les paramètres in/max sont utilisés, ce qui signifie que ces paramètres ont de grandes conséquences sur le résultat de la SI dynamique calculée. Soyez prudent en définissant une valeur autosens.max trop élevée. Avec un réglage correct du profil ISF, vous n'aurez probablement jamais besoin qu'il soit supérieur à 1.\n\nUne limite Autosens.max > 1.5 n'est pas recommandée lors de l'utilisation de la fonction sigmoid."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Réglage du seuil (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Le seuil par défaut du iAPS dépend de votre cible de glycémie minimale actuelle, comme suit :\n\nSi votre cible de glycémie minimale = 90 mg/dl -> seuil = 65 mg/dl,\n\nsi cible Glycémie minimale = 100 mg/dl -> seuil = 70 mg/dl,\n\nobjectif minimum de glycémie = 110 mg/dl -> seuil = 75 mg/dl,\n\net si l'objectif de glycémie minimum = 130 mg/dl -> seuil = 85 mg/dl.\n\nCe paramètre vous permet de changer le seuil par défaut pour la boucle avec dynISF. Les valeurs valides sont 65 mg/dl<= Seuil <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index ca145504a9..da774d4aa8 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index afbdce2ac6..9eec1ef85e 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 22ee03da7e..3859f8f0d5 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -2043,12 +2043,18 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calcola un nuovo ISF per ogni ciclo di loop. Il nuovo ISF sarà basato sulla glicemia attuale, sulla TDD dell’insulina (oltre 24 ore o media ponderata) e su un fattore di aggiustamento (valore predefinito è 1).\n\nI rapporti ISF e CR dinamici saranno limitati dai tuoi limiti autosens.min/max.\n\nIl rapporto dinamico sostituisce il rapporto autosens.ratio: New ISF = rapporto statico ISF / dinamico,\nRapporto dinamico = profilo. ens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinuti"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Abilita CR Dinamico"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Usa CR Dinamico. Il rapporto dinamico sarà utilizzato per CR come segue:\n\n Quando rapporto > 1: dynCR = (newRatio - 1) / 2 + 1.\nQuando il rapporto < 1: dynCR = CR/dynCR.\n\nNon usare insieme a frazione d'insulina elevata (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Regola i rapporti dinamici della costante ISF"; @@ -2056,20 +2062,68 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max. Per la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5. Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti Regola la costante ISF dinamica"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Usa Funzione Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Usa una funzione sigmoid per ISF (e per CR, quando abilitato), invece della formula Logaritmica predefinita. Richiede l'impostazione ISF dinamica per essere abilitata nelle impostazioni\n\nL'impostazione di regolazione regola la pendenza della curva (Y: Dynamic ratio, X: Colla Di Sangue). Un valore inferiore ==> meno ripido == meno aggressivo.\n\nGli autosens. le impostazioni in/max determinano sia i limiti max/min per il rapporto dinamico E quanto il rapporto dinamico viene regolato. Se AF è la pendenza della curva, gli autosensi. in/max è l'altezza del grafico, l'intervallo Y, dove Y: rapporto dinamico. La curva avrà sempre una forma di sigmoid, indipendentemente dagli autosensi. le impostazioni in/max sono usate, il che significa che queste impostazioni hanno grandi conseguenze per il risultato del ISF dinamico calcolato. Attenzione all'impostazione di un valore autosens.max troppo alto. Con una corretta impostazione ISF del profilo, probabilmente non avrete mai bisogno di essere superiore a 1.\n\nUn limite di Autosens.max > 1.5 non è consigliabile quando si utilizza la funzione sigmoid."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Impostazione Soglia (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "La soglia predefinita in FAX dipende dall'attuale obiettivo di glicemia minima, come segue:\n\nSe il vostro obiettivo minimo di glicemia = 90 mg/dl -> soglia = 65 mg/dl,\n\nse obiettivo minimo di glicemia = 100 mg/dl -> soglia = 70 mg/dl,\n\nobiettivo minimo di glicemia = 110 mg/dl -> soglia = 75 mg/dl,\n\ne se obiettivo minimo di glicemia = 130 mg/dl -> soglia = 85 mg/dl.\n\nQuesta impostazione ti permette di cambiare il valore predefinito ad una soglia più alta per il looping con dynISF. Valori validi sono 65 mg/dl<= Impostazione soglia <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Media ponderata di TDD. Peso delle ultime 24 ore:"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 74485febc7..724b172518 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beregn ny ISF ved hver loop-syklus. Ny ISF vil baseres på nåværende BS, TDD med insulin (siste 24 timer eller vektet gjennomsnitt) og en justeringsfaktor (standardverdi er 1).\n\nDynamisk ISF og CR-ratier vil bli begrenset av dine autosens-innstillinger.\n\nDynamisk ratio erstatter autosens-ratio: Ny ISF = Statisk ISF / Dyamisk ratio,\nDynamisk ratio = profile.sens * adjustmentFactor * tdd * Math.log(BS/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Bruk dynamisk CR. Dynamisk ratio brukes for CR som følger:\n\n Når ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nNår ratio < 1: dynCR = CR/dynCR.\n\nIkke bruk denne innstillingen sammen med en høy insulinbrøk (Insulin Fraction > 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Juster dynamisk forholdstall med en konstant. Standard er 0,5. Jo høyere verdien er, jo større blir korreksjonen av ISF ved høyt eller lavt BS. Maksimal korrigering bestemmes av min/maks innstillingene for Autosens. For Sigmoidfunksjon anbefales det å starte en justeringsfaktor på 0,4-0,5. For den logaritmiske formelens er det mindre konsensus, men å starte med 0.5 – 0,8 er anbefalt for de fleste brukere"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Terskelinnstilling (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Standard terskel i FAX er avhengig av ditt nåværende laveste BS-mål, som følger:\n\nDersom ditt laveste BS-mål = 90 mg/dL -> terskel = 65 mg/dL,\n\ndersom laveste BS-mål = 100 mg/dL -> terskel = 70 mg/dL,\n\nlaveste BS-mål = 110 mg/dL -> terskel = 75 mg/dL,\n\nog dersom laveste BS-mål = 130 mg/dL -> terskel = 85 mg/dL.\n\nDenne innstillingen tillater deg å endre til en høyere terskel for å loope med dynamisk ISF. Gyldige verdier er 65 mg/dL <= terskel-innstilling <= 120 mg/dL."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vektet snitt av TDD. Vekting av siste 24 timer:"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 253f0c9625..13c5866f92 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2047,7 +2047,7 @@ Dynamische ratio = profielgevoeligheid * aanpassingsfactor * TDD * Logaritme (BG InsulineFactor = 120 - Tijd tot insulinepiek in minuten./n/n Eenvoudiger gezegd, het systeem past de insulinegevoeligheid aan op basis van je recente insulinegebruik en huidige bloedsuikerspiegel. De aanpassingen zijn beperkt binnen bepaalde grenzen die je hebt ingesteld"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; /* Enable Dynamic CR */ @@ -2057,26 +2057,80 @@ Als de verhouding < 1 is: dynCR = CR/dynCR. Gebruik dit niet samen met een hoge insuline fractie (> 2).\n\n Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op basis van je recente verhoudingen. Het zorgt ervoor dat de aanpassingen niet te groot zijn en werkt niet goed als je een hoge insuline fractie hebt."; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Verander de dynamische verhoudingen met een vaste waarde, die standaard op 0,5 staat. Als je deze waarde verhoogt, zal de aanpassing van je ISF voor hoge of lage bloedsuikerwaarden groter zijn. De grootte van de correctie is beperkt door de instellingen voor Autosens min/max. Voor de Sigmoid-functie wordt een startwaarde van 0,4 tot 0,5 aanbevolen. Voor de logaritmische formule is er geen vastgestelde norm, maar voor de meeste gebruikers is een waarde tussen 0,5 en 0,8 passender."; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Gebruikt een Sigmoid functie voor ISF (en voor CR, indien ingeschakeld), in plaats van de standaard logaritmische formule. Vereist een geactiveerde dynamische ISF instelling.\n\nDe instelling aanpassing past de helling van de curve aan (Y: Dynamische verhouding, X: Bloedglucose). Een lagere waarde ==> minder steil = minder agressief.\n\nDe autosens.min/max instellingen bepalen zowel de max/min grenzen voor de dynamische ratio als hoeveel de dynamische ratio wordt aangepast. Als AF de helling van de curve is, is autosens.min/max de hoogte van de grafiek, het Y-interval, waarbij Y: dynamische verhouding. De curve zal altijd een sigmoïde vorm hebben, ongeacht de autosens.min/max instellingen, wat betekent dat deze instellingen grote gevolgen hebben voor het resultaat van de berekende dynamische ISF. Wees voorzichtig met het instellen van een te hoge autosens.max waarde. Met een goede profiel-ISF instelling zal het waarschijnlijk nooit nodig zijn deze hoger in te stellen dan 1,5.\n\nEen Autosens max grens > 1,5 is niet aan te raden bij gebruik van de Sigmoid functie."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Drempelinstelling (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index 24dae30c1c..d8e4c41e7e 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2045,32 +2045,86 @@ Połączono z Nightscout!"; /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index a799515be0..6e72e14f32 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 01894b15ea..a8b0c751d7 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 1262bc1f46..ba4f5e80b6 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Считать новый ISF с каждым циклом петли. Новый ISF будет зависеть от текущего BG, TDD (за последние 24 часа или взвешенное среднее значение) и Adjustment Factor (по-умолчанию - 1).\n\nDynamic ratio ISF и CR будет ограничен настройками autosens.min/max.\n\nDynamic ratio заменяет autosens.ratio: Новый ISF = Постоянный ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включить динамический CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Использовать Dynamic CR. Dynamic ratio будет также влиять и на CR:\n\n Когда ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКогда ratio <1: dynCR = CR/dynCR.\n\nНе используйте совместно с высоким Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Отрегулируйте динамические коэффициенты на постоянную величину. Значение по умолчанию равно 0.5. Чем выше значение, тем больше будет коррекция вашего ISF для высокого или низкого BG. Максимальная коррекция определяется настройками Auto sens min/max. Для сигмовидной функции рекомендуется для начала использовать коэффициент регулировки 0.4 - 0.5. В отношении логарифмической формулы консенсуса меньше, но большинству пользователей более подходит начинать с 0.5 - 0.8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Использовать сигмоидную функцию для ISF (и для CR, если включено), вместо логарифмической функции. Требует включенного в настройках режима Dynamic ISF\n\nКоэффициент регулировки AF регулирует наклон кривой (Y: Динамическое соотношение, X: Глюкоза крови). Ниже значения ==> меньше крутизна == меньше агрессивность.\n\nAutosens минимум и максимум определяют оба - максимальный и минимальный лимиты для динамического соотношения и как сильно динамическое соотношение будет изменять ISF/CR. Коэффициент регулировки AF - это высота кривой, Y - интервал, где Y - динамическое соотношение. Кривая всегда будет иметь сигмовидную форму, не важно какой autosens минимум/максимум указаны. Это означает, что эти настройки имеют большие последствия для результата вычисляемого динамического ISF. Пожалуйста, будьте осторожны с высокими значениями параметра алгоритма максимума для autosens. При правильной настройке профиля ISF, никогда не понадобится значение выше 1,5.\n\nAn Предел Autosens максимум > 1,5 не рекомендуется при использовании сигмовидной функции."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Настройка порога (мг/дл)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 5be5c7cab3..7d9395ef08 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Pri každom cykle slučky vypočítajte novú hodnotu ISF. Nový ISF bude založený na aktuálnom BG, TDD inzulínu (posledných 24 hodín alebo vážený priemer) a korekčnom faktore (predvolená hodnota je 1).\n\nDynamický pomer ISF a CR bude obmedzený limitmi autosens.min/max.\n\nDynamický pomer nahrádza autosens.pomer: Nový ISF = statický ISF / dynamický pomer,\nDynamický pomer = profil.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Používajte dynamický CR. Dynamický pomer sa použije pre CR takto:\n\n Keď pomer > 1: dynCR = (newRatio - 1) / 2 + 1.\nKeď pomer < 1: dynCR = CR/dynCR.\n\nNepoužívajte spolu s vysokou inzulínovou frakciou (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Upravte dynamické pomery pomocou konštanty. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF pre vysoký alebo nízky BG. Maximálna korekcia je určená nastavením min/max v položke Autosens. Pre funkciu Sigmoid sa na začiatku odporúča korekčný faktor 0,4 - 0,5. Pre logaritmický vzorec existuje menej konsenzu, ale pre väčšinu používateľov je vhodnejšie začať s 0,5 - 0,8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Použitie sigmoidnej funkcie pre ISF (a pre CR, ak je povolená) namiesto predvoleného logaritmického vzorca. Vyžaduje, aby bolo v nastaveniach povolené nastavenie Dynamická ISF.\n\nNastavenie Adjustment (Úprava) upravuje sklon krivky (Y: dynamický pomer, X: glykémia). Nižšia hodnota ==> menej strmá == menej agresívna.\n\nNastavenie autosens.min/max určuje limity max/min pre dynamický pomer A tiež to, ako veľmi sa dynamický pomer upravuje. Ak AF je sklon krivky, autosens.min/max je výška grafu, interval Y, kde Y: dynamický pomer. Krivka bude mať vždy sigmoidný tvar bez ohľadu na to, aké nastavenia autosens.min/max sa použijú, čo znamená, že tieto nastavenia majú veľké dôsledky na výsledok vypočítaného dynamického ISF. Buďte opatrní pri nastavení príliš vysokej hodnoty autosens.max. Pri správnom nastavení profilu ISF ju pravdepodobne nikdy nebudete potrebovať vyššiu ako 1.5\n\nLimit autosens.max > 1.5 sa pri použití sigmoidnej funkcie neodporúča."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Nastavenie prahu (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index fbdb6909ff..7320d216b6 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Använd dynamisk kolhydratkvot. Den dynamiska kvoten kommer att beräknas som flöjer::\n\n när kvot > 1: dynamisk kolhydratkvot = (dynamiskISFkvot - 1) / 2 + 1.\nNär kvot < 1: dynamisk kolhydratkvot = inställd kolhydratkvot/dynamisk kolhydratkvot.\n\nUndvik att använda tillsamans med en inställning för \"Kvot av rekommenderad mängd insulin\" över 2"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Aktivera dynamisk insulinkänslighet (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Aktivera dynamisk insulinkvot (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ändra AF-konstant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Individuell justering (en multipel) av hur din insulinkänslighet räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal insulinkänslighet och minimal insulinkänslighet bestäms av Autosens min/max inställningar och av din schemalagda inställning för insulinkänslighet.\n\nFör S-formad dynamisk inställning rekommendaras att börja med 0.3-0-4. För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Använd S-formad dynamisk insulinkänslighet"; +/* Which dyn ISF function to use */ +"Formula" = "Formel"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Säkerhet"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Använd en sigmoidfunktion för ISF (och för CR, när det är aktiverat), istället för den logaritmiska standardformeln. Kräver att den dynamiska ISF-inställningen är aktiverad i inställningarna\n\nJusteringsinställningen justerar lutningen på kurvan (Y: Dynamiskt förhållande, X: Blodglukos). Ett lägre värde ==> mindre brant == mindre aggressiv.\n\nAutosens. in/max inställningar bestämmer både max/min gränsen för det dynamiska förhållandet OCH hur mycket det dynamiska förhållandet justeras. Om AF är sluttningen av kurvan, autosens. in/max är höjden på grafen, Y-intervallet, där Y: dynamiskt förhållande. Kurvan kommer alltid att ha en sigmoid form, oavsett vilken autosens. in/max inställningar används, vilket innebär att dessa inställningar har stora konsekvenser för resultatet av den beräknade dynamiska ISF. Var försiktig med att ställa in ett för högt autosens.max värde. Med en korrekt profil ISF inställning, kommer du förmodligen aldrig behöver det att vara högre än 1.\n\nEn autosens.max gräns > 1.5 är inte lämpligt när du använder sigmoid-funktionen."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Inställning för tröskelvärde (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Tröskelvärde"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Tröskelvärde för blodsocker beror på ditt nuvarande undre blodsockermålvärde, enligt följande:\n\nOm ditt målvräde = 5 mmol/l -> tröskelvörde = 3,6 mmol/l,\n\nOm ditt målvräde = 5,6 -> tröskelärde = 3,9 mmol/l,\n\nOm ditt målvräde = 6,1 mmol/l -> tröskelvärde = 4,2 mmol/l,\n\nOch om ditt målvräde = 7,2 mmol/l -> tröskelvärde = 4,7 mmol/l.\n\nDenna inställning tillåter dig att ändra trösklevärdet till en högre inställnig när du loopar med dynamiska kvoter. Giltiga värden är 3,6 - 6,7."; +/* Header */ +"Calculator settings" = "Boluskalkylatorinställning"; + +/* UI/UX option */ +"Display Predictions" = "Visa prognoser"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "För mindre iPhone-skärmar"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Visa och tillåt inmatning av fett och protein"; + +/* UI/UX option */ +"Add Meal View settings " = "Måltidsfönster "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Visa knapp för tillfälligt målvärde"; + +/* UI/UX option */ +"Home View Button Panel " = "Knappar på hemskärmen "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "Om du använder både profiler och tillfälliga målvärden"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Färga alltid blodsockervärdet (grön, gul etc)"; + +/* UI/UX option */ +"Header settings" = "Övre delen av hemfönstret"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalt färgas nuvarande blodsocker med rött endast ifall detta är under eller över dina inställningar för ett lågt eller högt blodsocker i dina notisinställningar"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Antal synliga timmar i hemfönstret"; + +/* Notification option */ +"Live Activity" = "Liveaktiviteter"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Liveaktivitet visar senaste blodsockeravläsning på låsskärmen och på Dynamic Island, om sådan finns på din iPhone-modell"; + +/* Notification option */ +"Show live activity" = "Visa Liveaktivitet"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Viktat Genomsnitt av TDD. Vikt de senaste 24 timmarna:"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 1ce8ea8ed5..4ffd98717f 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Her döngü döngüsünde yeni bir İDF hesaplayın. Yeni İDF, mevcut BG'ye dayalı olacaktır, GTD'unuz (son 24 saat veya ağırlıklı bir ortalama) ve bir Ayarlama Faktörüne (varsayılan 1'dir) dayalı olacaktır.\n\nDinamik İDF ve KHO oranları, autosens.min/maks limitlerinizle sınırlanacaktır. .\n\nDinamik oran, autosens.ratio'nun yerini alır: Yeni İDF = Statik İDF / Dinamik oran,\nDynamic oran = profile.sens * AdjustFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - İnsülinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dinamik KHO Etkinleştir"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Dinamik KHO kullanın. Dinamik oran, KHO için şu şekilde kullanılacaktır:\n\n Oran > 1 olduğunda: dynCR = (newRatio - 1) / 2 + 1.\nOran < 1 olduğunda: dynCR = CR/dynCR.\n\nYüksek İnsülin Fraksiyonu (> 2) ile birlikte kullanmayın."; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dinamik İDF sabitini ayarla"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid Fonksiyonunu Kullan"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Eşik Ayarı (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index a0208c0c2c..1de4e5eaca 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2043,32 +2043,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Вважати новий ISF з кожним циклом петлі. Новий ISF буде залежати від поточного BG, TDD (за останні 24 години або зважене середнє значення) та Adjustment Factor (за замовчуванням - 1). nDynamic ratio замінює autosens.ratio: Новий ISF = Постійний ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPe"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Використовувати Dynamic CR. Dynamic ratio також впливатиме на CR:\n\n Коли ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКоли ratio <1: dynCR = CR/dynCR.\n\nНе використовуйте спільно з високим Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Активація динамічної чутливості (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Активація динамічного співвідношення вуглеводів (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Налаштуйте динамічні коефіцієнти за константою. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF для високого або низького рівня ГК. Максимальна корекція визначається параметрами min/max Автосенс. Для сигмоподібної функції спочатку рекомендується коригуючий коефіцієнт 0,4 - 0,5. Для логарифмічної формули threre є менш узгодженим, але починати з 0,5 - 0,8 є більш прийнятним для більшості користувачів"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; +/* Which dyn ISF function to use */ +"Formula" = "Формула"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Загальна безпека"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Використовуйте сигмоїдну функцію для ISF (та для CR, якщо ввімкнено), замість стандартної логарифмічної формули. У налаштуваннях потрібно ввімкнути параметр Dynamic ISF\n\nПараметр Adjustment регулює нахил кривої (Y: динамічне співвідношення, X: рівень глюкози в крові). Менше значення ==> менш крутий == менш агресивний.\n\nПараметри autosens.min/max визначають максимальні/мінімальні межі для динамічного коефіцієнта І наскільки динамічне співвідношення регулюється. Якщо AF – це нахил кривої, autosens.min/max – це висота графіка, Y-інтервал, де Y: динамічне співвідношення. Крива завжди матиме сигмоподібну форму, незалежно від того, які налаштування autosens.min/max використовуються, тобто ці налаштування мають великі наслідки для результату обчисленої динамічної ISF. Будьте обережні, встановлюючи занадто високе значення autosens.max. З правильним налаштуванням ISF профілю вам, ймовірно, ніколи не знадобиться, щоб воно було вищим за 1,5\n\nОбмеження Autosens.max > 1,5 не рекомендується під час використання сигмоїдної функції."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Порогове Значення (мг/дл)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Порогове значення"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Поріг, мг/дл, у FAX за замовчуванням залежить від Вашої поточної мінімальної мети BG, таким чином:\n\nЯкщо мінімальна мета BG = 5 ммоль/л -> поріг = 3,6 ммоль/л,\n\n мінімальна мета BG = 5.6 ммоль/л -> поріг = 3,9 ммоль/л, мінімальна мета BG = 6.1 ммоль/л -> поріг = 4,2 ммоль/л, якщо мінімальна мета BG = 7.2 ммоль/л -> поріг = 4,7 ммоль/л.\n\nЦе налаштування дозволяє збільшити рівень порога для більш безпечної роботи з dynISF. Валідним буде значення 65 мг/дл = 3,6 ммоль/л <= Threshold Setting <= 120 мг/дл = 6,7 ммоль/л."; +/* Header */ +"Calculator settings" = "Налаштування калькулятора"; + +/* UI/UX option */ +"Display Predictions" = "Показати передбачення"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Менші екрани iPhone"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Відобразити та дозволити записи жиру та білка"; + +/* UI/UX option */ +"Add Meal View settings " = "Додайте налаштування перегляду їжі"; + +/* UI/UX option */ +"Display Temp Targets Button" = "Показувати кнопку тимчасові цілі"; + +/* UI/UX option */ +"Home View Button Panel " = "Панель кнопок домашнього перегляду"; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "Якщо ви використовуєте профілі та тимчасові цілі"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Завжди кольорове значення глюкози (зелений, жовтий тощо)"; + +/* UI/UX option */ +"Header settings" = "Налаштування заголовка"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Зазвичай рівень глюкози забарвлюється в червоний колір лише тоді, коли рівень сповіщень перевищує або перебуває нижче для високого/низького рівня"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; + +/* Notification option */ +"Live Activity" = "Дії наживо"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; + +/* Notification option */ +"Show live activity" = "Показати дії наживо"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 22e06aad09..6d2962032f 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Continue without bolus" = "Tiếp tục và bỏ qua liều bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm \nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm Cảnh báo khi dùng liều cao mà không bolus"; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nLiều tiêm nhiều hơn liều Max Bolus! \nBạn có chắc chắn muốn thêm "; /* Header */ "Enact Bolus" = "Tiêm liều bolus"; @@ -134,10 +134,10 @@ "Bottom target" = "Mục tiêu dưới cùng"; /* Cancel preset name */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy bỏ"; /* */ -"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Custom temp target */ "Custom" = "THÔNG LỆ"; @@ -161,19 +161,19 @@ "Target" = "Mục tiêu"; /* */ -"Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; +"Basal Insulin and Sensitivity ratio" = "Tỷ lệ Insulin cơ bản và độ nhạy"; /* */ -"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose."; +"A lower 'Half Basal Target' setting will reduce the basal and raise the ISF earlier, at a lower target glucose." = "Cài đặt '1/2 mục tiêu cơ bản' thấp hơn sẽ giảm mức cơ bản và tăng ISF sớm hơn, ở mức glucose mục tiêu thấp hơn."; /* */ -" Your setting: " = " Your setting: "; +" Your setting: " = " Cài đặt của bạn: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "mg/dl. Autosens.max limits the max endpoint"; +"mg/dl. Autosens.max limits the max endpoint" = "autosens.max Giới hạn điểm cuối tối đa mg/dl"; /* */ -"Enter preset name" = "Enter preset name"; +"Enter preset name" = "Nhập tên"; /* Preset name */ "Name" = "Tên"; @@ -188,7 +188,7 @@ "Save" = "Lưu"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; /* Delete Meal Preset */ "Delete Preset" = "Xoá mẫu thiết lập"; @@ -212,7 +212,7 @@ "Top target" = "Top target"; /* Temp target set for ... minutes */ -"for" = "for"; +"for" = "của"; /* Temp target set for ... minutes */ "min" = "phút"; @@ -221,31 +221,31 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Basal profile"; +"Basal profile" = "Hồ sơ liều nền (Basal)"; /* */ "Carb ratio" = "Tỷ lệ Carb"; /* */ -"Delete autotune data" = "Delete autotune data"; +"Delete autotune data" = "Xóa dữ liệu Autotune"; /* */ "Run now" = "Chạy ngay"; /* */ -"Last run" = "Last run"; +"Last run" = "Chạy lần trước"; /* */ "Sensitivity" = "Độ nhạy"; /* */ -"Use Autotune" = "Use Autotune"; +"Use Autotune" = "Sử dụng Autotune"; /* Add profile basal */ "Add" = "Thêm vào"; /* */ -"Basal Profile" = "Basal Profile"; +"Basal Profile" = "Hồ sơ liều nền (Basal)"; /* Rate basal profile */ "Rate" = "Tỷ lệ"; @@ -266,7 +266,7 @@ "Time" = "Thời gian"; /* */ -"Calculated Ratio" = "Calculated Ratio"; +"Calculated Ratio" = "Tỷ lệ được tính toán"; /* Carb Ratios header */ "Carb Ratios" = "Tỷ lệ Carb"; @@ -278,13 +278,13 @@ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Độ nhạy được tính toán"; /* */ "Insulin Sensitivities" = "Độ nhạy của Insulin"; /* */ -"Sensitivity Ratio" = "Sensitivity Ratio"; +"Sensitivity Ratio" = "Tỷ lệ độ nhạy"; /* */ "Dismiss" = "Từ bỏ"; @@ -300,13 +300,13 @@ /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Chấp nhận"; /* */ "Manual Temp Basal" = "Liều Basal thủ công"; /* Allow uploads to different services */ -"Allow uploads" = "Allow uploads"; +"Allow uploads" = "Cho phép tải lên"; /* API secret in NS */ "API secret" = "Khóa API"; @@ -465,46 +465,46 @@ Enact a temp Basal or a temp target */ "g" = "g"; /* when 0 U/hr */ -"0 U/hr" = "0 U/hr"; +"0 U/hr" = "U/hr"; /* abbreviation for days */ -"d" = "d"; +"d" = "ngày"; /* abbreviation for hours */ -"h" = "h"; +"h" = "giờ"; /* abbreviation for minutes */ -"m" = "m"; +"m" = "phút"; /* */ -"Closed loop" = "Closed loop"; +"Closed loop" = "Vòng lặp kín"; /* */ -"Configuration" = "Configuration"; +"Configuration" = "Cấu hình"; /* */ -"Devices" = "Devices"; +"Devices" = "Thiết bị"; /* */ -"Pump" = "Pump"; +"Pump" = "Bơm"; /* */ -"Watch" = "Watch"; +"Watch" = "Đồng hồ"; /* */ -"Watch Configuration" = "Watch Configuration"; +"Watch Configuration" = "Cấu hình đồng hồ"; /* */ "Apple Watch" = "Apple Watch"; /* */ -"Display on Watch" = "Display on Watch"; +"Display on Watch" = "Hiển thị trên đồng hồ"; /* */ "Garmin Watch" = "Garmin Watch"; /* */ -"Add devices" = "Add devices"; +"Add devices" = "Thêm thiết bị"; /* */ "Glucose Target" = "Glucose Target"; @@ -519,94 +519,94 @@ Enact a temp Basal or a temp target */ "ISF" = "ISF"; /* */ -"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it"; +"The app Garmin Connect must be installed to use for iAPS.\n Go to App Store to download it" = "Phải cài đặt ứng dụng Garmin Connect để sử dụng cho iAPS.\n Hãy truy cập App Store để tải xuống ứng dụng này"; /* */ -"Garmin is not available" = "Garmin is not available"; +"Garmin is not available" = "Garmin không có sẵn"; /* */ -"Services" = "Services"; +"Services" = "Dịch vụ"; /* */ -"Settings" = "Settings"; +"Settings" = "Cài đặt"; /* Recommendation for a Manual Bolus */ -"Recommended Bolus Percentage" = "Recommended Bolus Percentage"; +"Recommended Bolus Percentage" = "Tỷ lệ phần trăm Bolus được đề xuất"; /* 2 log files to share */ -"Share logs" = "Share logs"; +"Share logs" = "Chia sẻ nhật ký"; /* Upper target */ -"High target" = "High target"; +"High target" = "Mục tiêu cao"; /* Lower target */ -"Low target" = "Low target"; +"Low target" = "Mục tiêu thấp"; /* When bolusing */ -"Bolusing" = "Bolusing"; +"Bolusing" = "Đang tiến hành bolus"; /* */ -"Pump suspended" = "Pump suspended"; +"Pump suspended" = "Bơm đã tạm ngưng"; /* */ -"Middleware" = "Middleware"; +"Middleware" = "Phần mềm trung gian"; /* Header */ -"History" = "History"; +"History" = "Lịch sử"; /* Nightscout option */ -"Upload" = "Upload"; +"Upload" = "Tải lên"; /* Nightscout option */ -"Allow Uploads" = "Allow Uploads"; +"Allow Uploads" = "Cho phép tải lên"; /* Type of CGM or glucose source */ -"Type" = "Type"; +"Type" = "Loại cảm biến"; /* CGM */ -"CGM" = "CGM"; +"CGM" = "Cảm biến đường huyết"; /* CGM Transmitter ID */ -"Transmitter ID" = "Transmitter ID"; +"Transmitter ID" = "Số ID của Transmitter"; /* Other CGM setting */ -"Other" = "Other"; +"Other" = "Khác"; /* Whatch app alert */ -"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first"; +"Set temp targets presets on iPhone first" = "Trước tiên hãy đặt mục tiêu tạm thời trên iPhone"; /* Updating Watch app */ -"Updating..." = "Updating..."; +"Updating..." = "Đang cập nhật..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp Targets"; +"Temp Targets" = "Temp targets"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Xóa Carbs?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Xóa Insulin?"; /* Treatments list */ -"Treatments" = "Treatments"; +"Treatments" = "Phương pháp điều trị"; /* " min" in Treatments list */ -" min" = " min"; +" min" = " phút"; /* */ -"Unable to change anything" = "Unable to change anything"; +"Unable to change anything" = "Không thể thay đổi"; /* Calendar and Libre transmitter settings --------------- */ /* */ -"Configure Libre Transmitter" = "Configure Libre Transmitter"; +"Configure Libre Transmitter" = "Cấu hình Libre Transmitter"; /* */ -"Calibrations" = "Calibrations"; +"Calibrations" = "Hiệu chuẩn (Calib)"; /* */ -"Create Events in Calendar" = "Create Events in Calendar"; +"Create Events in Calendar" = "Tạo sự kiện trong Calendar"; /* */ "Calendar" = "Calendar"; @@ -762,154 +762,154 @@ Enact a temp Basal or a temp target */ "Invalid Sensor Detected" = "Sensor không hợp lệ"; /* Detected sensor seems not to be a libre 1 sensor! */ -"Detected sensor seems not to be a libre 1 sensor!" = "Detected sensor seems not to be a libre 1 sensor!"; +"Detected sensor seems not to be a libre 1 sensor!" = "Cảm biến được phát hiện không phải là cảm biến libre 1!"; /* Detected sensor is invalid: %@ */ -"Detected sensor is invalid: %@" = "Detected sensor is invalid: %@"; +"Detected sensor is invalid: %@" = "Cảm biến được phát hiện không hợp lệ: %@"; /* Low Battery */ -"Low battery" = "Low battery"; +"Low battery" = "Pin yếu"; /* */ -"Invalid sensor" = "Invalid sensor"; +"Invalid sensor" = "Lỗi nhập không hợp lệ"; /* */ -"Sensor change" = "Sensor change"; +"Sensor change" = "Thay đổi cảm biến"; /* */ -"Sensor expires soon" = "Sensor expires soon"; +"Sensor expires soon" = "Cảm biến sắp hết hạn"; /* Battery is running low %@, consider charging your %@ device as soon as possible */ -"Battery is running low %@, consider charging your %@ device as soon as possible" = "Battery is running low %@, consider charging your %@ device as soon as possible"; +"Battery is running low %@, consider charging your %@ device as soon as possible" = "Pin sắp hết %@, hãy cân nhắc việc sạc thiết bị %@ của bạn càng sớm càng tốt"; /* Extracting calibrationdata from sensor */ -"Extracting calibrationdata from sensor" = "Extracting calibrationdata from sensor"; +"Extracting calibrationdata from sensor" = "Trích xuất dữ liệu hiệu chuẩn từ cảm biến"; /* Sensor Ending Soon */ -"Sensor Ending Soon" = "Sensor Ending Soon"; +"Sensor Ending Soon" = "Cảm biến sắp kết thúc"; /* Current Sensor is Ending soon! Sensor Life left in %@ */ -"Current Sensor is Ending soon! Sensor Life left in %@" = "Current Sensor is Ending soon! Sensor Life left in %@"; +"Current Sensor is Ending soon! Sensor Life left in %@" = "Cảm biến hiện tại sắp kết thúc! Tuổi thọ cảm biến còn lại trong %@"; /* */ "Libre Bluetooth" = "Libre Bluetooth"; /* */ -"Snooze Alerts" = "Snooze Alerts"; +"Snooze Alerts" = "Báo lại cảnh báo"; /* */ -"Last measurement" = "Last measurement"; +"Last measurement" = "Lần đo cuối cùng"; /* */ -"Sensor Footer checksum" = "Sensor Footer checksum"; +"Sensor Footer checksum" = "Tổng kiểm tra cảm biến"; /* */ -"Last Blood Sugar prediction" = "Last Blood Sugar prediction"; +"Last Blood Sugar prediction" = "Dự đoán lượng đường trong máu"; /* */ -"CurrentBG" = "CurrentBG"; +"CurrentBG" = "Đường máu hiện tại"; /* */ -"Sensor Info" = "Sensor Info"; +"Sensor Info" = "Thông tin cảm biến"; /* */ -"Sensor Age" = "Sensor Age"; +"Sensor Age" = "Thời gian sử dụng sensor"; /* */ -"Sensor Age Left" = "Sensor Age Left"; +"Sensor Age Left" = "Thời gian còn lại của cảm biến"; /* */ -"Sensor Endtime" = "Sensor Endtime"; +"Sensor Endtime" = "Thời gian kết thúc cảm biến"; /* */ -"Sensor State" = "Sensor State"; +"Sensor State" = "Trạng thái cảm biến"; /* */ -"Sensor Serial" = "Sensor Serial"; +"Sensor Serial" = "Serial cảm biến"; /* */ -"Transmitter Info" = "Transmitter Info"; +"Transmitter Info" = "Số Id của Transmitter"; /* */ -"Hardware" = "Hardware"; +"Hardware" = "Phần cứng"; /* */ -"Firmware" = "Firmware"; +"Firmware" = "Phần mềm"; /* */ -"Connection State" = "Connection State"; +"Connection State" = "Tình trạng Kết nối"; /* */ -"Transmitter Type" = "Transmitter Type"; +"Transmitter Type" = "Loại Transmitter"; /* */ -"Sensor Type" = "Sensor Type"; +"Sensor Type" = "Loại cảm biến"; /* */ -"Factory Calibration Parameters" = "Factory Calibration Parameters"; +"Factory Calibration Parameters" = "Thông số hiệu chuẩn từ nhà máy"; /* */ -"Valid for footer" = "Valid for footer"; +"Valid for footer" = "Hợp lệ"; /* */ -"Edit calibrations" = "Edit calibrations"; +"Edit calibrations" = "Thêm kết quả hiệu chuẩn"; /* */ -"edit calibration clicked" = "edit calibration clicked"; +"edit calibration clicked" = "Nhấp vào để hiệu chuẩn"; /* */ -"Delete CGM" = "Delete CGM"; +"Delete CGM" = "Xóa CGM"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?"; +"Are you sure you want to remove this cgm from loop?" = "Bạn có chắc muốn xóa Cgm này khỏi Loop không?"; /* */ -"There is no undo" = "There is no undo"; +"There is no undo" = "Không thể hoàn tác"; /* */ -"Advanced" = "Advanced"; +"Advanced" = "Nâng cao"; /* */ -"Alarms" = "Alarms"; +"Alarms" = "Cảnh báo"; /* */ -"Glucose Settings" = "Glucose Settings"; +"Glucose Settings" = "Cài đặt đường huyết"; /* */ -"Notifications" = "Notifications"; +"Notifications" = "Thông báo"; /* */ -"Export logs" = "Export logs"; +"Export logs" = "Kết xuất nhật ký"; /* */ -"Export not available" = "Export not available"; +"Export not available" = "Không thể kết xuất"; /* */ -"Log export requires ios 15" = "Log export requires ios 15"; +"Log export requires ios 15" = "Kết xuất nhật ký yêu cấu ios 15 trở lên"; /* */ -"Got it!" = "Got it!"; +"Got it!" = "Đã hiểu!"; /* */ -"Saved to %@" = "Saved to %@"; +"Saved to %@" = "Đã lưu vào %@"; /* */ -"No logs available" = "No logs available"; +"No logs available" = "Không có nhật ký"; /* */ -"Glucose Notification visibility" = "Glucose Notification visibility"; +"Glucose Notification visibility" = "Khả năng hiển thị thông báo Glucose"; /* */ -"Always Notify Glucose" = "Always Notify Glucose"; +"Always Notify Glucose" = "Luôn thông báo Glucose"; /* */ -"Notify per reading" = "Notify per reading"; +"Notify per reading" = "Thông báo cho mỗi lần đọc"; /* */ -"Value" = "Value"; +"Value" = "Giá trị"; /* */ -"Adds Phone Battery" = "Adds Phone Battery"; +"Adds Phone Battery" = "Thêm Pin điện thoại"; /* */ "Adds Transmitter Battery" = "Thêm pin của Transmitter"; @@ -1062,50 +1062,50 @@ Enact a temp Basal or a temp target */ "Carbs" = "Carbs"; /* Food Type / Meal Note */ -"Note" = "Note"; +"Note" = "Lưu ý"; /* */ "Temp Basal" = "Temp Basal"; /* */ -"Temp Target" = "Temp Target"; +"Temp Target" = "Mục tiêu tạm thời"; /* */ -"Resume" = "Resume"; +"Resume" = "Tiếp tục"; /* */ -"Suspend" = "Suspend"; +"Suspend" = "Đã tạm ngưng"; /* */ "Animated Background" = "Animated Background"; /* Sensor day(s) */ -" day(s)" = " day(s)"; +" day(s)" = " ngày(s)"; /* Option to show HR in Watch app*/ -"Display HR on Watch" = "Display HR on Watch"; +"Display HR on Watch" = "Hiển thị trên đồng hồ"; /* Headers for settings ----------------------- */ -"OpenAPS main settings" = "OpenAPS main settings"; +"OpenAPS main settings" = "Cài đặt chính của OpenAPS"; -"OpenAPS SMB settings" = "OpenAPS SMB settings"; +"OpenAPS SMB settings" = "Cài đặt SMB OpenAPS"; -"OpenAPS targets settings" = "OpenAPS targets settings"; +"OpenAPS targets settings" = "Cài đặt mục tiêu OpenAPS"; -"OpenAPS other settings" = "OpenAPS other settings"; +"OpenAPS other settings" = "Cài đặt khác OpenAPS"; /* Glucose Simulator CGM */ -"Glucose Simulator" = "Glucose Simulator"; +"Glucose Simulator" = "Mô phỏng Glucose"; /* Restored state message */ -"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@"; +"Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Đã khôi phục trạng thái Bluetooth (APS đã khởi động lại?). Đã tìm thấy %d thiết bị ngoại vi và được kết nối với %@ bằng mã định danh %@"; /* Shared app group xDrip4iOS */ -"Using shared app group with external CGM app xDrip4iOS" = "Using shared app group with external CGM app xDrip4iOS"; +"Using shared app group with external CGM app xDrip4iOS" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Using shared app group with external CGM app GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài GlucoseDirect"; /* Dexcom G6 app */ "Dexcom G6 app" = "Dexcom G6 app"; @@ -1120,30 +1120,30 @@ Enact a temp Basal or a temp target */ "Simple simulator" = "Simple simulator"; /* Direct connection with Libre 1 transmitters or Libre 2 */ -"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Direct connection with Libre 1 transmitters or European Libre 2 sensors"; +"Direct connection with Libre 1 transmitters or European Libre 2 sensors" = "Kết nối trực tiếp với bộ phát Libre 1 hoặc cảm biến Libre 2 của Châu Âu"; /* Online or internal server */ -"Online or internal server" = "Online or internal server"; +"Online or internal server" = "Máy chủ trực tuyến hoặc nội bộ"; /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Developer"; +"Developer" = "Nhà phát triển"; /* Debug option view NS Upload Profile */ -"NS Upload Profile" = "NS Upload Profile"; +"NS Upload Profile" = "Tải hồ sơ lên NS"; /* Debug option view NS Uploaded Profile */ -"NS Uploaded Profile" = "NS Uploaded Profile"; +"NS Uploaded Profile" = "Hồ sơ đã tải lên NS"; /* Debug option view Autosense */ "Autosense" = "Autosense"; /* Insulin sensitivity config header */ -"Dynamic Sensitivity" = "Dynamic Sensitivity"; +"Dynamic Sensitivity" = "Độ nhạy động"; /* Autotune config */ -"Only Autotune Basal Insulin" = "Only Autotune Basal Insulin"; +"Only Autotune Basal Insulin" = "Chỉ Autotune Insulin cơ bản"; /* */ "Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; @@ -1152,72 +1152,72 @@ Enact a temp Basal or a temp target */ "Save on Pump" = "Lưu vào bơm"; /* Debug option view Pump History */ -"Pump History" = "Pump History"; +"Pump History" = "Lịch sử Bơm"; /* Debug option view Target Ranges */ -"Target ranges" = "Target ranges"; +"Target ranges" = "Phạm vi Mục tiêu"; /* Debug option view Temp targets */ -"Temp targets" = "Temp targets"; +"Temp targets" = "Mục tiêu tạm thời"; /* Debug option view Meal */ -"Meal" = "Meal"; +"Meal" = "Bữa ăn"; /* Debug option view Pump profile */ -"Pump profile" = "Pump profile"; +"Pump profile" = "Hồ sơ Bơm"; /* Debug option view Profile */ -"Profile" = "Profile"; +"Profile" = "Hồ sơ"; /* Debug option view Enacted */ -"Enacted" = "Enacted"; +"Enacted" = "Đã kích hoạt"; /* Debug option view Announcements (from NS) */ "Announcements" = "Announcements"; /* Debug option view Enacted announcements announcements (from NS) */ -"Enacted announcements" = "Enacted announcements"; +"Enacted announcements" = "Thông báo đã kích hoạt"; /* Debug option view Autotune */ "Autotune" = "Autotune"; /* Debug option view Target presets */ -"Target presets" = "Target presets"; +"Target presets" = "Mục tiêu đặt trước"; /* Debug option view */ -"Loop Cycles" = "Loop Cycles"; +"Loop Cycles" = "Chu kỳ vòng lặp"; /* Debug option view Glucose Data used for statistics */ -"Glucose Data used for statistics" = "Glucose Data used for statistics"; +"Glucose Data used for statistics" = "Dữ liệu Glucose được sử dụng để thống kê"; /* --------------- HealthKit intergration --------------------*/ /* */ "Apple Health" = "Apple Health"; /* */ -"Connect to Apple Health" = "Connect to Apple Health"; +"Connect to Apple Health" = "Kết nối Apple Health"; /* Show when have not permissions for writing to Health */ -"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access"; +"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Để ghi dữ liệu vào Apple Health, bạn phải cấp quyền trong Cài đặt > Sức khỏe > Truy cập dữ liệu"; /* */ -"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up."; +"This allows iAPS to read from and write to Apple Heath. You must also give permissions in Settings > Health > Data Access. If you enter a glucose value into Apple Health, open iAPS to confirm it shows up." = "Điều này cho phép iAPS đọc và ghi vào Apple Heath. Bạn cũng phải cấp quyền trong Cài đặt > Sức khỏe > Truy cập dữ liệu. Nếu bạn nhập giá trị glucose vào Apple Health, hãy mở iAPS để xác nhận giá trị đó hiển thị."; /* New ALerts ------------------------- */ /* Info title */ "Info" = "Thông tin"; /* Warning title */ -"Warning" = "Warning"; +"Warning" = "Cảnh báo"; /* Error title */ "Error" = "Lỗi"; /* Manual temp basal mode */ -"Manual" = "Manual"; +"Manual" = "Thủ công"; /* An Automatic delivered bolus (SMB) */ -"SMB" = "SMB"; +"SMB" = "Liều tiêm tự động (SMB)"; /* A manually entered dose of external insulin */ "External Insulin" = "Liều insulin tiêm ngoài"; @@ -1258,13 +1258,13 @@ Enact a temp Basal or a temp target */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và protein thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Chất béo và protein"; +"Fat and Protein" = "Chất béo và chất đạm"; /* Display fat and protein entities */ -"Fat & Protein" = "Fat & Protein"; +"Fat & Protein" = "Chất Béo & Đạm"; /* */ -"Hide Fat & Protein" = "Ẩn Fat & Protein"; +"Hide Fat & Protein" = "Ẩn chất Béo & Đạm"; /* Add Fat */ "Fat" = "Chất béo"; @@ -1273,7 +1273,7 @@ Enact a temp Basal or a temp target */ "Protein" = "Protein"; /* Service Section */ -"Fat And Protein Conversion" = "Chuyển đổi chất béo và protein"; +"Fat And Protein Conversion" = "Chuyển đổi chất béo và đạm"; /* Service Section */ "Profile Override" = "Profile Override"; @@ -1293,7 +1293,7 @@ Enact a temp Basal or a temp target */ "Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; /* */ -"Enable indefinitely" = "Kích hoạt vô thời hạn"; +"Enable indefinitely" = "Cấp phép không giới hạn"; /* */ "Override Profile target" = "Override Profile target"; @@ -1302,7 +1302,7 @@ Enact a temp Basal or a temp target */ "Disable SMBs" = "Vô hiệu hóa SMBs"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Normal Profile"; +"Normal Profile" = "Hồ sơ Normal"; /* Custom but unsaved Profile */ "Custom Profile" = "Custom Profile"; @@ -1338,10 +1338,10 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Lưu profile"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override?"; +"Cancel Profile Override" = "Hủy bỏ Profile Override?"; /* Alert */ -"Cancel Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Alert */ "Return to Normal?" = "Quay lại bình thường?"; @@ -1374,128 +1374,128 @@ Enact a temp Basal or a temp target */ "iAPS Icon" = "biểu tượng iAPS"; /* Service Section */ -"Statistics and Home View" = "Statistics and Home View"; +"Statistics and Home View" = "Thống kê và xem"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Xóa Carb tương đương không?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Tất cả FPU của bữa ăn sẽ bị xóa."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Xóa Glucose không?"; /* */ -"Meal Presets" = "Meal Presets"; +"Meal Presets" = "Đặt trước bữa ăn"; /* */ -"Empty" = "Empty"; +"Empty" = "Trống rỗng"; /* */ -"Delete Selected Preset" = "Delete Selected Preset"; +"Delete Selected Preset" = "Xóa cài đặt trước đã chọn"; /* */ -"Enter Meal Preset Name" = "Enter Meal Preset Name"; +"Enter Meal Preset Name" = "Nhập tên trước bữa ăn"; /* */ -"Name Of Dish" = "Name Of Dish"; +"Name Of Dish" = "Tên món ăn"; /* Save Carbs and continue to bolus recommendation */ -"Save and continue" = "Save and continue"; +"Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Save as Preset"; +"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; /* */ -"Predictions" = "Predictions"; +"Predictions" = "Dự đoán"; /* Watch Config Option */ -"Display Protein & Fat" = "Display Protein & Fat"; +"Display Protein & Fat" = "Hiển thị chất đạm và chất béo"; /* ----------------------- New Bolus Calculator ---------------------------*/ /* Warning about bolus recommendation. Title */ -"Warning!" = "Warning!"; +"Warning!" = "Cảnh báo!"; /* Alert to confirm bolus amount to add */ -"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount."; +"\n\nTap 'Add' to continue with selected amount." = "\n\nNhấn 'Thêm' để tiếp tục với số lượng đã chọn."; /* */ -"Eventual Glucose" = "Eventual Glucose"; +"Eventual Glucose" = "Glucose hiện tại"; /* */ -"Please wait" = "Please wait"; +"Please wait" = "Vui lòng chờ"; /* */ "Glucose, " = "Glucose, "; /* */ -"Target Glucose" = "Target Glucose"; +"Target Glucose" = "Đường huyết mục tiêu"; /* */ -"Percentage setting" = "Percentage setting"; +"Percentage setting" = "Cài đặt phần trăm"; /* */ -"Insulin Sensitivity" = "Insulin Sensitivity"; +"Insulin Sensitivity" = "Độ nhạy Insulin"; /* Formula displayed in Bolus info pop-up. Make translation short! */ -"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF"; +"(Eventual Glucose - Target) / ISF" = "(Glucose hiện tại - Mục tiêu) / ISF"; /* */ -"Formula:" = "Formula:"; +"Formula:" = "Công thức:"; /* Bolus pop-up footer */ -"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."; +"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs và insulin trước đó được đưa vào dự đoán lượng đường, nhưng nếu Đường huyết hiện tại thấp hơn Đường huyết mục tiêu thì không nên tiêm một liều bolus."; /* Hide pop-up */ -"Hide" = "Hide"; +"Hide" = "Ẩn"; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to "; +"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose được dự đoán trước tiên sẽ giảm xuống "; /* Bolus pop-up / Alert string. Make translations concise! */ -"which is below your Threshold (" = "which is below your Threshold ("; +"which is below your Threshold (" = "nằm dưới Ngưỡng của bạn ("; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose tăng chậm hơn dự kiến. Hy vọng: "; //* Bolus pop-up / Alert string. Make translations concise! */ -". Climbing: " = ". Climbing: "; +". Climbing: " = ". Leo: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Glucose hiện tại > Glucose mục tiêu, nhưng glucose đang giảm nhanh hơn dự kiến. Hy vọng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Falling: " = ". Falling: "; +". Falling: " = ". Lao xuóng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: "; +"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Glucose cuối cùng > Glucose mục tiêu, nhưng glucose đang thay đổi nhanh hơn dự kiến. Hy vọng: "; /* Bolus pop-up / Alert string. Make translations concise! */ -". Changing: " = ". Changing: "; +". Changing: " = ". Đang thay đổi: "; /* Add insulin without bolusing alert */ -" without bolusing" = " without bolusing"; +" without bolusing" = "Thêm và bỏ qua liều bolus"; /* ------------------------------------------------------------------------------------------- DASH strings */ "Attach Pod" = "Attach Pod"; -"Deactivate Pod" = "Deactivate Pod"; +"Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Deactivating..." = "Deactivating..."; +"Deactivating..." = "Đang hủy kích hoạt..."; -"Pair Pod" = "Pair Pod"; +"Pair Pod" = "Kết nối Pod"; /* Text for previous pod information row */ -"Previous Pod Information" = "Previous Pod Information"; +"Previous Pod Information" = "Thông tin Pod trước đó"; /* Text for confidence reminders navigation link */ -"Confidence Reminders" = "Confidence Reminders"; +"Confidence Reminders" = "Lời nhắc độ tin cậy"; -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Lời nhắc về độ tin cậy là những tiếng bíp từ Pod có thể được sử dụng để xác nhận các lệnh đã chọn khi Pod không ở chế độ im lặng."; /* button title for saving low reservoir reminder while saving */ "Saving..." = "Đang lưu..."; @@ -1507,28 +1507,28 @@ Enact a temp Basal or a temp target */ "Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; /* */ -"No Error" = "No Error"; +"No Error" = "Không có lỗi"; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* Title string for BeepPreference.silent */ -"Disabled" = "Disabled"; +"Disabled" = "Vô hiệu hóa"; /* Title string for BeepPreference.manualCommands */ -"Enabled" = "Enabled"; +"Enabled" = "Cho phép"; /* Title string for BeepPreference.extended */ -"Extended" = "Extended"; +"Extended" = "Mở rộng"; /* Description for BeepPreference.silent */ -"No confidence reminders are used." = "No confidence reminders are used."; +"No confidence reminders are used." = "Không có lời nhắc nào được sử dụng."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Các tác vụ sẽ có âm thanh như khi bạn bolus, hủy bỏ bolus, tạm dừng bơm, hoạt động lại hay lưu các lời nhắc thông báo... sẽ không có âm thanh khi ứng dụng chạy tự động."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for expiration reminder default row */ "Expiration Reminder Default" = "Expiration Reminder Default"; @@ -1537,7 +1537,7 @@ Enact a temp Basal or a temp target */ "Expiration Reminder" = "Expiration Reminder"; /* */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Sắp hết thuốc"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -1546,99 +1546,99 @@ Enact a temp Basal or a temp target */ "Scheduled Reminder" = "Scheduled Reminder"; /* */ -"Low Reservoir Reminder" = "Low Reservoir Reminder"; +"Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; /* The action string on pod status page when pod data is stale */ -"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Make sure your phone and pod are close to each other. If communication issues persist, move to a new area."; +"Make sure your phone and pod are close to each other. If communication issues persist, move to a new area." = "Đảm bảo điện thoại và pod được đặt gần nhau. Nếu kết nối vẫn gặp trở ngại, đặt lại chổ khác."; /* Format string for the action string on pod status page when pod expired. (1: service time remaining) */ -"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains."; +"Change Pod now. Insulin delivery will stop in %1$@ or when no more insulin remains." = "Thay pod ngay. Insulin sẽ ngưng tiêm trong %1$@ hoặc khi không còn insulin."; /* Label text for temporary basal rate summary */ "Rate" = "Tỷ lệ"; /* Summary string for temporary basal rate configuration page */ -"%1$@ for %2$@" = "%1$@ for %2$@"; +"%1$@ for %2$@" = "%1$@ cho %2$@"; /* Description text on manual temp basal action sheet */ -"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled."; +"Loop will not automatically adjust your insulin delivery until the temporary basal rate finishes or is canceled." = "Loop sẽ không tự động điều chỉnh liều insulin đến khi liều nền tạm thời thực hiện xong hoặc bị hủy bỏ."; /* Button text for setting manual temporary basal rate*/ -"Set Temporary Basal" = "Set Temporary Basal"; +"Set Temporary Basal" = "Cài đặt liều nền tạm thời"; /* Navigation Title for ManualTempBasalEntryView */ -"Temporary Basal" = "Temporary Basal"; +"Temporary Basal" = "Liều nền tạm thời"; /* Alert title for a failure to set temporary basal */ -"Temporary Basal Failed" = "Temporary Basal Failed"; +"Temporary Basal Failed" = "Liều nền tạm thời thất bại"; /* Alert format string for a failure to set temporary basal with recovery suggestion. (1: error description) (2: recovery text) */ -"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Unable to set a temporary basal rate: %1$@\n\n%2$@"; +"Unable to set a temporary basal rate: %1$@\n\n%2$@" = "Không thể cài đặt liều nền tạm thời: %1$@\n\n%2$@"; /* Alert format string for a failure to set temporary basal. (1: error description) */ -"Unable to set a temporary basal rate: %1$@" = "Unable to set a temporary basal rate: %1$@"; +"Unable to set a temporary basal rate: %1$@" = "Không thể cài đặt liều nền tạm thời: %1$@"; /* Alert title for missing temp basal configuration */ -"Missing Config" = "Missing Config"; +"Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* description label for active time pod details row */ -"Active Time" = "Active Time"; +"Active Time" = "Thời gian Hoạt động"; /* description label for total delivery pod details row */ -"Total Delivery" = "Total Delivery"; +"Total Delivery" = "Tổng liều"; /* */ -"Add Omnipod Dash" = "Add Omnipod Dash"; +"Add Omnipod Dash" = "Thay Omnipod Dash"; /* */ -"Insert Cannula" = "Insert Cannula"; +"Insert Cannula" = "Thay Cannula"; /* */ -"Check Cannula" = "Check Cannula"; +"Check Cannula" = "Kiểm tra Cannula"; /* */ -"Setup Complete" = "Setup Complete"; +"Setup Complete" = "Thiết lập xong"; /* */ -"Insulin Suspended" = "Insulin Suspended"; +"Insulin Suspended" = "Liều insulin đã tạm dừng"; /* Text for suspend resume button when insulin delivery is suspending */ -"Suspending insulin delivery..." = "Suspending insulin delivery..."; +"Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; /* Text for suspend resume button when insulin delivery is suspended */ -"Resume Insulin Delivery" = "Resume Insulin Delivery"; +"Resume Insulin Delivery" = "Phục hồi liều insulin"; /* Text for suspend resume button when insulin delivery is resuming */ -"Resuming insulin delivery..." = "Resuming insulin delivery..."; +"Resuming insulin delivery..." = "Đang phục hồi liều insulin..."; /* Alert title for suspend error */ -"Failed to Suspend Insulin Delivery" = "Failed to Suspend Insulin Delivery"; +"Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; //* -----------------------------------------------------------------------*/ /* ----------------------Statistics strings -------------------------------*/ /* */ -"Today" = "Today"; +"Today" = "Hôm nay"; /* */ -"Day" = "Day"; +"Day" = "Ngày"; /* */ -"Week" = "Week"; +"Week" = "Tuần"; /* */ -"Month" = "Month"; +"Month" = "Tháng"; /* */ "Total" = "Tổng số"; /* Headline Statistics */ -"Statistics" = "Statistics"; +"Statistics" = "Thống kê"; /* Option in preferences */ -"Allow Upload of Statistics to NS" = "Allow Upload of Statistics to NS"; +"Allow Upload of Statistics to NS" = "Cho phép tải thống kê lên NS"; /* Low Glucose Threshold in Statistics settings */ "Low" = "Thấp"; @@ -1647,19 +1647,19 @@ Enact a temp Basal or a temp target */ "High" = "Cao"; /* In Range */ -"In Range" = "In Range"; +"In Range" = "Trong phạm vi"; /* Display % */ -"Change HbA1c Unit" = "Change HbA1c Unit"; +"Change HbA1c Unit" = "Thay đổi đơn vị của HbA1c"; /* */ -"Display Chart X - Grid lines" = "Display Chart X - Grid lines"; +"Display Chart X - Grid lines" = "Thể hiện biểu đồ dạng X-Grid"; /* */ -"Display Chart Y - Grid lines" = "Display Chart Y - Grid lines"; +"Display Chart Y - Grid lines" = "Thể hiện biểu đồ dạng Y-Grid"; /* */ -"Display Chart Threshold lines for Low and High" = "Display Chart Threshold lines for Low and High"; +"Display Chart Threshold lines for Low and High" = "Thể hiện các đường hiển thị Low và High"; /* */ "Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; @@ -1668,28 +1668,28 @@ Enact a temp Basal or a temp target */ "Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; /* */ -"2 hours" = "2 hours"; +"2 hours" = "2 giờ"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 giờ"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 giờ"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 giờ"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 giờ"; /* Average BG = */ -"Average" = "Average"; +"Average" = "Trung bình"; /* Median BG */ -"Median" = "Median"; +"Median" = "Trung Bình"; /* CGM readings in statView */ -"Readings" = "Readings"; +"Readings" = "Đang đọc"; /* CGM readings in statView */ "Readings / 24h" = "Readings / 24h"; @@ -1698,13 +1698,13 @@ Enact a temp Basal or a temp target */ "Days" = "Days"; /* Normal BG (within TIR) */ -"Normal" = "Normal"; +"Normal" = "Bình thường"; /* Title High BG in statPanel */ -"High (>" = "High (>"; +"High (>" = "Cao (>"; /* Title Low BG in statPanel */ -"Low (<" = "Low (<"; +"Low (<" = "Thấp (<"; /* SD */ "SD" = "SD"; @@ -1725,10 +1725,10 @@ Enact a temp Basal or a temp target */ "Loops" = "Loops"; /* Loop Errors in statPanel */ -"Errors" = "Errors"; +"Errors" = "Lỗi"; /* Average loop interval */ -"Interval" = "Interval"; +"Interval" = "Khoảng"; /* Median loop interval */ "Duration" = "Khoảng thời gian"; @@ -1737,57 +1737,57 @@ Enact a temp Basal or a temp target */ "Display SD instead of CV" = "Display SD instead of CV"; /* Description for display SD */ -"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel"; +"Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Hiển thị Độ lệch chuẩn (SD) thay vì Hệ số biến thiên (CV) trong statPanel"; /* How often to update the statistics */ -"Update every number of minutes:" = "Update every number of minutes:"; +"Update every number of minutes:" = "Cập nhật theo từng phút:"; /* Description for update interval for statistics */ -"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout."; +"Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Mặc định là 20 phút. Tần suất cập nhật và lưu stats.json cũng như tải mảng cuối cùng lên Nightscout khi được bật."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "Past 24 Hours "; +"Past 24 Hours " = "24 Giờ Qua "; /* Duration displayed in statPanel */ -"Past Week " = "Past Week "; +"Past Week " = "Một tuần qua "; /* Duration displayed in statPanel */ -"Past Month " = "Past Month "; +"Past Month " = "Một tháng qua "; /* Duration displayed in statPanel */ -"Past 90 Days " = "Past 90 Days "; +"Past 90 Days " = "90 ngày trước "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "All Past Days of Data "; +"All Past Days of Data " = "Tất cả dữ liệu những ngày qua "; /* "Display Loop statistics in statPanel */ -"Display Loop Cycle statistics" = "Display Loop Cycle statistics"; +"Display Loop Cycle statistics" = "Hiển thị số liệu thống kê theo vòng tròn"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Displays Loop statistics in the statPanel in Home View"; +"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong statPanel trong Chế độ xem trang chủ"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong statPanlel. Đơn vị trong statPanel sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; /* HbA1c for all glucose storage days */ -"all" = "all"; +"all" = "Tất cả"; /* -------------------------------------------------------- Dexcom G7 --------------------------------------*/ -"CGM Configuration" = "CGM Configuration"; +"CGM Configuration" = "Cấu hình CGM"; -"Heartbeat" = "Heartbeat"; +"Heartbeat" = "Nhịp tim"; -"CGM address :" = "CGM address :"; +"CGM address :" = "Địa chỉ CGM :"; -"CGM is not used as heartbeat." = "CGM is not used as heartbeat."; +"CGM is not used as heartbeat." = "CGM không được sử dụng làm nhịp tim."; -"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?"; +"Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?"; /* New Experimental feature */ -"Experimental" = "Experimental"; +"Experimental" = "Thử nghiệm"; /* Smoothing of CGM readings */ -"Smooth Glucose Value" = "Smooth Glucose Value"; +"Smooth Glucose Value" = "Giá trị Glucose mịn"; /* ----------------------------------------------------------------------------------------------------------- @@ -1799,311 +1799,367 @@ Enact a temp Basal or a temp target */ "Rewind Resets Autosens" = "Rewind Resets Autosens"; /* ”Rewind Resets Autosens” */ -"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."; +"This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "Tính năng này, được bật theo mặc định, sẽ đặt lại tỷ lệ cảm biến tự động về mức trung tính khi bạn tua lại máy bơm của mình, với giả định rằng điều này tương ứng với một sự thay đổi địa điểm có thể xảy ra. Autosens sẽ bắt đầu học lại độ nhạy kể từ thời điểm tua lại, quá trình này có thể mất tới 6 giờ. Nếu bạn thường tua lại máy bơm của mình một cách độc lập với những thay đổi ở địa điểm, bạn có thể cân nhắc việc tắt tính năng này."; /* Headline "High Temptarget Raises Sensitivity" */ "High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; /* ”High Temptarget Raises Sensitivity" */ -"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Fitness_mode. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ "Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ "Sensitivity Raises Target" = "Sensitivity Raises Target"; /* ”Sensitivity Raises Target" */ -"When true, raises BG target when autosens detects sensitivity" = "When true, raises BG target when autosens detects sensitivity"; +"When true, raises BG target when autosens detects sensitivity" = "Khi True, tăng mục tiêu BG khi cảm biến tự động phát hiện độ nhạy"; /* Headline ”Resistance Lowers Target" */ "Resistance Lowers Target" = "Resistance Lowers Target"; /* ”Resistance Lowers Target" */ -"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Defaults to false. When true, will lower BG target when autosens detects resistance"; +"Defaults to false. When true, will lower BG target when autosens detects resistance" = "Mặc định là False. Khi True, sẽ hạ mục tiêu BG khi cảm biến tự động phát hiện kháng cự"; /* Headline ”Advanced Target Adjustments" */ "Advanced Target Adjustments" = "Advanced Target Adjustments"; /* ”Advanced Target Adjustments" */ -"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone."; +"This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Tính năng này trước đây được bật theo mặc định nhưng bây giờ sẽ được mặc định là false (sẽ KHÔNG được bật tự động) trong oref0 0.6.0 trở lên. (Không cần điều này với 0.6.0). Tính năng này tự động giảm BG mục tiêu của oref0 khi BG hiện tại và BG cuối cùng ở mức cao. Điều này giúp ngăn chặn và giảm thiểu BG cao, nhưng tự động chuyển sang nhiệt độ thấp để đảm bảo BG đi xuống mục tiêu thực tế của bạn một cách suôn sẻ. Nếu bạn thấy hành vi này quá hung hăng, bạn có thể tắt tính năng này. Nếu bạn làm như vậy, vui lòng cho chúng tôi biết để chúng tôi có thể hiểu rõ hơn cài đặt nào phù hợp nhất với mọi người."; /* Headline "Exercise Mode" */ -"Exercise Mode" = "Exercise Mode"; +"Exercise Mode" = "Chế độ tập thể dục"; /* "Exercise Mode" */ -"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity"; +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Mặc định là False. Khi True, mục tiêu cao > 105 mg/dL sẽ điều chỉnh Tỷ lệ độ nhạy cho chế độ tập luyện. Từ đồng nghĩa với high_temptarget_raises_sensitive"; /* Headline "Wide BG Target Range" */ -"Wide BG Target Range" = "Wide BG Target Range"; +"Wide BG Target Range" = "Phạm vi mục tiêu BG rộng"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng wide_bg_target_range: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; /* Headline "Skip Neutral Temps" */ "Skip Neutral Temps" = "Skip Neutral Temps"; /* "Skip Neutral Temps" */ -"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means OpenAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications form the 'rig', that may wake you up during the night. "; +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Temp “trung tính” (giống như Temp cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; /* Headline "Unsuspend If No Temp” */ "Unsuspend If No Temp" = "Unsuspend If No Temp"; /* "Unsuspend If No Temp” */ -"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended."; +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Nhiều người thỉnh thoảng quên tiếp tục/hủy tạm dừng máy bơm sau khi kết nối lại. Nếu bạn là một trong số họ và sẵn sàng đặt nhiệt độ cơ bản bằng 0 một cách đáng tin cậy bất cứ khi nào tạm dừng và ngắt kết nối máy bơm của mình, thì tính năng này sẽ hỗ trợ bạn. Nếu được bật, nó sẽ tự động tiếp tục/hủy tạm dừng máy bơm nếu bạn quên làm như vậy trước khi hết nhiệt độ 0. Miễn là nhiệt độ bằng 0 vẫn đang chạy, nó sẽ khiến máy bơm bị treo."; /* Headline "Enable UAM" */ -"Enable UAM" = "Enable UAM"; +"Enable UAM" = "Kích hoạt UAM"; /* "Enable UAM" */ -"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier."; +"With this option enabled, the SMB algorithm can recognize unannounced meals. This is helpful, if you forget to tell iAPS about your carbs or estimate your carbs wrong and the amount of entered carbs is wrong or if a meal with lots of fat and protein has a longer duration than expected. Without any carb entry, UAM can recognize fast glucose increasments caused by carbs, adrenaline, etc, and tries to adjust it with SMBs. This also works the opposite way: if there is a fast glucose decreasement, it can stop SMBs earlier." = "Khi bật tùy chọn này, thuật toán SMB có thể nhận ra các bữa ăn không báo trước. Điều này rất hữu ích nếu bạn quên thông báo cho iAPS về lượng carb của mình hoặc ước tính sai lượng carb của bạn và lượng carb đã nhập sai hoặc nếu một bữa ăn có nhiều chất béo và protein kéo dài hơn dự kiến. Nếu không có bất kỳ lượng carb nào được đưa vào, UAM có thể nhận ra mức tăng đường huyết nhanh chóng do carbs, adrenaline, v. v. gây ra và cố gắng điều chỉnh nó bằng SMB. Điều này cũng hoạt động theo cách ngược lại: nếu lượng glucose giảm nhanh, nó có thể dừng SMB sớm hơn."; /* Headline "Enable SMB With COB" */ -"Enable SMB With COB" = "Enable SMB With COB"; +"Enable SMB With COB" = "Kích hoạt SMB đối với COB"; /* Enable SMB With COB" */ -"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "This enables supermicrobolus (SMB) while carbs on board (COB) are positive."; +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép supermicrobolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; /* Headline "Enable SMB With Temptarget” */ -"Enable SMB With Temptarget" = "Enable SMB With Temptarget"; +"Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; /* "Enable SMB With Temptarget” */ -"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB."; +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép supermicrobolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; /* Headline "Enable SMB Always" */ -"Enable SMB Always" = "Enable SMB Always"; +"Enable SMB Always" = "Luôn bật SMB"; /* "Enable SMB Always" */ -"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)."; +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật supermicrobolus (trừ khi bị tắt bởi high temptarget)."; /* Headline "Enable SMB After Carbs" */ -"Enable SMB After Carbs" = "Enable SMB After Carbs"; +"Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; /* "Enable SMB After Carbs" */ -"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)."; +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật supermicrobolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Allow SMB With High Temptarget"; +"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép supermicrobolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ -"Use Custom Peak Time" = "Use Custom Peak Time"; +"Use Custom Peak Time" = "Sử dụng Giờ cao điểm tùy chỉnh"; /* "Use Custom Peak Time” */ -"Defaults to false. Setting to true allows changing insulinPeakTime" = "Defaults to false. Setting to true allows changing insulinPeakTime"; +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi insulinPeakTime"; /* Headline "Suspend Zeros IOB” */ "Suspend Zeros IOB" = "Suspend Zeros IOB"; /* "Suspend Zeros IOB” */ -"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added."; +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; /* Headline "Max IOB" */ -"Max IOB" = "Max IOB"; +"Max IOB" = "IOB tối đa"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (max_daily_safety_multiplier và current_basal_safety_multiplier), max_iob được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ -"Max Daily Safety Multiplier" = "Max Daily Safety Multiplier"; +"Max Daily Safety Multiplier" = "Hệ số an toàn hàng ngày tối đa"; /* "Max Daily Safety Multiplier" */ -"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là giới hạn an toàn quan trọng của OpenAPS. Cài đặt mặc định (có thể không cần điều chỉnh) là 3. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 3 lần tốc độ cơ bản hàng giờ cao nhất được lập trình trong máy bơm của người dùng hoặc, nếu được bật, sẽ được xác định bằng autotune."; /* Headline "Current Basal Safety Multiplier" */ -"Current Basal Safety Multiplier" = "Current Basal Safety Multiplier"; +"Current Basal Safety Multiplier" = "Hệ số an toàn cơ bản(Basal) hiện tại"; /* "Current Basal Safety Multiplier" */ -"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune."; +"This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là một giới hạn an toàn quan trọng khác của OpenAPS. Cài đặt mặc định (cũng khó có thể cần điều chỉnh) là 4. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 4 lần tốc độ cơ bản hàng giờ hiện tại được lập trình trong máy bơm của người dùng hoặc, nếu được bật, được xác định bằng autotune."; /* Headline "Autosens Max" */ -"Autosens Max" = "Autosens Max"; +"Autosens Max" = "Autosens tối đa"; /* "Autosens Max" */ -"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target."; +"This is a multiplier cap for autosens (and autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target." = "Đây là giới hạn hệ số nhân cho autosens (và autotune) để đặt giới hạn tối đa 20% cho tỷ lệ cảm biến tự động có thể cao đến mức nào, từ đó xác định mức độ tự động điều chỉnh mức cơ bản cao, mức độ điều chỉnh ISF thấp và mức độ thấp của nó có thể đặt mục tiêu BG."; /* Headline "Autosens Min" */ -"Autosens Min" = "Autosens Min"; +"Autosens Min" = "Autosens tối thiểu"; /* "Autosens Min" */ -"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets."; +"The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "Mặt khác của các giới hạn an toàn của autosens, đặt giới hạn về mức độ tự động thấp có thể điều chỉnh mức cơ bản và mức độ có thể điều chỉnh các mục tiêu ISF và BG."; /* Headline "Half Basal Exercise Target" */ "Half Basal Exercise Target" = "Half Basal Exercise Target"; /* "Half Basal Exercise Target" */ -"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes."; +"Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Đặt thành một số, ví dụ: 160, có nghĩa là khi mục tiêu tạm thời là 160 mg/dL và tập thể dục_mode=true, hãy chạy 50% cơ bản ở mức này (120 = 75%; 140 = 60%). Điều này có thể được điều chỉnh để giúp bạn kiểm soát nhiều hơn các chế độ tập luyện của mình. +\"Mục tiêu tập thể dục nửa cơ bản\"."; /* Headline "Max COB" */ -"Max COB" = "Max COB"; +"Max COB" = "COB tối đa"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của maxCOB là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức maxCOB và giữ nó ở mức maxCOB cho đến khi lượng carb nhập vào trên maxCOB cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; /* "Bolus Snooze DIA Divisor" */ -"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)."; +"Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Chế độ báo lại bolus được kích hoạt sau khi bạn thực hiện một bữa ăn nhanh, vì vậy vòng lặp sẽ không phản tác dụng với nhiệt độ thấp khi bạn vừa ăn. Ví dụ ở đây và mặc định là 2; vì vậy DIA 3 giờ có nghĩa là thời gian báo lại bolus sẽ giảm dần trong 1,5 giờ (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ "Min 5m Carbimpact" = "Min 5m Carbimpact"; /* "Min 5m Carbimpact" */ -"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g."; +"This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Đây là cài đặt cho tác động hấp thụ carb mặc định trong 5 phút. Giá trị mặc định là 8 mg/dL/5 phút dự kiến. Điều này ảnh hưởng đến tốc độ phân hủy của COB trong các tình huống khi không thể nhìn thấy sự hấp thụ carb ở độ lệch BG. Giá trị mặc định là 8 mg/dL/5 phút tương ứng với tốc độ hấp thụ carb tối thiểu là 24g/giờ ở CSF là 4 mg/dL/g."; /* Headline "Autotune ISF Adjustment Fraction" */ -"Autotune ISF Adjustment Fraction" = "Autotune ISF Adjustment Fraction"; +"Autotune ISF Adjustment Fraction" = "Phân số (AF) điều chỉnh ISF tự động điều chỉnh"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của fullNewISF và PumpISF. 1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF."; /* Headline "Remaining Carbs Fraction" */ "Remaining Carbs Fraction" = "Remaining Carbs Fraction"; /* "Remaining Carbs Fraction" */ -"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là tỷ lệ carbs mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy sự hấp thụ carb."; /* Headline "Remaining Carbs Cap" */ -"Remaining Carbs Cap" = "Remaining Carbs Cap"; +"Remaining Carbs Cap" = "Phần carb còn lại"; /* "Remaining Carbs Cap" */ -"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption."; +"This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là lượng carb tối đa mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy khả năng hấp thụ carb."; /* Headline ”Max SMB Basal Minutes" */ -"Max SMB Basal Minutes" = "Max SMB Basal Minutes"; +"Max SMB Basal Minutes" = "Số phút cơ bản(Basal) SMB tối đa"; /* ”Max SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa có thể được phân phối dưới dạng một SMB duy nhất không có COB. Điều này mang lại khả năng làm cho SMB trở nên hung hãn hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Không nên đặt giá trị này cao hơn 90 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "Max UAM SMB Basal Minutes" */ -"Max UAM SMB Basal Minutes" = "Max UAM SMB Basal Minutes"; +"Max UAM SMB Basal Minutes" = "Số phút cơ bản(basal) UAM SMB tối đa"; /* "Max UAM SMB Basal Minutes" */ -"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs."; +"Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa mà UAM có thể phân phối dưới dạng một SMB khi IOB vượt quá COB. Điều này mang lại khả năng khiến UAM trở nên hung hãn hơn hoặc ít hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Việc giảm giá trị sẽ khiến UAM giảm liều insulin cho mỗi SMB. Không nên đặt giá trị này cao hơn 60 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "SMB Interval" */ -"SMB Interval" = "SMB Interval"; +"SMB Interval" = "Khoảng thời gian SMB"; /* "SMB Interval" */ -"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Minimum duration in minutes for new SMB since last SMB or manual bolus"; +"Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Thời lượng tối thiểu tính bằng phút cho SMB mới kể từ SMB cuối cùng hoặc liều truyền thủ công"; /* Headline "Bolus Increment" */ -"Bolus Increment" = "Bolus Increment"; +"Bolus Increment" = "Tăng liều Bolus nhanh"; /* "Bolus Increment" */ -"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1."; +"Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Số SMB được ban hành nhỏ nhất. Lượng tối thiểu đối với máy bơm Omnipod là 0,05 U, trong khi đối với máy bơm Medtronic, lượng này khác nhau đối với nhiều kiểu máy khác nhau, từ 0,025 U đến 0,10 U. Vui lòng kiểm tra lượng truyền nhanh tối thiểu mà máy bơm của bạn có thể cung cấp. Giá trị mặc định là 0,1."; /* Headline "Insulin Peak Time" */ -"Insulin Peak Time" = "Insulin Peak Time"; +"Insulin Peak Time" = "Thời gian cao điểm của insulin"; /* "Insulin Peak Time" */ -"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops."; +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Thời gian tác dụng hạ đường huyết tối đa của insulin, tính bằng phút. Lưu ý: Oref giả định đường cong cực nhanh (Lyumjev) và tác dụng nhanh (Fiasp) tối thiểu (35 & 50 phút) và tối đa (100 & 120 phút) insulinPeakTimes áp dụng. Việc sử dụng insulinPeakTime tùy chỉnh ngoài các giới hạn này sẽ dẫn đến sự cố với iAPS, tính toán vòng lặp dài hơn và có thể xảy ra vòng lặp màu đỏ."; /* Headline "Carbs Req Threshold" */ -"Carbs Req Threshold" = "Carbs Req Threshold"; +"Carbs Req Threshold" = "Ngưỡng yêu cầu của lượng Carbs"; /* "Carbs Req Threshold" */ -"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold."; +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Số gram carbsReq để kích hoạt quá trình đẩy. Mặc định là 1 (cho 1 gam carbohydrate). Có thể tăng lên nếu bạn chỉ muốn nhận Pushover cho carbsReq ở ngưỡng X."; /* Headline "Noisy CGM Target Multiplier" */ -"Noisy CGM Target Multiplier" = "Noisy CGM Target Multiplier"; +"Noisy CGM Target Multiplier" = "Hệ số mục tiêu CGM Noisy"; /* "Noisy CGM Target Multiplier" */ -"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data"; +"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Mặc định là 1.3. Tăng mục tiêu lên số lượng này khi lặp lại dữ liệu CGM thô/noisy"; /* Headline "SMB DeliveryRatio" */ -"SMB DeliveryRatio" = "SMB DeliveryRatio"; +"SMB DeliveryRatio" = "Tỷ lệ phân phối SMB"; /* SMB DeliveryRatio */ -"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution."; +"Default value: 0.5 This is another key OpenAPS safety cap, and specifies what share of the total insulin required can be delivered as SMB. Increase this experimental value slowly and with caution." = "Giá trị mặc định: 0,5 Đây là một giới hạn an toàn quan trọng khác của OpenAPS và chỉ định tỷ lệ trong tổng lượng insulin cần thiết có thể được phân phối dưới dạng SMB. Tăng giá trị thử nghiệm này một cách chậm rãi và thận trọng."; // Dynamic ISF + CR Settings: /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Enable Dynamic ISF, Headline */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Enable Dynamic ISF"; +"Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Tính toán ISF mới với mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên BG, TDD hiện tại của insulin (24 giờ qua hoặc mức trung bình có trọng số) và Hệ số điều chỉnh (mặc định là 1).\n\nTỷ lệ ISF và CR động sẽ bị giới hạn bởi giới hạn autosens.min/max của bạn.\n\nTỷ lệ động thay thế tỷ lệ autosens: ISF mới = ISF tĩnh / Tỷ lệ động,\nTỷ lệ động = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ -"Enable Dynamic CR" = "Enable Dynamic CR"; +/* Headline Enable Dynamic CR */ +"Enable Dynamic CR" = "Kích hoạt CR động"; /* Enable Dynamic CR */ -"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +"Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Sử dụng CR động. Tỷ lệ động sẽ được sử dụng cho CR như sau:\n\n Khi tỷ lệ > 1: dynCR = (newRatio - 1) / 2 + 1.\nKhi tỷ lệ < 1: dynCR = CR/dynCR.\n\nKhông sử dụng cùng với Tỷ lệ Insulin cao (> 2)"; + +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Kích hoạt độ nhạy động (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Kích hoạt Tỷ lệ Carb động (CR)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; +"Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Điều chỉnh tỷ lệ động theo một hằng số. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF của bạn sẽ càng lớn đối với BG cao hay thấp. Hiệu chỉnh tối đa được xác định bởi cài đặt tối thiểu/tối đa của Autosens. Đối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu. Đối với công thức logarit, thre có ít sự đồng thuận hơn, nhưng bắt đầu bằng 0,5 - 0,8 thì phù hợp hơn với hầu hết người dùng"; +/* Headline Use Sigmoid Function */ +"Use Sigmoid Function" = "Sử dụng hàm Sigmoid (SF)"; -/* Headline "Use Sigmoid Function" */ -"Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Công thức"; -/* Use Sigmoid Function */ -"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; +/* Extra Safety Features when using dyn ISF */ +"Safety" = "An toàn"; +/* Use Sigmoid Function */ +"Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Sử dụng hàm sigmoid cho ISF (và cho CR, khi được bật), thay vì công thức logarit mặc định. Yêu cầu bật cài đặt ISF động trong cài đặt\n\nCài đặt Điều chỉnh điều chỉnh độ dốc của đường cong (Y: Tỷ lệ động, X: Đường huyết). Giá trị thấp hơn ==> ít dốc hơn == ít linh hoạt hơn.\n\nCài đặt autosens.min/max xác định cả giới hạn tối đa/phút cho tỷ lệ động VÀ mức độ điều chỉnh tỷ lệ động. Nếu AF là độ dốc của đường cong thì autosens.min/max là chiều cao của biểu đồ, khoảng Y, trong đó Y: tỷ lệ động. Đường cong sẽ luôn có dạng sigmoid, bất kể cài đặt autosens.min/max nào được sử dụng, nghĩa là những cài đặt này có hậu quả lớn đối với kết quả của ISF động được tính toán. Hãy cẩn thận khi đặt giá trị autosens.max quá cao. Với cài đặt ISF cấu hình phù hợp, bạn có thể sẽ không bao giờ cần nó cao hơn 1,5\n\nGiới hạn Autosens.max > 1,5 là không nên khi sử dụng chức năng sigmoid."; -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Cài đặt ngưỡng"; /* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; + +/* Header */ +"Calculator settings" = "Thiết lập Tính toán"; + +/* UI/UX option */ +"Display Predictions" = "Hiển thị dự đoán"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Màn hình iPhone nhỏ hơn"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Hiển thị và cho phép nhập các mục Chất béo và chất đạm"; + +/* UI/UX option */ +"Add Meal View settings " = "Thêm cài đặt Chế độ xem bữa ăn "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Hiển thị nút tiêu tạm thời"; + +/* UI/UX option */ +"Home View Button Panel " = "Bảng nút xem trang chủ "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "Trong trường hợp bạn đang sử dụng cả hồ sơ và mục tiêu tạm thời"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Luôn tô màu Giá trị Glucose (xanh, vàng, v. v.)"; + +/* UI/UX option */ +"Header settings" = "Cài đặt tiêu đề"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Thông thường glucose chỉ có màu đỏ khi vượt quá hoặc dưới giới hạn thông báo của bạn về mức cao"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; + +/* Notification option */ +"Live Activity" = "Hoạt động trực tiếp"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hoạt động trực tiếp hiển thị đường huyết trực tiếp trên màn hình khóa và trên đảo động (nếu có)"; + +/* Notification option */ +"Show live activity" = "Hiển thị hoạt động trực tiếp"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; /* Weight of past 24 hours of insulin */ -"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; +"Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Phải > 0 và <= 1.\nMặc định là 0,65 (65 %) * TDD. Phần còn lại sẽ lấy từ mức trung bình của tổng dữ liệu (tối đa 14 ngày) của tất cả các phép tính TDD (35%). Để chỉ sử dụng 24 giờ qua, hãy đặt giá trị này thành 1.\n\nĐể tránh những biến động đột ngột, chẳng hạn như sau một bữa ăn thịnh soạn, tính toán TDD trung bình trong 2 giờ qua được sử dụng thay vì chỉ TDD hiện tại (24 giờ qua lúc thời điểm này). +​."; /* Headline "Adjust basal" */ -"Adjust basal" = "Adjust basal"; +"Adjust basal" = "Điều chỉnh cơ bản(basal)"; /* Enable adjustment of basal profile */ -"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD"; +"Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Cho phép điều chỉnh mức cơ bản dựa trên tỷ lệ TDD hiện tại/TDD trung bình 7 ngày"; /* Headline "Max Delta-BG Threshold SMB" */ -"Max Delta-BG Threshold SMB" = "Max Delta-BG Threshold SMB"; +"Max Delta-BG Threshold SMB" = "Ngưỡng tối đa Delta-BG SMB"; /* Max Delta-BG Threshold SMB */ -"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)."; +"Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Mặc định là 0,2 (20%). Thay đổi phần trăm dương tối đa của cấp độ BG để sử dụng SMB, trên mức đó sẽ vô hiệu hóa SMB. Giới hạn mã hóa cứng là 40%. Đối với UAM vòng kín hoàn toàn nên sử dụng 30%. Quan sát nhật ký và cửa sổ bật lên (maxDelta 27 > 20% BG 100 - vô hiệu hóa SMB!)."; /* Headline "... When Blood Glucose Is Over (mg/dl):" */ "... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; /* ... When Blood Glucose Is Over (mg/dl): */ -"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable."; +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Đặt giá trị EnableSMB_high_bg sẽ so sánh để kích hoạt SMB. Nếu BG > giá trị này, SMB sẽ kích hoạt."; /* Headline "Enable SMB With High BG" */ -"Enable SMB With High BG" = "Enable SMB With High BG"; +"Enable SMB With High BG" = "Kích hoạt SMB với BG cao"; /* "Enable SMB With High BG" */ -"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)"; +"Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Dynamic settings"; +"Dynamic settings" = "Cài đặt động(Dynamic)"; /* Insulin curve */ -"Insulin curve" = "Insulin curve"; +"Insulin curve" = "Đường cong insulin"; /* Headline "Adjustment Factor" */ -"Adjustment Factor" = "Adjustment Factor"; +"Adjustment Factor" = "Yếu tố điều chỉnh (AF)"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 7d5e483142..913fd01e52 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2045,32 +2045,86 @@ Enact a temp Basal or a temp target */ /* Enable Dynamic ISF */ "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; -/* Headline "Enable Dynamic CR" */ +/* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; /* Enable Dynamic CR */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)"; +/* Enable Dyn ISF */ +"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; + +/* Enable Dyn CR */ +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; + /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; - -/* Headline "Use Sigmoid Function" */ +/* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; +/* Which dyn ISF function to use */ +"Formula" = "Formula"; + +/* Extra Safety Features when using dyn ISF */ +"Safety" = "Safety"; + /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; - -/* Headline "Threshold Setting" */ -"Threshold Setting (mg/dl)" = "Threshold Setting (mg/dl)"; +/* Headline Threshold Setting */ +"Threshold Setting" = "Threshold Setting"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Header */ +"Calculator settings" = "Calculator settings"; + +/* UI/UX option */ +"Display Predictions" = "Display Predictions"; + +/* UI/UX option */ +"Smaller iPhone Screens" = "Smaller iPhone Screens"; + +/* UI/UX option */ +"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; + +/* UI/UX option */ +"Add Meal View settings " = "Add Meal View settings "; + +/* UI/UX option */ +"Display Temp Targets Button" = "Display Temp Targets Button"; + +/* UI/UX option */ +"Home View Button Panel " = "Home View Button Panel "; + +/* UI/UX option */ +"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; + +/* UI/UX option */ +"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; + +/* UI/UX option */ +"Header settings" = "Header settings"; +/* UI/UX option */ +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; + +/* UI/UX option */ +"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; + +/* Notification option */ +"Live Activity" = "Live Activity"; + +/* Notification option */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Notification option */ +"Show live activity" = "Show live activity"; + /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From e5e5c5f0d4844eda4468ddfa71dfcd3251c28093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 4 Jan 2024 13:18:07 +0100 Subject: [PATCH 326/405] Crowdin updates (#451) --- .../ar.lproj/Localizable.strings | 5 +- .../da.lproj/Localizable.strings | 5 +- .../de.lproj/Localizable.strings | 5 +- .../es.lproj/Localizable.strings | 5 +- .../fi.lproj/Localizable.strings | 5 +- .../fr.lproj/Localizable.strings | 5 +- .../he.lproj/Localizable.strings | 5 +- .../hu.lproj/Localizable.strings | 5 +- .../it.lproj/Localizable.strings | 5 +- .../nb.lproj/Localizable.strings | 5 +- .../nl.lproj/Localizable.strings | 5 +- .../pl.lproj/Localizable.strings | 5 +- .../pt-BR.lproj/Localizable.strings | 5 +- .../pt-PT.lproj/Localizable.strings | 5 +- .../ru.lproj/Localizable.strings | 5 +- .../sk.lproj/Localizable.strings | 5 +- .../sv.lproj/Localizable.strings | 5 +- .../tr.lproj/Localizable.strings | 5 +- .../uk.lproj/Localizable.strings | 5 +- .../vi.lproj/Localizable.strings | 13 +- .../zh-Hans.lproj/Localizable.strings | 5 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/nl.lproj/Localizable.strings | 40 +++--- .../Main/ru.lproj/Localizable.strings | 40 +++--- .../Main/vi.lproj/Localizable.strings | 120 +++++++++--------- 27 files changed, 172 insertions(+), 151 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index f3e25b45ef..8d41f1c19b 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 6102a76d53..bb109e08f5 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Forbered pumpested."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Tjek Pod, sæt på kroppen og bekræft derefter Pod er sat korrekt på."; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 9862b94e96..eaad1065cb 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Setzstelle vorbereiten."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Prüfen Sie den Pod, auf der Setzstelle anbringen, dann Prodanbringung bestätigen."; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 97b0403250..0d15cb6c8e 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 681a1e0169..9dd176defb 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 75afbac176..34b5263e1b 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Préparez le site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Retirez le bouchon d'aiguille bleu et vérifiez la cannule, puis retirez le support papier."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Retirez le bouchon d'aiguille bleu et vérifiez la cannule, puis retirez le support papier."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Vérifiez Pod, appliquez au site, puis confirmez l'attachement du pod."; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index f3e25b45ef..8d41f1c19b 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index 8cb982a2a1..414410c356 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 578e6f3b86..aed2900061 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepara il sito."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell’ago e controlla la cannula. Quindi rimuovi il supporto cartaceo."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell’ago e controlla la cannula. Quindi rimuovi il supporto cartaceo."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controlla il Pod, applica al sito e conferma che il pod è attaccato."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 4b9f32d606..01ebb9e192 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Gjør klart stedet hvor pod skal festes."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Fjern det blå beskyttelsesdekselet og kontroller kanylen. Fjern deretter papiret fra plasteret."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern det blå beskyttelsesdekselet og kontroller kanylen. Fjern deretter papiret fra plasteret."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontroller pod, fest på kroppen, og bekreft at den sitter korrekt."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 1449d7ec74..6fc71f3d51 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Bereid de infusieplaats voor."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controleer de Pod, breng aan op de infusieplaats en bevestig de plaatsing."; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index bebc91b195..a3c78b1ac4 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 15d56f1c91..fae147e03a 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index 8019116b43..c6dbe93021 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index afd3e16fe2..61c04d321d 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Подготовьте место."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Проверьте Под, установите его на теле, затем подтвердите установку Пода."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 36859c5e7f..7e78021cff 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Príprava miesta na telo."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Skontrolujte pod, aplikujte ho na telo, potom potvrďte prilepenie podu."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index fd17da881e..8c87f7d3f5 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Förbered hud."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Ta bort det blå kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Ta bort det blå kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontrollera din podd, sätt fast den och bekräfta sedan att den sitter bra."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 8a589c5980..49e4338631 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "İnfüzyon bölgesini hazırlayın."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Mavi Pod iğne kapağını çıkarın ve kanülü kontrol edin. Ardından kağıt koruma bandını çıkarın."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Mavi Pod iğne kapağını çıkarın ve kanülü kontrol edin. Ardından kağıt koruma bandını çıkarın."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Pod'u kontrol edin, infüzyon bölgesine uygulayın, ardından pod ekini onaylayın."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index d68827c20d..4c21c563a2 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Підготуйте місце."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Перевірте Pod, установіть його на тілі, а потім підтвердіть установку Pod."; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 7486629962..58bd0f55f2 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -234,7 +234,7 @@ "No Insulin" = "Hết thuốc"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Status highlight when communications with the pod haven't happened recently. */ "Signal Loss" = "Mất tín hiệu"; @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Chuẩn bị vị trí."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; @@ -529,7 +530,7 @@ "Finish Setup" = "Hoàn thành cài đặt"; /* */ -"Setup Complete" = "Thiết lập xong"; +"Setup Complete" = "Cấu hình hoàn thành"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -640,7 +641,7 @@ "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* Text for previous pod information row */ "Previous Pod Information" = "Thông tin Pod trước đó"; @@ -703,7 +704,7 @@ "Next" = "Kế tiếp"; /* */ -"Expiration Reminder" = "Expiration Reminder"; +"Expiration Reminder" = "Nhắc nhở Hết hạn"; /* Description text on LowReservoirReminderSetupView */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index f349bab503..ccda671d38 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "将注射部位做好准备"; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "检查Pod,贴在注射部位上,确保pod已经贴牢"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 97e98360f9..6bf56b90fd 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -126,7 +126,7 @@ "Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ "Insulin type not configured" = "Loại insulin chưa được khai báo"; @@ -368,7 +368,7 @@ "Tank power activated" = "Pod được kích hoạt"; /* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ -"Temp Basal" = "Temp Basal"; +"Temp Basal" = "Liều cơ bản tạm thời"; /* Error message shown when temp basal could not be set due to existing temp basal in progress */ "Temp basal in progress" = "Liều basal tạm thời đang tiến hành"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 072d2830c2..67917dc46b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -547,7 +547,7 @@ "Remove Pump" = "Verwijder Pomp"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de transparante naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 76c78eb3c0..c7b3aa70eb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -240,7 +240,7 @@ "Expiration Reminder" = "Nhắc nhở Hết hạn"; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* The title of the cell showing the pod expiration after expiry */ "Expired" = "Đã hết hạn"; @@ -261,7 +261,7 @@ "Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for error when updating confidence reminder preference */ -"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; +"Failed to update confidence reminder preference." = "Không cập nhật được tùy chọn lời nhắc về độ tin cậy."; /* Alert title for error when updating expiration reminder */ "Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 13c5866f92..aad07472fd 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2058,10 +2058,10 @@ Gebruik dit niet samen met een hoge insuline fractie (> 2).\n\n Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op basis van je recente verhoudingen. Het zorgt ervoor dat de aanpassingen niet te groot zijn en werkt niet goed als je een hoge insuline fractie hebt."; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Dynamische gevoeligheid (ISF) activeren"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Dynamische koolhydraat verhouding activeren (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; @@ -2073,63 +2073,63 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Use Sigmoid Function" = "Gebruik Sigmoid functie"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formule"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Veiligheid"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Gebruikt een Sigmoid functie voor ISF (en voor CR, indien ingeschakeld), in plaats van de standaard logaritmische formule. Vereist een geactiveerde dynamische ISF instelling.\n\nDe instelling aanpassing past de helling van de curve aan (Y: Dynamische verhouding, X: Bloedglucose). Een lagere waarde ==> minder steil = minder agressief.\n\nDe autosens.min/max instellingen bepalen zowel de max/min grenzen voor de dynamische ratio als hoeveel de dynamische ratio wordt aangepast. Als AF de helling van de curve is, is autosens.min/max de hoogte van de grafiek, het Y-interval, waarbij Y: dynamische verhouding. De curve zal altijd een sigmoïde vorm hebben, ongeacht de autosens.min/max instellingen, wat betekent dat deze instellingen grote gevolgen hebben voor het resultaat van de berekende dynamische ISF. Wees voorzichtig met het instellen van een te hoge autosens.max waarde. Met een goede profiel-ISF instelling zal het waarschijnlijk nooit nodig zijn deze hoger in te stellen dan 1,5.\n\nEen Autosens max grens > 1,5 is niet aan te raden bij gebruik van de Sigmoid functie."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Grenswaarde instellingen"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Calculator instellingen"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Geef voorspellingen weer"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Kleinere iPhone schermen"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Vet- en proteïne weergeven en toestaan"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Maaltijdweergave instellingen toevoegen "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Toon tijdelijke doelen knop"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Beginscherm knoppaneel "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "In het geval dat je zowel profielen als tijdelijke doelen gebruikt"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Glucose waarde altijd in kleur (rood, groen, geel enz.) weergeven"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Instellingen voor kopteksten"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normaal gesproken wordt glucose alleen rood gekleurd als je de notificatiegrens hebt overschreden voor hoog/laag"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Live activiteit"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Toon live activiteit"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ba4f5e80b6..e023b85790 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Использовать Dynamic CR. Dynamic ratio будет также влиять и на CR:\n\n Когда ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКогда ratio <1: dynCR = CR/dynCR.\n\nНе используйте совместно с высоким Insulin Fraction (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Включить динамическую чувствительность (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Включить динамический углеводный коэффициент (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; @@ -2065,63 +2065,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Формула"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Безопасность"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Использовать сигмоидную функцию для ISF (и для CR, если включено), вместо логарифмической функции. Требует включенного в настройках режима Dynamic ISF\n\nКоэффициент регулировки AF регулирует наклон кривой (Y: Динамическое соотношение, X: Глюкоза крови). Ниже значения ==> меньше крутизна == меньше агрессивность.\n\nAutosens минимум и максимум определяют оба - максимальный и минимальный лимиты для динамического соотношения и как сильно динамическое соотношение будет изменять ISF/CR. Коэффициент регулировки AF - это высота кривой, Y - интервал, где Y - динамическое соотношение. Кривая всегда будет иметь сигмовидную форму, не важно какой autosens минимум/максимум указаны. Это означает, что эти настройки имеют большие последствия для результата вычисляемого динамического ISF. Пожалуйста, будьте осторожны с высокими значениями параметра алгоритма максимума для autosens. При правильной настройке профиля ISF, никогда не понадобится значение выше 1,5.\n\nAn Предел Autosens максимум > 1,5 не рекомендуется при использовании сигмовидной функции."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Настройка порога"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Настройки калькулятора"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Отображать прогнозы"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Небольшие экраны iPhone"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Отображать и разрешать запись жиров и белков"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Настройки отображения еды "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Отображать кнопку временных целей"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Панель кнопок главного экрана "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "В случае, если вы используете как профили, так и временные цели"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Цветовая индикация уровня глюкозы в крови (зеленый, желтый, красный)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Верхняя панель"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Обычно глюкоза окрашивается в красный цвет только в том случае, если значение превышено или выходит за пределы ваших лимитов уведомлений о высоком / низком уровне"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Эфир активности"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Отображать эфир активности"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 6d2962032f..617bc2940a 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -35,7 +35,7 @@ "Recommendation" = "LIỀU KHUYẾN NGHỊ"; /* Button */ -"Clear" = "Bỏ"; +"Clear" = "Hủy bỏ"; /* Button */ "Done" = "Hoàn thành"; @@ -65,7 +65,7 @@ "Edit Meal" = "Chỉnh sửa bữa ăn"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Thêm bữa ăn"; +"Add Meal" = "Khai báo bữa ăn"; /* Bolus View Bolus Summary Header */ "Bolus Summary" = "Tóm tắt liều bolus"; @@ -74,7 +74,7 @@ "Calculations" = "Các tính toán"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Bữa ăn nhiều béo"; +"Fatty Meal" = "Bữa ăn nhiều chất béo"; /* For the Bolus View pop-up */ "Full Bolus" = "Liều bolus đầy đủ"; @@ -83,7 +83,7 @@ "Fraction" = "Chia cho"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Chỉ số bữa ăn nhiều béo"; +"Fatty Meal Factor" = "Chỉ số bữa ăn nhiều chất béo"; /* For the Bolus View pop-up */ "Result" = "Kết quả"; @@ -140,7 +140,7 @@ "Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Custom temp target */ -"Custom" = "THÔNG LỆ"; +"Custom" = "Tùy chọn"; /* */ "Date" = "Ngày"; @@ -152,10 +152,10 @@ "Delete preset \"%@\"" = "Xóa cài đặt trước \"%@\""; /* Duration of target temp or temp basal */ -"Duration" = "Khoảng thời gian"; +"Duration" = "Duration"; /* */ -"Enact Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Enact Temp Target" = "Chấp nhận mục tiêu tạm thời"; /* */ "Target" = "Mục tiêu"; @@ -221,7 +221,7 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Hồ sơ liều nền (Basal)"; +"Basal profile" = "Hồ sơ liều nền"; /* */ "Carb ratio" = "Tỷ lệ Carb"; @@ -242,10 +242,10 @@ "Use Autotune" = "Sử dụng Autotune"; /* Add profile basal */ -"Add" = "Thêm vào"; +"Add" = "Thêm"; /* */ -"Basal Profile" = "Hồ sơ liều nền (Basal)"; +"Basal Profile" = "Hồ sơ liều nền"; /* Rate basal profile */ "Rate" = "Tỷ lệ"; @@ -345,7 +345,7 @@ Enact a temp Basal or a temp target */ "Edit settings json" = "Chỉnh sửa cấu hình json"; /* */ -"Glucose units" = "Đơn vị glucose"; +"Glucose units" = "Đơn vị Glucose"; /* */ "Preferences" = "Sở thích"; @@ -390,7 +390,7 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Các cấu hình đã được cập nhật"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị Glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; /* Import Error */ "Can't find the default Nightscout Profile." = "Không thể tìm thấy Profile Nightscout mặc định."; @@ -543,7 +543,7 @@ Enact a temp Basal or a temp target */ "Low target" = "Mục tiêu thấp"; /* When bolusing */ -"Bolusing" = "Đang tiến hành bolus"; +"Bolusing" = "Đang bolus"; /* */ "Pump suspended" = "Bơm đã tạm ngưng"; @@ -579,7 +579,7 @@ Enact a temp Basal or a temp target */ "Updating..." = "Đang cập nhật..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp targets"; +"Temp Targets" = "Mục tiêu tạm thời"; /* Delete carbs from data table and Nightscout */ "Delete Carbs?" = "Xóa Carbs?"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Configure Libre Transmitter" = "Cấu hình Libre Transmitter"; /* */ -"Calibrations" = "Hiệu chuẩn (Calib)"; +"Calibrations" = "Hiệu chuẩn"; /* */ "Create Events in Calendar" = "Tạo sự kiện trong Calendar"; @@ -630,7 +630,7 @@ Enact a temp Basal or a temp target */ "Bluetooth Transmitters" = "Bluetooth Transmitters"; /* */ -"Modes" = "Các cách thức"; +"Modes" = "Chế độ cảm biến"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; @@ -702,7 +702,7 @@ Enact a temp Basal or a temp target */ "Phone NFC required!" = "Bật NFC của điện thoại lên!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Điện thoại hoặc app của bạn không hỗ trợ NFC ghép nối với libre2"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Điện thoại hoặc ứng dụng của bạn không hỗ trợ NFC ghép nối với libre2"; /* Bluetooth Power Off */ "Bluetooth Power Off" = "Tắt bluetooth"; @@ -732,7 +732,7 @@ Enact a temp Basal or a temp target */ "HIGHALERT!" = "CẢNH BÁO CAO!"; /* (Snoozed)*/ -"(Snoozed)" = "(Snoozed)"; +"(Snoozed)" = "(Đã báo lại)"; /* Glucose: %@ */ "Glucose: %@" = "Đường huyết: %@"; @@ -756,10 +756,10 @@ Enact a temp Basal or a temp target */ "Invalid Glucose sample detected, try again later" = "Mẫu đường huyết không hợp lệ, thử lại sau"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor có khả năng tạm dừng, bong khỏi hoặc quá lạnh hoặc quá nóng"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Cảm biến có khả năng tạm dừng, bong khỏi hoặc quá lạnh hoặc quá nóng"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Sensor không hợp lệ"; +"Invalid Sensor Detected" = "Cảm biến không hợp lệ"; /* Detected sensor seems not to be a libre 1 sensor! */ "Detected sensor seems not to be a libre 1 sensor!" = "Cảm biến được phát hiện không phải là cảm biến libre 1!"; @@ -909,10 +909,10 @@ Enact a temp Basal or a temp target */ "Value" = "Giá trị"; /* */ -"Adds Phone Battery" = "Thêm Pin điện thoại"; +"Adds Phone Battery" = "Hãy sạc Pin điện thoại"; /* */ -"Adds Transmitter Battery" = "Thêm pin của Transmitter"; +"Adds Transmitter Battery" = "Hãy sạc pin của Transmitter"; /* */ "Also vibrate" = "Rung"; @@ -945,7 +945,7 @@ Enact a temp Basal or a temp target */ "Error" = "Lỗi"; /* */ -"Some ui element was incorrectly specified" = "Một vại yếu tố ui đã không được chỉ định"; +"Some ui element was incorrectly specified" = "Một vài yếu tố ui đã không được chỉ định"; /* */ "Success" = "Thành công"; @@ -954,13 +954,13 @@ Enact a temp Basal or a temp target */ "Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; /* */ -"High Glucose Alarm active" = "High Glucose Alarm đang hoạt động"; +"High Glucose Alarm active" = "Báo động Glucose đang Cao"; /* */ -"Low Glucose Alarm active" = "Low Glucose Alarm đang hoạt động"; +"Low Glucose Alarm active" = "Báo động Glucose đang Thấp"; /* */ -"No Glucose Alarm active" = "No Glucose Alarm đang hoạt động"; +"No Glucose Alarm active" = "Báo động Không có Glucose đang hoạt động"; /* */ "snoozing until %@" = "tạm yên cho đến khi %@"; @@ -1014,7 +1014,7 @@ Enact a temp Basal or a temp target */ "Debug options" = "Tùy chọn gỡ lỗi"; /* */ -"Adds a lot of data to the Issue Report " = "Thêm nhiều dữ liệu vào Issue Report "; +"Adds a lot of data to the Issue Report " = "Thêm nhiều dữ liệu vào Báo cáo vấn đề "; /* */ "Persist sensordata" = "Duy trì dữ liệu cảm biến"; @@ -1041,10 +1041,10 @@ Enact a temp Basal or a temp target */ "Last loop was more than %d min ago" = "Loop dừng hoạt động hơn %d phút trước"; /* Glucose badge */ -"Show glucose on the app badge" = "Thể hiện đường huyết lên trên app"; +"Show glucose on the app badge" = "Thể hiện đường huyết lên trên iAPS"; /* */ -"Backfill glucose" = "Backfill glucose"; +"Backfill glucose" = "Bổ sung glucose"; /* About this source */ "About this source" = "Thông tin nguồn này"; @@ -1065,7 +1065,7 @@ Enact a temp Basal or a temp target */ "Note" = "Lưu ý"; /* */ -"Temp Basal" = "Temp Basal"; +"Temp Basal" = "Liều cơ bản tạm thời"; /* */ "Temp Target" = "Mục tiêu tạm thời"; @@ -1173,7 +1173,7 @@ Enact a temp Basal or a temp target */ "Enacted" = "Đã kích hoạt"; /* Debug option view Announcements (from NS) */ -"Announcements" = "Announcements"; +"Announcements" = "Các thông báo"; /* Debug option view Enacted announcements announcements (from NS) */ "Enacted announcements" = "Thông báo đã kích hoạt"; @@ -1243,37 +1243,37 @@ Enact a temp Basal or a temp target */ "Conversion settings" = "Cài đặt chuyển đổi"; /* Delay */ -"Delay In Minutes" = "Tạm ngừng trong số phút"; +"Delay In Minutes" = "Độ trễ theo phút"; /* Duration */ -"Maximum Duration In Hours" = "Khoảng thời gian tối đa tính theo giờ"; +"Maximum Duration In Hours" = "Giới hạn thời gian tính theo giờ"; /* Interval */ -"Interval In Minutes" = "Khoảng thời gian tính bằng phút"; +"Interval In Minutes" = "Khoảng thời gian tính bằng phút"; /* Override */ -"Override With A Factor Of " = "Override With A Factor Of "; +"Override With A Factor Of " = "Hệ số "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và protein thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và chất đạm thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Chất béo và chất đạm"; +"Fat and Protein" = "Chất Béo & chất Đạm"; /* Display fat and protein entities */ -"Fat & Protein" = "Chất Béo & Đạm"; +"Fat & Protein" = "Chất Béo & Chất Đạm"; /* */ "Hide Fat & Protein" = "Ẩn chất Béo & Đạm"; /* Add Fat */ -"Fat" = "Chất béo"; +"Fat" = "Chất Béo"; /* Add Protein */ -"Protein" = "Protein"; +"Protein" = "Chất Đạm"; /* Service Section */ -"Fat And Protein Conversion" = "Chuyển đổi chất béo và đạm"; +"Fat And Protein Conversion" = "Chuyển đổi chất Béo và Đạm"; /* Service Section */ "Profile Override" = "Profile Override"; @@ -1290,22 +1290,22 @@ Enact a temp Basal or a temp target */ "Total Insulin Adjustment" = "Tổng số điều chỉnh Insulin"; /* */ -"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; +"Override your Basal, ISF, CR and Target profiles" = "Ghi đè profiles Basal, ISF, CR và Target của bạn"; /* */ "Enable indefinitely" = "Cấp phép không giới hạn"; /* */ -"Override Profile target" = "Override Profile target"; +"Override Profile target" = "Ghi đè Profile target"; /* */ "Disable SMBs" = "Vô hiệu hóa SMBs"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Hồ sơ Normal"; +"Normal Profile" = "Normal Profile"; /* Custom but unsaved Profile */ -"Custom Profile" = "Custom Profile"; +"Custom Profile" = "Tùy chỉnh Profile"; /* */ "Profiles" = "Profiles"; @@ -1475,7 +1475,7 @@ Enact a temp Basal or a temp target */ ". Changing: " = ". Đang thay đổi: "; /* Add insulin without bolusing alert */ -" without bolusing" = "Thêm và bỏ qua liều bolus"; +" without bolusing" = " không cần bolus"; /* ------------------------------------------------------------------------------------------- DASH strings @@ -1504,7 +1504,7 @@ Enact a temp Basal or a temp target */ "Save" = "Lưu"; /* Alert title for error when updating confidence reminder preference */ -"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; +"Failed to update confidence reminder preference." = "Không cập nhật được tùy chọn lời nhắc về độ tin cậy."; /* */ "No Error" = "Không có lỗi"; @@ -1531,10 +1531,10 @@ Enact a temp Basal or a temp target */ "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* */ -"Expiration Reminder" = "Expiration Reminder"; +"Expiration Reminder" = "Nhắc nhở Hết hạn"; /* */ "Low Reservoir" = "Sắp hết thuốc"; @@ -1598,10 +1598,10 @@ Enact a temp Basal or a temp target */ "Check Cannula" = "Kiểm tra Cannula"; /* */ -"Setup Complete" = "Thiết lập xong"; +"Setup Complete" = "Cấu hình hoàn thành"; /* */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Text for suspend resume button when insulin delivery is suspending */ "Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; @@ -1653,13 +1653,13 @@ Enact a temp Basal or a temp target */ "Change HbA1c Unit" = "Thay đổi đơn vị của HbA1c"; /* */ -"Display Chart X - Grid lines" = "Thể hiện biểu đồ dạng X-Grid"; +"Display Chart X - Grid lines" = "Hiển thị biểu đồ dạng X-Grid"; /* */ -"Display Chart Y - Grid lines" = "Thể hiện biểu đồ dạng Y-Grid"; +"Display Chart Y - Grid lines" = "Hiển thị biểu đồ dạng Y-Grid"; /* */ -"Display Chart Threshold lines for Low and High" = "Thể hiện các đường hiển thị Low và High"; +"Display Chart Threshold lines for Low and High" = "Hiển thị các đường hiển thị Low và High"; /* */ "Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; @@ -1728,10 +1728,10 @@ Enact a temp Basal or a temp target */ "Errors" = "Lỗi"; /* Average loop interval */ -"Interval" = "Khoảng"; +"Interval" = "Interval"; /* Median loop interval */ -"Duration" = "Khoảng thời gian"; +"Duration" = "Duration"; /* "Display SD */ "Display SD instead of CV" = "Display SD instead of CV"; @@ -1746,7 +1746,7 @@ Enact a temp Basal or a temp target */ "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Mặc định là 20 phút. Tần suất cập nhật và lưu stats.json cũng như tải mảng cuối cùng lên Nightscout khi được bật."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "24 Giờ Qua "; +"Past 24 Hours " = "24 giờ qua "; /* Duration displayed in statPanel */ "Past Week " = "Một tuần qua "; @@ -1808,13 +1808,13 @@ Enact a temp Basal or a temp target */ "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Fitness_mode. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ -"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; +"Low Temptarget Lowers Sensitivity" = "Mục tiêu tạm thời thấp sẽ làm giảm độ nhạy"; /* ”Low Temptarget Lowers Sensitivity" */ "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ -"Sensitivity Raises Target" = "Sensitivity Raises Target"; +"Sensitivity Raises Target" = "Độ nhạy tăng mục tiêu"; /* ”Sensitivity Raises Target" */ "When true, raises BG target when autosens detects sensitivity" = "Khi True, tăng mục tiêu BG khi cảm biến tự động phát hiện độ nhạy"; @@ -1826,7 +1826,7 @@ Enact a temp Basal or a temp target */ "Defaults to false. When true, will lower BG target when autosens detects resistance" = "Mặc định là False. Khi True, sẽ hạ mục tiêu BG khi cảm biến tự động phát hiện kháng cự"; /* Headline ”Advanced Target Adjustments" */ -"Advanced Target Adjustments" = "Advanced Target Adjustments"; +"Advanced Target Adjustments" = "Điều chỉnh mục tiêu nâng cao"; /* ”Advanced Target Adjustments" */ "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Tính năng này trước đây được bật theo mặc định nhưng bây giờ sẽ được mặc định là false (sẽ KHÔNG được bật tự động) trong oref0 0.6.0 trở lên. (Không cần điều này với 0.6.0). Tính năng này tự động giảm BG mục tiêu của oref0 khi BG hiện tại và BG cuối cùng ở mức cao. Điều này giúp ngăn chặn và giảm thiểu BG cao, nhưng tự động chuyển sang nhiệt độ thấp để đảm bảo BG đi xuống mục tiêu thực tế của bạn một cách suôn sẻ. Nếu bạn thấy hành vi này quá hung hăng, bạn có thể tắt tính năng này. Nếu bạn làm như vậy, vui lòng cho chúng tôi biết để chúng tôi có thể hiểu rõ hơn cài đặt nào phù hợp nhất với mọi người."; From 91bac92038c5e93c830b87e9c460d153fb3a4585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:07:38 +0100 Subject: [PATCH 327/405] Crowdin (#453) Vietnamese and Ukrainian and Swedish and various other new Crowdin generated strings. --- .../ar.lproj/Localizable.strings | 5 +- .../da.lproj/Localizable.strings | 5 +- .../de.lproj/Localizable.strings | 5 +- .../es.lproj/Localizable.strings | 5 +- .../fi.lproj/Localizable.strings | 5 +- .../fr.lproj/Localizable.strings | 5 +- .../he.lproj/Localizable.strings | 5 +- .../hu.lproj/Localizable.strings | 5 +- .../it.lproj/Localizable.strings | 5 +- .../nb.lproj/Localizable.strings | 5 +- .../nl.lproj/Localizable.strings | 5 +- .../pl.lproj/Localizable.strings | 5 +- .../pt-BR.lproj/Localizable.strings | 5 +- .../pt-PT.lproj/Localizable.strings | 5 +- .../ru.lproj/Localizable.strings | 5 +- .../sk.lproj/Localizable.strings | 5 +- .../sv.lproj/Localizable.strings | 5 +- .../tr.lproj/Localizable.strings | 5 +- .../uk.lproj/Localizable.strings | 5 +- .../vi.lproj/Localizable.strings | 13 +- .../zh-Hans.lproj/Localizable.strings | 5 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/nl.lproj/Localizable.strings | 40 +++--- .../Main/ru.lproj/Localizable.strings | 40 +++--- .../Main/vi.lproj/Localizable.strings | 116 +++++++++--------- 27 files changed, 170 insertions(+), 149 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index f3e25b45ef..8d41f1c19b 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 6102a76d53..bb109e08f5 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Forbered pumpested."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Tjek Pod, sæt på kroppen og bekræft derefter Pod er sat korrekt på."; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 9862b94e96..eaad1065cb 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Setzstelle vorbereiten."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Prüfen Sie den Pod, auf der Setzstelle anbringen, dann Prodanbringung bestätigen."; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 97b0403250..0d15cb6c8e 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 681a1e0169..9dd176defb 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 75afbac176..34b5263e1b 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Préparez le site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Retirez le bouchon d'aiguille bleu et vérifiez la cannule, puis retirez le support papier."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Retirez le bouchon d'aiguille bleu et vérifiez la cannule, puis retirez le support papier."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Vérifiez Pod, appliquez au site, puis confirmez l'attachement du pod."; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index f3e25b45ef..8d41f1c19b 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index 8cb982a2a1..414410c356 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 578e6f3b86..aed2900061 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepara il sito."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell’ago e controlla la cannula. Quindi rimuovi il supporto cartaceo."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell’ago e controlla la cannula. Quindi rimuovi il supporto cartaceo."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controlla il Pod, applica al sito e conferma che il pod è attaccato."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 4b9f32d606..01ebb9e192 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Gjør klart stedet hvor pod skal festes."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Fjern det blå beskyttelsesdekselet og kontroller kanylen. Fjern deretter papiret fra plasteret."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern det blå beskyttelsesdekselet og kontroller kanylen. Fjern deretter papiret fra plasteret."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontroller pod, fest på kroppen, og bekreft at den sitter korrekt."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 1449d7ec74..6fc71f3d51 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Bereid de infusieplaats voor."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controleer de Pod, breng aan op de infusieplaats en bevestig de plaatsing."; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index bebc91b195..a3c78b1ac4 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 15d56f1c91..fae147e03a 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index 8019116b43..c6dbe93021 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index afd3e16fe2..61c04d321d 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Подготовьте место."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Проверьте Под, установите его на теле, затем подтвердите установку Пода."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 36859c5e7f..7e78021cff 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Príprava miesta na telo."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Skontrolujte pod, aplikujte ho na telo, potom potvrďte prilepenie podu."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index fd17da881e..8c87f7d3f5 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Förbered hud."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Ta bort det blå kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Ta bort det blå kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontrollera din podd, sätt fast den och bekräfta sedan att den sitter bra."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 8a589c5980..49e4338631 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "İnfüzyon bölgesini hazırlayın."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Mavi Pod iğne kapağını çıkarın ve kanülü kontrol edin. Ardından kağıt koruma bandını çıkarın."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Mavi Pod iğne kapağını çıkarın ve kanülü kontrol edin. Ardından kağıt koruma bandını çıkarın."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Pod'u kontrol edin, infüzyon bölgesine uygulayın, ardından pod ekini onaylayın."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index d68827c20d..4c21c563a2 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Підготуйте місце."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Перевірте Pod, установіть його на тілі, а потім підтвердіть установку Pod."; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 7486629962..58bd0f55f2 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -234,7 +234,7 @@ "No Insulin" = "Hết thuốc"; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Status highlight when communications with the pod haven't happened recently. */ "Signal Loss" = "Mất tín hiệu"; @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Chuẩn bị vị trí."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; @@ -529,7 +530,7 @@ "Finish Setup" = "Hoàn thành cài đặt"; /* */ -"Setup Complete" = "Thiết lập xong"; +"Setup Complete" = "Cấu hình hoàn thành"; /* Value text for no expiration reminder */ "No Reminder" = "No Reminder"; @@ -640,7 +641,7 @@ "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* Text for previous pod information row */ "Previous Pod Information" = "Thông tin Pod trước đó"; @@ -703,7 +704,7 @@ "Next" = "Kế tiếp"; /* */ -"Expiration Reminder" = "Expiration Reminder"; +"Expiration Reminder" = "Nhắc nhở Hết hạn"; /* Description text on LowReservoirReminderSetupView */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index f349bab503..ccda671d38 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -459,8 +459,9 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "将注射部位做好准备"; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; +/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. +Label text for step two of attach pod instructions */ +"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "检查Pod,贴在注射部位上,确保pod已经贴牢"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 97e98360f9..6bf56b90fd 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -126,7 +126,7 @@ "Insulin delivery stopped. Change Pod now." = "Insulin ngừng. Thay Pod ngay."; /* Status highlight that insulin delivery was suspended. */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Error description for OmniBLEPumpManagerError.insulinTypeNotConfigured */ "Insulin type not configured" = "Loại insulin chưa được khai báo"; @@ -368,7 +368,7 @@ "Tank power activated" = "Pod được kích hoạt"; /* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ -"Temp Basal" = "Temp Basal"; +"Temp Basal" = "Liều cơ bản tạm thời"; /* Error message shown when temp basal could not be set due to existing temp basal in progress */ "Temp basal in progress" = "Liều basal tạm thời đang tiến hành"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 072d2830c2..67917dc46b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -547,7 +547,7 @@ "Remove Pump" = "Verwijder Pomp"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Verwijder de transparante naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label indicating pod replacement necessary The title of the command to replace pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 76c78eb3c0..c7b3aa70eb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -240,7 +240,7 @@ "Expiration Reminder" = "Nhắc nhở Hết hạn"; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* The title of the cell showing the pod expiration after expiry */ "Expired" = "Đã hết hạn"; @@ -261,7 +261,7 @@ "Failed to Suspend Insulin Delivery" = "Thất bại khi tạm dừng liều insulin"; /* Alert title for error when updating confidence reminder preference */ -"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; +"Failed to update confidence reminder preference." = "Không cập nhật được tùy chọn lời nhắc về độ tin cậy."; /* Alert title for error when updating expiration reminder */ "Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 13c5866f92..aad07472fd 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2058,10 +2058,10 @@ Gebruik dit niet samen met een hoge insuline fractie (> 2).\n\n Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op basis van je recente verhoudingen. Het zorgt ervoor dat de aanpassingen niet te groot zijn en werkt niet goed als je een hoge insuline fractie hebt."; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Dynamische gevoeligheid (ISF) activeren"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Dynamische koolhydraat verhouding activeren (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; @@ -2073,63 +2073,63 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Use Sigmoid Function" = "Gebruik Sigmoid functie"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formule"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Veiligheid"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Gebruikt een Sigmoid functie voor ISF (en voor CR, indien ingeschakeld), in plaats van de standaard logaritmische formule. Vereist een geactiveerde dynamische ISF instelling.\n\nDe instelling aanpassing past de helling van de curve aan (Y: Dynamische verhouding, X: Bloedglucose). Een lagere waarde ==> minder steil = minder agressief.\n\nDe autosens.min/max instellingen bepalen zowel de max/min grenzen voor de dynamische ratio als hoeveel de dynamische ratio wordt aangepast. Als AF de helling van de curve is, is autosens.min/max de hoogte van de grafiek, het Y-interval, waarbij Y: dynamische verhouding. De curve zal altijd een sigmoïde vorm hebben, ongeacht de autosens.min/max instellingen, wat betekent dat deze instellingen grote gevolgen hebben voor het resultaat van de berekende dynamische ISF. Wees voorzichtig met het instellen van een te hoge autosens.max waarde. Met een goede profiel-ISF instelling zal het waarschijnlijk nooit nodig zijn deze hoger in te stellen dan 1,5.\n\nEen Autosens max grens > 1,5 is niet aan te raden bij gebruik van de Sigmoid functie."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Grenswaarde instellingen"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Calculator instellingen"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Geef voorspellingen weer"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Kleinere iPhone schermen"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Vet- en proteïne weergeven en toestaan"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Maaltijdweergave instellingen toevoegen "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Toon tijdelijke doelen knop"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Beginscherm knoppaneel "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "In het geval dat je zowel profielen als tijdelijke doelen gebruikt"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Glucose waarde altijd in kleur (rood, groen, geel enz.) weergeven"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Instellingen voor kopteksten"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normaal gesproken wordt glucose alleen rood gekleurd als je de notificatiegrens hebt overschreden voor hoog/laag"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Live activiteit"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Toon live activiteit"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index ba4f5e80b6..e023b85790 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Использовать Dynamic CR. Dynamic ratio будет также влиять и на CR:\n\n Когда ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nКогда ratio <1: dynCR = CR/dynCR.\n\nНе используйте совместно с высоким Insulin Fraction (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Включить динамическую чувствительность (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Включить динамический углеводный коэффициент (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; @@ -2065,63 +2065,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Формула"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Безопасность"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Использовать сигмоидную функцию для ISF (и для CR, если включено), вместо логарифмической функции. Требует включенного в настройках режима Dynamic ISF\n\nКоэффициент регулировки AF регулирует наклон кривой (Y: Динамическое соотношение, X: Глюкоза крови). Ниже значения ==> меньше крутизна == меньше агрессивность.\n\nAutosens минимум и максимум определяют оба - максимальный и минимальный лимиты для динамического соотношения и как сильно динамическое соотношение будет изменять ISF/CR. Коэффициент регулировки AF - это высота кривой, Y - интервал, где Y - динамическое соотношение. Кривая всегда будет иметь сигмовидную форму, не важно какой autosens минимум/максимум указаны. Это означает, что эти настройки имеют большие последствия для результата вычисляемого динамического ISF. Пожалуйста, будьте осторожны с высокими значениями параметра алгоритма максимума для autosens. При правильной настройке профиля ISF, никогда не понадобится значение выше 1,5.\n\nAn Предел Autosens максимум > 1,5 не рекомендуется при использовании сигмовидной функции."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Настройка порога"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Настройки калькулятора"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Отображать прогнозы"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Небольшие экраны iPhone"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Отображать и разрешать запись жиров и белков"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Настройки отображения еды "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Отображать кнопку временных целей"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Панель кнопок главного экрана "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "В случае, если вы используете как профили, так и временные цели"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Цветовая индикация уровня глюкозы в крови (зеленый, желтый, красный)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Верхняя панель"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Обычно глюкоза окрашивается в красный цвет только в том случае, если значение превышено или выходит за пределы ваших лимитов уведомлений о высоком / низком уровне"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Эфир активности"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Отображать эфир активности"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 6d2962032f..01689efc7f 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -35,7 +35,7 @@ "Recommendation" = "LIỀU KHUYẾN NGHỊ"; /* Button */ -"Clear" = "Bỏ"; +"Clear" = "Hủy bỏ"; /* Button */ "Done" = "Hoàn thành"; @@ -65,7 +65,7 @@ "Edit Meal" = "Chỉnh sửa bữa ăn"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Thêm bữa ăn"; +"Add Meal" = "Khai báo bữa ăn"; /* Bolus View Bolus Summary Header */ "Bolus Summary" = "Tóm tắt liều bolus"; @@ -74,7 +74,7 @@ "Calculations" = "Các tính toán"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Bữa ăn nhiều béo"; +"Fatty Meal" = "Bữa ăn nhiều chất béo"; /* For the Bolus View pop-up */ "Full Bolus" = "Liều bolus đầy đủ"; @@ -83,7 +83,7 @@ "Fraction" = "Chia cho"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Chỉ số bữa ăn nhiều béo"; +"Fatty Meal Factor" = "Chỉ số bữa ăn nhiều chất béo"; /* For the Bolus View pop-up */ "Result" = "Kết quả"; @@ -140,7 +140,7 @@ "Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Custom temp target */ -"Custom" = "THÔNG LỆ"; +"Custom" = "Tùy chọn"; /* */ "Date" = "Ngày"; @@ -152,10 +152,10 @@ "Delete preset \"%@\"" = "Xóa cài đặt trước \"%@\""; /* Duration of target temp or temp basal */ -"Duration" = "Khoảng thời gian"; +"Duration" = "Duration"; /* */ -"Enact Temp Target" = "Bỏ qua mục tiêu tạm thời"; +"Enact Temp Target" = "Chấp nhận mục tiêu tạm thời"; /* */ "Target" = "Mục tiêu"; @@ -221,7 +221,7 @@ "Autotune" = "Autotune"; /* */ -"Basal profile" = "Hồ sơ liều nền (Basal)"; +"Basal profile" = "Hồ sơ liều nền"; /* */ "Carb ratio" = "Tỷ lệ Carb"; @@ -242,10 +242,10 @@ "Use Autotune" = "Sử dụng Autotune"; /* Add profile basal */ -"Add" = "Thêm vào"; +"Add" = "Thêm"; /* */ -"Basal Profile" = "Hồ sơ liều nền (Basal)"; +"Basal Profile" = "Hồ sơ liều nền"; /* Rate basal profile */ "Rate" = "Tỷ lệ"; @@ -345,7 +345,7 @@ Enact a temp Basal or a temp target */ "Edit settings json" = "Chỉnh sửa cấu hình json"; /* */ -"Glucose units" = "Đơn vị glucose"; +"Glucose units" = "Đơn vị Glucose"; /* */ "Preferences" = "Sở thích"; @@ -390,7 +390,7 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Các cấu hình đã được cập nhật"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị Glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; /* Import Error */ "Can't find the default Nightscout Profile." = "Không thể tìm thấy Profile Nightscout mặc định."; @@ -543,7 +543,7 @@ Enact a temp Basal or a temp target */ "Low target" = "Mục tiêu thấp"; /* When bolusing */ -"Bolusing" = "Đang tiến hành bolus"; +"Bolusing" = "Đang bolus"; /* */ "Pump suspended" = "Bơm đã tạm ngưng"; @@ -579,7 +579,7 @@ Enact a temp Basal or a temp target */ "Updating..." = "Đang cập nhật..."; /* Header for Temp targets in Watch app */ -"Temp Targets" = "Temp targets"; +"Temp Targets" = "Mục tiêu tạm thời"; /* Delete carbs from data table and Nightscout */ "Delete Carbs?" = "Xóa Carbs?"; @@ -603,7 +603,7 @@ Enact a temp Basal or a temp target */ "Configure Libre Transmitter" = "Cấu hình Libre Transmitter"; /* */ -"Calibrations" = "Hiệu chuẩn (Calib)"; +"Calibrations" = "Hiệu chuẩn"; /* */ "Create Events in Calendar" = "Tạo sự kiện trong Calendar"; @@ -630,7 +630,7 @@ Enact a temp Basal or a temp target */ "Bluetooth Transmitters" = "Bluetooth Transmitters"; /* */ -"Modes" = "Các cách thức"; +"Modes" = "Chế độ cảm biến"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; @@ -702,7 +702,7 @@ Enact a temp Basal or a temp target */ "Phone NFC required!" = "Bật NFC của điện thoại lên!"; /* */ -"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Điện thoại hoặc app của bạn không hỗ trợ NFC ghép nối với libre2"; +"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Điện thoại hoặc ứng dụng của bạn không hỗ trợ NFC ghép nối với libre2"; /* Bluetooth Power Off */ "Bluetooth Power Off" = "Tắt bluetooth"; @@ -732,7 +732,7 @@ Enact a temp Basal or a temp target */ "HIGHALERT!" = "CẢNH BÁO CAO!"; /* (Snoozed)*/ -"(Snoozed)" = "(Snoozed)"; +"(Snoozed)" = "(Đã báo lại)"; /* Glucose: %@ */ "Glucose: %@" = "Đường huyết: %@"; @@ -756,10 +756,10 @@ Enact a temp Basal or a temp target */ "Invalid Glucose sample detected, try again later" = "Mẫu đường huyết không hợp lệ, thử lại sau"; /* ensor might have temporarily stopped, fallen off or is too cold or too warm */ -"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Sensor có khả năng tạm dừng, bong khỏi hoặc quá lạnh hoặc quá nóng"; +"Sensor might have temporarily stopped, fallen off or is too cold or too warm" = "Cảm biến có khả năng tạm dừng, bong khỏi hoặc quá lạnh hoặc quá nóng"; /* Invalid Sensor Detected */ -"Invalid Sensor Detected" = "Sensor không hợp lệ"; +"Invalid Sensor Detected" = "Cảm biến không hợp lệ"; /* Detected sensor seems not to be a libre 1 sensor! */ "Detected sensor seems not to be a libre 1 sensor!" = "Cảm biến được phát hiện không phải là cảm biến libre 1!"; @@ -909,10 +909,10 @@ Enact a temp Basal or a temp target */ "Value" = "Giá trị"; /* */ -"Adds Phone Battery" = "Thêm Pin điện thoại"; +"Adds Phone Battery" = "Hãy sạc Pin điện thoại"; /* */ -"Adds Transmitter Battery" = "Thêm pin của Transmitter"; +"Adds Transmitter Battery" = "Hãy sạc pin của Transmitter"; /* */ "Also vibrate" = "Rung"; @@ -945,7 +945,7 @@ Enact a temp Basal or a temp target */ "Error" = "Lỗi"; /* */ -"Some ui element was incorrectly specified" = "Một vại yếu tố ui đã không được chỉ định"; +"Some ui element was incorrectly specified" = "Một vài yếu tố ui đã không được chỉ định"; /* */ "Success" = "Thành công"; @@ -954,13 +954,13 @@ Enact a temp Basal or a temp target */ "Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; /* */ -"High Glucose Alarm active" = "High Glucose Alarm đang hoạt động"; +"High Glucose Alarm active" = "Báo động Glucose đang Cao"; /* */ -"Low Glucose Alarm active" = "Low Glucose Alarm đang hoạt động"; +"Low Glucose Alarm active" = "Báo động Glucose đang Thấp"; /* */ -"No Glucose Alarm active" = "No Glucose Alarm đang hoạt động"; +"No Glucose Alarm active" = "Báo động Không có Glucose đang hoạt động"; /* */ "snoozing until %@" = "tạm yên cho đến khi %@"; @@ -1014,7 +1014,7 @@ Enact a temp Basal or a temp target */ "Debug options" = "Tùy chọn gỡ lỗi"; /* */ -"Adds a lot of data to the Issue Report " = "Thêm nhiều dữ liệu vào Issue Report "; +"Adds a lot of data to the Issue Report " = "Thêm nhiều dữ liệu vào Báo cáo vấn đề "; /* */ "Persist sensordata" = "Duy trì dữ liệu cảm biến"; @@ -1041,10 +1041,10 @@ Enact a temp Basal or a temp target */ "Last loop was more than %d min ago" = "Loop dừng hoạt động hơn %d phút trước"; /* Glucose badge */ -"Show glucose on the app badge" = "Thể hiện đường huyết lên trên app"; +"Show glucose on the app badge" = "Thể hiện đường huyết lên trên iAPS"; /* */ -"Backfill glucose" = "Backfill glucose"; +"Backfill glucose" = "Bổ sung glucose"; /* About this source */ "About this source" = "Thông tin nguồn này"; @@ -1065,7 +1065,7 @@ Enact a temp Basal or a temp target */ "Note" = "Lưu ý"; /* */ -"Temp Basal" = "Temp Basal"; +"Temp Basal" = "Liều cơ bản tạm thời"; /* */ "Temp Target" = "Mục tiêu tạm thời"; @@ -1173,7 +1173,7 @@ Enact a temp Basal or a temp target */ "Enacted" = "Đã kích hoạt"; /* Debug option view Announcements (from NS) */ -"Announcements" = "Announcements"; +"Announcements" = "Các thông báo"; /* Debug option view Enacted announcements announcements (from NS) */ "Enacted announcements" = "Thông báo đã kích hoạt"; @@ -1243,37 +1243,37 @@ Enact a temp Basal or a temp target */ "Conversion settings" = "Cài đặt chuyển đổi"; /* Delay */ -"Delay In Minutes" = "Tạm ngừng trong số phút"; +"Delay In Minutes" = "Độ trễ theo phút"; /* Duration */ -"Maximum Duration In Hours" = "Khoảng thời gian tối đa tính theo giờ"; +"Maximum Duration In Hours" = "Giới hạn thời gian tính theo giờ"; /* Interval */ -"Interval In Minutes" = "Khoảng thời gian tính bằng phút"; +"Interval In Minutes" = "Khoảng thời gian tính bằng phút"; /* Override */ -"Override With A Factor Of " = "Override With A Factor Of "; +"Override With A Factor Of " = "Hệ số "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và protein thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và chất đạm thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Chất béo và chất đạm"; +"Fat and Protein" = "Chất Béo & chất Đạm"; /* Display fat and protein entities */ -"Fat & Protein" = "Chất Béo & Đạm"; +"Fat & Protein" = "Chất Béo & Chất Đạm"; /* */ "Hide Fat & Protein" = "Ẩn chất Béo & Đạm"; /* Add Fat */ -"Fat" = "Chất béo"; +"Fat" = "Chất Béo"; /* Add Protein */ -"Protein" = "Protein"; +"Protein" = "Chất Đạm"; /* Service Section */ -"Fat And Protein Conversion" = "Chuyển đổi chất béo và đạm"; +"Fat And Protein Conversion" = "Chuyển đổi chất Béo và Đạm"; /* Service Section */ "Profile Override" = "Profile Override"; @@ -1290,13 +1290,13 @@ Enact a temp Basal or a temp target */ "Total Insulin Adjustment" = "Tổng số điều chỉnh Insulin"; /* */ -"Override your Basal, ISF, CR and Target profiles" = "Override your Basal, ISF, CR and Target profiles"; +"Override your Basal, ISF, CR and Target profiles" = "Ghi đè profiles Basal, ISF, CR và Target của bạn"; /* */ "Enable indefinitely" = "Cấp phép không giới hạn"; /* */ -"Override Profile target" = "Override Profile target"; +"Override Profile target" = "Ghi đè Profile target"; /* */ "Disable SMBs" = "Vô hiệu hóa SMBs"; @@ -1305,7 +1305,7 @@ Enact a temp Basal or a temp target */ "Normal Profile" = "Hồ sơ Normal"; /* Custom but unsaved Profile */ -"Custom Profile" = "Custom Profile"; +"Custom Profile" = "Tùy chỉnh Profile"; /* */ "Profiles" = "Profiles"; @@ -1475,7 +1475,7 @@ Enact a temp Basal or a temp target */ ". Changing: " = ". Đang thay đổi: "; /* Add insulin without bolusing alert */ -" without bolusing" = "Thêm và bỏ qua liều bolus"; +" without bolusing" = " không cần bolus"; /* ------------------------------------------------------------------------------------------- DASH strings @@ -1504,7 +1504,7 @@ Enact a temp Basal or a temp target */ "Save" = "Lưu"; /* Alert title for error when updating confidence reminder preference */ -"Failed to update confidence reminder preference." = "Failed to update confidence reminder preference."; +"Failed to update confidence reminder preference." = "Không cập nhật được tùy chọn lời nhắc về độ tin cậy."; /* */ "No Error" = "Không có lỗi"; @@ -1531,10 +1531,10 @@ Enact a temp Basal or a temp target */ "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Expiration Reminder Default"; +"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; /* */ -"Expiration Reminder" = "Expiration Reminder"; +"Expiration Reminder" = "Nhắc nhở Hết hạn"; /* */ "Low Reservoir" = "Sắp hết thuốc"; @@ -1598,10 +1598,10 @@ Enact a temp Basal or a temp target */ "Check Cannula" = "Kiểm tra Cannula"; /* */ -"Setup Complete" = "Thiết lập xong"; +"Setup Complete" = "Cấu hình hoàn thành"; /* */ -"Insulin Suspended" = "Liều insulin đã tạm dừng"; +"Insulin Suspended" = "Insulin Đã tạm ngưng"; /* Text for suspend resume button when insulin delivery is suspending */ "Suspending insulin delivery..." = "Đang tạm dừng liều insulin..."; @@ -1653,13 +1653,13 @@ Enact a temp Basal or a temp target */ "Change HbA1c Unit" = "Thay đổi đơn vị của HbA1c"; /* */ -"Display Chart X - Grid lines" = "Thể hiện biểu đồ dạng X-Grid"; +"Display Chart X - Grid lines" = "Hiển thị biểu đồ dạng X-Grid"; /* */ -"Display Chart Y - Grid lines" = "Thể hiện biểu đồ dạng Y-Grid"; +"Display Chart Y - Grid lines" = "Hiển thị biểu đồ dạng Y-Grid"; /* */ -"Display Chart Threshold lines for Low and High" = "Thể hiện các đường hiển thị Low và High"; +"Display Chart Threshold lines for Low and High" = "Hiển thị các đường hiển thị Low và High"; /* */ "Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; @@ -1731,7 +1731,7 @@ Enact a temp Basal or a temp target */ "Interval" = "Khoảng"; /* Median loop interval */ -"Duration" = "Khoảng thời gian"; +"Duration" = "Duration"; /* "Display SD */ "Display SD instead of CV" = "Display SD instead of CV"; @@ -1746,7 +1746,7 @@ Enact a temp Basal or a temp target */ "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Mặc định là 20 phút. Tần suất cập nhật và lưu stats.json cũng như tải mảng cuối cùng lên Nightscout khi được bật."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "24 Giờ Qua "; +"Past 24 Hours " = "24 giờ qua "; /* Duration displayed in statPanel */ "Past Week " = "Một tuần qua "; @@ -1808,13 +1808,13 @@ Enact a temp Basal or a temp target */ "Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Fitness_mode. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ -"Low Temptarget Lowers Sensitivity" = "Low Temptarget Lowers Sensitivity"; +"Low Temptarget Lowers Sensitivity" = "Mục tiêu tạm thời thấp sẽ làm giảm độ nhạy"; /* ”Low Temptarget Lowers Sensitivity" */ "Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ -"Sensitivity Raises Target" = "Sensitivity Raises Target"; +"Sensitivity Raises Target" = "Độ nhạy tăng mục tiêu"; /* ”Sensitivity Raises Target" */ "When true, raises BG target when autosens detects sensitivity" = "Khi True, tăng mục tiêu BG khi cảm biến tự động phát hiện độ nhạy"; @@ -1826,7 +1826,7 @@ Enact a temp Basal or a temp target */ "Defaults to false. When true, will lower BG target when autosens detects resistance" = "Mặc định là False. Khi True, sẽ hạ mục tiêu BG khi cảm biến tự động phát hiện kháng cự"; /* Headline ”Advanced Target Adjustments" */ -"Advanced Target Adjustments" = "Advanced Target Adjustments"; +"Advanced Target Adjustments" = "Điều chỉnh mục tiêu nâng cao"; /* ”Advanced Target Adjustments" */ "This feature was previously enabled by default but will now default to false (will NOT be enabled automatically) in oref0 0.6.0 and beyond. (There is no need for this with 0.6.0). This feature lowers oref0’s target BG automatically when current BG and eventualBG are high. This helps prevent and mitigate high BG, but automatically switches to low-temping to ensure that BG comes down smoothly toward your actual target. If you find this behavior too aggressive, you can disable this feature. If you do so, please let us know so we can better understand what settings work best for everyone." = "Tính năng này trước đây được bật theo mặc định nhưng bây giờ sẽ được mặc định là false (sẽ KHÔNG được bật tự động) trong oref0 0.6.0 trở lên. (Không cần điều này với 0.6.0). Tính năng này tự động giảm BG mục tiêu của oref0 khi BG hiện tại và BG cuối cùng ở mức cao. Điều này giúp ngăn chặn và giảm thiểu BG cao, nhưng tự động chuyển sang nhiệt độ thấp để đảm bảo BG đi xuống mục tiêu thực tế của bạn một cách suôn sẻ. Nếu bạn thấy hành vi này quá hung hăng, bạn có thể tắt tính năng này. Nếu bạn làm như vậy, vui lòng cho chúng tôi biết để chúng tôi có thể hiểu rõ hơn cài đặt nào phù hợp nhất với mọi người."; From 13195a3a95342bd126a34cce503e3f14d11075b1 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Thu, 4 Jan 2024 11:52:04 -0800 Subject: [PATCH 328/405] Fix Silence Pod toggle bug which inadvertently cleared configured alerts (#452) --- .../OmniBLE/PumpManager/PodCommsSession.swift | 13 +++++++++---- .../OmniKit/PumpManager/PodCommsSession.swift | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift index 58e2b5ca18..47e2889750 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift @@ -380,15 +380,20 @@ public class PodCommsSession { podState.finalizedDoses.append(UnfinalizedDose(resumeStartTime: currentDate, scheduledCertainty: .certain, insulinType: podState.insulinType)) } + // Configures the given pod alert(s) and registers the newly configured alert slot(s). + // When re-configuring all the pod alerts for a silence pod toggle, the optional acknowledgeAll can be + // specified to first acknowledge and clear all possible pending pod alerts and pod alert configurations. @discardableResult func configureAlerts(_ alerts: [PodAlert], acknowledgeAll: Bool = false, beepBlock: MessageBlock? = nil) throws -> StatusResponse { let configurations = alerts.map { $0.configuration } let configureAlerts = ConfigureAlertsCommand(nonce: podState.currentNonce, configurations: configurations) - var blocksToSend: [MessageBlock] = [configureAlerts] + let blocksToSend: [MessageBlock] if acknowledgeAll { - // requested to acknowledge any possible pending pod alerts out of an abundnace of caution - let acknowledgeAll = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) - blocksToSend += [acknowledgeAll] + // Do the acknowledgeAllAlerts command first to clear all previous pod alert configurations. + let acknowledgeAllAlerts = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) + blocksToSend = [acknowledgeAllAlerts, configureAlerts] + } else { + blocksToSend = [configureAlerts] } let status: StatusResponse = try send(blocksToSend, beepBlock: beepBlock) for alert in alerts { diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift index bc1b897c9b..2c3d930f72 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift @@ -386,15 +386,20 @@ public class PodCommsSession { podState.finalizedDoses.append(UnfinalizedDose(resumeStartTime: currentDate, scheduledCertainty: .certain, insulinType: podState.insulinType)) } + // Configures the given pod alert(s) and registers the newly configured alert slot(s). + // When re-configuring all the pod alerts for a silence pod toggle, the optional acknowledgeAll can be + // specified to first acknowledge and clear all possible pending pod alerts and pod alert configurations. @discardableResult func configureAlerts(_ alerts: [PodAlert], acknowledgeAll: Bool = false, beepBlock: MessageBlock? = nil) throws -> StatusResponse { let configurations = alerts.map { $0.configuration } let configureAlerts = ConfigureAlertsCommand(nonce: podState.currentNonce, configurations: configurations) - var blocksToSend: [MessageBlock] = [configureAlerts] + let blocksToSend: [MessageBlock] if acknowledgeAll { - // requested to acknowledge any possible pending pod alerts out of an abundnace of caution - let acknowledgeAll = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) - blocksToSend += [acknowledgeAll] + // Do the acknowledgeAllAlerts command first to clear all previous pod alert configurations. + let acknowledgeAllAlerts = AcknowledgeAlertCommand(nonce: podState.currentNonce, alerts: AlertSet(rawValue: ~0)) + blocksToSend = [acknowledgeAllAlerts, configureAlerts] + } else { + blocksToSend = [configureAlerts] } let status: StatusResponse = try send(blocksToSend, beepBlock: beepBlock) for alert in alerts { From 3684bec95f6b72e6214da65b982cf441b5c223de Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Sat, 6 Jan 2024 12:54:12 -0800 Subject: [PATCH 329/405] nonce display & OmniBLE/OmniKit PodCommsSession.swift consistency updates (#456) + Have SetInsulinScheduleCommand debugDescription display hex nonce values + Update OmniBLE programInitialBasalSchedule() to add missing dose append + Update OmniBLE recoverUnacknowledgedCommand() to use log.default() + Update OmniKit resumeBasal() to omit useless completionBeep parameter + Update OmniKit send() beepBlock commenting to match OmniBLE --- .../MessageBlocks/SetInsulinScheduleCommand.swift | 2 +- .../OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift | 5 +++-- .../MessageBlocks/SetInsulinScheduleCommand.swift | 2 +- .../OmniKit/OmniKit/PumpManager/PodCommsSession.swift | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift index dbe1575bae..2d4df5973d 100644 --- a/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift +++ b/Dependencies/OmniBLE/OmniBLE/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift @@ -209,6 +209,6 @@ public struct SetInsulinScheduleCommand : NonceResyncableMessageBlock { extension SetInsulinScheduleCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "SetInsulinScheduleCommand(nonce:\(nonce), \(deliverySchedule))" + return "SetInsulinScheduleCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), \(deliverySchedule))" } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift index 47e2889750..24392b65cf 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/PodCommsSession.swift @@ -369,6 +369,7 @@ public class PodCommsSession { podState.updateFromStatusResponse(status, at: currentDate) if status.podProgressStatus == .basalInitialized { podState.setupProgress = .initialBasalScheduleSet + podState.finalizedDoses.append(UnfinalizedDose(resumeStartTime: currentDate, scheduledCertainty: .certain, insulinType: podState.insulinType)) return } } @@ -880,10 +881,10 @@ public class PodCommsSession { self.log.default("Recovering from unacknowledged command %{public}@, status = %{public}@", String(describing: pendingCommand), String(describing: status)) if status.lastProgrammingMessageSeqNum == pendingCommand.sequence { - self.log.debug("Unacknowledged command was received by pump") + self.log.default("Unacknowledged command was received by pump") unacknowledgedCommandWasReceived(pendingCommand: pendingCommand, podStatus: status) } else { - self.log.debug("Unacknowledged command was not received by pump") + self.log.default("Unacknowledged command was not received by pump") } podState.unacknowledgedCommand = nil } diff --git a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift index dffc7e7cd7..9889e8439d 100644 --- a/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift +++ b/Dependencies/OmniKit/OmniKit/OmnipodCommon/MessageBlocks/SetInsulinScheduleCommand.swift @@ -208,6 +208,6 @@ public struct SetInsulinScheduleCommand : NonceResyncableMessageBlock { extension SetInsulinScheduleCommand: CustomDebugStringConvertible { public var debugDescription: String { - return "SetInsulinScheduleCommand(nonce:\(nonce), \(deliverySchedule))" + return "SetInsulinScheduleCommand(nonce:\(Data(bigEndian: nonce).hexadecimalString), \(deliverySchedule))" } } diff --git a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift index 2c3d930f72..cca005e176 100644 --- a/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift +++ b/Dependencies/OmniKit/OmniKit/PumpManager/PodCommsSession.swift @@ -238,7 +238,7 @@ public class PodCommsSession { /// /// - Parameters: /// - messageBlocks: The message blocks to send - /// - beepBlock: If specified, confirmation beep block message to append to the message blocks to send + /// - beepBlock: Optional confirmation beep block message to append to the message blocks to send /// - expectFollowOnMessage: If true, the pod will expect another message within 4 minutes, or will alarm with an 0x33 (51) fault. /// - Returns: The received message response /// - Throws: @@ -778,7 +778,7 @@ public class PodCommsSession { } } - public func resumeBasal(schedule: BasalSchedule, scheduleOffset: TimeInterval, acknowledgementBeep: Bool = false, completionBeep: Bool = false, programReminderInterval: TimeInterval = 0) throws -> StatusResponse { + public func resumeBasal(schedule: BasalSchedule, scheduleOffset: TimeInterval, acknowledgementBeep: Bool = false, programReminderInterval: TimeInterval = 0) throws -> StatusResponse { guard podState.unacknowledgedCommand == nil else { throw PodCommsError.unacknowledgedCommandPending From 048d149031384b04ac3d03d2a5f0c5a27c3d4f7c Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Sat, 6 Jan 2024 19:54:49 -0800 Subject: [PATCH 330/405] Add slider button for cannula insertion and pod deactivation from Loop (#458) --- .../OmniBLE/OmniBLE.xcodeproj/project.pbxproj | 17 ++++++ .../ViewModels/DeactivatePodViewModel.swift | 11 +++- .../ViewModels/InsertCannulaViewModel.swift | 13 +++- .../Views/DeactivatePodView.swift | 37 ++++++++--- .../Views/InsertCannulaView.swift | 60 ++++++++++++++---- .../OmniKit/OmniKit.xcodeproj/project.pbxproj | 27 ++++++++ .../ViewModels/DeactivatePodViewModel.swift | 11 +++- .../ViewModels/InsertCannulaViewModel.swift | 12 +++- .../OmniKitUI/Views/DeactivatePodView.swift | 37 ++++++++--- .../OmniKitUI/Views/InsertCannulaView.swift | 61 +++++++++++++++---- FreeAPS.xcodeproj/project.pbxproj | 17 ++++++ .../xcshareddata/swiftpm/Package.resolved | 9 +++ 12 files changed, 264 insertions(+), 48 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj index 9a83b2ea1d..354847f75e 100644 --- a/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj +++ b/Dependencies/OmniBLE/OmniBLE.xcodeproj/project.pbxproj @@ -181,6 +181,7 @@ D895BF5B275DE64000D51FC7 /* StringLengthPrefixEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D895BF5A275DE64000D51FC7 /* StringLengthPrefixEncoding.swift */; }; D897B06B29347ED500FDB009 /* BolusDeliveryTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D897B06A29347ED500FDB009 /* BolusDeliveryTable.swift */; }; D897B06D29347EE500FDB009 /* InsulinTableEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D897B06C29347EE500FDB009 /* InsulinTableEntry.swift */; }; + D8DA5CCE2B49EDE900C54E6C /* SlideButton in Frameworks */ = {isa = PBXBuildFile; productRef = D8DA5CCD2B49EDE900C54E6C /* SlideButton */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -451,6 +452,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D8DA5CCE2B49EDE900C54E6C /* SlideButton in Frameworks */, 847530F626ED65DD009FD801 /* LoopKit.framework in Frameworks */, 8475306E26ED15DE009FD801 /* CryptoSwift in Frameworks */, 847530F826ED65DD009FD801 /* LoopKitUI.framework in Frameworks */, @@ -913,6 +915,7 @@ name = OmniBLE; packageProductDependencies = ( 8475306D26ED15DE009FD801 /* CryptoSwift */, + D8DA5CCD2B49EDE900C54E6C /* SlideButton */, ); productName = OmniBLE; productReference = 84752E8226ED0FFE009FD801 /* OmniBLE.framework */; @@ -1016,6 +1019,7 @@ mainGroup = 84752E7826ED0FFE009FD801; packageReferences = ( 8475306C26ED15DE009FD801 /* XCRemoteSwiftPackageReference "CryptoSwift" */, + D8DA5CCC2B49EDE900C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */, ); productRefGroup = 84752E8326ED0FFE009FD801 /* Products */; projectDirPath = ""; @@ -1684,6 +1688,14 @@ minimumVersion = 1.4.1; }; }; + D8DA5CCC2B49EDE900C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/no-comment/SlideButton"; + requirement = { + branch = main; + kind = branch; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -1692,6 +1704,11 @@ package = 8475306C26ED15DE009FD801 /* XCRemoteSwiftPackageReference "CryptoSwift" */; productName = CryptoSwift; }; + D8DA5CCD2B49EDE900C54E6C /* SlideButton */ = { + isa = XCSwiftPackageProductDependency; + package = D8DA5CCC2B49EDE900C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */; + productName = SlideButton; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 84752E7926ED0FFE009FD801 /* Project object */; diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift index 76064cb3b1..80ef387795 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/DeactivatePodViewModel.swift @@ -41,7 +41,7 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { var actionButtonDescription: String { switch self { case .active: - return LocalizedString("Deactivate Pod", comment: "Action button description for deactivate while pod still active") + return LocalizedString("Slide to Deactivate Pod", comment: "Action button description for deactivate while pod still active") case .resultError: return LocalizedString("Retry", comment: "Action button description for deactivate after failed attempt") case .deactivating: @@ -101,6 +101,15 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { @Published var state: DeactivatePodViewModelState = .active + public var stateNeedsDeliberateUserAcceptance : Bool { + switch state { + case .active: + true + default: + false + } + } + var error: DeactivationError? { if case .resultError(let error) = self.state { return error diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/InsertCannulaViewModel.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/InsertCannulaViewModel.swift index 70b56e50b0..21648b1f4a 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/InsertCannulaViewModel.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/ViewModels/InsertCannulaViewModel.swift @@ -29,7 +29,7 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { var actionButtonAccessibilityLabel: String { switch self { case .ready, .startingInsertion: - return LocalizedString("Insert Cannula", comment: "Insert cannula action button accessibility label while ready to pair") + return LocalizedString("Slide Button to insert Cannula", comment: "Insert cannula slider button accessibility label while ready to pair") case .inserting: return LocalizedString("Inserting. Please wait.", comment: "Insert cannula action button accessibility label while pairing") case .checkingInsertion: @@ -53,7 +53,7 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { var nextActionButtonDescription: String { switch self { case .ready: - return LocalizedString("Insert Cannula", comment: "Cannula insertion button text while ready to insert") + return LocalizedString("Slide to Insert Cannula", comment: "Cannula insertion button text while ready to insert") case .error: return LocalizedString("Retry", comment: "Cannula insertion button text while showing error") case .inserting, .startingInsertion: @@ -124,6 +124,15 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { } @Published var state: InsertCannulaViewModelState = .ready + + public var stateNeedsDeliberateUserAcceptance : Bool { + switch state { + case .ready: + true + default: + false + } + } var didFinish: (() -> Void)? diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/DeactivatePodView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/DeactivatePodView.swift index 73fa312e69..755110811c 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/DeactivatePodView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/DeactivatePodView.swift @@ -8,6 +8,7 @@ import SwiftUI import LoopKitUI +import SlideButton struct DeactivatePodView: View { @@ -65,15 +66,8 @@ struct DeactivatePodView: View { } .disabled(viewModel.state.isProcessing) } - Button(action: { - viewModel.continueButtonTapped() - }) { - Text(viewModel.state.actionButtonDescription) - .accessibility(identifier: "button_next_action") - .accessibility(label: Text(viewModel.state.actionButtonAccessibilityLabel)) - .actionButtonStyle(viewModel.state.actionButtonStyle) - } - .disabled(viewModel.state.isProcessing) + actionButton + .disabled(viewModel.state.isProcessing) } .padding() } @@ -94,4 +88,29 @@ struct DeactivatePodView: View { secondaryButton: .default(FrameworkLocalText("Continue", comment: "Title of button to continue discard"), action: { viewModel.discardPod() }) ) } + + var actionText: some View { + Text(self.viewModel.state.actionButtonDescription) + .accessibility(identifier: "button_next_action") + .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) + .font(.headline) + } + + @ViewBuilder + var actionButton: some View { + if self.viewModel.stateNeedsDeliberateUserAcceptance { + SlideButton(styling: .init(indicatorSize: 60, indicatorColor: Color.red), action: { + self.viewModel.continueButtonTapped() + }) { + actionText + } + } else { + Button(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + .actionButtonStyle(.primary) + } + } + } } diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/InsertCannulaView.swift b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/InsertCannulaView.swift index bf625b0482..b3636434d1 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/InsertCannulaView.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManagerUI/Views/InsertCannulaView.swift @@ -8,6 +8,7 @@ import SwiftUI import LoopKitUI +import SlideButton struct InsertCannulaView: View { @@ -24,7 +25,7 @@ struct InsertCannulaView: View { HStack { InstructionList(instructions: [ - LocalizedString("Tap below to start cannula insertion.", comment: "Label text for step one of insert cannula instructions"), + LocalizedString("Slide the switch below to start cannula insertion.", comment: "Label text for step one of insert cannula instructions"), LocalizedString("Wait until insertion is completed.", comment: "Label text for step two of insert cannula instructions"), ]) .disabled(viewModel.state.instructionsDisabled) @@ -65,29 +66,45 @@ struct InsertCannulaView: View { } if (self.viewModel.error == nil || self.viewModel.error?.recoverable == true) { - Button(action: { - self.viewModel.continueButtonTapped() - }) { - Text(self.viewModel.state.nextActionButtonDescription) - .accessibility(identifier: "button_next_action") - .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) - .actionButtonStyle(.primary) - } + actionButton .disabled(self.viewModel.state.isProcessing) - .animation(nil) .zIndex(1) } } .transition(AnyTransition.opacity.combined(with: .move(edge: .bottom))) .padding() } - .animation(.default) .alert(isPresented: $cancelModalIsPresented) { cancelPairingModal } .navigationBarTitle(LocalizedString("Insert Cannula", comment: "navigation bar title for insert cannula"), displayMode: .automatic) .navigationBarBackButtonHidden(true) .navigationBarItems(trailing: cancelButton) } - + + var actionText : some View { + Text(self.viewModel.state.nextActionButtonDescription) + .accessibility(identifier: "button_next_action") + .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) + .font(.headline) + } + + @ViewBuilder + var actionButton: some View { + if self.viewModel.stateNeedsDeliberateUserAcceptance { + SlideButton(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + } + } else { + Button(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + .actionButtonStyle(.primary) + } + } + } + var cancelButton: some View { Button(LocalizedString("Cancel", comment: "Cancel button text in navigation bar on insert cannula screen")) { cancelModalIsPresented = true @@ -103,5 +120,24 @@ struct InsertCannulaView: View { secondaryButton: .default(FrameworkLocalText("No, Continue With Pod", comment: "Continue pairing button title of in pairing cancel modal")) ) } +} + +class MockCannulaInserter: CannulaInserter { + public func insertCannula(completion: @escaping (Result) -> Void) { + let mockDelay = TimeInterval(seconds: 3) + let result :Result = .success(mockDelay) + completion(result) + } + func checkCannulaInsertionFinished(completion: @escaping (OmniBLEPumpManagerError?) -> Void) { + completion(nil) + } +} + +struct InsertCannulaView_Previews: PreviewProvider { + static var mockInserter = MockCannulaInserter() + static var model = InsertCannulaViewModel(cannulaInserter: mockInserter) + static var previews: some View { + InsertCannulaView(viewModel: model) + } } diff --git a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj index 50e1310c3e..b42daf833f 100644 --- a/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj +++ b/Dependencies/OmniKit/OmniKit.xcodeproj/project.pbxproj @@ -166,6 +166,7 @@ D845A1522AF8A51000EA0853 /* SilencePodSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D845A1512AF8A51000EA0853 /* SilencePodSelectionView.swift */; }; D85AEAC82B1403C000081044 /* PodDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEAC72B1403C000081044 /* PodDiagnostics.swift */; }; D85AEACA2B1403CB00081044 /* ReadPodInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85AEAC92B1403CB00081044 /* ReadPodInfoView.swift */; }; + D8DA5CCB2B49EDD400C54E6C /* SlideButton in Frameworks */ = {isa = PBXBuildFile; productRef = D8DA5CCA2B49EDD400C54E6C /* SlideButton */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -446,6 +447,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D8DA5CCB2B49EDD400C54E6C /* SlideButton in Frameworks */, CEF2639B29D88516009921F1 /* OmniKit.framework in Frameworks */, CEC751E329D88392006E9D24 /* LoopKitUI.framework in Frameworks */, ); @@ -891,6 +893,9 @@ dependencies = ( ); name = OmniKitUI; + packageProductDependencies = ( + D8DA5CCA2B49EDD400C54E6C /* SlideButton */, + ); productName = OmniKitUI; productReference = C124020B29C7D92700B32844 /* OmniKitUI.framework */; productType = "com.apple.product-type.framework"; @@ -996,6 +1001,9 @@ hu, ); mainGroup = C124016229C7D87A00B32844; + packageReferences = ( + D8DA5CC92B49EDD400C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */, + ); productRefGroup = C124016D29C7D87A00B32844 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1727,6 +1735,25 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + D8DA5CC92B49EDD400C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/no-comment/SlideButton"; + requirement = { + branch = main; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + D8DA5CCA2B49EDD400C54E6C /* SlideButton */ = { + isa = XCSwiftPackageProductDependency; + package = D8DA5CC92B49EDD400C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */; + productName = SlideButton; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = C124016329C7D87A00B32844 /* Project object */; } diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift index 8f42c46261..1e8c9375a4 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/DeactivatePodViewModel.swift @@ -42,7 +42,7 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { var actionButtonDescription: String { switch self { case .active: - return LocalizedString("Deactivate Pod", comment: "Action button description for deactivate while pod still active") + return LocalizedString("Slide to Deactivate Pod", comment: "Action button description for deactivate while pod still active") case .resultError: return LocalizedString("Retry", comment: "Action button description for deactivate after failed attempt") case .deactivating: @@ -102,6 +102,15 @@ class DeactivatePodViewModel: ObservableObject, Identifiable { @Published var state: DeactivatePodViewModelState = .active + public var stateNeedsDeliberateUserAcceptance : Bool { + switch state { + case .active: + true + default: + false + } + } + var error: DeactivationError? { if case .resultError(let error) = self.state { return error diff --git a/Dependencies/OmniKit/OmniKitUI/ViewModels/InsertCannulaViewModel.swift b/Dependencies/OmniKit/OmniKitUI/ViewModels/InsertCannulaViewModel.swift index c35617f509..029ef7d2bd 100644 --- a/Dependencies/OmniKit/OmniKitUI/ViewModels/InsertCannulaViewModel.swift +++ b/Dependencies/OmniKit/OmniKitUI/ViewModels/InsertCannulaViewModel.swift @@ -30,7 +30,7 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { var actionButtonAccessibilityLabel: String { switch self { case .ready, .startingInsertion: - return LocalizedString("Insert Cannula", comment: "Insert cannula action button accessibility label while ready to pair") + return LocalizedString("Slide Button to insert Cannula", comment: "Insert cannula slider button accessibility label while ready to pair") case .inserting: return LocalizedString("Inserting. Please wait.", comment: "Insert cannula action button accessibility label while pairing") case .checkingInsertion: @@ -54,7 +54,7 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { var nextActionButtonDescription: String { switch self { case .ready: - return LocalizedString("Insert Cannula", comment: "Cannula insertion button text while ready to insert") + return LocalizedString("Slide to Insert Cannula", comment: "Cannula insertion button text while ready to insert") case .error: return LocalizedString("Retry", comment: "Cannula insertion button text while showing error") case .inserting, .startingInsertion: @@ -125,6 +125,14 @@ class InsertCannulaViewModel: ObservableObject, Identifiable { } @Published var state: InsertCannulaViewModelState = .ready + public var stateNeedsDeliberateUserAcceptance : Bool { + switch state { + case .ready: + true + default: + false + } + } var didFinish: (() -> Void)? diff --git a/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift b/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift index 3d24d0c739..b11f981b7d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/DeactivatePodView.swift @@ -8,6 +8,7 @@ import SwiftUI import LoopKitUI +import SlideButton struct DeactivatePodView: View { @@ -65,15 +66,8 @@ struct DeactivatePodView: View { } .disabled(viewModel.state.isProcessing) } - Button(action: { - viewModel.continueButtonTapped() - }) { - Text(viewModel.state.actionButtonDescription) - .accessibility(identifier: "button_next_action") - .accessibility(label: Text(viewModel.state.actionButtonAccessibilityLabel)) - .actionButtonStyle(viewModel.state.actionButtonStyle) - } - .disabled(viewModel.state.isProcessing) + actionButton + .disabled(viewModel.state.isProcessing) } .padding() } @@ -94,4 +88,29 @@ struct DeactivatePodView: View { secondaryButton: .default(FrameworkLocalText("Continue", comment: "Title of button to continue discard"), action: { viewModel.discardPod() }) ) } + + var actionText: some View { + Text(self.viewModel.state.actionButtonDescription) + .accessibility(identifier: "button_next_action") + .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) + .font(.headline) + } + + @ViewBuilder + var actionButton: some View { + if self.viewModel.stateNeedsDeliberateUserAcceptance { + SlideButton(styling: .init(indicatorSize: 60, indicatorColor: Color.red), action: { + self.viewModel.continueButtonTapped() + }) { + actionText + } + } else { + Button(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + .actionButtonStyle(.primary) + } + } + } } diff --git a/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift b/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift index 06520b4be2..37a6e740e6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift +++ b/Dependencies/OmniKit/OmniKitUI/Views/InsertCannulaView.swift @@ -8,6 +8,8 @@ import SwiftUI import LoopKitUI +import SlideButton +import OmniKit struct InsertCannulaView: View { @@ -24,7 +26,7 @@ struct InsertCannulaView: View { HStack { InstructionList(instructions: [ - LocalizedString("Tap below to start cannula insertion.", comment: "Label text for step one of insert cannula instructions"), + LocalizedString("Slide the switch below to start cannula insertion.", comment: "Label text for step one of insert cannula instructions"), LocalizedString("Wait until insertion is completed.", comment: "Label text for step two of insert cannula instructions"), ]) .disabled(viewModel.state.instructionsDisabled) @@ -65,29 +67,45 @@ struct InsertCannulaView: View { } if (self.viewModel.error == nil || self.viewModel.error?.recoverable == true) { - Button(action: { - self.viewModel.continueButtonTapped() - }) { - Text(self.viewModel.state.nextActionButtonDescription) - .accessibility(identifier: "button_next_action") - .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) - .actionButtonStyle(.primary) - } + actionButton .disabled(self.viewModel.state.isProcessing) - .animation(nil) .zIndex(1) } } .transition(AnyTransition.opacity.combined(with: .move(edge: .bottom))) .padding() } - .animation(.default) .alert(isPresented: $cancelModalIsPresented) { cancelPairingModal } .navigationBarTitle(LocalizedString("Insert Cannula", comment: "navigation bar title for insert cannula"), displayMode: .automatic) .navigationBarBackButtonHidden(true) .navigationBarItems(trailing: cancelButton) } - + + var actionText : some View { + Text(self.viewModel.state.nextActionButtonDescription) + .accessibility(identifier: "button_next_action") + .accessibility(label: Text(self.viewModel.state.actionButtonAccessibilityLabel)) + .font(.headline) + } + + @ViewBuilder + var actionButton: some View { + if self.viewModel.stateNeedsDeliberateUserAcceptance { + SlideButton(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + } + } else { + Button(action: { + self.viewModel.continueButtonTapped() + }) { + actionText + .actionButtonStyle(.primary) + } + } + } + var cancelButton: some View { Button(LocalizedString("Cancel", comment: "Cancel button text in navigation bar on insert cannula screen")) { cancelModalIsPresented = true @@ -103,5 +121,24 @@ struct InsertCannulaView: View { secondaryButton: .default(FrameworkLocalText("No, Continue With Pod", comment: "Continue pairing button title of in pairing cancel modal")) ) } +} + +class MockCannulaInserter: CannulaInserter { + public func insertCannula(completion: @escaping (Result) -> Void) { + let mockDelay = TimeInterval(seconds: 3) + let result :Result = .success(mockDelay) + completion(result) + } + func checkCannulaInsertionFinished(completion: @escaping (OmnipodPumpManagerError?) -> Void) { + completion(nil) + } +} + +struct InsertCannulaView_Previews: PreviewProvider { + static var mockInserter = MockCannulaInserter() + static var model = InsertCannulaViewModel(cannulaInserter: mockInserter) + static var previews: some View { + InsertCannulaView(viewModel: model) + } } diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 893be6e7ed..346f38cb0d 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -391,6 +391,7 @@ D6D02515BBFBE64FEBE89856 /* DataTableRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 881E04BA5E0A003DE8E0A9C6 /* DataTableRootView.swift */; }; D6DEC113821A7F1056C4AA1E /* NightscoutConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2A13DF0EDEEEDC4106AA2A /* NightscoutConfigDataFlow.swift */; }; D76333C9256787610B3B4875 /* AutotuneConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D295A3F870E826BE371C0BB5 /* AutotuneConfigStateModel.swift */; }; + D8DA5CD12B49EEF000C54E6C /* SlideButton in Frameworks */ = {isa = PBXBuildFile; productRef = D8DA5CD02B49EEF000C54E6C /* SlideButton */; }; DBA5254DBB2586C98F61220C /* ISFEditorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F9F137F126D9F8DEB799F26 /* ISFEditorProvider.swift */; }; DD399FB31EACB9343C944C4C /* PreferencesEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA3E609094E064C99A4752C /* PreferencesEditorStateModel.swift */; }; E00EEC0327368630002FF094 /* ServiceAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00EEBFD27368630002FF094 /* ServiceAssembly.swift */; }; @@ -983,6 +984,7 @@ buildActionMask = 2147483647; files = ( CEC751D829D88262006E9D24 /* MinimedKitUI.framework in Frameworks */, + D8DA5CD12B49EEF000C54E6C /* SlideButton in Frameworks */, CEC751D629D88262006E9D24 /* MinimedKit.framework in Frameworks */, CEC751D429D88257006E9D24 /* OmniKitUI.framework in Frameworks */, CEC751D229D88257006E9D24 /* OmniKit.framework in Frameworks */, @@ -2459,6 +2461,7 @@ 3818AA46274C255A00843DB3 /* LibreTransmitter */, 38DF1788276FC8C400B3528F /* SwiftMessages */, CEB434FC28B90B7C00B70274 /* SwiftCharts */, + D8DA5CD02B49EEF000C54E6C /* SlideButton */, ); productName = FreeAPS; productReference = 388E595825AD948C0019842D /* FreeAPS.app */; @@ -2596,6 +2599,7 @@ 3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */, 38DF1787276FC8C300B3528F /* XCRemoteSwiftPackageReference "SwiftMessages" */, CEB434FB28B90B7C00B70274 /* XCRemoteSwiftPackageReference "SwiftCharts" */, + D8DA5CCF2B49EEF000C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */, ); productRefGroup = 388E595925AD948C0019842D /* Products */; projectDirPath = ""; @@ -3732,6 +3736,14 @@ kind = branch; }; }; + D8DA5CCF2B49EEF000C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/no-comment/SlideButton"; + requirement = { + branch = main; + kind = branch; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -3769,6 +3781,11 @@ package = CEB434FB28B90B7C00B70274 /* XCRemoteSwiftPackageReference "SwiftCharts" */; productName = SwiftCharts; }; + D8DA5CD02B49EEF000C54E6C /* SlideButton */ = { + isa = XCSwiftPackageProductDependency; + package = D8DA5CCF2B49EEF000C54E6C /* XCRemoteSwiftPackageReference "SlideButton" */; + productName = SlideButton; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ diff --git a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2cfe78ebfa..37e3510a58 100644 --- a/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -10,6 +10,15 @@ "version": "1.6.0" } }, + { + "package": "SlideButton", + "repositoryURL": "https://github.com/no-comment/SlideButton", + "state": { + "branch": "main", + "revision": "5eacebba4d7deeb693592bc9a62ab2d2181e133b", + "version": null + } + }, { "package": "swift-algorithms", "repositoryURL": "https://github.com/apple/swift-algorithms", From 3c19ef1613c484b9083dabd3edfef16ae3b684fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 7 Jan 2024 05:26:30 +0100 Subject: [PATCH 331/405] Crowdin updates (#455) Vietnamese and German --- .../Resources/vi.lproj/Localizable.strings | 16 +- .../Main/de.lproj/Localizable.strings | 40 ++-- .../Main/vi.lproj/Localizable.strings | 210 +++++++++--------- 3 files changed, 133 insertions(+), 133 deletions(-) diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index c7b3aa70eb..0473a8a4e8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -240,7 +240,7 @@ "Expiration Reminder" = "Nhắc nhở Hết hạn"; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; +"Expiration Reminder Default" = "Mặc định nhắc nhở hết hạn"; /* The title of the cell showing the pod expiration after expiry */ "Expired" = "Đã hết hạn"; @@ -400,7 +400,7 @@ "No Pod" = "Không pod"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Không có lời nhắc"; /* Continue pairing button title of in pairing cancel modal */ "No, Continue With Pod" = "Không, tiếp tục"; @@ -449,7 +449,7 @@ "Percent = %lf" = "Phần trăm = %lf"; /* The title of the cell showing the pod pi version */ -"PI Version" = "Đời PI"; +"PI Version" = "Phiên bản PI"; /* The title of the command to play test beeps */ "Play Test Beeps" = "Kiểm tra tiếng Beep"; @@ -458,7 +458,7 @@ "Play Test Beeps…" = "Kiểm tra tiếng Beep…"; /* Alert message body for confirm pod attachment */ -"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Confirm” khi Pod đã gắn chặt."; +"Please confirm that the Pod is securely attached to your body.\n\nThe cannula can be inserted only once with each Pod. Tap “Confirm” when Pod is attached." = "Xác nhận rằng Pod được gắn chặt vào cơ thể bạn.\n\nCannula chỉ có thể lắp một lần. Nhấn vào “Xác nhận” khi Pod đã gắn chặt."; /* Instructions for deactivate pod when pod not on body */ "Please deactivate the pod. When deactivation is complete, you may pair a new pod." = "Hủy kích hoạt pod. Khi việc hủy kích hoạt hoàn tất, bạn có thể ghép nối pod mới."; @@ -474,7 +474,7 @@ "Pod Activated" = "Pod đã kích hoạt"; /* Label describing pod age view */ -"Pod Age" = "Pod Age"; +"Pod Age" = "Tuổi Pod"; /* Deactivate pod action button accessibility label when deactivation complete */ "Pod deactivated successfully. Continue." = "Pod hủy kích hoạt thành công. Tiếp tục."; @@ -597,7 +597,7 @@ Scheduled reminder card title on NotificationSettingsView Title for scheduled expiration reminder edit page Title of SetupCompleteView */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Lịch biểu lời nhắc"; /* Title text for insulin type confirmation page */ "Select the type of insulin that you will be using in this pod." = "Chọn loại insulin bạn sẽ sử dụng cho pod."; @@ -618,7 +618,7 @@ "Signal Loss" = "Mất tín hiệu"; /* No comment provided by engineer. */ -"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; +"Skip Omnipod Onboarding?" = "Bỏ qua quá trình giới thiệu Omnipod?"; /* The title of the status section in settings */ "Status" = "Tình trạng"; @@ -711,7 +711,7 @@ "Time Change Detected" = "Thay đổi thời gian được phát hiện"; /* No comment provided by engineer. */ -"Toggle sign" = "Toggle sign"; +"Toggle sign" = "Chuyển đổi tín hiệu"; /* The error message shown when Loop's basal schedule has more entries than the pod can support */ "Too many entries" = "Quá nhiều mục"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 20c296dd03..344d448c0c 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Nutze Dynamic CR. Das dynamische Verhältnis wird für CR wie folgt verwendet:\n\n Bei Verhältnis > 1: dynCR = (newRatio - 1) / 2 + 1.\nWenn Verhältnis < 1: dynCR = CR/dynCR.\n\nNicht verwenden mit hohem Insulinanteil (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Dynamische Sensibilität (ISF) aktivieren"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Dynamisches Carb Ratio (CR) aktivieren"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; @@ -2065,63 +2065,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formel"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sicherheit"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Verwenden Sie eine sigmoid Funktion für ISF (und für CR, wenn aktiviert), anstelle der Standard-logarithmischen Formel. Erfordert die Aktivierung der dynamischen ISF-Einstellung in den Einstellungen\n\nDie Veränderungsanpassung passt die Neigung der Kurve an (Y: Dynamisches Verhältnis, X: Blutzucker). Ein niedrigerer Wert ==> weniger steil == weniger aggressiv.\n\nDie autosens.min/max Einstellungen bestimmen sowohl die max/min Grenzen für das dynamische Verhältnis UND wie sehr das dynamische Verhältnis angepasst wird. Wenn AF ist der Hang der Kurve, die Autosen. in/max ist die Höhe des Diagramms, das Y-Intervall, wo Y: dynamisches Verhältnis. Die Kurve hat immer eine S-Form, egal welche autosense.min/max Einstellungen verwendet werden, was bedeutet, dass diese Einstellungen große Folgen für das Ergebnis des berechneten dynamischen ISF haben. Bitte sei vorsichtig, einen zu hohen autosens.max Wert zu setzen. Mit einer korrekten Profil-ISF-Einstellung werden Sie wahrscheinlich nie mehr als 1 benötigen.\n\nEin Autosens.max Limit > 1.5 ist nicht ratsam, wenn Sie die sigmoid Funktion benutzen."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Grenzwert-Einstellungen"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Der Standardschwellenwert in FAX hängt von Ihrem aktuellen Minimum für BG ab, wie folgt:\n\nWenn Ihr Minimum BG Ziel = 90 mg/dl -> Schwellenwert = 65 mg/dl,\n\nwenn Minimum BG Ziel = 100 mg/dl -> Schwellenwert = 70 mg/dl,\n\nMinimum BG Ziel = 110 mg/dl -> Schwellenwert = 75 mg/dl,\n\nund wenn Minimum BG Ziel = 130 mg/dl -> Schwellenwert = 85 mg/dl.\n\nMit dieser Einstellung können Sie die Standardeinstellung auf einen höheren Schwellenwert für die Schleife mit dynISF ändern. Gültige Werte sind 65 mg/dl<= Grenzwert <= 120 mg/dl."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Berechnungseinstellungen"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Prognosen anzeigen"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Kleinere iPhone Bildschirme"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Fett- und Proteineinträge anzeigen und erlauben"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Mahlzeitansicht Einstellungen hinzufügen "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Temp Zielknopf anzeigen"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Home-Schaltflächenleiste "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Falls Sie sowohl Profile als auch temporäre Ziele verwenden"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Farbe Glukosewert immer (grün, gelb etc.)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Header-Einstellungen"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalerweise ist die Glukose nur rot wenn sie über oder unter Ihren Benachrichtigungsgrenzen für hoch/niedrig ist"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Horizontale Scroll-Ansicht sichtbare Stunden"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Live-Aktivitäten"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Live Aktivitäten anzeigen"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 01689efc7f..294ee54340 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -11,7 +11,7 @@ "Bolus" = "Liều bolus"; -"Close" = "Đóng lại"; +"Close" = "Đóng"; /* Continue after added carbs without bolus */ "Continue without bolus" = "Tiếp tục và bỏ qua liều bolus"; @@ -128,7 +128,7 @@ "Saved Food" = "Lưu thực phẩm"; /* */ -"Are you sure?" = "Bạn có chắc?"; +"Are you sure?" = "Bạn có chắc không?"; /* Bottom target temp */ "Bottom target" = "Mục tiêu dưới cùng"; @@ -149,7 +149,7 @@ "Delete" = "Xóa"; /* Delete preset temp target */ -"Delete preset \"%@\"" = "Xóa cài đặt trước \"%@\""; +"Delete preset \"%@\"" = "Xóa mẫu cài đặt \"%@\""; /* Duration of target temp or temp basal */ "Duration" = "Duration"; @@ -170,7 +170,7 @@ " Your setting: " = " Cài đặt của bạn: "; /* */ -"mg/dl. Autosens.max limits the max endpoint" = "autosens.max Giới hạn điểm cuối tối đa mg/dl"; +"mg/dl. Autosens.max limits the max endpoint" = "autosens.max Giới hạn điểm hiện tại tối đa mg/dl"; /* */ "Enter preset name" = "Nhập tên"; @@ -182,19 +182,19 @@ "minutes" = "phút"; /* */ -"Presets" = "Mẫu thiết lặp"; +"Presets" = "Mẫu cài đặt sẵn"; /* Save preset name */ "Save" = "Lưu"; /* */ -"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; +"Save as Preset" = "Lưu cài đặt sẵn"; /* Delete Meal Preset */ -"Delete Preset" = "Xoá mẫu thiết lập"; +"Delete Preset" = "Xoá mẫu cài đặt"; /* Confirm Deletion */ -"Delete preset '%@'?" = "Bạn có muốn xóa thiết lập sẵn '%@' không?"; +"Delete preset '%@'?" = "Bạn có muốn xóa mẫu cài đặt sẵn '%@' không?"; /* Button */ "No" = "Không"; @@ -296,14 +296,14 @@ "Amount" = "Số lượng"; /* */ -"Cancel Temp Basal" = "Huỷ bỏ Temp Basal"; +"Cancel Temp Basal" = "Huỷ bỏ liều cơ bản tạm thời"; /* Enact Enact a temp Basal or a temp target */ "Enact" = "Chấp nhận"; /* */ -"Manual Temp Basal" = "Liều Basal thủ công"; +"Manual Temp Basal" = "Liều cơ bản thủ công"; /* Allow uploads to different services */ "Allow uploads" = "Cho phép tải lên"; @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Sử dụng nguồn glucose nội tại"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Điều này cho phép tải lên các dữ liệu.json lên Nightscout mà có thể được sử dụng bởi Dự án Community Statictics và Demographics. \n\\Tham gia vào Community Statistics là tùy chọn và yêu cầu đăng ký riêng tại:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Điều này cho phép tải số liệu thống kê lên Nightscout mà có thể được sử dụng bởi Dự án Community Statictics và Demographics. \n\nTham gia vào Thống kê Cộng đồng là tùy chọn và yêu cầu đăng ký riêng tại:\n"; /* */ "Edit settings json" = "Chỉnh sửa cấu hình json"; @@ -348,7 +348,7 @@ Enact a temp Basal or a temp target */ "Glucose units" = "Đơn vị Glucose"; /* */ -"Preferences" = "Sở thích"; +"Preferences" = "Tùy chỉnh"; /* Recommended Insulin Fraction in preferences */ "Recommended Insulin Fraction" = "Insulin được đề xuất"; @@ -360,7 +360,7 @@ Enact a temp Basal or a temp target */ "Remote control" = "Điều khiển từ xa"; /* Imported Profiles Alert */ -"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\n Bây giờ xin hãy xác minh lại tất cả các cài đặt của bạn kỹ lưỡng:\n\n* Cài đặt liều nền\n * Carb Ratios\n * Các mục tiêu đường huyết \n * Độ nhạy của Insulin\n * DIA\n\n trong iAPS Settings > Configuration.\n\n Cấu hình không hợp lệ hoặc tồi có thể có tác động thảm họa."; +"\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\n Bây giờ xin hãy xác minh lại tất cả các cài đặt của bạn kỹ lưỡng:\n\n* Cài đặt liều nền\n * Tỷ lệ Carb\n * Mục tiêu đường huyết \n * Độ nhạy của Insulin\n * Thời gian hoạt động của insulin\n\n trong iAPS Cài đặt > Cấu hình.\n\n Cấu hình không hợp lệ hoặc tồi có thể có tác động thảm họa."; /* Profile Import Alert */ "This will replace some or all of your current pump settings. Are you sure you want to import profile settings from Nightscout?" = "Việc này có thể thay thế một vài hoặc tất cả những cấu hình bơm hiện tại của bạn. Bạn có chắc bạn muốn nhập cấu hình từ Nightscout?"; @@ -369,7 +369,7 @@ Enact a temp Basal or a temp target */ "\nInvalid Nightcsout Basal Settings. \n\nImport aborted. Please check your Nightscout Profile Basal Settings!" = "\nCác cấu hình liều nền trên Nightscout không hợp lệ.\n\n Việc cập nhật bị bỏ. Đề nghị bạn kiểm tra cấu hình liều nền trên Nightscout!"; /* Import Error */ -"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\n Các cấu hình đã được nhập nhưng liều nền không được lưu vào bơm (Không có bơm). Kiểm tra cấu hình liều nền của bạn và nhấn 'Lưu vào bơm' để đồng hóa cấu hình liều nền mới"; +"\nSettings were imported but the Basals couldn't be saved to pump (No pump). Check your basal settings and tap ´Save on Pump´ to sync the new basal settings" = "\n Các cấu hình đã được nhập nhưng liều nền không được lưu vào bơm (không có bơm). Kiểm tra cấu hình liều nền của bạn và nhấn 'Lưu vào bơm' để đồng hóa cấu hình liều nền mới"; /* Import Error Headline */ "Import Error" = "Cập nhật lỗi"; @@ -405,7 +405,7 @@ Enact a temp Basal or a temp target */ "Add Omnipod" = "Thêm Omnipod"; /* Add Simulator pump */ -"Add Simulator" = "Thêm phần mô phỏng"; +"Add Simulator" = "Thêm Bơm mô phỏng"; /* Insulin model */ "Model" = "Model"; @@ -417,7 +417,7 @@ Enact a temp Basal or a temp target */ "Delivery limits" = "Các giới hạn liều tiêm"; /* */ -"Duration of Insulin Action" = "Khoảng thời gian Insulin tác động"; +"Duration of Insulin Action" = "Thời gian hoạt động của Insulin"; /* hours of duration of insulin activity */ "hours" = "giờ"; @@ -681,7 +681,7 @@ Enact a temp Basal or a temp target */ "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Xin chắc chắn rằng Libre 2 của bạn đã được kích hoạt and hoàn thành khởi động. Nếu bạn đang có app nào kết nối với cảm biến qua bluetooth thì nên đóng các app này lại hoặc gỡ các app khỏi máy.\n\n Bạn chỉ được dùng 01 app để kết nối với cảm biến qua bluetooth. Sau đó nhấn \"pairing and connection\" để tiếp tục. Bluetooth có thể mất vài phút để kết nối trước khi bắt đầu hoạt động."; /* */ -"Pairinginfo" = "Thông in ghép nối"; +"Pairinginfo" = "Thông tin ghép nối"; /* */ "PatchInfo" = "Thông tin bản vá lỗi"; @@ -744,7 +744,7 @@ Enact a temp Basal or a temp target */ "No Sensor Detected" = "Không phát hiện được cảm biến"; /* This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor */ -"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "Có sự gián đoạn tạm thời, đề nghị kiểm tra lại transmitter đã được gắn chặt lên sensor"; +"This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor" = "Có sự gián đoạn tạm thời, đề nghị kiểm tra lại transmitter đã được gắn chặt lên cảm biến"; /* New Sensor Detected */ "New Sensor Detected" = "Phát hiện được sensor mới"; @@ -807,7 +807,7 @@ Enact a temp Basal or a temp target */ "Last Blood Sugar prediction" = "Dự đoán lượng đường trong máu"; /* */ -"CurrentBG" = "Đường máu hiện tại"; +"CurrentBG" = "Đường huyết hiện tại"; /* */ "Sensor Info" = "Thông tin cảm biến"; @@ -828,7 +828,7 @@ Enact a temp Basal or a temp target */ "Sensor Serial" = "Serial cảm biến"; /* */ -"Transmitter Info" = "Số Id của Transmitter"; +"Transmitter Info" = "Số ID của Transmitter"; /* */ "Hardware" = "Phần cứng"; @@ -861,7 +861,7 @@ Enact a temp Basal or a temp target */ "Delete CGM" = "Xóa CGM"; /* */ -"Are you sure you want to remove this cgm from loop?" = "Bạn có chắc muốn xóa Cgm này khỏi Loop không?"; +"Are you sure you want to remove this cgm from loop?" = "Bạn có chắc muốn xóa CGM này khỏi Loop không?"; /* */ "There is no undo" = "Không thể hoàn tác"; @@ -885,7 +885,7 @@ Enact a temp Basal or a temp target */ "Export not available" = "Không thể kết xuất"; /* */ -"Log export requires ios 15" = "Kết xuất nhật ký yêu cấu ios 15 trở lên"; +"Log export requires ios 15" = "Kết xuất nhật ký yêu cầu ios 15 trở lên"; /* */ "Got it!" = "Đã hiểu!"; @@ -912,7 +912,7 @@ Enact a temp Basal or a temp target */ "Adds Phone Battery" = "Hãy sạc Pin điện thoại"; /* */ -"Adds Transmitter Battery" = "Hãy sạc pin của Transmitter"; +"Adds Transmitter Battery" = "Hãy sạc Pin của Transmitter"; /* */ "Also vibrate" = "Rung"; @@ -924,7 +924,7 @@ Enact a temp Basal or a temp target */ "Misc" = "Misc"; /* */ -"Unit override" = "Unit override"; +"Unit override" = "Đơn vị ghi đè"; /* */ "Low" = "Thấp"; @@ -948,7 +948,7 @@ Enact a temp Basal or a temp target */ "Some ui element was incorrectly specified" = "Một vài yếu tố ui đã không được chỉ định"; /* */ -"Success" = "Thành công"; +"Success" = "Success"; /* */ "Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; @@ -1096,7 +1096,7 @@ Enact a temp Basal or a temp target */ "OpenAPS other settings" = "Cài đặt khác OpenAPS"; /* Glucose Simulator CGM */ -"Glucose Simulator" = "Mô phỏng Glucose"; +"Glucose Simulator" = "Glucose mô phỏng"; /* Restored state message */ "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Đã khôi phục trạng thái Bluetooth (APS đã khởi động lại?). Đã tìm thấy %d thiết bị ngoại vi và được kết nối với %@ bằng mã định danh %@"; @@ -1105,7 +1105,7 @@ Enact a temp Basal or a temp target */ "Using shared app group with external CGM app xDrip4iOS" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài xDrip4iOS"; /* Shared app group GlucoseDirect */ -"Using shared app group with external CGM app GlucoseDirect" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài GlucoseDirect"; +"Using shared app group with external CGM app GlucoseDirect" = "Sử dụng nhóm ứng dụng dùng chung với ứng dụng CGM bên ngoài Glucose Direct"; /* Dexcom G6 app */ "Dexcom G6 app" = "Dexcom G6 app"; @@ -1128,7 +1128,7 @@ Enact a temp Basal or a temp target */ /* -------------- Developer settings ---------------------- */ /* Debug options */ -"Developer" = "Nhà phát triển"; +"Developer" = "Dành cho nhà phát triển"; /* Debug option view NS Upload Profile */ "NS Upload Profile" = "Tải hồ sơ lên NS"; @@ -1146,7 +1146,7 @@ Enact a temp Basal or a temp target */ "Only Autotune Basal Insulin" = "Chỉ Autotune Insulin cơ bản"; /* */ -"Save as your Normal Basal Rates" = "Save as your Normal Basal Rates"; +"Save as your Normal Basal Rates" = "Lưu như liều nền của bạn"; /* */ "Save on Pump" = "Lưu vào bơm"; @@ -1252,57 +1252,57 @@ Enact a temp Basal or a temp target */ "Interval In Minutes" = "Khoảng thời gian tính bằng phút"; /* Override */ -"Override With A Factor Of " = "Hệ số "; +"Override With A Factor Of " = "Ghi đè bằng hệ số "; /* Description */ -"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và chất đạm thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và protein đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; +"Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Cho phép chuyển đổi chất béo và chất đạm thành lượng carb tương đương trong tương lai bằng cách sử dụng công thức kilocalories chia cho 10 của Warsaw.\n\nĐiều này phân bổ lượng carb tương đương trong cài đặt thời lượng tối đa có thể được định cấu hình từ 5-12 giờ.\n\nĐộ trễ là thời gian từ nay cho đến lần nhập carb đầu tiên trong tương lai.\n\nKhoảng thời gian tính bằng phút là số phút giữa các lần nhập. Khoảng thời gian càng ngắn thì kết quả càng mượt. 10, 15, 20, 30 hoặc 60 là những lựa chọn hợp lý.\n\nHệ số điều chỉnh là mức độ ảnh hưởng của chất béo và chất đạm đối với các mục. 1,0 là hiệu ứng đầy đủ (Phương pháp Warsaw gốc) và 0,5 là một nửa hiệu ứng. Lưu ý rằng bạn có thể thấy rằng tỷ lệ carb bình thường của bạn cần tăng lên một con số lớn hơn nếu bạn bắt đầu bổ sung các mục chất béo và protein. Vì lý do này, tốt nhất bạn nên bắt đầu với hệ số khoảng 0,5 để dễ dàng thực hiện.\n\nCài đặt mặc định: Giới hạn thời gian: 8 giờ, Khoảng thời gian: 30 phút, Hệ số: 0,5, Độ trễ 60 phút"; /* FPU Settings Title */ -"Fat and Protein" = "Chất Béo & chất Đạm"; +"Fat and Protein" = "Chất béo và chất đạm"; /* Display fat and protein entities */ -"Fat & Protein" = "Chất Béo & Chất Đạm"; +"Fat & Protein" = "Chất béo & Chất đạm"; /* */ -"Hide Fat & Protein" = "Ẩn chất Béo & Đạm"; +"Hide Fat & Protein" = "Ẩn chất béo & chất đạm"; /* Add Fat */ -"Fat" = "Chất Béo"; +"Fat" = "Chất béo"; /* Add Protein */ -"Protein" = "Chất Đạm"; +"Protein" = "Chất đạm"; /* Service Section */ -"Fat And Protein Conversion" = "Chuyển đổi chất Béo và Đạm"; +"Fat And Protein Conversion" = "Chuyển đổi chất béo và chất đạm"; /* Service Section */ -"Profile Override" = "Profile Override"; +"Profile Override" = "Mô tả ghi đè"; /* */ -"Override Profiles" = "Override Profiles"; +"Override Profiles" = "Chế độ ghi đè"; /* */ "Normal " = "Bình thường "; -"Currently no Override active" = "Hiện tại không có Override hoạt động"; +"Currently no Override active" = "Hiện tại không có ghi đè nào hoạt động"; /* */ "Total Insulin Adjustment" = "Tổng số điều chỉnh Insulin"; /* */ -"Override your Basal, ISF, CR and Target profiles" = "Ghi đè profiles Basal, ISF, CR và Target của bạn"; +"Override your Basal, ISF, CR and Target profiles" = "Ghi đè Basal, ISF, CR và Target của bạn"; /* */ "Enable indefinitely" = "Cấp phép không giới hạn"; /* */ -"Override Profile target" = "Ghi đè Profile target"; +"Override Profile target" = "Mục tiêu của ghi đè"; /* */ "Disable SMBs" = "Vô hiệu hóa SMBs"; /* Your normal Profile. Use a short string */ -"Normal Profile" = "Hồ sơ Normal"; +"Normal Profile" = "Normal Profile"; /* Custom but unsaved Profile */ "Custom Profile" = "Tùy chỉnh Profile"; @@ -1338,28 +1338,28 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Lưu profile"; /* Alert */ -"Cancel Profile Override" = "Hủy bỏ Profile Override?"; +"Cancel Profile Override" = "Hủy bỏ ghi đè?"; /* Alert */ "Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; /* Alert */ -"Return to Normal?" = "Quay lại bình thường?"; +"Return to Normal?" = "Quay lại chế độ bình thường không?"; /* */ -"This will change settings back to your normal profile." = "Việc này sẽ thay đổi cấu hình trở lại profile bình thường của bạn."; +"This will change settings back to your normal profile." = "Việc này sẽ thay đổi cấu hình trở lại profile Normal của bạn."; /* Start Profile Alert */ "Start Profile" = "Bắt đầu profile"; /* */ -"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Liều basal sẽ được điều chỉnh theo tỷ lệ phần trăm override trong khi ISF và CR sẽ được điều chỉnh ngược lại."; +"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage." = "Liều basal sẽ được điều chỉnh theo tỷ lệ phần trăm ghi đè trong khi ISF và CR sẽ được điều chỉnh ngược lại."; /* */ -"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Việc sử dụng override này sẽ thay đổi profile và/hoặc Target Glucose của bạn được sử dụng cho looping trong suốt thời gian được chọn. Chọn \"Start Profile\" sẽ cho phép bạn lập profile mới và chỉnh sửa profile hiện hữu đang hoạt động."; +"Starting this override will change your Profiles and/or your Target Glucose used for looping during the entire selected duration. Tapping ”Start Profile” will start your new profile or edit your current active profile." = "Việc sử dụng Ghi đè này sẽ thay đổi profile và/hoặc Mục tiêu Đường huyết của bạn được sử dụng cho looping trong suốt thời gian được chọn. Chọn \"Bắt đầu Profile\" sẽ cho phép bạn lập profile mới và chỉnh sửa profile hiện hữu đang hoạt động."; /* Change Target glucose in profile settings */ -"Override Profile Target" = "Override Profile Target"; +"Override Profile Target" = "Mục tiêu ghi đè"; /* Alert string. Keep spaces. */ " SMBs are disabled either by schedule or during the entire duration." = " SBMs bị vô hiệu theo lịch trình hoặc theo toàn bộ thời gian."; @@ -1368,7 +1368,7 @@ Enact a temp Basal or a temp target */ " infinite duration." = " thời gian không xác định."; /* Service Section */ -"App Icons" = "Biểu tượng app"; +"App Icons" = "Biểu tượng ứng dụng"; /* */ "iAPS Icon" = "biểu tượng iAPS"; @@ -1386,7 +1386,7 @@ Enact a temp Basal or a temp target */ "Delete Glucose?" = "Xóa Glucose không?"; /* */ -"Meal Presets" = "Đặt trước bữa ăn"; +"Meal Presets" = "Trước bữa ăn"; /* */ "Empty" = "Trống rỗng"; @@ -1404,7 +1404,7 @@ Enact a temp Basal or a temp target */ "Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Lưu dưới dạng cài đặt sẵn"; +"Save as Preset" = "Lưu cài đặt mẫu"; /* */ "Predictions" = "Dự đoán"; @@ -1531,19 +1531,19 @@ Enact a temp Basal or a temp target */ "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Sẽ có âm thanh báo nhắc khi ứng dụng tự động điều chỉnh liều cũng như khi bạn khởi tạo ứng dụng."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; +"Expiration Reminder Default" = "Mặc định nhắc nhở hết hạn"; /* */ -"Expiration Reminder" = "Nhắc nhở Hết hạn"; +"Expiration Reminder" = "Nhắc nhở hết hạn"; /* */ "Low Reservoir" = "Sắp hết thuốc"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Không có lời nhắc"; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Lịch biểu lời nhắc"; /* */ "Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; @@ -1580,7 +1580,7 @@ Enact a temp Basal or a temp target */ "Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Liều nền tối đa chưa được cấu hình. Đề nghị vào Cài đặt-> Cấu hình bơm và cấu hình Liều nền tối đa mới."; /* description label for active time pod details row */ "Active Time" = "Thời gian Hoạt động"; @@ -1620,16 +1620,16 @@ Enact a temp Basal or a temp target */ /* */ -"Today" = "Hôm nay"; +"Today" = "Today"; /* */ -"Day" = "Ngày"; +"Day" = "Day"; /* */ -"Week" = "Tuần"; +"Week" = "Week"; /* */ -"Month" = "Tháng"; +"Month" = "Month"; /* */ "Total" = "Tổng số"; @@ -1659,13 +1659,13 @@ Enact a temp Basal or a temp target */ "Display Chart Y - Grid lines" = "Hiển thị biểu đồ dạng Y-Grid"; /* */ -"Display Chart Threshold lines for Low and High" = "Hiển thị các đường hiển thị Low và High"; +"Display Chart Threshold lines for Low and High" = "Hiển thị các đường hiển thị Thấp và Cao"; /* */ -"Standing / Laying TIR Chart" = "Standing / Laying TIR Chart"; +"Standing / Laying TIR Chart" = "Đứng/nằm biểu đồ TIR"; /* */ -"Hours X-Axis (6 default)" = "Hours X-Axis (6 default)"; +"Hours X-Axis (6 default)" = "Giờ trục X (mặc định 6)"; /* */ "2 hours" = "2 giờ"; @@ -1683,13 +1683,13 @@ Enact a temp Basal or a temp target */ "24 hours" = "24 giờ"; /* Average BG = */ -"Average" = "Trung bình"; +"Average" = "Average"; /* Median BG */ -"Median" = "Trung Bình"; +"Median" = "Median"; /* CGM readings in statView */ -"Readings" = "Đang đọc"; +"Readings" = "Readings"; /* CGM readings in statView */ "Readings / 24h" = "Readings / 24h"; @@ -1698,7 +1698,7 @@ Enact a temp Basal or a temp target */ "Days" = "Days"; /* Normal BG (within TIR) */ -"Normal" = "Bình thường"; +"Normal" = "Normal"; /* Title High BG in statPanel */ "High (>" = "Cao (>"; @@ -1728,13 +1728,13 @@ Enact a temp Basal or a temp target */ "Errors" = "Lỗi"; /* Average loop interval */ -"Interval" = "Khoảng"; +"Interval" = "Interval"; /* Median loop interval */ "Duration" = "Duration"; /* "Display SD */ -"Display SD instead of CV" = "Display SD instead of CV"; +"Display SD instead of CV" = "Hiển thị SD thay vì CV"; /* Description for display SD */ "Display Standard Deviation (SD) instead of Coefficient of Variation (CV) in statPanel" = "Hiển thị Độ lệch chuẩn (SD) thay vì Hệ số biến thiên (CV) trong statPanel"; @@ -1746,19 +1746,19 @@ Enact a temp Basal or a temp target */ "Default is 20 minutes. How often to update and save the statistics.json and to upload last array, when enabled, to Nightscout." = "Mặc định là 20 phút. Tần suất cập nhật và lưu stats.json cũng như tải mảng cuối cùng lên Nightscout khi được bật."; /* Duration displayed in statPanel */ -"Past 24 Hours " = "24 giờ qua "; +"Past 24 Hours " = "Past 24 Hours "; /* Duration displayed in statPanel */ -"Past Week " = "Một tuần qua "; +"Past Week " = "Past Week "; /* Duration displayed in statPanel */ -"Past Month " = "Một tháng qua "; +"Past Month " = "Past Month "; /* Duration displayed in statPanel */ "Past 90 Days " = "90 ngày trước "; /* Duration displayed in statPanel */ -"All Past Days of Data " = "Tất cả dữ liệu những ngày qua "; +"All Past Days of Data " = "All Past Days of Data "; /* "Display Loop statistics in statPanel */ "Display Loop Cycle statistics" = "Hiển thị số liệu thống kê theo vòng tròn"; @@ -1785,7 +1785,7 @@ Enact a temp Basal or a temp target */ "Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?"; /* New Experimental feature */ -"Experimental" = "Thử nghiệm"; +"Experimental" = "Thực hiện"; /* Smoothing of CGM readings */ "Smooth Glucose Value" = "Giá trị Glucose mịn"; @@ -1796,16 +1796,16 @@ Enact a temp Basal or a temp target */ */ /* Headline Rewind Resets Autosens */ -"Rewind Resets Autosens" = "Rewind Resets Autosens"; +"Rewind Resets Autosens" = "Rewind sẽ thiết lập lại Autosens"; /* ”Rewind Resets Autosens” */ "This feature, enabled by default, resets the autosens ratio to neutral when you rewind your pump, on the assumption that this corresponds to a probable site change. Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours. If you usually rewind your pump independently of site changes, you may want to consider disabling this feature." = "Tính năng này, được bật theo mặc định, sẽ đặt lại tỷ lệ cảm biến tự động về mức trung tính khi bạn tua lại máy bơm của mình, với giả định rằng điều này tương ứng với một sự thay đổi địa điểm có thể xảy ra. Autosens sẽ bắt đầu học lại độ nhạy kể từ thời điểm tua lại, quá trình này có thể mất tới 6 giờ. Nếu bạn thường tua lại máy bơm của mình một cách độc lập với những thay đổi ở địa điểm, bạn có thể cân nhắc việc tắt tính năng này."; /* Headline "High Temptarget Raises Sensitivity" */ -"High Temptarget Raises Sensitivity" = "High Temptarget Raises Sensitivity"; +"High Temptarget Raises Sensitivity" = "Mục tiêu tạm thời cao sẽ làm tăng độ nhạy"; /* ”High Temptarget Raises Sensitivity" */ -"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Fitness_mode. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với HalfBasalTarget mặc định là 160)."; +"Defaults to false. When set to true, raises sensitivity (lower sensitivity ratio) for temp targets set to >= 111. Synonym for exercise_mode. The higher your temp target above 110 will result in more sensitive (lower) ratios, e.g., temp target of 120 results in sensitivity ratio of 0.75, while 140 results in 0.6 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, sẽ tăng độ nhạy (tỷ lệ độ nhạy thấp hơn) cho các mục tiêu tạm thời được đặt thành >= 111. Từ đồng nghĩa với Chế độ thể dục. Mục tiêu tạm thời của bạn trên 110 càng cao sẽ dẫn đến tỷ lệ nhạy cảm hơn (thấp hơn), ví dụ: mục tiêu tạm thời là 120 dẫn đến tỷ lệ độ nhạy là 0,75, trong khi 140 dẫn đến tỷ lệ nhạy cảm là 0,6 (với một nửa mục tiêu với mặc định là 160)."; /* Headline ”Low Temptarget Lowers Sensitivity" */ "Low Temptarget Lowers Sensitivity" = "Mục tiêu tạm thời thấp sẽ làm giảm độ nhạy"; @@ -1820,7 +1820,7 @@ Enact a temp Basal or a temp target */ "When true, raises BG target when autosens detects sensitivity" = "Khi True, tăng mục tiêu BG khi cảm biến tự động phát hiện độ nhạy"; /* Headline ”Resistance Lowers Target" */ -"Resistance Lowers Target" = "Resistance Lowers Target"; +"Resistance Lowers Target" = "Chống mục tiêu thấp"; /* ”Resistance Lowers Target" */ "Defaults to false. When true, will lower BG target when autosens detects resistance" = "Mặc định là False. Khi True, sẽ hạ mục tiêu BG khi cảm biến tự động phát hiện kháng cự"; @@ -1835,25 +1835,25 @@ Enact a temp Basal or a temp target */ "Exercise Mode" = "Chế độ tập thể dục"; /* "Exercise Mode" */ -"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Mặc định là False. Khi True, mục tiêu cao > 105 mg/dL sẽ điều chỉnh Tỷ lệ độ nhạy cho chế độ tập luyện. Từ đồng nghĩa với high_temptarget_raises_sensitive"; +"Defaults to false. When true, > 105 mg/dL high temp target adjusts sensitivityRatio for exercise_mode. Synonym for high_temptarget_raises_sensitivity" = "Mặc định là False. Khi True, mục tiêu cao > 105 mg/dL sẽ điều chỉnh Tỷ lệ độ nhạy cho chế độ tập luyện. Từ đồng nghĩa với \"Mục tiêu tạm thời cao sẽ làm tăng độ nhạy\""; /* Headline "Wide BG Target Range" */ "Wide BG Target Range" = "Phạm vi mục tiêu BG rộng"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng wide_bg_target_range: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng Phạm vi mục tiêu BG rộng: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; /* Headline "Skip Neutral Temps" */ -"Skip Neutral Temps" = "Skip Neutral Temps"; +"Skip Neutral Temps" = "Bỏ qua tạm thời trung lập"; /* "Skip Neutral Temps" */ "Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Temp “trung tính” (giống như Temp cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; /* Headline "Unsuspend If No Temp” */ -"Unsuspend If No Temp" = "Unsuspend If No Temp"; +"Unsuspend If No Temp" = "Bỏ tạm dừng nếu không có tạm thời"; /* "Unsuspend If No Temp” */ -"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Nhiều người thỉnh thoảng quên tiếp tục/hủy tạm dừng máy bơm sau khi kết nối lại. Nếu bạn là một trong số họ và sẵn sàng đặt nhiệt độ cơ bản bằng 0 một cách đáng tin cậy bất cứ khi nào tạm dừng và ngắt kết nối máy bơm của mình, thì tính năng này sẽ hỗ trợ bạn. Nếu được bật, nó sẽ tự động tiếp tục/hủy tạm dừng máy bơm nếu bạn quên làm như vậy trước khi hết nhiệt độ 0. Miễn là nhiệt độ bằng 0 vẫn đang chạy, nó sẽ khiến máy bơm bị treo."; +"Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended." = "Nhiều người thỉnh thoảng quên tiếp tục/hủy tạm dừng máy bơm sau khi kết nối lại. Nếu bạn là một trong số họ và sẵn sàng đặt nhiệt độ cơ bản bằng 0 một cách đáng tin cậy bất cứ khi nào tạm dừng và ngắt kết nối máy bơm của mình, thì tính năng này sẽ hỗ trợ bạn. Nếu được bật, nó sẽ tự động tiếp tục/hủy tạm dừng máy bơm nếu bạn quên làm như vậy trước khi hết tạm thời 0. Miễn là tạm thời bằng 0 vẫn đang chạy, nó sẽ khiến máy bơm bị treo."; /* Headline "Enable UAM" */ "Enable UAM" = "Kích hoạt UAM"; @@ -1895,10 +1895,10 @@ Enact a temp Basal or a temp target */ "Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép supermicrobolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ -"Use Custom Peak Time" = "Sử dụng Giờ cao điểm tùy chỉnh"; +"Use Custom Peak Time" = "Sử dụng giờ cao điểm tùy chỉnh"; /* "Use Custom Peak Time” */ -"Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi insulinPeakTime"; +"Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi đỉnh của insulin"; /* Headline "Suspend Zeros IOB” */ "Suspend Zeros IOB" = "Suspend Zeros IOB"; @@ -1910,16 +1910,16 @@ Enact a temp Basal or a temp target */ "Max IOB" = "IOB tối đa"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (max_daily_safety_multiplier và current_basal_safety_multiplier), max_iob được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (Hệ số tối đa an toàn hàng ngày và Hệ số an toàn cơ bản hiện tại), Tối đa IOB được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ -"Max Daily Safety Multiplier" = "Hệ số an toàn hàng ngày tối đa"; +"Max Daily Safety Multiplier" = "Hệ số tối đa an toàn hàng ngày"; /* "Max Daily Safety Multiplier" */ "This is an important OpenAPS safety limit. The default setting (which is unlikely to need adjusting) is 3. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 3x the highest hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là giới hạn an toàn quan trọng của OpenAPS. Cài đặt mặc định (có thể không cần điều chỉnh) là 3. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 3 lần tốc độ cơ bản hàng giờ cao nhất được lập trình trong máy bơm của người dùng hoặc, nếu được bật, sẽ được xác định bằng autotune."; /* Headline "Current Basal Safety Multiplier" */ -"Current Basal Safety Multiplier" = "Hệ số an toàn cơ bản(Basal) hiện tại"; +"Current Basal Safety Multiplier" = "Hệ số an toàn cơ bản hiện tại"; /* "Current Basal Safety Multiplier" */ "This is another important OpenAPS safety limit. The default setting (which is also unlikely to need adjusting) is 4. This means that OpenAPS will never be allowed to set a temporary basal rate that is more than 4x the current hourly basal rate programmed in a user’s pump, or, if enabled, determined by autotune." = "Đây là một giới hạn an toàn quan trọng khác của OpenAPS. Cài đặt mặc định (cũng khó có thể cần điều chỉnh) là 4. Điều này có nghĩa là OpenAPS sẽ không bao giờ được phép đặt tốc độ cơ bản tạm thời cao hơn 4 lần tốc độ cơ bản hàng giờ hiện tại được lập trình trong máy bơm của người dùng hoặc, nếu được bật, được xác định bằng autotune."; @@ -1937,7 +1937,7 @@ Enact a temp Basal or a temp target */ "The other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets." = "Mặt khác của các giới hạn an toàn của autosens, đặt giới hạn về mức độ tự động thấp có thể điều chỉnh mức cơ bản và mức độ có thể điều chỉnh các mục tiêu ISF và BG."; /* Headline "Half Basal Exercise Target" */ -"Half Basal Exercise Target" = "Half Basal Exercise Target"; +"Half Basal Exercise Target" = "Mục tiêu tập thể dục 1/2 liều cơ bản"; /* "Half Basal Exercise Target" */ "Set to a number, e.g. 160, which means when temp target is 160 mg/dL and exercise_mode=true, run 50% basal at this level (120 = 75%; 140 = 60%). This can be adjusted, to give you more control over your exercise modes." = "Đặt thành một số, ví dụ: 160, có nghĩa là khi mục tiêu tạm thời là 160 mg/dL và tập thể dục_mode=true, hãy chạy 50% cơ bản ở mức này (120 = 75%; 140 = 60%). Điều này có thể được điều chỉnh để giúp bạn kiểm soát nhiều hơn các chế độ tập luyện của mình. @@ -1956,7 +1956,7 @@ Enact a temp Basal or a temp target */ "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Chế độ báo lại bolus được kích hoạt sau khi bạn thực hiện một bữa ăn nhanh, vì vậy vòng lặp sẽ không phản tác dụng với nhiệt độ thấp khi bạn vừa ăn. Ví dụ ở đây và mặc định là 2; vì vậy DIA 3 giờ có nghĩa là thời gian báo lại bolus sẽ giảm dần trong 1,5 giờ (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ -"Min 5m Carbimpact" = "Min 5m Carbimpact"; +"Min 5m Carbimpact" = "Tác động tối thiểu 5m"; /* "Min 5m Carbimpact" */ "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Đây là cài đặt cho tác động hấp thụ carb mặc định trong 5 phút. Giá trị mặc định là 8 mg/dL/5 phút dự kiến. Điều này ảnh hưởng đến tốc độ phân hủy của COB trong các tình huống khi không thể nhìn thấy sự hấp thụ carb ở độ lệch BG. Giá trị mặc định là 8 mg/dL/5 phút tương ứng với tốc độ hấp thụ carb tối thiểu là 24g/giờ ở CSF là 4 mg/dL/g."; @@ -1968,7 +1968,7 @@ Enact a temp Basal or a temp target */ "The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của fullNewISF và PumpISF. 1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF."; /* Headline "Remaining Carbs Fraction" */ -"Remaining Carbs Fraction" = "Remaining Carbs Fraction"; +"Remaining Carbs Fraction" = "Phần carb còn lại"; /* "Remaining Carbs Fraction" */ "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là tỷ lệ carbs mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy sự hấp thụ carb."; @@ -1980,19 +1980,19 @@ Enact a temp Basal or a temp target */ "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là lượng carb tối đa mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy khả năng hấp thụ carb."; /* Headline ”Max SMB Basal Minutes" */ -"Max SMB Basal Minutes" = "Số phút cơ bản(Basal) SMB tối đa"; +"Max SMB Basal Minutes" = "Số phút cơ bản SMB tối đa"; /* ”Max SMB Basal Minutes" */ "Defaults to start at 30. This is the maximum minutes of basal that can be delivered as a single SMB with uncovered COB. This gives the ability to make SMB more aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. It is not recommended to set this value higher than 90 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa có thể được phân phối dưới dạng một SMB duy nhất không có COB. Điều này mang lại khả năng làm cho SMB trở nên hung hãn hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Không nên đặt giá trị này cao hơn 90 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "Max UAM SMB Basal Minutes" */ -"Max UAM SMB Basal Minutes" = "Số phút cơ bản(basal) UAM SMB tối đa"; +"Max UAM SMB Basal Minutes" = "Số phút cơ bản UAM SMB tối đa"; /* "Max UAM SMB Basal Minutes" */ "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa mà UAM có thể phân phối dưới dạng một SMB khi IOB vượt quá COB. Điều này mang lại khả năng khiến UAM trở nên hung hãn hơn hoặc ít hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Việc giảm giá trị sẽ khiến UAM giảm liều insulin cho mỗi SMB. Không nên đặt giá trị này cao hơn 60 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "SMB Interval" */ -"SMB Interval" = "Khoảng thời gian SMB"; +"SMB Interval" = "SMB Interval"; /* "SMB Interval" */ "Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Thời lượng tối thiểu tính bằng phút cho SMB mới kể từ SMB cuối cùng hoặc liều truyền thủ công"; @@ -2004,16 +2004,16 @@ Enact a temp Basal or a temp target */ "Smallest enacted SMB amount. Minimum amount for Omnipod pumps is 0.05 U, whereas for Medtronic pumps it differs for various models, from 0.025 U to 0.10 U. Please check the minimum bolus amount which can be delivered by your pump. The default value is 0.1." = "Số SMB được ban hành nhỏ nhất. Lượng tối thiểu đối với máy bơm Omnipod là 0,05 U, trong khi đối với máy bơm Medtronic, lượng này khác nhau đối với nhiều kiểu máy khác nhau, từ 0,025 U đến 0,10 U. Vui lòng kiểm tra lượng truyền nhanh tối thiểu mà máy bơm của bạn có thể cung cấp. Giá trị mặc định là 0,1."; /* Headline "Insulin Peak Time" */ -"Insulin Peak Time" = "Thời gian cao điểm của insulin"; +"Insulin Peak Time" = "Thời gian đỉnh của Insulin"; /* "Insulin Peak Time" */ -"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Thời gian tác dụng hạ đường huyết tối đa của insulin, tính bằng phút. Lưu ý: Oref giả định đường cong cực nhanh (Lyumjev) và tác dụng nhanh (Fiasp) tối thiểu (35 & 50 phút) và tối đa (100 & 120 phút) insulinPeakTimes áp dụng. Việc sử dụng insulinPeakTime tùy chỉnh ngoài các giới hạn này sẽ dẫn đến sự cố với iAPS, tính toán vòng lặp dài hơn và có thể xảy ra vòng lặp màu đỏ."; +"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with iAPS, longer loop calculations and possible red loops." = "Thời gian tác dụng hạ đường huyết tối đa của insulin, tính bằng phút. Lưu ý: Oref giả định đường cong cực nhanh (Lyumjev) và tác dụng nhanh (Fiasp) tối thiểu (35 & 50 phút) và tối đa (100 & 120 phút) áp dụng đỉnh insulin. Việc sử dụng đỉnh insulin tùy chỉnh ngoài các giới hạn này sẽ dẫn đến sự cố với iAPS, tính toán vòng lặp dài hơn và có thể xảy ra vòng lặp màu đỏ."; /* Headline "Carbs Req Threshold" */ "Carbs Req Threshold" = "Ngưỡng yêu cầu của lượng Carbs"; /* "Carbs Req Threshold" */ -"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Số gram carbsReq để kích hoạt quá trình đẩy. Mặc định là 1 (cho 1 gam carbohydrate). Có thể tăng lên nếu bạn chỉ muốn nhận Pushover cho carbsReq ở ngưỡng X."; +"Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Số gram carbs yêu cầu để kích hoạt quá trình đẩy. Mặc định là 1 (cho 1 gam carbohydrate). Có thể tăng lên nếu bạn chỉ muốn nhận đẩy qua cho carbs yêu cầu ở ngưỡng X."; /* Headline "Noisy CGM Target Multiplier" */ "Noisy CGM Target Multiplier" = "Hệ số mục tiêu CGM Noisy"; @@ -2081,7 +2081,7 @@ Enact a temp Basal or a temp target */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; /* Header */ -"Calculator settings" = "Thiết lập Tính toán"; +"Calculator settings" = "Thiết lập tính toán"; /* UI/UX option */ "Display Predictions" = "Hiển thị dự đoán"; @@ -2125,14 +2125,14 @@ Enact a temp Basal or a temp target */ "Show live activity" = "Hiển thị hoạt động trực tiếp"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ -"Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; +"Weighted Average of TDD. Weight of past 24 hours:" = "Trung bình có trọng số của TDD. Trọng lượng trong 24 giờ qua:"; /* Weight of past 24 hours of insulin */ "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Phải > 0 và <= 1.\nMặc định là 0,65 (65 %) * TDD. Phần còn lại sẽ lấy từ mức trung bình của tổng dữ liệu (tối đa 14 ngày) của tất cả các phép tính TDD (35%). Để chỉ sử dụng 24 giờ qua, hãy đặt giá trị này thành 1.\n\nĐể tránh những biến động đột ngột, chẳng hạn như sau một bữa ăn thịnh soạn, tính toán TDD trung bình trong 2 giờ qua được sử dụng thay vì chỉ TDD hiện tại (24 giờ qua lúc thời điểm này). ​."; /* Headline "Adjust basal" */ -"Adjust basal" = "Điều chỉnh cơ bản(basal)"; +"Adjust basal" = "Mức cơ bản"; /* Enable adjustment of basal profile */ "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD" = "Cho phép điều chỉnh mức cơ bản dựa trên tỷ lệ TDD hiện tại/TDD trung bình 7 ngày"; @@ -2144,10 +2144,10 @@ Enact a temp Basal or a temp target */ "Defaults to 0.2 (20%). Maximum positive percentual change of BG level to use SMB, above that will disable SMB. Hardcoded cap of 40%. For UAM fully-closed-loop 30% is advisable. Observe in log and popup (maxDelta 27 > 20% of BG 100 - disabling SMB!)." = "Mặc định là 0,2 (20%). Thay đổi phần trăm dương tối đa của cấp độ BG để sử dụng SMB, trên mức đó sẽ vô hiệu hóa SMB. Giới hạn mã hóa cứng là 40%. Đối với UAM vòng kín hoàn toàn nên sử dụng 30%. Quan sát nhật ký và cửa sổ bật lên (maxDelta 27 > 20% BG 100 - vô hiệu hóa SMB!)."; /* Headline "... When Blood Glucose Is Over (mg/dl):" */ -"... When Blood Glucose Is Over (mg/dl):" = "... When Blood Glucose Is Over (mg/dl):"; +"... When Blood Glucose Is Over (mg/dl):" = "... Khi đường huyết vượt quá (mg/dl):"; /* ... When Blood Glucose Is Over (mg/dl): */ -"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Đặt giá trị EnableSMB_high_bg sẽ so sánh để kích hoạt SMB. Nếu BG > giá trị này, SMB sẽ kích hoạt."; +"Set the value enableSMB_high_bg will compare against to enable SMB. If BG > than this value, SMBs should enable." = "Đặt giá trị \"Kích hoạt SMB với BG cao\" sẽ so sánh để kích hoạt SMB. Nếu BG > giá trị này, SMB sẽ kích hoạt."; /* Headline "Enable SMB With High BG" */ "Enable SMB With High BG" = "Kích hoạt SMB với BG cao"; @@ -2156,10 +2156,10 @@ Enact a temp Basal or a temp target */ "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Cài đặt động(Dynamic)"; +"Dynamic settings" = "Dynamic settings"; /* Insulin curve */ -"Insulin curve" = "Đường cong insulin"; +"Insulin curve" = "Chủng loại insulin"; /* Headline "Adjustment Factor" */ "Adjustment Factor" = "Yếu tố điều chỉnh (AF)"; From bb10ed4df7c40ff8b8e67867b4542d301ce958a4 Mon Sep 17 00:00:00 2001 From: "Jon B.M" Date: Sun, 7 Jan 2024 14:21:58 +0100 Subject: [PATCH 332/405] Bump version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 4bf62311af..219aff9a63 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.4.2 +APP_VERSION = 2.4.3 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 3732b41a0a9248d8091d2ef90f605727cfd1c225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 7 Jan 2024 15:38:12 +0100 Subject: [PATCH 333/405] Fix bug which deleted last meal entry when coming from bolus->meal view. --- FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift | 2 -- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 -- 2 files changed, 4 deletions(-) diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 9a1aa13978..993597b279 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -256,8 +256,6 @@ extension Bolus { if deleteTwice { nsManager.deleteCarbs(mealArray, complexMeal: true) - } else { - nsManager.deleteCarbs(mealArray, complexMeal: false) } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index a28006c364..d663944078 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -178,8 +178,6 @@ extension Bolus { label: { Text("Continue without bolus") }.frame(maxWidth: .infinity, alignment: .center) } } - - // Section {} footer: {}.padding(.bottom, 30) } .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") From d69bbab12a3d1e7085d27a8ae0ef35623ac7a81c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:51:21 +0100 Subject: [PATCH 334/405] UI/UX updates UI/UX Dynamic Adaptive Font Sizes for Home View. Making the bigger and smaller optional font sizes in iOS accessibility settings work well with iAPS. Adaptive Font Size also added to all of the other iAPS views, but here using existing fonts with an added maximum font size (extraExtraLarge) to not look ridiculous and avoid being non-functional. The LoopKit Dependencies currently look bad with the maximum or near maximum font sizes, but these dependencies will need changes in LoopKit to work with bigger fonts. I'll leave this to the Loop Authors. Use same test tube size fro both COB and IOB. Increase also the normal font size for a number of fonts used in iAPS Home View. Account for time passed for active profile overrides. A fix for a bug I discovered. Bump dev version Make the Profile Overrides illustrated more clearly in the Main Chart in dark mode. Various other UI adjustments and refinements New Omnipod strings for deactivate with slider Oref2 refactoring Only use TDD computation when needed. And don't run when mising data. Move code so that exercise setting is checked before the eventual TDD calc. --- .../OmniBLE/en.lproj/Localizable.strings | 3 + .../Resources/en.lproj/Localizable.strings | 3 + .../javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/Models/Configs.swift | 28 +++++-- .../AddCarbs/View/AddCarbsRootView.swift | 5 +- .../View/AddTempTargetRootView.swift | 1 + .../View/AutotuneConfigRootView.swift | 1 + .../View/BasalProfileEditorRootView.swift | 1 + .../View/AlternativeBolusCalcRootView.swift | 1 + .../Bolus/View/DefaultBolusCalcRootView.swift | 1 + .../View/BolusCalculatorConfigRootView.swift | 1 + .../Modules/CGM/View/CGMRootView.swift | 1 + .../CREditor/View/CREditorRootView.swift | 1 + .../View/CalibrationsRootView.swift | 1 + .../View/ConfigEditorRootView.swift | 1 + .../DataTable/View/DataTableRootView.swift | 1 + .../Dynamic/View/DynamicRootView.swift | 3 +- .../FPUConfig/View/FPUConfigRootView.swift | 1 + .../View/AppleHealthKitRootView.swift | 1 + .../Home/View/Chart/MainChartView.swift | 24 +++--- .../Home/View/Header/CurrentGlucoseView.swift | 11 ++- .../Modules/Home/View/Header/LoopView.swift | 10 ++- .../Home/View/Header/PreviewView.swift | 5 +- .../Modules/Home/View/Header/PumpView.swift | 74 ++++++++-------- .../Modules/Home/View/HomeRootView.swift | 84 +++++++++++-------- .../ISFEditor/View/ISFEditorRootView.swift | 1 + .../IconConfig/View/IconConfigRootWiew.swift | 1 + .../View/LibreConfigRootView.swift | 1 + .../View/ManualTempBasalRootView.swift | 1 + .../View/NightscoutConfigRootView.swift | 1 + .../View/NotificationsConfigRootView.swift | 1 + .../View/OverrideProfilesRootView.swift | 3 +- .../View/PreferencesEditorRootView.swift | 1 + .../PumpConfig/View/PumpConfigRootView.swift | 1 + .../View/PumpSettingsEditorRootView.swift | 1 + .../Settings/View/SettingsRootView.swift | 1 + .../Modules/Snooze/View/SnoozeRootView.swift | 1 + .../Modules/Stat/View/StatRootView.swift | 1 + .../StatConfig/View/StatConfigRootView.swift | 1 + .../View/TargetsEditorRootView.swift | 1 + .../View/WatchConfigRootView.swift | 1 + 41 files changed, 171 insertions(+), 112 deletions(-) diff --git a/Dependencies/OmniBLE/OmniBLE/en.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/en.lproj/Localizable.strings index 0150a675a9..fba519ffe5 100644 --- a/Dependencies/OmniBLE/OmniBLE/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/en.lproj/Localizable.strings @@ -25,6 +25,9 @@ /* Pod state when pod has been deactivated */ "Deactivated" = "Deactivated"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Description for Empty reservoir pod fault */ "Empty reservoir" = "Empty reservoir"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 72cedeb38c..e0ed8addab 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactivate"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index d9fe6478b6..5af1b01efb 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v){var B=i.min_bg,f=v.overrideTarget;0!=f&&6!=f&&v.useOverride&&!i.temptargetSet&&(B=f);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=0,U=B,O=0,R="",A="",I="",F="",j="",P=0,E=0,q=0,W=0,k=0,L=0;const z=v.weightedAverage;var N=1,H=i.sens,Z=i.carb_ratio;v.useOverride&&(N=v.overridePercentage/100,_?(H/=N,Z/=N):(x&&(Z/=N),y&&(H/=N)));const $=i.weightPercentage,J=v.average_total_data;function K(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Q(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function V(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function X(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}function Y(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=V(r),u=p[0].rate;for(let e=0;e=(s=X(p[e+1].start,p[e].start))?n=s:o=s?n=s:od)if(e+1=(s=X(m,l))?n=s:o=(s=X("23:59:59",l))?n=s:o0&&o21)k=Y(ee,(ae=24-O,re=ee.getTime(),new Date(re-36e5*ae))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+k.toPrecision(5)+" U. ";else O<21?(pe=!1,enableDynamicCR=!1):F=""}else console.log("Pumphistory is empty!"),pe=!1,enableDynamicCR=!1;var ae,re;for(let e=0;e0){P=e,L=g[e].rate;var oe=g[e-1]["duration (min)"]/60,ne=oe,ie=new Date(g[e-1].timestamp),se=ie,le=0;do{if(e--,0==e){se=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){se=new Date(g[e].timestamp);break}var ue=e-2;if(ue>=0&&"Rewind"==g[ue]._type){let e=g[ue].timestamp;for(;ue-1>=0&&"Prime"==g[ue-=1]._type;)le=(g[ue].timestamp-e)/36e5;le>=oe&&(se=e,le=0)}}while(e>0);var de=(se-ie)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(k+=Y(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var me=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){me=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(me=new Date,t=g[e]["duration (min)"]/60),(me-a)/36e5-t>0){k+=Y(me,K(a,t))}}var ce,ge={TDD:o(E=W+q+k,5),bolus:o(W,5),temp_basal:o(q,5),scheduled_basal:o(k,5)};O>21?(A=". Bolus insulin: "+W.toPrecision(5)+" U",I=". Temporary basal insulin: "+q.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+k.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+E.toPrecision(5)+" U")+A+I+R,tddReason=", TDD: "+o(E,2)+" U, "+o(W/E*100,0)+"% Bolus "+o((q+k)/E*100,0)+"% Basal"):tddReason=", TDD: Not enough pumpData (< 21h)";const he=e.glucose;var pe=h.useNewFormula;const ve=h.enableDynamicCR,Be=Math.min(i.autosens_min,i.autosens_max),fe=Math.max(i.autosens_min,i.autosens_max);(fe==Be||fe<1||Be>1)&&(pe=!1,console.log("Dynamic ISF disabled due to current autosens settings"));const be=h.adjustmentFactor,Me=B;var _e=!1,ye="",xe=1,Se="";J>0&&(xe=z/J),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(pe=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+he+" mg/dl ("+(.0555*he).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),ce=E,$<1&&z>0&&(E=z,console.log("Using weighted TDD average: "+o(E,2)+" U, instead of past 24 h ("+o(ce,2)+" U), weight: "+$),Ce=", Weighted TDD: "+o(E,2)+" U");const Fe=h.sigmoid;var je="";if(pe){var Pe=H*be*E*Math.log(he/Ae+1)/1800;Te=", Logarithmic formula"}if(pe&&Fe){const e=Be,t=fe-e,a=.0555*(he-B);var Ee=xe,qe=fe-1;1==fe&&(qe=fe+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=Z;const ke=o(Z,1);var Le="",ze="";if(pe&&E>0){if(Le=", Dynamic ISF/CR: On/",Pe>fe?(ye=", Dynamic ISF limited by autosens_max setting: "+fe+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+fe+" ("+o(Pe,2)+")",Pe=fe):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var tt=Math.min(e.delta,e.short_avgdelta),at=Math.min(e.short_avgdelta,e.long_avgdelta),rt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ye<=10||38===Ye||et>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Ye>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ye&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ye&&!0),Xe>12||Xe<-5?He.reason="If current system time "+Ke+" is correct, then BG data is too old. The last BG data was read "+Xe+"m ago at "+Ve:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ye&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Ye,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ye&&(Ye<=10||38===Ye||et>=3||Xe>12||Xe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var ot,nt,it,st,lt=i.max_iob;if(void 0!==B&&(nt=B),void 0!==i.max_bg&&(it=B),void 0!==i.enableSMB_high_bg_target&&(st=i.enableSMB_high_bg_target),void 0===B)return He.error="Error: could not determine target_bg. ",He;ot=B;var ut=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+n(mt,i)+" "+i.out_units);if(ut&&i.temptargetSet&&ot>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&ot=ot&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ce,2)+"U, Weighted average TDD = "+o(z,2)+"U, (Weight percentage = "+$+"), Total data of TDDs (up to 14 days) average = "+o(J,2)+"U. "),Je!==$e*N?process.stderr.write("Adjusting basal from "+$e*N+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=o((nt-60)/s.ratio)+60,it=o((it-60)/s.ratio)+60;var gt=o((ot-60)/s.ratio)+60;ot===(gt=Math.max(80,gt))?process.stderr.write("target_bg unchanged: "+n(gt,i)+"; "):process.stderr.write("target_bg from "+n(gt,i)+" to "+n(gt,i)+"; "),ot=gt}var ht=n(ot,i);ot!=B&&(ht=0!==f&&6!==f&&f!==ot?n(B,i)+"→"+n(f,i)+"→"+n(ot,i):n(B,i)+"→"+n(ot,i));var pt=200,vt=200,Bt=200;if(e.noise>=2){var ft=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);pt=o(Math.min(200,nt*ft)),vt=o(Math.min(200,ot*ft)),Bt=o(Math.min(200,it*ft)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(gt,i)+" to "+n(vt,i)+"; "),nt=pt,ot=vt,it=Bt}U=nt-.5*(nt-40);var bt=i.threshold_setting;bt>U&&bt<=120&&bt>=65?(console.error("Threshold changed in settings from "+n(U,i)+" to "+n(bt,i)+". "),U=bt):console.error("Current threshold: "+n(U,i));var Mt="",_t=(o(H,1),H);if(void 0!==s&&s&&((_t=o(_t=H/sensitivityRatio,1))!==H?process.stderr.write("ISF from "+n(H,i)+" to "+n(_t,i)):process.stderr.write("ISF unchanged: "+n(_t,i)),Mt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(H,i)+"→"+n(_t,i)),console.error("CR:"+Z),void 0===a)return He.error="Error: iob_data undefined. ",He;var yt,xt=a;if(a.length,a.length>1&&(a=xt[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var St=((yt=void 0!==a.lastTemp?o((new Date(Ke).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+yt+"m, tempModulus:"+St+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&yt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var Dt=yt-a.lastTemp.duration;if(Dt>5&&yt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Dt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var wt=o(-a.activity*_t*5,2),Gt=o(6*(tt-wt));Gt<0&&(Gt=o(6*(at-wt)))<0&&(Gt=o(6*(e.long_avgdelta-wt)));var Tt=Ye,Ct=(Tt=a.iob>0?o(Ye-a.iob*_t):o(Ye-a.iob*Math.min(_t,H)))+Gt;if(void 0===Ct||isNaN(Ct))return He.error="Error: could not calculate eventualBG. Sensitivity: "+_t+" Deviation: "+Gt,He;var Ut,Ot,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(ot,Ct,wt);He={temp:"absolute",bg:Ye,tick:Qe,eventualBG:Ct,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o(Z,1),TDD:ce,insulin:ge,current_target:ot,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:tt,expectedDelta:Rt,minGuardBG:Ot,minPredBG:Ut,threshold:n(U,i)};var At=[],It=[],Ft=[],jt=[];At.push(Ye),It.push(Ye),jt.push(Ye),Ft.push(Ye);var Pt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Ye,ot,st);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Pt=!1),wLt&&(console.error("Limiting carb impact from "+qt+" to "+Lt+"mg/dL/5m (30g/h)"),qt=Lt);var zt=3;sensitivityRatio&&(zt/=sensitivityRatio);var Nt=zt;if(l.carbs){zt=Math.max(zt,l.mealCOB/20);var Ht=o((new Date(Ke).getTime()-l.lastCarbTime)/6e4),Zt=(l.carbs-l.mealCOB)/l.carbs;Nt=o(Nt=zt+1.5*Ht/60,1),console.error("Last carbs "+Ht+" minutes ago; remainingCATime:"+Nt+"hours; "+o(100*Zt,1)+"% carbs absorbed")}var $t=Math.max(0,qt/5*60*Nt/2)/csf,Jt=90,Kt=1;i.remainingCarbsCap&&(Jt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Kt=Math.min(1,i.remainingCarbsFraction));var Qt=1-Kt,Vt=Math.max(0,l.mealCOB-$t-l.carbs*Qt),Xt=(Vt=Math.min(Jt,Vt))*csf*5/60/(Nt/2),Yt=o(l.slopeFromMaxDeviation,2),ea=o(l.slopeFromMinDeviation,2),ta=Math.min(Yt,-ea/3);Wt=0===qt?0:Math.min(60*Nt/5/2,Math.max(0,l.mealCOB*csf/qt)),console.error("Carb Impact:"+qt+"mg/dL per 5m; CI Duration:"+o(5*Wt/60*2,1)+"hours; remaining CI ("+Nt/2+"h peak):"+o(Xt,1)+"mg/dL per 5m");var aa,ra,oa,na,ia=999,sa=999,la=999,ua=999,da=999,ma=999,ca=999,ga=Ct,ha=Ye,pa=Ye,va=0,Ba=[],fa=[];try{xt.forEach((function(e){var t=o(-e.activity*_t*5,2),a=o(-e.iobWithZeroTemp.activity*_t*5,2),r=Tt,n=qt*(1-Math.min(1,It.length/12));if(!0===(pe&&!Fe))ga=It[It.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2)+n,r=jt[jt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(E*be*Math.log(Math.max(jt[jt.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ga,2)+" , ZTpredBG: "+o(r,2));else ga=It[It.length-1]+t+n,r=jt[jt.length-1]+a;var i=Math.max(0,Math.max(0,qt)*(1-At.length/Math.max(2*Wt,1))),s=Math.min(At.length,12*Nt-At.length),l=Math.max(0,s/(Nt/2*12)*Xt);i+l,Ba.push(o(l,0)),fa.push(o(i,0)),COBpredBG=At[At.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,kt+Ft.length*ta),d=Math.max(0,kt*(1-Ft.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(va=o(5*(Ft.length+1)/60,1)),!0===(pe&&!Fe))UAMpredBG=Ft[Ft.length-1]+o(-e.activity*(1800/(E*be*Math.log(Math.max(Ft[Ft.length-1],39)/Ae+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+m;It.length<48&&It.push(ga),At.length<48&&At.push(COBpredBG),Ft.length<48&&Ft.push(UAMpredBG),jt.length<48&&jt.push(r),COBpredBG18&&gaha&&(ha=ga),(Wt||Xt>0)&&At.length>18&&COBpredBG0)&&COBpredBG>ha&&(pa=COBpredBG),Et&&Ft.length>12&&UAMpredBGha&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+fa.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),He.predBGs={},It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var ba=It.length-1;ba>12&&It[ba-1]===It[ba];ba--)It.pop();for(He.predBGs.IOB=It,ra=o(It[It.length-1]),jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=jt.length-1;ba>6&&!(jt[ba-1]>=jt[ba]||jt[ba]<=ot);ba--)jt.pop();if(He.predBGs.ZT=jt,o(jt[jt.length-1]),l.mealCOB>0&&(qt>0||Xt>0)){for(At.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),ba=At.length-1;ba>12&&At[ba-1]===At[ba];ba--)At.pop();He.predBGs.COB=At,oa=o(At[At.length-1]),Ct=Math.max(Ct,o(At[At.length-1])),console.error("COBpredBG: "+o(At[At.length-1]))}if(qt>0||Xt>0){if(Et){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),ba=Ft.length-1;ba>12&&Ft[ba-1]===Ft[ba];ba--)Ft.pop();He.predBGs.UAM=Ft,na=o(Ft[Ft.length-1]),Ft[Ft.length-1]&&(Ct=Math.max(Ct,o(Ft[Ft.length-1])))}He.eventualBG=Ct}console.error("UAM Impact:"+kt+"mg/dL per 5m; UAM Duration:"+va+"hours"),ia=Math.max(39,ia),sa=Math.max(39,sa),la=Math.max(39,la),Ut=o(ia);var Ma=l.mealCOB/l.carbs;aa=o(la<999&&sa<999?(1-Ma)*UAMpredBG+Ma*COBpredBG:sa<999?(ga+COBpredBG)/2:la<999?(ga+UAMpredBG)/2:ga),ca>aa&&(aa=ca),Ot=o(Ot=Wt||Xt>0?Et?Ma*ua+(1-Ma)*da:ua:Et?da:ma);var _a=la;if(cala&&(_a=(la+ca)/2);if(_a=o(_a),l.carbs)if(!Et&&sa<999)Ut=o(Math.max(ia,sa));else if(sa<999){var xa=Ma*sa+(1-Ma)*_a;Ut=o(Math.max(ia,sa,xa))}else Ut=Et?_a:Ot;else Et&&(Ut=o(Math.max(ia,_a)));Ut=Math.min(Ut,aa),process.stderr.write("minPredBG: "+Ut+" minIOBPredBG: "+ia+" minZTGuardBG: "+ca),sa<999&&process.stderr.write(" minCOBPredBG: "+sa),la<999&&process.stderr.write(" minUAMPredBG: "+la),console.error(" avgPredBG:"+aa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),pa>Ye&&(Ut=Math.min(Ut,pa)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(wt,i),He.deviation=n(Gt,i),He.ISF=n(_t,i),He.CR=o(Z,1),He.target_bg=n(ot,i),He.TDD=o(ce,2),He.current_target=o(ot,0);var Sa=He.CR;ke!=He.CR&&(Sa=ke+"→"+He.CR),He.reason=Mt+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+Sa+", Target: "+ht+", minPredBG "+n(Ut,i)+", minGuardBG "+n(Ot,i)+", IOBpredBG "+n(ra,i),oa>0&&(He.reason+=", COBpredBG "+n(oa,i)),na>0&&(He.reason+=", UAMpredBG "+n(na,i)),He.reason+=tddReason,.5!=i.smb_delivery_ratio&&(He.reason+=", SMB Ratio: "+i.smb_delivery_ratio),He.reason+="; ";var Da=Tt;Da<40&&(Da=Math.min(Ot,Da));var wa,Ga=U-Da,Ta=240,Ca=240;if(l.mealCOB>0&&(qt>0||Xt>0)){for(ba=0;bawa*Ye&&(console.error("maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - disabling SMB"),He.reason+="maxDelta "+n(rt,i)+" > "+100*wa+"% of BG "+n(Ye,i)+" - SMB disabled!, ",Pt=!1),console.error("BG projected to remain above "+n(nt,i)+" for "+Ta+"minutes"),(Ca<240||Ta<60)&&console.error("BG projected to remain above "+n(U,i)+" for "+Ca+"minutes");var Ua=Ca,Oa=i.current_basal*N*_t*Ua/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Aa=(Ga-Oa)/csf-Ra;Oa=o(Oa),Aa=o(Aa),console.error("naive_eventualBG:",Tt,"bgUndershoot:",Ga,"zeroTempDuration:",Ua,"zeroTempEffect:",Oa,"carbsReq:",Aa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Aa>=i.carbsReqThreshold&&Ca<=45&&(He.carbsReq=Aa,He.reason+=Aa+" add'l carbs req w/in "+Ca+"m; ");var Ia=0;if(Ye0&&tt>Rt)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*N*20/60,2),He.reason+=" and minDelta "+n(tt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(Ye=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Fa=0,ja=Je,Pa=0;if(CtRt&&tt>0&&!Aa)return Tt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>tt?He.reason+=", but Delta "+n(Qe,i)+" > expectedDelta "+n(Rt,i):He.reason+=", but Min. Delta "+tt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Fa=o(Fa=2*Math.min(0,(Ct-ot)/_t),2);var Ea=Math.min(0,(Tt-ot)/_t);if(Ea=o(Ea,2),tt<0&&tt>Rt)Fa=o(Fa*(tt/Rt),2);ja=r(ja=Je+2*Fa,i),Pa=t.duration*(t.rate-Je)/60;var qa=Math.min(Fa,Ea);if(console.log("naiveInsulinReq:"+Ea),Pa5&&ja>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+ja+"U/hr. ",He;if(ja<=0){if((Ia=o(60*((Ga=ot-Tt)/_t)/i.current_basal*N))<0?Ia=0:(Ia=30*o(Ia/30),Ia=Math.min(120,Math.max(0,Ia))),Ia>0)return He.reason+=", setting "+Ia+"m zero temp. ",u.setTempBasal(ja,Ia,i,He,t)}else He.reason+=", setting "+ja+"U/hr. ";return u.setTempBasal(ja,30,i,He,t)}if(tt=2||Rt+-1*tt>=2)&&(He.manualBolusErrorString=tt>=0&&Rt>0?3:tt<0&&Rt<=0||tt<0&&Rt>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),!d||!Pt))return e.delta "+n(nt,i)+" but Delta "+n(Qe,i)+" < Exp. Delta "+n(Rt,i):He.reason+="Eventual BG "+n(Ct,i)+" > "+n(nt,i)+" but Min. Delta "+tt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Ct,Ut)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/_t,2),He.minPredBG=Ut),!d||!Pt))return He.reason+=n(Ct,i)+"-"+n(Ut,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Ct>=it&&(He.reason+="Eventual BG "+n(Ct,i)+" >= "+n(it,i)+", ",Ct>it&&(He.insulinForManualBolus=o((Ct-ot)/_t,2))),a.iob>lt)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+lt,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Fa=o((Math.min(Ut,Ct)-ot)/_t,2),C=o((Ct-ot)/_t,2),Fa>lt-a.iob?(console.error("SMB limited by maxIOB: "+lt-a.iob+" (. insulinReq: "+Fa+" U)"),He.reason+="max_iob "+lt+", ",Fa=lt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Fa+" U)."),C>lt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+lt-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+lt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),ja=r(ja=Je+2*Fa,i),Fa=o(Fa,3),He.insulinReq=Fa;var Wa=o((new Date(Ke).getTime()-a.lastBolusTime)/6e4,1);if(d&&Pt&&Ye>U){var ka=30;void 0!==i.maxSMBBasalMinutes&&(ka=i.maxSMBBasalMinutes);var La=30;void 0!==i.maxUAMSMBBasalMinutes&&(La=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==ka&&(console.error("SMB Max Minutes - setting overriden from "+ka+" to "+G),ka=G),v.useOverride&&M&&T!==La&&(console.error("UAM Max Minutes - setting overriden from "+La+" to "+T),La=T);var za=o(l.mealCOB/Z,3),Na=0;void 0===ka?(Na=o(i.current_basal*N*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Fa>Na&&console.error("SMB limited by maxBolus: "+Na+" ( "+Fa+" U)")):a.iob>za&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+za),La?(console.error("maxUAMSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*N),Na=o(i.current_basal*N*La/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Na=o(i.current_basal*N*30/60,1)),Fa>Na?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+La+"m ]: "+Na+"U ( "+Fa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Fa+"U )")):(console.error(".maxSMBBasalMinutes: "+ka+", profile.current_basal: "+i.current_basal*N),Fa>(Na=o(i.current_basal*ka/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+ka+"m ]: "+Na+"U ( insulinReq: "+Fa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Fa+"U )"));var Ha=i.bolus_increment,Za=1/Ha,$a=i.smb_delivery_ratio;$a>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o($a,2));var Ja=Math.min(Fa*$a,Na);Ja=Math.floor(Ja*Za)/Za,Ia=o(60*((ot-(Tt+ia)/2)/_t)/i.current_basal*N),Fa>0&&Ja=30?(Ia=30*o(Ia/30),Ia=Math.min(60,Math.max(0,Ia))):(Ka=o(Je*Ia/30,2),Ia=30),He.reason+=" insulinReq "+Fa,Ja>=Na&&(He.reason+="; maxBolus "+Na),Ia>0&&(He.reason+="; setting "+Ia+"m low temp of "+Ka+"U/h"),He.reason+=". ";var Qa=3;i.SMBInterval&&(Qa=Math.min(10,Math.max(1,i.SMBInterval)));var Va=o(Qa-Wa,0),Xa=o(60*(Qa-Wa),0)%60;if(console.error("naive_eventualBG "+Tt+","+Ia+"m "+Ka+"U/h temp needed; last bolus "+Wa+"m ago; maxBolus: "+Na),Wa>Qa?Ja>0&&(He.units=Ja,He.reason+="Microbolusing "+Ja+"U. "):He.reason+="Waiting "+Va+"m "+Xa+"s to microbolus again. ",Ia>0)return He.rate=Ka,He.duration=Ia,He}var Ya=u.getMaxSafeBasal(i);return 400==Ye?u.setTempBasal(i.current_basal,30,i,He,t):(ja>Ya&&(He.reason+="adj. req. rate: "+ja+" to maxSafeBasal: "+o(Ya,2)+", ",ja=r(Ya,i)),(Pa=t.duration*(t.rate-Je)/60)>=2*Fa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)):t.duration>5&&r(ja,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+ja+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+ja+"U/hr. ",u.setTempBasal(ja,30,i,He,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v){var f=i.min_bg,B=v.overrideTarget;0!=B&&6!=B&&v.useOverride&&!i.temptargetSet&&(f=B);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=h.useNewFormula,U=0,O=f,A=0,R="",I="",F="",j="",P="",E="",q=0,W=0,k=0,L=0,z=0,N=0;const H=v.weightedAverage;var Z=1,$=i.sens,J=i.carb_ratio;v.useOverride&&(Z=v.overridePercentage/100,_?($/=Z,J/=Z):(x&&(J/=Z),y&&($/=Z)));const K=i.weightPercentage,Q=v.average_total_data;function V(e,t){var a=e.getTime();return new Date(a+36e5*t)}function X(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Y(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function ee(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const te=Math.min(i.autosens_min,i.autosens_max),ae=Math.max(i.autosens_min,i.autosens_max);function re(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Y(r),u=p[0].rate;for(let e=0;e=(s=ee(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=ee(d,l))?n=s:o=(s=ee("23:59:59",l))?n=s:o0&&o1)&&(C=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(C){let e=g.length-1;var oe=new Date(g[e].timestamp),ne=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ne=new Date),(A=(ne-oe)/36e5)<23.9&&A>21)z=re(oe,(ie=24-A,se=oe.getTime(),new Date(se-36e5*ie))),j="24 hours of data is required for an accurate tdd calculation. Currently only "+A.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+z.toPrecision(5)+" U. ";else A<21?(C=!1,enableDynamicCR=!1):j=""}}else console.log("Pumphistory is empty!"),C=!1,enableDynamicCR=!1;var ie,se;if(C){for(let e=0;e0){q=e,N=g[e].rate;var le=g[e-1]["duration (min)"]/60,ue=le,me=new Date(g[e-1].timestamp),de=me,ce=0;do{if(e--,0==e){de=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){de=new Date(g[e].timestamp);break}var ge=e-2;if(ge>=0&&"Rewind"==g[ge]._type){let e=g[ge].timestamp;for(;ge-1>=0&&"Prime"==g[ge-=1]._type;)ce=(g[ge].timestamp-e)/36e5;ce>=le&&(de=e,ce=0)}}while(e>0);var he=(de-me)/36e5;he0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(z+=re(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var pe=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){pe=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(pe=new Date,t=g[e]["duration (min)"]/60),(pe-a)/36e5-t>0){z+=re(pe,V(a,t))}}var ve={TDD:o(W=L+k+z,5),bolus:o(L,5),temp_basal:o(k,5),scheduled_basal:o(z,5)};A>21?(I=". Bolus insulin: "+L.toPrecision(5)+" U",F=". Temporary basal insulin: "+k.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+z.toPrecision(5)+" U",P=j+(" TDD past 24h is: "+W.toPrecision(5)+" U")+I+F+R,E=", TDD: "+o(W,2)+" U, "+o(L/W*100,0)+"% Bolus "+o((k+z)/W*100,0)+"% Basal"):E=", TDD: Not enough pumpData (< 21h)"}var fe;const Be=e.glucose,be=h.enableDynamicCR,Me=h.adjustmentFactor,_e=f;var ye=!1,xe="",Se=1,De="";Q>0&&(Se=H/Q),De=Se>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(Se=o(Se=Math.min(Se,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":Se<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(Se=o(Se=Math.max(Se,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+Se,De=", Basal ratio: "+Se,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(ye=!0),_e>=118&&ye&&(C=!1,xe="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+_e);var we=", Dynamic ratios log: ",Ge=", AF: "+Me,Te="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Ce="",Ue="";const Oe=h.curve,Ae=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ie=55,Fe=65;switch(Oe){case"rapid-acting":Fe=65;break;case"ultra-rapid":Fe=50}Re?(Ie=120-Ae,console.log("Custom insulinpeakTime set to :"+Ae+", insulinFactor: "+Ie)):(Ie=120-Fe,console.log("insulinFactor set to : "+Ie)),fe=W,K<1&&H>0&&(W=H,console.log("Using weighted TDD average: "+o(W,2)+" U, instead of past 24 h ("+o(fe,2)+" U), weight: "+K),Ue=", Weighted TDD: "+o(W,2)+" U");const je=h.sigmoid;var Pe="";if(C){var Ee=$*Me*W*Math.log(Be/Ie+1)/1800;Ce=", Logarithmic formula"}if(C&&je){const e=te,t=ae-e,a=.0555*(Be-f);var qe=Se,We=ae-1;1==ae&&(We=ae+.01-1);const r=Math.log10(1/We-e/We)/Math.log10(Math.E),o=a*Me*qe+r;Ee=t/(1+Math.exp(-o))+e,Ce=", Sigmoid function"}var ke=J;const Le=o(J,1);var ze="",Ne="";if(C&&W>0){if(ze=", Dynamic ISF/CR: On/",Ee>ae?(xe=", Dynamic ISF limited by autosens_max setting: "+ae+" ("+o(Ee,2)+"), ",Ne=", Autosens/Dynamic Limit: "+ae+" ("+o(Ee,2)+")",Ee=ae):Ee-.5?"+"+o(e.delta,0):o(e.delta,0);var at=Math.min(e.delta,e.short_avgdelta),rt=Math.min(e.short_avgdelta,e.long_avgdelta),ot=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(et<=10||38===et||tt>=3)&&(Ze.reason="CGM is calibrating, in ??? state, or noise is high");if(et>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=et&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(et,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=et&&!0),Ye>12||Ye<-5?Ze.reason="If current system time "+Qe+" is correct, then BG data is too old. The last BG data was read "+Ye+"m ago at "+Xe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=et&&(e.last_cal&&e.last_cal<3?Ze.reason="CGM was just calibrated":Ze.reason="CGM data is unchanged ("+n(et,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=et&&(et<=10||38===et||tt>=3||Ye>12||Ye<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ke?(Ze.reason+=". Canceling high temp basal of "+t.rate,Ze.deliverAt=$e,Ze.temp="absolute",Ze.duration=0,Ze.rate=0,Ze):0===t.rate&&t.duration>30?(Ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",Ze.deliverAt=$e,Ze.temp="absolute",Ze.duration=30,Ze.rate=0,Ze):(Ze.reason+=". Temp "+t.rate+" <= current basal "+Ke+"U/hr; doing nothing. ",Ze);var nt,it,st,lt,ut=i.max_iob;if(void 0!==f&&(it=f),void 0!==i.max_bg&&(st=f),void 0!==i.enableSMB_high_bg_target&&(lt=i.enableSMB_high_bg_target),void 0===f)return Ze.error="Error: could not determine target_bg. ",Ze;nt=f;var mt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,ct=160;if(ct=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ct=e}else console.log("Default Half Basal Target used: "+n(ct,i)+" "+i.out_units);if(mt&&i.temptargetSet&&nt>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&nt=nt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(Se,2)+", TDD 24h = "+o(fe,2)+"U, Weighted average TDD = "+o(H,2)+"U, (Weight percentage = "+K+"), Total data of TDDs (up to 14 days) average = "+o(Q,2)+"U. "),Ke!==Je*Z?process.stderr.write("Adjusting basal from "+Je*Z+" U/h to "+Ke+" U/h; "):process.stderr.write("Basal unchanged: "+Ke+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){it=o((it-60)/s.ratio)+60,st=o((st-60)/s.ratio)+60;var ht=o((nt-60)/s.ratio)+60;nt===(ht=Math.max(80,ht))?process.stderr.write("target_bg unchanged: "+n(ht,i)+"; "):process.stderr.write("target_bg from "+n(ht,i)+" to "+n(ht,i)+"; "),nt=ht}var pt=n(nt,i);nt!=f&&(pt=0!==B&&6!==B&&B!==nt?n(f,i)+"→"+n(B,i)+"→"+n(nt,i):n(f,i)+"→"+n(nt,i));var vt=200,ft=200,Bt=200;if(e.noise>=2){var bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);vt=o(Math.min(200,it*bt)),ft=o(Math.min(200,nt*bt)),Bt=o(Math.min(200,st*bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(ht,i)+" to "+n(ft,i)+"; "),it=vt,nt=ft,st=Bt}O=it-.5*(it-40);var Mt=i.threshold_setting;Mt>O&&Mt<=120&&Mt>=65?(console.error("Threshold changed in settings from "+n(O,i)+" to "+n(Mt,i)+". "),O=Mt):console.error("Current threshold: "+n(O,i));var _t="",yt=(o($,1),$);if(void 0!==s&&s&&((yt=o(yt=$/sensitivityRatio,1))!==$?process.stderr.write("ISF from "+n($,i)+" to "+n(yt,i)):process.stderr.write("ISF unchanged: "+n(yt,i)),_t+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n($,i)+"→"+n(yt,i)),console.error("CR:"+J),void 0===a)return Ze.error="Error: iob_data undefined. ",Ze;var xt,St=a;if(a.length,a.length>1&&(a=St[0]),void 0===a.activity||void 0===a.iob)return Ze.error="Error: iob_data missing some property. ",Ze;var Dt=((xt=void 0!==a.lastTemp?o((new Date(Qe).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+xt+"m, tempModulus:"+Dt+"m"),Ze.temp="absolute",Ze.deliverAt=$e,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&xt>10&&t.duration)return Ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,Ze,t);if(t&&a.lastTemp&&t.duration>0){var wt=xt-a.lastTemp.duration;if(wt>5&&xt>10)return Ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+wt+"m ago; canceling temp",u.setTempBasal(0,0,i,Ze,t)}var Gt=o(-a.activity*yt*5,2),Tt=o(6*(at-Gt));Tt<0&&(Tt=o(6*(rt-Gt)))<0&&(Tt=o(6*(e.long_avgdelta-Gt)));var Ct=et,Ut=(Ct=a.iob>0?o(et-a.iob*yt):o(et-a.iob*Math.min(yt,$)))+Tt;if(void 0===Ut||isNaN(Ut))return Ze.error="Error: could not calculate eventualBG. Sensitivity: "+yt+" Deviation: "+Tt,Ze;var Ot,At,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(nt,Ut,Gt);Ze={temp:"absolute",bg:et,tick:Ve,eventualBG:Ut,insulinReq:0,reservoir:d,deliverAt:$e,sensitivityRatio,CR:o(J,1),TDD:fe,insulin:ve,current_target:nt,insulinForManualBolus:U,manualBolusErrorString:0,minDelta:at,expectedDelta:Rt,minGuardBG:At,minPredBG:Ot,threshold:n(O,i)};var It=[],Ft=[],jt=[],Pt=[];It.push(et),Ft.push(et),Pt.push(et),jt.push(et);var Et=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,et,nt,lt);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Et=!1),wzt&&(console.error("Limiting carb impact from "+Wt+" to "+zt+"mg/dL/5m (30g/h)"),Wt=zt);var Nt=3;sensitivityRatio&&(Nt/=sensitivityRatio);var Ht=Nt;if(l.carbs){Nt=Math.max(Nt,l.mealCOB/20);var Zt=o((new Date(Qe).getTime()-l.lastCarbTime)/6e4),$t=(l.carbs-l.mealCOB)/l.carbs;Ht=o(Ht=Nt+1.5*Zt/60,1),console.error("Last carbs "+Zt+" minutes ago; remainingCATime:"+Ht+"hours; "+o(100*$t,1)+"% carbs absorbed")}var Jt=Math.max(0,Wt/5*60*Ht/2)/csf,Kt=90,Qt=1;i.remainingCarbsCap&&(Kt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Qt=Math.min(1,i.remainingCarbsFraction));var Vt=1-Qt,Xt=Math.max(0,l.mealCOB-Jt-l.carbs*Vt),Yt=(Xt=Math.min(Kt,Xt))*csf*5/60/(Ht/2),ea=o(l.slopeFromMaxDeviation,2),ta=o(l.slopeFromMinDeviation,2),aa=Math.min(ea,-ta/3);kt=0===Wt?0:Math.min(60*Ht/5/2,Math.max(0,l.mealCOB*csf/Wt)),console.error("Carb Impact:"+Wt+"mg/dL per 5m; CI Duration:"+o(5*kt/60*2,1)+"hours; remaining CI ("+Ht/2+"h peak):"+o(Yt,1)+"mg/dL per 5m");var ra,oa,na,ia,sa=999,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=Ut,pa=et,va=et,fa=0,Ba=[],ba=[];try{St.forEach((function(e){var t=o(-e.activity*yt*5,2),a=o(-e.iobWithZeroTemp.activity*yt*5,2),r=Ct,n=Wt*(1-Math.min(1,Ft.length/12));if(!0===(C&&!je))ha=Ft[Ft.length-1]+o(-e.activity*(1800/(W*Me*Math.log(Math.max(Ft[Ft.length-1],39)/Ie+1)))*5,2)+n,r=Pt[Pt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(W*Me*Math.log(Math.max(Pt[Pt.length-1],39)/Ie+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ha,2)+" , ZTpredBG: "+o(r,2));else ha=Ft[Ft.length-1]+t+n,r=Pt[Pt.length-1]+a;var i=Math.max(0,Math.max(0,Wt)*(1-It.length/Math.max(2*kt,1))),s=Math.min(It.length,12*Ht-It.length),l=Math.max(0,s/(Ht/2*12)*Yt);i+l,Ba.push(o(l,0)),ba.push(o(i,0)),COBpredBG=It[It.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Lt+jt.length*aa),m=Math.max(0,Lt*(1-jt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(fa=o(5*(jt.length+1)/60,1)),!0===(C&&!je))UAMpredBG=jt[jt.length-1]+o(-e.activity*(1800/(W*Me*Math.log(Math.max(jt[jt.length-1],39)/Ie+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=jt[jt.length-1]+t+Math.min(0,n)+d;Ft.length<48&&Ft.push(ha),It.length<48&&It.push(COBpredBG),jt.length<48&&jt.push(UAMpredBG),Pt.length<48&&Pt.push(r),COBpredBG18&&hapa&&(pa=ha),(kt||Yt>0)&&It.length>18&&COBpredBG0)&&COBpredBG>pa&&(va=COBpredBG),qt&&jt.length>12&&UAMpredBGpa&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+ba.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),Ze.predBGs={},Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ma=Ft.length-1;Ma>12&&Ft[Ma-1]===Ft[Ma];Ma--)Ft.pop();for(Ze.predBGs.IOB=Ft,oa=o(Ft[Ft.length-1]),Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=Pt.length-1;Ma>6&&!(Pt[Ma-1]>=Pt[Ma]||Pt[Ma]<=nt);Ma--)Pt.pop();if(Ze.predBGs.ZT=Pt,o(Pt[Pt.length-1]),l.mealCOB>0&&(Wt>0||Yt>0)){for(It.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ma=It.length-1;Ma>12&&It[Ma-1]===It[Ma];Ma--)It.pop();Ze.predBGs.COB=It,na=o(It[It.length-1]),Ut=Math.max(Ut,o(It[It.length-1])),console.error("COBpredBG: "+o(It[It.length-1]))}if(Wt>0||Yt>0){if(qt){for(jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=jt.length-1;Ma>12&&jt[Ma-1]===jt[Ma];Ma--)jt.pop();Ze.predBGs.UAM=jt,ia=o(jt[jt.length-1]),jt[jt.length-1]&&(Ut=Math.max(Ut,o(jt[jt.length-1])))}Ze.eventualBG=Ut}console.error("UAM Impact:"+Lt+"mg/dL per 5m; UAM Duration:"+fa+"hours"),sa=Math.max(39,sa),la=Math.max(39,la),ua=Math.max(39,ua),Ot=o(sa);var _a=l.mealCOB/l.carbs;ra=o(ua<999&&la<999?(1-_a)*UAMpredBG+_a*COBpredBG:la<999?(ha+COBpredBG)/2:ua<999?(ha+UAMpredBG)/2:ha),ga>ra&&(ra=ga),At=o(At=kt||Yt>0?qt?_a*ma+(1-_a)*da:ma:qt?da:ca);var ya=ua;if(gaua&&(ya=(ua+ga)/2);if(ya=o(ya),l.carbs)if(!qt&&la<999)Ot=o(Math.max(sa,la));else if(la<999){var Sa=_a*la+(1-_a)*ya;Ot=o(Math.max(sa,la,Sa))}else Ot=qt?ya:At;else qt&&(Ot=o(Math.max(sa,ya)));Ot=Math.min(Ot,ra),process.stderr.write("minPredBG: "+Ot+" minIOBPredBG: "+sa+" minZTGuardBG: "+ga),la<999&&process.stderr.write(" minCOBPredBG: "+la),ua<999&&process.stderr.write(" minUAMPredBG: "+ua),console.error(" avgPredBG:"+ra+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),va>et&&(Ot=Math.min(Ot,va)),Ze.COB=l.mealCOB,Ze.IOB=a.iob,Ze.BGI=n(Gt,i),Ze.deviation=n(Tt,i),Ze.ISF=n(yt,i),Ze.CR=o(J,1),Ze.target_bg=n(nt,i),Ze.TDD=o(fe,2),Ze.current_target=o(nt,0);var Da=Ze.CR;Le!=Ze.CR&&(Da=Le+"→"+Ze.CR),Ze.reason=_t+", COB: "+Ze.COB+", Dev: "+Ze.deviation+", BGI: "+Ze.BGI+", CR: "+Da+", Target: "+pt+", minPredBG "+n(Ot,i)+", minGuardBG "+n(At,i)+", IOBpredBG "+n(oa,i),na>0&&(Ze.reason+=", COBpredBG "+n(na,i)),ia>0&&(Ze.reason+=", UAMpredBG "+n(ia,i)),Ze.reason+=E,.5!=i.smb_delivery_ratio&&(Ze.reason+=", SMB Ratio: "+i.smb_delivery_ratio),Ze.reason+="; ";var wa=Ct;wa<40&&(wa=Math.min(At,wa));var Ga,Ta=O-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(Wt>0||Yt>0)){for(Ma=0;MaGa*et&&(console.error("maxDelta "+n(ot,i)+" > "+100*Ga+"% of BG "+n(et,i)+" - disabling SMB"),Ze.reason+="maxDelta "+n(ot,i)+" > "+100*Ga+"% of BG "+n(et,i)+" - SMB disabled!, ",Et=!1),console.error("BG projected to remain above "+n(it,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(O,i)+" for "+Ua+"minutes");var Oa=Ua,Aa=i.current_basal*Z*yt*Oa/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Aa)/csf-Ra;Aa=o(Aa),Ia=o(Ia),console.error("naive_eventualBG:",Ct,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Aa,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(Ze.carbsReq=Ia,Ze.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(et0&&at>Rt)Ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*Z*20/60,2),Ze.reason+=" and minDelta "+n(at,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(et=55)return Ze.reason+="; Canceling temp at "+Ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,Ze,t);var ja=0,Pa=Ke,Ea=0;if(UtRt&&at>0&&!Ia)return Ct<40?(Ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,Ze,t)):(e.delta>at?Ze.reason+=", but Delta "+n(Ve,i)+" > expectedDelta "+n(Rt,i):Ze.reason+=", but Min. Delta "+at.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t)));ja=o(ja=2*Math.min(0,(Ut-nt)/yt),2);var qa=Math.min(0,(Ct-nt)/yt);if(qa=o(qa,2),at<0&&at>Rt)ja=o(ja*(at/Rt),2);Pa=r(Pa=Ke+2*ja,i),Ea=t.duration*(t.rate-Ke)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return Ze.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",Ze;if(Pa<=0){if((Fa=o(60*((Ta=nt-Ct)/yt)/i.current_basal*Z))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return Ze.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,Ze,t)}else Ze.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,Ze,t)}if(at=2||Rt+-1*at>=2)&&(Ze.manualBolusErrorString=at>=0&&Rt>0?3:at<0&&Rt<=0||at<0&&Rt>=0?4:5),Ze.insulinForManualBolus=o((Ze.eventualBG-Ze.target_bg)/yt,2),!m||!Et))return e.delta "+n(it,i)+" but Delta "+n(Ve,i)+" < Exp. Delta "+n(Rt,i):Ze.reason+="Eventual BG "+n(Ut,i)+" > "+n(it,i)+" but Min. Delta "+at.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));if(Math.min(Ut,Ot)it&&(Ze.manualBolusErrorString=6,Ze.insulinForManualBolus=o((Ze.eventualBG-Ze.target_bg)/yt,2),Ze.minPredBG=Ot),!m||!Et))return Ze.reason+=n(Ut,i)+"-"+n(Ot,i)+" in range: no temp required",t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));if(Ut>=st&&(Ze.reason+="Eventual BG "+n(Ut,i)+" >= "+n(st,i)+", ",Ut>st&&(Ze.insulinForManualBolus=o((Ut-nt)/yt,2))),a.iob>ut)return Ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+ut,t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));ja=o((Math.min(Ot,Ut)-nt)/yt,2),U=o((Ut-nt)/yt,2),ja>ut-a.iob?(console.error("SMB limited by maxIOB: "+ut-a.iob+" (. insulinReq: "+ja+" U)"),Ze.reason+="max_iob "+ut+", ",ja=ut-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),U>ut-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+ut-a.iob+" (. insulinForManualBolus: "+U+" U)"),Ze.reason+="max_iob "+ut+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+U+" U)."),Pa=r(Pa=Ke+2*ja,i),ja=o(ja,3),Ze.insulinReq=ja;var ka=o((new Date(Qe).getTime()-a.lastBolusTime)/6e4,1);if(m&&Et&&et>O){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/J,3),Ha=0;void 0===La?(Ha=o(i.current_basal*Z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*Z),Ha=o(i.current_basal*Z*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*Z*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*Z),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((nt-(Ct+sa)/2)/yt)/i.current_basal*Z),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Ke*Fa/30,2),Fa=30),Ze.reason+=" insulinReq "+ja,Ka>=Ha&&(Ze.reason+="; maxBolus "+Ha),Fa>0&&(Ze.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),Ze.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Ct+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(Ze.units=Ka,Ze.reason+="Microbolusing "+Ka+"U. "):Ze.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return Ze.rate=Qa,Ze.duration=Fa,Ze}var er=u.getMaxSafeBasal(i);return 400==et?u.setTempBasal(i.current_basal,30,i,Ze,t):(Pa>er&&(Ze.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Ke)/60)>=2*ja?(Ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)):void 0===t.duration||0===t.duration?(Ze.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(Ze.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",Ze):(Ze.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); diff --git a/FreeAPS/Sources/Models/Configs.swift b/FreeAPS/Sources/Models/Configs.swift index 4573bf9815..da9b8959a6 100644 --- a/FreeAPS/Sources/Models/Configs.swift +++ b/FreeAPS/Sources/Models/Configs.swift @@ -22,22 +22,32 @@ public enum IAPSconfig { extension Font { static let buttonFont = Font.custom("TimeButtonFont", fixedSize: 14) // Same as Eventual BG size - static let loopFont = Font.custom("LoopFont", fixedSize: 18) // Loop min ago - static let statusFont = Font.custom("StatusFont", fixedSize: 16) // IOB, COB etc. - static let pumpFont = Font.custom("StatusFont", fixedSize: 15) - static let previewSmall = Font.custom("PreviewSmallFont", fixedSize: 12) - static let previewNormal = Font.custom("PreviewNormalFont", fixedSize: 18) - static let previewHeadline = Font.custom("PreviewHeadlineFont", fixedSize: 20) - static let extraSmall = Font.custom("ExtraSmallFont", fixedSize: 14) + + static let loopFont = Font.custom("LoopFont", size: 13) // Loop min ago + static let statusFont = Font.custom("StatusFont", size: 16) // IOB, COB etc. + static let pumpFont = Font.custom("PumpFont", size: 16) + + static let previewSmall = Font.custom("PreviewSmallFont", size: 14) + static let previewNormal = Font.custom("PreviewNormalFont", size: 16) + static let previewHeadline = Font.custom("PreviewHeadlineFont", size: 18) + static let extraSmall = Font.custom("ExtraSmallFont", size: 12) static let suggestionHeadline = Font.custom("SuggestionHeadlineFont", fixedSize: 20) static let suggestionError = Font.custom("SuggestionErrorFone", fixedSize: 18) static let suggestionParts = Font.custom("SuggestionPartsFont", fixedSize: 17) static let suggestionSmallParts = Font.custom("SuggestionSmallPartsFont", fixedSize: 16) - static let glucoseFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 45) - static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", fixedSize: 24) + static let glucoseFont = Font.custom("SuggestionSmallPartsFont", size: 45) + static let glucoseSmallFont = Font.custom("SuggestionSmallPartsFont", size: 24) + static let bolusProgressStopFont = Font.custom("BolusProgressStop", fixedSize: 24) static let bolusProgressFont = Font.custom("BolusProgress", fixedSize: 20) static let bolusProgressBarFont = Font.custom("BolusProgressBarFont", fixedSize: 18) + + static let chartTimeFont = Font.custom("ChartTimeFont", fixedSize: 14) + static let timeSettingFont = Font.custom("TimeSettingFont", fixedSize: 14) + + static let carbsDotFont = Font.custom("CarbsDotFont", fixedSize: 14) + static let bolusDotFont = Font.custom("BolusDotFont", fixedSize: 14) + static let announcementSymbolFont = Font.custom("AnnouncementSymbolFont", fixedSize: 14) } diff --git a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift index baa12570e6..93b3c31a8d 100644 --- a/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift +++ b/FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift @@ -124,6 +124,7 @@ extension AddCarbs { mealPresets } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear { configureView { state.loadEntries(editMode) @@ -159,7 +160,7 @@ extension AddCarbs { isPromptPresented = false } label: { Text("Cancel") } } header: { Text("Enter Meal Preset Name") } - } + }.dynamicTypeSize(...DynamicTypeSize.xxLarge) } private var empty: Bool { @@ -239,7 +240,7 @@ extension AddCarbs { if state.selection != nil { plusButton } - } + }.dynamicTypeSize(...DynamicTypeSize.xxLarge) HStack { Button("Delete Preset") { diff --git a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift index 6ccf9256ae..fd7323bf26 100644 --- a/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift +++ b/FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift @@ -135,6 +135,7 @@ extension AddTempTarget { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear { configureView() state.hbt = isEnabledArray.first?.hbt ?? 160 diff --git a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift index fce80922a1..9859a588ce 100644 --- a/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift +++ b/FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift @@ -106,6 +106,7 @@ extension AutotuneConfig { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Autotune") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/BasalProfileEditor/View/BasalProfileEditorRootView.swift b/FreeAPS/Sources/Modules/BasalProfileEditor/View/BasalProfileEditorRootView.swift index f0de233099..1a68aa50a6 100644 --- a/FreeAPS/Sources/Modules/BasalProfileEditor/View/BasalProfileEditorRootView.swift +++ b/FreeAPS/Sources/Modules/BasalProfileEditor/View/BasalProfileEditorRootView.swift @@ -51,6 +51,7 @@ extension BasalProfileEditor { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Basal Profile") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index d663944078..b7bb69068f 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -179,6 +179,7 @@ extension Bolus { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 0af99e7106..2984562449 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -136,6 +136,7 @@ extension Bolus { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .alert(isPresented: $displayError) { Alert( title: Text("Warning!"), diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift index bbb379a520..14da146278 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift @@ -67,6 +67,7 @@ extension BolusCalculatorConfig { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Bolus Calculator") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift index 45dad02ad9..c4cb9fc683 100644 --- a/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift +++ b/FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift @@ -83,6 +83,7 @@ extension CGM { Toggle("Smooth Glucose Value", isOn: $state.smoothGlucose) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("CGM") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/CREditor/View/CREditorRootView.swift b/FreeAPS/Sources/Modules/CREditor/View/CREditorRootView.swift index 80fc0cd50f..2eb1d1e9c4 100644 --- a/FreeAPS/Sources/Modules/CREditor/View/CREditorRootView.swift +++ b/FreeAPS/Sources/Modules/CREditor/View/CREditorRootView.swift @@ -48,6 +48,7 @@ extension CREditor { .disabled(state.items.isEmpty) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Carb Ratios") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/Calibrations/View/CalibrationsRootView.swift b/FreeAPS/Sources/Modules/Calibrations/View/CalibrationsRootView.swift index e7fde5af95..8bfaead27c 100644 --- a/FreeAPS/Sources/Modules/Calibrations/View/CalibrationsRootView.swift +++ b/FreeAPS/Sources/Modules/Calibrations/View/CalibrationsRootView.swift @@ -95,6 +95,7 @@ extension Calibrations { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Calibrations") .navigationBarItems(trailing: EditButton().disabled(state.calibrations.isEmpty)) diff --git a/FreeAPS/Sources/Modules/ConfigEditor/View/ConfigEditorRootView.swift b/FreeAPS/Sources/Modules/ConfigEditor/View/ConfigEditorRootView.swift index fb46b233a3..3354243b8f 100644 --- a/FreeAPS/Sources/Modules/ConfigEditor/View/ConfigEditorRootView.swift +++ b/FreeAPS/Sources/Modules/ConfigEditor/View/ConfigEditorRootView.swift @@ -31,6 +31,7 @@ extension ConfigEditor { .sheet(isPresented: $showShareSheet) { ShareSheet(activityItems: [state.provider.urlFor(file: state.file)!]) } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear { configureView { state.file = file diff --git a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift index b3f1dcd231..58bb8280b7 100644 --- a/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift +++ b/FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift @@ -74,6 +74,7 @@ extension DataTable { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("History") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 1094544a48..aefef60236 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -46,7 +46,7 @@ extension Dynamic { if state.useNewFormula { Section { HStack { - Toggle("Use Sigmoid Formula", isOn: $state.sigmoid) + Toggle("Use Sigmoid Function", isOn: $state.sigmoid) } } header: { Text("Formula") } @@ -78,6 +78,7 @@ extension Dynamic { } } header: { Text("Safety") } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Dynamic ISF") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/FPUConfig/View/FPUConfigRootView.swift b/FreeAPS/Sources/Modules/FPUConfig/View/FPUConfigRootView.swift index e8588dabbf..49e95fe2ab 100644 --- a/FreeAPS/Sources/Modules/FPUConfig/View/FPUConfigRootView.swift +++ b/FreeAPS/Sources/Modules/FPUConfig/View/FPUConfigRootView.swift @@ -52,6 +52,7 @@ extension FPUConfig { ) {} } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Fat and Protein") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/HealthKit/View/AppleHealthKitRootView.swift b/FreeAPS/Sources/Modules/HealthKit/View/AppleHealthKitRootView.swift index 7b98e7caa8..df01e30ca5 100644 --- a/FreeAPS/Sources/Modules/HealthKit/View/AppleHealthKitRootView.swift +++ b/FreeAPS/Sources/Modules/HealthKit/View/AppleHealthKitRootView.swift @@ -28,6 +28,7 @@ extension AppleHealthKit { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Apple Health") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 9ebdeef235..9f3171d967 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -329,7 +329,7 @@ struct MainChartView: View { return Text(glucoseFormatter.string(from: value as NSNumber)!) .position(CGPoint(x: fullSize.width - 12, y: range.minY + CGFloat(line) * yStep)) - .font(.caption2) + .font(.bolusDotFont) .asAny() } } @@ -424,7 +424,7 @@ struct MainChartView: View { EmptyView() } else { Text(format.string(from: firstHourDate().addingTimeInterval(hour.hours.timeInterval))) - .font(.caption) + .font(.chartTimeFont) .position( x: firstHourPosition(viewWidth: fullSize.width) + oneSecondStep(viewWidth: fullSize.width) * @@ -489,7 +489,7 @@ struct MainChartView: View { info.note.contains("tempbasal") ? Command.tempbasal : Command.bolus VStack { - Text(type).font(.caption2).foregroundStyle(.orange) + Text(type).font(.announcementSymbolFont).foregroundStyle(.orange) Image("owl").resizable().frame(maxWidth: Config.owlSeize, maxHeight: Config.owlSeize).scaledToFill() }.position(position).asAny() } @@ -554,7 +554,7 @@ struct MainChartView: View { ForEach(bolusDots, id: \.rect.minX) { info -> AnyView in let position = CGPoint(x: info.rect.midX, y: info.rect.maxY + 8) - return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.caption2) + return Text(bolusFormatter.string(from: info.value as NSNumber)!).font(.bolusDotFont) .position(position) .asAny() } @@ -576,7 +576,7 @@ struct MainChartView: View { ForEach(carbsDots, id: \.rect.minX) { info -> AnyView in let position = CGPoint(x: info.rect.midX, y: info.rect.minY - 8) - return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.caption2) + return Text(carbsFormatter.string(from: info.value as NSNumber)!).font(.carbsDotFont) .position(position) .asAny() } @@ -625,7 +625,7 @@ struct MainChartView: View { private func overridesView(fullSize: CGSize) -> some View { ZStack { overridesPath - .fill(Color.purple.opacity(0.1)) + .fill(Color.purple.opacity(colorScheme == .light ? 0.1 : 0.3)) overridesPath .stroke(Color.purple.opacity(0.7), lineWidth: 1) } @@ -1085,12 +1085,13 @@ extension MainChartView { x: xStart, y: y - 3, width: xEnd - xStart, - height: 6 + height: 8 ) } if latest?.enabled ?? false { var old = Array(rects) - if (latest?.duration ?? 0) != 0 { + let duration = Double(latest?.duration ?? 0) + if duration > 0 { let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) let plusNow = (latest?.date ?? Date.now).addingTimeInterval(Int(latest?.duration ?? 0).minutes.timeInterval) let x2 = timeToXCoordinate(plusNow.timeIntervalSince1970, fullSize: fullSize) @@ -1101,7 +1102,7 @@ extension MainChartView { fullSize: fullSize ), width: x2 - x1, - height: 6 + height: 8 ) old.append(oneMore) let path = Path { path in @@ -1112,11 +1113,12 @@ extension MainChartView { } } else { let x1 = timeToXCoordinate((latest?.date ?? Date.now).timeIntervalSince1970, fullSize: fullSize) + let x2 = timeToXCoordinate(Date.now.timeIntervalSince1970, fullSize: fullSize) let oneMore = CGRect( x: x1, y: glucoseToYCoordinate(Int(Double(latest?.target ?? 100)), fullSize: fullSize), - width: additionalWidth(viewWidth: fullSize.width), - height: 6 + width: x2 - x1 + additionalWidth(viewWidth: fullSize.width), + height: 8 ) old.append(oneMore) let path = Path { path in diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 466f71287b..7fc599d481 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -17,6 +17,7 @@ struct CurrentGlucoseView: View { } @Environment(\.colorScheme) var colorScheme + @Environment(\.sizeCategory) private var fontSize private var glucoseFormatter: NumberFormatter { let formatter = NumberFormatter() @@ -55,8 +56,8 @@ struct CurrentGlucoseView: View { var body: some View { ZStack { - VStack(alignment: .center) { - // HStack { + VStack { + let offset: CGFloat = fontSize < .large ? 75 : (fontSize >= .large && fontSize < .extraExtraLarge) ? 80 : 85 ZStack { Text( (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose @@ -69,7 +70,7 @@ struct CurrentGlucoseView: View { .foregroundColor(alwaysUseColors ? colorOfGlucose : alarm == nil ? .primary : .loopRed) .frame(maxWidth: .infinity, alignment: .center) - HStack(spacing: 20) { + HStack(spacing: 10) { image .font(.system(size: 25)) VStack { @@ -92,8 +93,10 @@ struct CurrentGlucoseView: View { }.offset(x: 7, y: 0) } .font(.extraSmall).foregroundStyle(.secondary) - }.frame(maxWidth: .infinity, alignment: .trailing).padding(.trailing, 50) + }.frame(maxWidth: .infinity, alignment: .center) + .offset(x: offset, y: 0) } + .dynamicTypeSize(DynamicTypeSize.medium ... DynamicTypeSize.xxLarge) } } } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift index 897ecb1625..bece30b613 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/LoopView.swift @@ -22,11 +22,13 @@ struct LoopView: View { } @Environment(\.colorScheme) var colorScheme + @Environment(\.sizeCategory) private var fontSize var body: some View { VStack { + let multiplyForLargeFonts = fontSize > .extraLarge ? 1.2 : 1 LoopEllipse(stroke: color) - .frame(width: minutesAgo > 9 ? 70 : 60, height: 27) + .frame(width: minutesAgo > 9 ? 70 * multiplyForLargeFonts : 60 * multiplyForLargeFonts, height: 27) .overlay { let textColor: Color = .secondary HStack { @@ -34,18 +36,18 @@ struct LoopView: View { if closedLoop { if !isLooping, actualSuggestion?.timestamp != nil { if minutesAgo > 1440 { - Text("--").font(.extraSmall).foregroundColor(textColor).padding(.leading, 5) + Text("--").font(.loopFont).foregroundColor(textColor).padding(.leading, 5) } else { let timeString = "\(minutesAgo) " + NSLocalizedString("min", comment: "Minutes ago since last loop") - Text(timeString).font(.extraSmall).foregroundColor(textColor) + Text(timeString).font(.loopFont).foregroundColor(textColor) } } if isLooping { ProgressView() } } else if !isLooping { - Text("Open") + Text("Open").font(.loopFont) } } } diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift index 383a796539..3bfec68903 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PreviewView.swift @@ -209,8 +209,9 @@ struct PreviewChart: View { .padding(.bottom, 15) .frame(maxWidth: UIScreen.main.bounds.width / 5, alignment: .leading) }.frame(maxHeight: 200) - - }.padding(.top, 20).padding(.leading, 20) + } + .padding(.top, 20).padding(.leading, 20) + .dynamicTypeSize(...DynamicTypeSize.accessibility1) } private func previewTir() -> [(decimal: Decimal, string: String)] { diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index 3e0368b464..1e0c457853 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -40,24 +40,25 @@ struct PumpView: View { var body: some View { HStack(spacing: 10) { if let reservoir = reservoir { - HStack { - if reservoir == 0xDEAD_BEEF { - HStack(spacing: 0) { - Text("50+ ").font(.statusFont).bold() - Text(NSLocalizedString("U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) - } - } else { - HStack(spacing: 0) { - Text( - reservoirFormatter - .string(from: reservoir as NSNumber)! - ).font(.statusFont).bold() - Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) - } + if reservoir == 0xDEAD_BEEF { + HStack(spacing: 0) { + Text("50+ ").font(.statusFont).bold() + Text(NSLocalizedString("U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) + } + .offset(x: 0, y: expiresAtDate == nil ? -4 : 0) + } else { + HStack(spacing: 0) { + Text( + reservoirFormatter + .string(from: reservoir as NSNumber)! + ).font(.statusFont).bold() + Text(NSLocalizedString(" U", comment: "Insulin unit")).font(.statusFont).foregroundStyle(.secondary) } - }.offset(x: 0, y: expiresAtDate != nil ? 4 : 0) + .offset(x: 0, y: expiresAtDate == nil ? -4 : 0) + } } else { Text("No Pump").font(.statusFont).foregroundStyle(.secondary) + .offset(x: 0, y: -4) } if let battery = battery, !state.pumpName.contains("Omni") { @@ -69,52 +70,45 @@ struct PumpView: View { .aspectRatio(contentMode: .fit) .frame(maxHeight: 15) .foregroundColor(batteryColor) + .offset(x: 0, y: -4) } if let date = expiresAtDate { - HStack(spacing: 2) { - Image("pod_reservoir") - .resizable(resizingMode: .stretch) - .frame(width: IAPSconfig.iconSize * 1.15, height: IAPSconfig.iconSize * 1.6) - .foregroundColor(colorScheme == .dark ? .secondary : .white) - remainingTime(time: date.timeIntervalSince(timerDate)) - .font(.pumpFont) - } + Image("pod_reservoir") + .resizable(resizingMode: .stretch) + .frame(width: IAPSconfig.iconSize * 1.15, height: IAPSconfig.iconSize * 1.6) + .foregroundColor(colorScheme == .dark ? .secondary : .white) + .offset(x: 0, y: -5) + + remainingTime(time: date.timeIntervalSince(timerDate)) + .font(.pumpFont) } else if state.pumpName.contains("Omni") { Text("No Pod").font(.statusFont).foregroundStyle(.secondary) + .offset(x: 0, y: -4) } } + .offset(x: 0, y: 5) } private func remainingTime(time: TimeInterval) -> some View { - VStack { + HStack { if time > 0 { let days = Int(time / 1.days.timeInterval) let hours = Int(time / 1.hours.timeInterval) let minutes = Int(time / 1.minutes.timeInterval) if days >= 1 { - HStack(spacing: 0) { - Text(" \(days)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("d", comment: "abbreviation for days")) - Text("+") - } + Text(" \(days)" + NSLocalizedString("d", comment: "abbreviation for days" + "+")) } else if hours >= 1 { - HStack(spacing: 0) { - Text(" \(hours)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("h", comment: "abbreviation for hours")) - .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - } + Text(" \(hours)" + NSLocalizedString("h", comment: "abbreviation for hours")) + .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) } else { - HStack(spacing: 0) { - Text(" \(minutes)").foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - Text(NSLocalizedString("m", comment: "abbreviation for minutes")) - .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) - } + Text(" \(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes")) + .foregroundStyle(time < 4 * 60 * 60 ? .red : .primary) } } else { Text(NSLocalizedString("Replace", comment: "View/Header when pod expired")).foregroundStyle(.red) } - }.offset(x: 0, y: 4) + } } private var batteryColor: Color { diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index f7347d9288..226eb2f4fa 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -18,6 +18,7 @@ extension Home { @Environment(\.managedObjectContext) var moc @Environment(\.colorScheme) var colorScheme + @Environment(\.sizeCategory) private var fontSize @FetchRequest( entity: Override.entity(), @@ -157,7 +158,7 @@ extension Home { if state.apsManager.isManualTempBasal { manualBasalString = NSLocalizedString( - " - Manual Basal ⚠️", + " Manual", comment: "Manual Temp basal" ) } @@ -177,27 +178,29 @@ extension Home { HStack { if state.pumpSuspended { Text("Pump suspended") - .font(.custom("TempBasal", fixedSize: 13)).bold().foregroundColor(.loopGray) + .font(.extraSmall).bold().foregroundColor(.loopGray) } else if let tempBasalString = tempBasalString { Text(tempBasalString) - .font(.custom("TempBasal", fixedSize: 13)).bold() + .font(.statusFont).bold() .foregroundColor(.insulin) } if state.closedLoop, state.settingsManager.preferences.maxIOB == 0 { Text("Check Max IOB Setting").font(.extraSmall).foregroundColor(.orange) } } - .padding(.leading, 8) - .frame(maxWidth: .infinity, alignment: .leading) - - if let tempTargetString = tempTargetString, !(fetchedPercent.first?.enabled ?? false) { - Text(tempTargetString) - .font(.buttonFont) - .foregroundColor(.secondary) - } else { - profileView - } + } + .padding(.leading, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + if let tempTargetString = tempTargetString, !(fetchedPercent.first?.enabled ?? false) { + Text(tempTargetString) + .font(.buttonFont) + .foregroundColor(.secondary) + } else { + profileView + } + ZStack { if let eventualBG = state.eventualBG { HStack { Text("⇢").font(.statusFont).foregroundStyle(.secondary) @@ -216,6 +219,7 @@ extension Home { } } .frame(maxWidth: .infinity, maxHeight: 30, alignment: .bottom) + .dynamicTypeSize(...DynamicTypeSize.xxLarge) } var mainChart: some View { @@ -274,7 +278,6 @@ extension Home { height: IAPSconfig.buttonSize ) .foregroundColor(.gray) - .padding(8) } }.buttonStyle(.borderless) Spacer() @@ -287,7 +290,6 @@ extension Home { .foregroundColor(colorScheme == .dark ? .loopYellow : .orange) .padding(8) .foregroundColor(.loopYellow) - .padding(8) if let carbsReq = state.carbsRequired { Text(numberFormatter.string(from: carbsReq as NSNumber)!) .font(.caption) @@ -301,7 +303,7 @@ extension Home { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom)) { Image(systemName: isOverride ? "person.fill" : "person") .symbolRenderingMode(.palette) - .font(.custom("Buttons", size: 28)) + .font(.custom("Buttons", size: 30)) .foregroundStyle(.purple) .padding(8) .background(isOverride ? .purple.opacity(0.15) : .clear) @@ -348,7 +350,6 @@ extension Home { Image(systemName: "syringe") .renderingMode(.template) .font(.custom("Buttons", size: 24)) - .padding(8) } .buttonStyle(.borderless) .foregroundColor(.insulin) @@ -360,7 +361,6 @@ extension Home { .renderingMode(.template) .resizable() .frame(width: IAPSconfig.buttonSize, height: IAPSconfig.buttonSize, alignment: .bottom) - .padding(8) } .foregroundColor(.insulin) Spacer() @@ -370,14 +370,14 @@ extension Home { Image(systemName: "gear") .renderingMode(.template) .font(.custom("Buttons", size: 24)) - .padding(8) } .buttonStyle(.borderless) .foregroundColor(.gray) } - .padding(.horizontal, 24) + .padding(.horizontal, state.allowManualTemp ? 5 : 24) .padding(.bottom, geo.safeAreaInsets.bottom) } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .confirmationDialog("Cancel Profile Override", isPresented: $showCancelAlert) { Button("Cancel Profile Override", role: .destructive) { state.cancelProfile() @@ -405,12 +405,13 @@ extension Home { } } .frame( - minHeight: UIScreen.main.bounds.height / 1.48 + minHeight: UIScreen.main.bounds + .height / (state.timeSettings ? 1.50 : fontSize < .extraExtraLarge ? 1.46 : 1.49) ) } var carbsAndInsulinView: some View { - HStack(spacing: 10) { + HStack { if let settings = state.settingsManager { let opacity: CGFloat = colorScheme == .dark ? 0.2 : 0.6 let materialOpacity: CGFloat = colorScheme == .dark ? 0.25 : 0.10 @@ -420,8 +421,8 @@ extension Home { let fraction: Double = 1 - (substance / max) let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) TestTube(opacity: opacity, amount: fill, colourOfSubstance: .loopYellow, materialOpacity: materialOpacity) - .frame(width: 13.8, height: 40) - .offset(x: 0, y: -6) + .frame(width: 12, height: 38) + .offset(x: 0, y: -5) HStack(spacing: 0) { Text( numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0" @@ -435,8 +436,8 @@ extension Home { let fraction: Double = 1 - (substance / max) let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) TestTube(opacity: opacity, amount: fill, colourOfSubstance: .insulin, materialOpacity: materialOpacity) - .frame(width: 11, height: 36) - .offset(x: 0, y: -2.5) + .frame(width: 12, height: 38) + .offset(x: 0, y: -5) HStack(spacing: 0) { Text( numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0" @@ -527,20 +528,28 @@ extension Home { @ViewBuilder private func headerView(_ geo: GeometryProxy) -> some View { addHeaderBackground() - .frame(minHeight: 120 + geo.safeAreaInsets.top) + .frame( + minHeight: fontSize < .extraExtraLarge ? 125 + geo.safeAreaInsets.top : 135 + geo.safeAreaInsets.top + ) .overlay { VStack { ZStack { glucoseView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top).padding(.top, 10) - loopView.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom).padding(.bottom, 3) - carbsAndInsulinView - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading) - .padding(.leading, 10) - pumpView - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) - .padding(.trailing, 7).padding(.bottom, 2) - }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 5) - } + HStack { + carbsAndInsulinView + .frame(maxHeight: .infinity, alignment: .bottom) + Spacer() + loopView.frame(maxHeight: .infinity, alignment: .bottom).padding(.bottom, 3) + .offset(x: -2, y: 0) // To do: Remove all offsets, if possible. + Spacer() + pumpView + .frame(maxHeight: .infinity, alignment: .bottom) + .padding(.bottom, 2) + } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) + .padding(.horizontal, 5) + } + }.padding(.top, geo.safeAreaInsets.top).padding(.bottom, 10) } .clipShape(Rectangle()) } @@ -554,8 +563,9 @@ extension Home { Button("24 " + NSLocalizedString("hours", comment: ""), action: { state.hours = 24 }) Button("UI/UX Settings", action: { state.showModal(for: .statisticsConfig) }) } + .buttonStyle(.borderless) .foregroundStyle(.secondary) - .font(buttonFont) + .font(.timeSettingFont) .padding(.vertical, 15) .background(TimeEllipse(characters: string.count)) } diff --git a/FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift b/FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift index 8570040eb7..297b692b85 100644 --- a/FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift +++ b/FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift @@ -85,6 +85,7 @@ extension ISFEditor { .disabled(state.items.isEmpty) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Insulin Sensitivities") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift b/FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift index c64ee87b4f..f2dde5d9d1 100644 --- a/FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift +++ b/FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift @@ -8,6 +8,7 @@ extension IconConfig { var body: some View { IconSelection() + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) } } diff --git a/FreeAPS/Sources/Modules/LibreConfig/View/LibreConfigRootView.swift b/FreeAPS/Sources/Modules/LibreConfig/View/LibreConfigRootView.swift index f0b2f36546..39229ef7f3 100644 --- a/FreeAPS/Sources/Modules/LibreConfig/View/LibreConfigRootView.swift +++ b/FreeAPS/Sources/Modules/LibreConfig/View/LibreConfigRootView.swift @@ -28,6 +28,7 @@ extension LibreConfig { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .navigationBarTitle("") .navigationBarHidden(true) .onAppear(perform: configureView) diff --git a/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift b/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift index 93080a7f19..9a4bca92e2 100644 --- a/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift +++ b/FreeAPS/Sources/Modules/ManualTempBasal/View/ManualTempBasalRootView.swift @@ -42,6 +42,7 @@ extension ManualTempBasal { label: { Text("Cancel Temp Basal") } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Manual Temp Basal") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift index 4676f16ec5..57e737345f 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift @@ -148,6 +148,7 @@ extension NightscoutConfig { Toggle("Remote control", isOn: $state.allowAnnouncements) } header: { Text("Allow Remote control of iAPS") } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Nightscout Config") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift index 1c74c81ced..23decc48ea 100644 --- a/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift +++ b/FreeAPS/Sources/Modules/NotificationsConfig/View/NotificationsConfigRootView.swift @@ -99,6 +99,7 @@ extension NotificationsConfig { }) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Notifications") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 16a28b3ac4..5cb88807f9 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -62,7 +62,7 @@ extension OverrideProfilesConfig { isSheetPresented = false } } - } + }.dynamicTypeSize(...DynamicTypeSize.xxLarge) } var body: some View { @@ -272,6 +272,7 @@ extension OverrideProfilesConfig { .tint(.red) } footer: { Text("").padding(.bottom, 150) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .onAppear { state.savedSettings() } .navigationBarTitle("Profiles") diff --git a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift index e1405b8c55..0b25db6fad 100644 --- a/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PreferencesEditor/View/PreferencesEditorRootView.swift @@ -76,6 +76,7 @@ extension PreferencesEditor { } Section {} footer: { Text("").padding(.bottom, 300) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Preferences") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift index 77c35c244f..4b1a925323 100644 --- a/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift +++ b/FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift @@ -31,6 +31,7 @@ extension PumpConfig { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Pump config") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift index 27889b538c..4611097c4c 100644 --- a/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift +++ b/FreeAPS/Sources/Modules/PumpSettingsEditor/View/PumpSettingsEditorRootView.swift @@ -49,6 +49,7 @@ extension PumpSettingsEditor { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Pump Settings") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift index 4e60f0e3ba..f2170dad72 100644 --- a/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift +++ b/FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift @@ -139,6 +139,7 @@ extension Settings { .sheet(isPresented: $showShareSheet) { ShareSheet(activityItems: state.logItems()) } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Settings") .navigationBarItems(trailing: Button("Close", action: state.hideSettingsModal)) diff --git a/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift b/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift index fefb226d30..43ec1ebdce 100644 --- a/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift +++ b/FreeAPS/Sources/Modules/Snooze/View/SnoozeRootView.swift @@ -118,6 +118,7 @@ extension Snooze { .navigationBarTitle("Snooze Alerts") .navigationBarTitleDisplayMode(.automatic) .navigationBarItems(trailing: Button("Close", action: state.hideModal)) + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear { configureView() snoozeDescription = getSnoozeDescription() diff --git a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift index bf116c6f46..3b1a9ae3a3 100644 --- a/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift +++ b/FreeAPS/Sources/Modules/Stat/View/StatRootView.swift @@ -146,6 +146,7 @@ extension Stat { .pickerStyle(.segmented).background(.cyan.opacity(0.2)) stats() } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Statistics") .navigationBarTitleDisplayMode(.inline) diff --git a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift index f66059f2ff..3f19339556 100644 --- a/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift +++ b/FreeAPS/Sources/Modules/StatConfig/View/StatConfigRootView.swift @@ -72,6 +72,7 @@ extension StatConfig { Toggle("Display and allow Fat and Protein entries", isOn: $state.useFPUconversion) } header: { Text("Add Meal View settings ") } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("UI/UX") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift b/FreeAPS/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift index aa2180c21d..68797470b4 100644 --- a/FreeAPS/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift +++ b/FreeAPS/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift @@ -38,6 +38,7 @@ extension TargetsEditor { .disabled(state.items.isEmpty) } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Target Glucose") .navigationBarTitleDisplayMode(.automatic) diff --git a/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift b/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift index 2c3bae1dfd..fad8456157 100644 --- a/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift +++ b/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift @@ -33,6 +33,7 @@ extension WatchConfig { } } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationTitle("Watch Configuration") .navigationBarTitleDisplayMode(.automatic) From 1c2bb510e4103c14472d36bf32869040d74f11c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:57:45 +0100 Subject: [PATCH 335/405] Update Config.xcconfig Bump version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 219aff9a63..c76f6e35eb 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.4.3 +APP_VERSION = 2.4.5 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From eba9e6b630b9e0776b9c04c7c917a08ef5e0f3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 7 Jan 2024 20:14:02 +0100 Subject: [PATCH 336/405] Too small spacing --- .../Sources/Modules/Home/View/Header/CurrentGlucoseView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift index 7fc599d481..01f74ae702 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift @@ -57,7 +57,7 @@ struct CurrentGlucoseView: View { var body: some View { ZStack { VStack { - let offset: CGFloat = fontSize < .large ? 75 : (fontSize >= .large && fontSize < .extraExtraLarge) ? 80 : 85 + let offset: CGFloat = fontSize < .large ? 82 : (fontSize >= .large && fontSize < .extraExtraLarge) ? 87 : 92 ZStack { Text( (recentGlucose?.glucose ?? 100) == 400 ? "HIGH" : recentGlucose?.glucose From c9ab365148941160bfa5b0094d392e7fc5d0ad50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 8 Jan 2024 00:58:31 +0100 Subject: [PATCH 337/405] Missing? --- .../OmniBLE/Localizations/de.lproj/Localizable.strings | 3 +-- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index eaad1065cb..5dba9bf0f4 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -459,8 +459,7 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Setzstelle vorbereiten."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ +/* Label text for step two of attach pod instructions */ "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label text for step three of attach pod instructions */ diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 2612ff2e95..a0a0a5050b 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -437,6 +437,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; From a8224407f7083bcee111d64bf8817df25ee5b4c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 8 Jan 2024 01:07:11 +0100 Subject: [PATCH 338/405] remove unused string --- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index a0a0a5050b..457ae35768 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -464,9 +464,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Label text for step two of attach pod instructions */ -"Remove blue Pod needle cap and check cannula. Then remove paper backing." = "Remove blue Pod needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; From e78567fab1c9aaf1c8536f87a9e39b4f60533741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 8 Jan 2024 23:28:00 +0100 Subject: [PATCH 339/405] Display when Middleware active. Display change of SMB ratio in Orange. If return string from MIddleware is different from the deafult function (and if not empy), display it inthe big pop-up in red bacground. Display change of SMB ratio in orange (when not deafult 0.5). --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- FreeAPS/Resources/javascript/prepare/determine-basal.js | 4 +++- FreeAPS/Sources/Views/TagCloudView.swift | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 5af1b01efb..2bacc2a842 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v){var f=i.min_bg,B=v.overrideTarget;0!=B&&6!=B&&v.useOverride&&!i.temptargetSet&&(f=B);const b=v.smbIsOff,M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff,D=v.start;var w=v.end;const G=v.smbMinutes,T=v.uamMinutes;var C=h.useNewFormula,U=0,O=f,A=0,R="",I="",F="",j="",P="",E="",q=0,W=0,k=0,L=0,z=0,N=0;const H=v.weightedAverage;var Z=1,$=i.sens,J=i.carb_ratio;v.useOverride&&(Z=v.overridePercentage/100,_?($/=Z,J/=Z):(x&&(J/=Z),y&&($/=Z)));const K=i.weightPercentage,Q=v.average_total_data;function V(e,t){var a=e.getTime();return new Date(a+36e5*t)}function X(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Y(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function ee(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const te=Math.min(i.autosens_min,i.autosens_max),ae=Math.max(i.autosens_min,i.autosens_max);function re(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Y(r),u=p[0].rate;for(let e=0;e=(s=ee(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=ee(d,l))?n=s:o=(s=ee("23:59:59",l))?n=s:o0&&o1)&&(C=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(C){let e=g.length-1;var oe=new Date(g[e].timestamp),ne=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ne=new Date),(A=(ne-oe)/36e5)<23.9&&A>21)z=re(oe,(ie=24-A,se=oe.getTime(),new Date(se-36e5*ie))),j="24 hours of data is required for an accurate tdd calculation. Currently only "+A.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+z.toPrecision(5)+" U. ";else A<21?(C=!1,enableDynamicCR=!1):j=""}}else console.log("Pumphistory is empty!"),C=!1,enableDynamicCR=!1;var ie,se;if(C){for(let e=0;e0){q=e,N=g[e].rate;var le=g[e-1]["duration (min)"]/60,ue=le,me=new Date(g[e-1].timestamp),de=me,ce=0;do{if(e--,0==e){de=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){de=new Date(g[e].timestamp);break}var ge=e-2;if(ge>=0&&"Rewind"==g[ge]._type){let e=g[ge].timestamp;for(;ge-1>=0&&"Prime"==g[ge-=1]._type;)ce=(g[ge].timestamp-e)/36e5;ce>=le&&(de=e,ce=0)}}while(e>0);var he=(de-me)/36e5;he0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(z+=re(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var pe=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){pe=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(pe=new Date,t=g[e]["duration (min)"]/60),(pe-a)/36e5-t>0){z+=re(pe,V(a,t))}}var ve={TDD:o(W=L+k+z,5),bolus:o(L,5),temp_basal:o(k,5),scheduled_basal:o(z,5)};A>21?(I=". Bolus insulin: "+L.toPrecision(5)+" U",F=". Temporary basal insulin: "+k.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+z.toPrecision(5)+" U",P=j+(" TDD past 24h is: "+W.toPrecision(5)+" U")+I+F+R,E=", TDD: "+o(W,2)+" U, "+o(L/W*100,0)+"% Bolus "+o((k+z)/W*100,0)+"% Basal"):E=", TDD: Not enough pumpData (< 21h)"}var fe;const Be=e.glucose,be=h.enableDynamicCR,Me=h.adjustmentFactor,_e=f;var ye=!1,xe="",Se=1,De="";Q>0&&(Se=H/Q),De=Se>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(Se=o(Se=Math.min(Se,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":Se<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(Se=o(Se=Math.max(Se,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+Se,De=", Basal ratio: "+Se,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(ye=!0),_e>=118&&ye&&(C=!1,xe="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+_e);var we=", Dynamic ratios log: ",Ge=", AF: "+Me,Te="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Ce="",Ue="";const Oe=h.curve,Ae=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ie=55,Fe=65;switch(Oe){case"rapid-acting":Fe=65;break;case"ultra-rapid":Fe=50}Re?(Ie=120-Ae,console.log("Custom insulinpeakTime set to :"+Ae+", insulinFactor: "+Ie)):(Ie=120-Fe,console.log("insulinFactor set to : "+Ie)),fe=W,K<1&&H>0&&(W=H,console.log("Using weighted TDD average: "+o(W,2)+" U, instead of past 24 h ("+o(fe,2)+" U), weight: "+K),Ue=", Weighted TDD: "+o(W,2)+" U");const je=h.sigmoid;var Pe="";if(C){var Ee=$*Me*W*Math.log(Be/Ie+1)/1800;Ce=", Logarithmic formula"}if(C&&je){const e=te,t=ae-e,a=.0555*(Be-f);var qe=Se,We=ae-1;1==ae&&(We=ae+.01-1);const r=Math.log10(1/We-e/We)/Math.log10(Math.E),o=a*Me*qe+r;Ee=t/(1+Math.exp(-o))+e,Ce=", Sigmoid function"}var ke=J;const Le=o(J,1);var ze="",Ne="";if(C&&W>0){if(ze=", Dynamic ISF/CR: On/",Ee>ae?(xe=", Dynamic ISF limited by autosens_max setting: "+ae+" ("+o(Ee,2)+"), ",Ne=", Autosens/Dynamic Limit: "+ae+" ("+o(Ee,2)+")",Ee=ae):Ee-.5?"+"+o(e.delta,0):o(e.delta,0);var at=Math.min(e.delta,e.short_avgdelta),rt=Math.min(e.short_avgdelta,e.long_avgdelta),ot=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(et<=10||38===et||tt>=3)&&(Ze.reason="CGM is calibrating, in ??? state, or noise is high");if(et>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=et&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(et,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=et&&!0),Ye>12||Ye<-5?Ze.reason="If current system time "+Qe+" is correct, then BG data is too old. The last BG data was read "+Ye+"m ago at "+Xe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=et&&(e.last_cal&&e.last_cal<3?Ze.reason="CGM was just calibrated":Ze.reason="CGM data is unchanged ("+n(et,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=et&&(et<=10||38===et||tt>=3||Ye>12||Ye<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ke?(Ze.reason+=". Canceling high temp basal of "+t.rate,Ze.deliverAt=$e,Ze.temp="absolute",Ze.duration=0,Ze.rate=0,Ze):0===t.rate&&t.duration>30?(Ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",Ze.deliverAt=$e,Ze.temp="absolute",Ze.duration=30,Ze.rate=0,Ze):(Ze.reason+=". Temp "+t.rate+" <= current basal "+Ke+"U/hr; doing nothing. ",Ze);var nt,it,st,lt,ut=i.max_iob;if(void 0!==f&&(it=f),void 0!==i.max_bg&&(st=f),void 0!==i.enableSMB_high_bg_target&&(lt=i.enableSMB_high_bg_target),void 0===f)return Ze.error="Error: could not determine target_bg. ",Ze;nt=f;var mt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,dt=100,ct=160;if(ct=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ct=e}else console.log("Default Half Basal Target used: "+n(ct,i)+" "+i.out_units);if(mt&&i.temptargetSet&&nt>dt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&nt=nt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(Se,2)+", TDD 24h = "+o(fe,2)+"U, Weighted average TDD = "+o(H,2)+"U, (Weight percentage = "+K+"), Total data of TDDs (up to 14 days) average = "+o(Q,2)+"U. "),Ke!==Je*Z?process.stderr.write("Adjusting basal from "+Je*Z+" U/h to "+Ke+" U/h; "):process.stderr.write("Basal unchanged: "+Ke+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){it=o((it-60)/s.ratio)+60,st=o((st-60)/s.ratio)+60;var ht=o((nt-60)/s.ratio)+60;nt===(ht=Math.max(80,ht))?process.stderr.write("target_bg unchanged: "+n(ht,i)+"; "):process.stderr.write("target_bg from "+n(ht,i)+" to "+n(ht,i)+"; "),nt=ht}var pt=n(nt,i);nt!=f&&(pt=0!==B&&6!==B&&B!==nt?n(f,i)+"→"+n(B,i)+"→"+n(nt,i):n(f,i)+"→"+n(nt,i));var vt=200,ft=200,Bt=200;if(e.noise>=2){var bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);vt=o(Math.min(200,it*bt)),ft=o(Math.min(200,nt*bt)),Bt=o(Math.min(200,st*bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(ht,i)+" to "+n(ft,i)+"; "),it=vt,nt=ft,st=Bt}O=it-.5*(it-40);var Mt=i.threshold_setting;Mt>O&&Mt<=120&&Mt>=65?(console.error("Threshold changed in settings from "+n(O,i)+" to "+n(Mt,i)+". "),O=Mt):console.error("Current threshold: "+n(O,i));var _t="",yt=(o($,1),$);if(void 0!==s&&s&&((yt=o(yt=$/sensitivityRatio,1))!==$?process.stderr.write("ISF from "+n($,i)+" to "+n(yt,i)):process.stderr.write("ISF unchanged: "+n(yt,i)),_t+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n($,i)+"→"+n(yt,i)),console.error("CR:"+J),void 0===a)return Ze.error="Error: iob_data undefined. ",Ze;var xt,St=a;if(a.length,a.length>1&&(a=St[0]),void 0===a.activity||void 0===a.iob)return Ze.error="Error: iob_data missing some property. ",Ze;var Dt=((xt=void 0!==a.lastTemp?o((new Date(Qe).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+xt+"m, tempModulus:"+Dt+"m"),Ze.temp="absolute",Ze.deliverAt=$e,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&xt>10&&t.duration)return Ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,Ze,t);if(t&&a.lastTemp&&t.duration>0){var wt=xt-a.lastTemp.duration;if(wt>5&&xt>10)return Ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+wt+"m ago; canceling temp",u.setTempBasal(0,0,i,Ze,t)}var Gt=o(-a.activity*yt*5,2),Tt=o(6*(at-Gt));Tt<0&&(Tt=o(6*(rt-Gt)))<0&&(Tt=o(6*(e.long_avgdelta-Gt)));var Ct=et,Ut=(Ct=a.iob>0?o(et-a.iob*yt):o(et-a.iob*Math.min(yt,$)))+Tt;if(void 0===Ut||isNaN(Ut))return Ze.error="Error: could not calculate eventualBG. Sensitivity: "+yt+" Deviation: "+Tt,Ze;var Ot,At,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(nt,Ut,Gt);Ze={temp:"absolute",bg:et,tick:Ve,eventualBG:Ut,insulinReq:0,reservoir:d,deliverAt:$e,sensitivityRatio,CR:o(J,1),TDD:fe,insulin:ve,current_target:nt,insulinForManualBolus:U,manualBolusErrorString:0,minDelta:at,expectedDelta:Rt,minGuardBG:At,minPredBG:Ot,threshold:n(O,i)};var It=[],Ft=[],jt=[],Pt=[];It.push(et),Ft.push(et),Pt.push(et),jt.push(et);var Et=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,et,nt,lt);if(b)if(S){let e=c.getHours();wD&&(w+=24),e>=D&&e<=w&&(console.error("SMB disabled by profile override"),Et=!1),wzt&&(console.error("Limiting carb impact from "+Wt+" to "+zt+"mg/dL/5m (30g/h)"),Wt=zt);var Nt=3;sensitivityRatio&&(Nt/=sensitivityRatio);var Ht=Nt;if(l.carbs){Nt=Math.max(Nt,l.mealCOB/20);var Zt=o((new Date(Qe).getTime()-l.lastCarbTime)/6e4),$t=(l.carbs-l.mealCOB)/l.carbs;Ht=o(Ht=Nt+1.5*Zt/60,1),console.error("Last carbs "+Zt+" minutes ago; remainingCATime:"+Ht+"hours; "+o(100*$t,1)+"% carbs absorbed")}var Jt=Math.max(0,Wt/5*60*Ht/2)/csf,Kt=90,Qt=1;i.remainingCarbsCap&&(Kt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Qt=Math.min(1,i.remainingCarbsFraction));var Vt=1-Qt,Xt=Math.max(0,l.mealCOB-Jt-l.carbs*Vt),Yt=(Xt=Math.min(Kt,Xt))*csf*5/60/(Ht/2),ea=o(l.slopeFromMaxDeviation,2),ta=o(l.slopeFromMinDeviation,2),aa=Math.min(ea,-ta/3);kt=0===Wt?0:Math.min(60*Ht/5/2,Math.max(0,l.mealCOB*csf/Wt)),console.error("Carb Impact:"+Wt+"mg/dL per 5m; CI Duration:"+o(5*kt/60*2,1)+"hours; remaining CI ("+Ht/2+"h peak):"+o(Yt,1)+"mg/dL per 5m");var ra,oa,na,ia,sa=999,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=Ut,pa=et,va=et,fa=0,Ba=[],ba=[];try{St.forEach((function(e){var t=o(-e.activity*yt*5,2),a=o(-e.iobWithZeroTemp.activity*yt*5,2),r=Ct,n=Wt*(1-Math.min(1,Ft.length/12));if(!0===(C&&!je))ha=Ft[Ft.length-1]+o(-e.activity*(1800/(W*Me*Math.log(Math.max(Ft[Ft.length-1],39)/Ie+1)))*5,2)+n,r=Pt[Pt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(W*Me*Math.log(Math.max(Pt[Pt.length-1],39)/Ie+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ha,2)+" , ZTpredBG: "+o(r,2));else ha=Ft[Ft.length-1]+t+n,r=Pt[Pt.length-1]+a;var i=Math.max(0,Math.max(0,Wt)*(1-It.length/Math.max(2*kt,1))),s=Math.min(It.length,12*Ht-It.length),l=Math.max(0,s/(Ht/2*12)*Yt);i+l,Ba.push(o(l,0)),ba.push(o(i,0)),COBpredBG=It[It.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Lt+jt.length*aa),m=Math.max(0,Lt*(1-jt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(fa=o(5*(jt.length+1)/60,1)),!0===(C&&!je))UAMpredBG=jt[jt.length-1]+o(-e.activity*(1800/(W*Me*Math.log(Math.max(jt[jt.length-1],39)/Ie+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=jt[jt.length-1]+t+Math.min(0,n)+d;Ft.length<48&&Ft.push(ha),It.length<48&&It.push(COBpredBG),jt.length<48&&jt.push(UAMpredBG),Pt.length<48&&Pt.push(r),COBpredBG18&&hapa&&(pa=ha),(kt||Yt>0)&&It.length>18&&COBpredBG0)&&COBpredBG>pa&&(va=COBpredBG),qt&&jt.length>12&&UAMpredBGpa&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+ba.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),Ze.predBGs={},Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ma=Ft.length-1;Ma>12&&Ft[Ma-1]===Ft[Ma];Ma--)Ft.pop();for(Ze.predBGs.IOB=Ft,oa=o(Ft[Ft.length-1]),Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=Pt.length-1;Ma>6&&!(Pt[Ma-1]>=Pt[Ma]||Pt[Ma]<=nt);Ma--)Pt.pop();if(Ze.predBGs.ZT=Pt,o(Pt[Pt.length-1]),l.mealCOB>0&&(Wt>0||Yt>0)){for(It.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ma=It.length-1;Ma>12&&It[Ma-1]===It[Ma];Ma--)It.pop();Ze.predBGs.COB=It,na=o(It[It.length-1]),Ut=Math.max(Ut,o(It[It.length-1])),console.error("COBpredBG: "+o(It[It.length-1]))}if(Wt>0||Yt>0){if(qt){for(jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=jt.length-1;Ma>12&&jt[Ma-1]===jt[Ma];Ma--)jt.pop();Ze.predBGs.UAM=jt,ia=o(jt[jt.length-1]),jt[jt.length-1]&&(Ut=Math.max(Ut,o(jt[jt.length-1])))}Ze.eventualBG=Ut}console.error("UAM Impact:"+Lt+"mg/dL per 5m; UAM Duration:"+fa+"hours"),sa=Math.max(39,sa),la=Math.max(39,la),ua=Math.max(39,ua),Ot=o(sa);var _a=l.mealCOB/l.carbs;ra=o(ua<999&&la<999?(1-_a)*UAMpredBG+_a*COBpredBG:la<999?(ha+COBpredBG)/2:ua<999?(ha+UAMpredBG)/2:ha),ga>ra&&(ra=ga),At=o(At=kt||Yt>0?qt?_a*ma+(1-_a)*da:ma:qt?da:ca);var ya=ua;if(gaua&&(ya=(ua+ga)/2);if(ya=o(ya),l.carbs)if(!qt&&la<999)Ot=o(Math.max(sa,la));else if(la<999){var Sa=_a*la+(1-_a)*ya;Ot=o(Math.max(sa,la,Sa))}else Ot=qt?ya:At;else qt&&(Ot=o(Math.max(sa,ya)));Ot=Math.min(Ot,ra),process.stderr.write("minPredBG: "+Ot+" minIOBPredBG: "+sa+" minZTGuardBG: "+ga),la<999&&process.stderr.write(" minCOBPredBG: "+la),ua<999&&process.stderr.write(" minUAMPredBG: "+ua),console.error(" avgPredBG:"+ra+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),va>et&&(Ot=Math.min(Ot,va)),Ze.COB=l.mealCOB,Ze.IOB=a.iob,Ze.BGI=n(Gt,i),Ze.deviation=n(Tt,i),Ze.ISF=n(yt,i),Ze.CR=o(J,1),Ze.target_bg=n(nt,i),Ze.TDD=o(fe,2),Ze.current_target=o(nt,0);var Da=Ze.CR;Le!=Ze.CR&&(Da=Le+"→"+Ze.CR),Ze.reason=_t+", COB: "+Ze.COB+", Dev: "+Ze.deviation+", BGI: "+Ze.BGI+", CR: "+Da+", Target: "+pt+", minPredBG "+n(Ot,i)+", minGuardBG "+n(At,i)+", IOBpredBG "+n(oa,i),na>0&&(Ze.reason+=", COBpredBG "+n(na,i)),ia>0&&(Ze.reason+=", UAMpredBG "+n(ia,i)),Ze.reason+=E,.5!=i.smb_delivery_ratio&&(Ze.reason+=", SMB Ratio: "+i.smb_delivery_ratio),Ze.reason+="; ";var wa=Ct;wa<40&&(wa=Math.min(At,wa));var Ga,Ta=O-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(Wt>0||Yt>0)){for(Ma=0;MaGa*et&&(console.error("maxDelta "+n(ot,i)+" > "+100*Ga+"% of BG "+n(et,i)+" - disabling SMB"),Ze.reason+="maxDelta "+n(ot,i)+" > "+100*Ga+"% of BG "+n(et,i)+" - SMB disabled!, ",Et=!1),console.error("BG projected to remain above "+n(it,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(O,i)+" for "+Ua+"minutes");var Oa=Ua,Aa=i.current_basal*Z*yt*Oa/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Aa)/csf-Ra;Aa=o(Aa),Ia=o(Ia),console.error("naive_eventualBG:",Ct,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Aa,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&(Ze.carbsReq=Ia,Ze.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(et0&&at>Rt)Ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*Z*20/60,2),Ze.reason+=" and minDelta "+n(at,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(et=55)return Ze.reason+="; Canceling temp at "+Ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,Ze,t);var ja=0,Pa=Ke,Ea=0;if(UtRt&&at>0&&!Ia)return Ct<40?(Ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,Ze,t)):(e.delta>at?Ze.reason+=", but Delta "+n(Ve,i)+" > expectedDelta "+n(Rt,i):Ze.reason+=", but Min. Delta "+at.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t)));ja=o(ja=2*Math.min(0,(Ut-nt)/yt),2);var qa=Math.min(0,(Ct-nt)/yt);if(qa=o(qa,2),at<0&&at>Rt)ja=o(ja*(at/Rt),2);Pa=r(Pa=Ke+2*ja,i),Ea=t.duration*(t.rate-Ke)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return Ze.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",Ze;if(Pa<=0){if((Fa=o(60*((Ta=nt-Ct)/yt)/i.current_basal*Z))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return Ze.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,Ze,t)}else Ze.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,Ze,t)}if(at=2||Rt+-1*at>=2)&&(Ze.manualBolusErrorString=at>=0&&Rt>0?3:at<0&&Rt<=0||at<0&&Rt>=0?4:5),Ze.insulinForManualBolus=o((Ze.eventualBG-Ze.target_bg)/yt,2),!m||!Et))return e.delta "+n(it,i)+" but Delta "+n(Ve,i)+" < Exp. Delta "+n(Rt,i):Ze.reason+="Eventual BG "+n(Ut,i)+" > "+n(it,i)+" but Min. Delta "+at.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));if(Math.min(Ut,Ot)it&&(Ze.manualBolusErrorString=6,Ze.insulinForManualBolus=o((Ze.eventualBG-Ze.target_bg)/yt,2),Ze.minPredBG=Ot),!m||!Et))return Ze.reason+=n(Ut,i)+"-"+n(Ot,i)+" in range: no temp required",t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));if(Ut>=st&&(Ze.reason+="Eventual BG "+n(Ut,i)+" >= "+n(st,i)+", ",Ut>st&&(Ze.insulinForManualBolus=o((Ut-nt)/yt,2))),a.iob>ut)return Ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+ut,t.duration>15&&r(Ke,i)===r(t.rate,i)?(Ze.reason+=", temp "+t.rate+" ~ req "+Ke+"U/hr. ",Ze):(Ze.reason+="; setting current basal of "+Ke+" as temp. ",u.setTempBasal(Ke,30,i,Ze,t));ja=o((Math.min(Ot,Ut)-nt)/yt,2),U=o((Ut-nt)/yt,2),ja>ut-a.iob?(console.error("SMB limited by maxIOB: "+ut-a.iob+" (. insulinReq: "+ja+" U)"),Ze.reason+="max_iob "+ut+", ",ja=ut-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),U>ut-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+ut-a.iob+" (. insulinForManualBolus: "+U+" U)"),Ze.reason+="max_iob "+ut+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+U+" U)."),Pa=r(Pa=Ke+2*ja,i),ja=o(ja,3),Ze.insulinReq=ja;var ka=o((new Date(Qe).getTime()-a.lastBolusTime)/6e4,1);if(m&&Et&&et>O){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&G!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+G),La=G),v.useOverride&&M&&T!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+T),za=T);var Na=o(l.mealCOB/J,3),Ha=0;void 0===La?(Ha=o(i.current_basal*Z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*Z),Ha=o(i.current_basal*Z*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*Z*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*Z),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((nt-(Ct+sa)/2)/yt)/i.current_basal*Z),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Ke*Fa/30,2),Fa=30),Ze.reason+=" insulinReq "+ja,Ka>=Ha&&(Ze.reason+="; maxBolus "+Ha),Fa>0&&(Ze.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),Ze.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Ct+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&(Ze.units=Ka,Ze.reason+="Microbolusing "+Ka+"U. "):Ze.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return Ze.rate=Qa,Ze.duration=Fa,Ze}var er=u.getMaxSafeBasal(i);return 400==et?u.setTempBasal(i.current_basal,30,i,Ze,t):(Pa>er&&(Ze.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Ke)/60)>=2*ja?(Ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)):void 0===t.duration||0===t.duration?(Ze.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?(Ze.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",Ze):(Ze.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,Ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,.5!=i.smb_delivery_ratio&&($e.reason+=", SMB Ratio: "+i.smb_delivery_ratio),$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); diff --git a/FreeAPS/Resources/javascript/prepare/determine-basal.js b/FreeAPS/Resources/javascript/prepare/determine-basal.js index 9ddc8b8833..392931d867 100644 --- a/FreeAPS/Resources/javascript/prepare/determine-basal.js +++ b/FreeAPS/Resources/javascript/prepare/determine-basal.js @@ -4,8 +4,10 @@ function generate(iob, currenttemp, glucose, profile, autosens = null, meal = nu var clock = new Date(); + var middleware_was_used = ""; try { var middlewareReason = middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock, pump_history, preferences, basalProfile, oref2_variables); + middleware_was_used = (middlewareReason || "Nothing changed"); console.log("Middleware reason: " + (middlewareReason || "Nothing changed")); } catch (error) { console.log("Invalid middleware: " + error); @@ -43,5 +45,5 @@ function generate(iob, currenttemp, glucose, profile, autosens = null, meal = nu oref2_variables_ = oref2_variables; } - return freeaps_determineBasal(glucose_status, currenttemp, iob, profile, autosens_data, meal_data, freeaps_basalSetTemp, microbolusAllowed, reservoir_data, clock, pumphistory, preferences, basalprofile, oref2_variables_); + return freeaps_determineBasal(glucose_status, currenttemp, iob, profile, autosens_data, meal_data, freeaps_basalSetTemp, microbolusAllowed, reservoir_data, clock, pumphistory, preferences, basalprofile, oref2_variables_, middleware_was_used); } diff --git a/FreeAPS/Sources/Views/TagCloudView.swift b/FreeAPS/Sources/Views/TagCloudView.swift index 98ad0779e0..fc89c0e8d9 100644 --- a/FreeAPS/Sources/Views/TagCloudView.swift +++ b/FreeAPS/Sources/Views/TagCloudView.swift @@ -66,9 +66,12 @@ struct TagCloudView: View { textTag where textTag.contains("AF:"), textTag where textTag.contains("Autosens/Dynamic Limit:"), textTag where textTag.contains("Dynamic ISF/CR"), - textTag where textTag.contains("Basal ratio"), - textTag where textTag.contains("SMB Ratio"): + textTag where textTag.contains("Basal ratio"): return .zt + case textTag where textTag.contains("Middleware:"): + return .red + case textTag where textTag.contains("SMB Ratio"): + return .orange default: return .insulin } From 8bf0838f9231c5031faada63caa67073aa166f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 8 Jan 2024 23:38:39 +0100 Subject: [PATCH 340/405] Crowdin updates (#464) --- .../ar.lproj/Localizable.strings | 7 ++-- .../da.lproj/Localizable.strings | 9 ++--- .../de.lproj/Localizable.strings | 6 +-- .../es.lproj/Localizable.strings | 7 ++-- .../fi.lproj/Localizable.strings | 7 ++-- .../fr.lproj/Localizable.strings | 7 ++-- .../he.lproj/Localizable.strings | 7 ++-- .../hu.lproj/Localizable.strings | 7 ++-- .../it.lproj/Localizable.strings | 7 ++-- .../nb.lproj/Localizable.strings | 7 ++-- .../nl.lproj/Localizable.strings | 9 ++--- .../pl.lproj/Localizable.strings | 7 ++-- .../pt-BR.lproj/Localizable.strings | 7 ++-- .../pt-PT.lproj/Localizable.strings | 7 ++-- .../ru.lproj/Localizable.strings | 7 ++-- .../sk.lproj/Localizable.strings | 7 ++-- .../sv.lproj/Localizable.strings | 7 ++-- .../tr.lproj/Localizable.strings | 7 ++-- .../uk.lproj/Localizable.strings | 9 ++--- .../vi.lproj/Localizable.strings | 29 +++++++------- .../zh-Hans.lproj/Localizable.strings | 9 ++--- .../Resources/ar.lproj/Localizable.strings | 3 ++ .../Resources/da.lproj/Localizable.strings | 3 ++ .../Resources/de.lproj/Localizable.strings | 3 ++ .../Resources/es.lproj/Localizable.strings | 3 ++ .../Resources/fi.lproj/Localizable.strings | 3 ++ .../Resources/fr.lproj/Localizable.strings | 3 ++ .../Resources/he.lproj/Localizable.strings | 3 ++ .../Resources/hu.lproj/Localizable.strings | 3 ++ .../Resources/it.lproj/Localizable.strings | 3 ++ .../Resources/nb.lproj/Localizable.strings | 3 ++ .../Resources/nl.lproj/Localizable.strings | 3 ++ .../Resources/pl.lproj/Localizable.strings | 3 ++ .../Resources/pt-BR.lproj/Localizable.strings | 3 ++ .../Resources/pt-PT.lproj/Localizable.strings | 3 ++ .../Resources/ru.lproj/Localizable.strings | 3 ++ .../Resources/sk.lproj/Localizable.strings | 3 ++ .../Resources/sv.lproj/Localizable.strings | 3 ++ .../Resources/tr.lproj/Localizable.strings | 3 ++ .../Resources/uk.lproj/Localizable.strings | 3 ++ .../Resources/vi.lproj/Localizable.strings | 3 ++ .../zh-Hans.lproj/Localizable.strings | 3 ++ .../Main/vi.lproj/Localizable.strings | 40 +++++++++---------- 43 files changed, 161 insertions(+), 118 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index 8d41f1c19b..e2697b569c 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index bb109e08f5..74696c25ba 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lyt efter 2 bip."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Forbered pumpested."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens nålehætte og kontroller kanyle. Fjern derefter papirbagsiden."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Tjek Pod, sæt på kroppen og bekræft derefter Pod er sat korrekt på."; @@ -710,7 +709,7 @@ Label text for step two of attach pod instructions */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Lavt Reservoir"; /* */ "Save" = "Gem"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 5dba9bf0f4..cde44da38b 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; @@ -459,9 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Setzstelle vorbereiten."; -/* Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Prüfen Sie den Pod, auf der Setzstelle anbringen, dann Prodanbringung bestätigen."; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 0d15cb6c8e..26b4d41624 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index 9dd176defb..d5221527ec 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 34b5263e1b..68e9f148a0 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Remplissez une nouvelle cartouche avec de l'insuline U-100 (laissez le capuchon bleu sur le pod)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Écoutez deux bips."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Préparez le site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Retirez le bouchon d'aiguille bleu et vérifiez la cannule, puis retirez le support papier."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Vérifiez Pod, appliquez au site, puis confirmez l'attachement du pod."; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index 8d41f1c19b..e2697b569c 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index 414410c356..90ac66acda 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index aed2900061..c088ad63bd 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepara il sito."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell’ago e controlla la cannula. Quindi rimuovi il supporto cartaceo."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controlla il Pod, applica al sito e conferma che il pod è attaccato."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 01ebb9e192..57ba996a5a 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny Pod med U-100 insulin (la den blå hetten være på)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Gjør klart stedet hvor pod skal festes."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Fjern det blå beskyttelsesdekselet og kontroller kanylen. Fjern deretter papiret fra plasteret."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontroller pod, fest på kroppen, og bekreft at den sitter korrekt."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 6fc71f3d51..2e37adf37c 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline. Verwijder de blauwe naalddop niet."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Bereid de infusieplaats voor."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Controleer de Pod, breng aan op de infusieplaats en bevestig de plaatsing."; @@ -710,7 +709,7 @@ Label text for step two of attach pod instructions */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Laag reservoir niveau"; +"Low Reservoir" = "Reservoir bijna leeg"; /* */ "Save" = "Opslaan"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index a3c78b1ac4..acbaf6beed 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index fae147e03a..4f61369b04 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index c6dbe93021..f82ffd6fbe 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Listen for 2 beeps."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Prepare site."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod’s blue needle cap and check cannula. Then remove paper backing."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Check Pod, apply to site, then confirm pod attachment."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 61c04d321d..21a81cd02b 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослушайте 2 звуковых сигнала."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Подготовьте место."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Удалите синюю крышку иглы Пода и проверьте канюлю. Затем удалите защитные пленки."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Проверьте Под, установите его на теле, затем подтвердите установку Пода."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 7e78021cff..952e4ea76a 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Naplňte nový pod s inzulínom U-100 (modrý uzáver ihly pod nechajte nasadený)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Počúvajte 2 pípnutia."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Príprava miesta na telo."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Odstráňte modrý kryt ihly Pod a skontrolujte kanylu. Potom odstráňte papierovú podložku."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Skontrolujte pod, aplikujte ho na telo, potom potvrďte prilepenie podu."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 8c87f7d3f5..e71410d028 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny podd med insulin (låt det blå kanlyskyddet sitta kvar)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Ta bort poddens blåa kanylskydd och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Det ska höras 2 pip."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Förbered hud."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Ta bort det blå kanylskyddet och kontrollera att kanylen inte redan sticker ut. Ta sedan bort skyddspappret."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kontrollera din podd, sätt fast den och bekräfta sedan att den sitter bra."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 49e4338631..deae189e4d 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "2 bip sesini dinleyin."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "İnfüzyon bölgesini hazırlayın."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Mavi Pod iğne kapağını çıkarın ve kanülü kontrol edin. Ardından kağıt koruma bandını çıkarın."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Pod'u kontrol edin, infüzyon bölgesine uygulayın, ardından pod ekini onaylayın."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 4c21c563a2..08fe71be37 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Наповніть новий Pod інсуліном U-100 (залиште синю кришку капсули на голці)."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Прослухайте 2 звукові сигнали."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Підготуйте місце."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Видаліть синю кришку голки Podʼа та перевірте канюлю. Потім зніміть паперову підкладку."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Перевірте Pod, установіть його на тілі, а потім підтвердіть установку Pod."; @@ -574,7 +573,7 @@ Label text for step two of attach pod instructions */ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Нагадування вище не звучатимуть, якщо ваш пристрій перебуває в беззвучному режимі або режимі «Не турбувати».\n\nІснують інші важливі сповіщення та будильники Podʼу, які лунатимуть, навіть якщо на пристрої встановлено режим «Без звуку» або «Не турбувати»."; /* navigation title for notification settings */ -"Notification Settings" = "Параметри сповіщень"; +"Notification Settings" = "Параметри Сповіщень"; /* Label for scheduled reminder value row */ "Time" = "Час"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 58bd0f55f2..1b70b9d540 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Dùng loại insulin U-100."; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Nghe 2 tiếng bíp."; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "Chuẩn bị vị trí."; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh và kiểm tra cannula. Sau đó gỡ bỏ lớp giấy phía sau."; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "Kiểm tra pod, gắn vào vị trí sau đó xác nhận pod đã được gắn chặt."; @@ -521,7 +520,7 @@ Label text for step two of attach pod instructions */ "Your Pod is ready for use.\n\n%1$@ will remind you to change your pod before it expires. You can change this to a time convenient for you." = "Pod đã sẵn sàng hoạt động.\n\n%1$@ sẽ nhắc nhở bạn thay đổi khi pod hết hạn. Bạn có thể thay khi nào tiện."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Lịch biểu lời nhắc"; /* Label for expiration reminder row */ "Time" = "Thời gian"; @@ -533,7 +532,7 @@ Label text for step two of attach pod instructions */ "Setup Complete" = "Cấu hình hoàn thành"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Không có lời nhắc"; /* Error message description for PeripheralManagerError.notReady */ "Peripheral Not Ready" = "Thiết bị ngoại vi chưa sẵn sàng"; @@ -563,7 +562,7 @@ Label text for step two of attach pod instructions */ "This is a reminder that you scheduled when you paired your current Pod." = "Đây là lời nhắc mà bạn đã lên lịch khi ghép nối Pod hiện tại của mình."; /* */ -"Scheduled Reminder" = "Scheduled Reminder"; +"Scheduled Reminder" = "Lịch biểu lời nhắc"; /* Footer text for low reservoir value row */ "The App notifies you when the amount of insulin in the Pod reaches this level." = "Ứng dụng nhắc nhở bạn khi lượng insulin trong pod đạt đến mức này."; @@ -580,7 +579,7 @@ Label text for step two of attach pod instructions */ "Time" = "Thời gian"; /* Value text for no expiration reminder */ -"No Reminder" = "No Reminder"; +"No Reminder" = "Không có lời nhắc"; /* Label for low reservoir reminder row */ "Low Reservoir Reminder" = "Báo nhắc gần hết thuốc"; @@ -638,10 +637,10 @@ Label text for step two of attach pod instructions */ "Missing Config" = "Thiếu cấu hình"; /* Alert format string for missing temp basal configuration. */ -"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Maximum basal rate chưa được PumpManager cấu hình. Đề nghị vào therapy settings-> delivery limits và cấu hình maximum basal rate mới."; +"This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Liều nền tối đa chưa được cấu hình. Đề nghị vào Cài đặt-> Cấu hình bơm và cấu hình Liều nền tối đa mới."; /* Label text for expiration reminder default row */ -"Expiration Reminder Default" = "Mặc định Nhắc nhở Hết hạn"; +"Expiration Reminder Default" = "Mặc định nhắc nhở hết hạn"; /* Text for previous pod information row */ "Previous Pod Information" = "Thông tin Pod trước đó"; @@ -689,7 +688,7 @@ Label text for step two of attach pod instructions */ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Hủy bỏ"; +"Cancel" = "Bỏ qua"; /* Text for continue button on PodSetupView */ "Continue" = "Tiếp tục"; @@ -704,7 +703,7 @@ Label text for step two of attach pod instructions */ "Next" = "Kế tiếp"; /* */ -"Expiration Reminder" = "Nhắc nhở Hết hạn"; +"Expiration Reminder" = "Nhắc nhở hết hạn"; /* Description text on LowReservoirReminderSetupView */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Ứng dụng sẽ thông báo khi lượng insulin trong Pod đạt đến mức này (50-10 U).\n\n Kéo xuống để chọn số Unit mà bạn muốn để nhận thông báo."; @@ -809,12 +808,12 @@ Label text for step two of attach pod instructions */ "Previous Pod Details" = "Thông tin của Pod trước đó"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Chi tiết về Trình quản lý Máy bơm"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Pump Manager..."; +"Retrieving Pump Manager Details..." = "Đang truy xuất thông tin Trình quản lý máy bơm..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Làm mới Pump Manager Details"; +"Refresh Pump Manager Details" = "Làm mới Chi tiết về Trình quản lý Máy bơm"; /* Section header for diagnostic section */ "Diagnostics" = "Chẩn đoán"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index ccda671d38..463eca07b1 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -435,6 +435,9 @@ /* Label text for step 1 of pair pod instructions */ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "用至少100个单位的胰岛素填充一个新的pod (不要取下Pod的针头盖)。"; +/* Label text for step 1 of pair pod instructions */ +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; + /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "注意听两声哔声"; @@ -459,10 +462,6 @@ /* Label text for step one of attach pod instructions */ "Prepare site." = "将注射部位做好准备"; -/* Remove the Pod’s blue needle cap and check cannula. Then remove paper backing. -Label text for step two of attach pod instructions */ -"Remove the Pod’s blue needle cap and check cannula. Then remove paper backing." = "移除蓝色防尘帽并检查出药口软管,然后移除覆盖的贴纸"; - /* Label text for step three of attach pod instructions */ "Check Pod, apply to site, then confirm pod attachment." = "检查Pod,贴在注射部位上,确保pod已经贴牢"; @@ -710,7 +709,7 @@ Label text for step two of attach pod instructions */ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "低药量"; /* */ "Save" = "保存​​"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index a3b7b3a417..a214c79917 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactivate"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index be078fbfe6..1311c51c65 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deaktiver"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 702fbf6a0d..e9781baad3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deaktivieren"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Pod deaktivieren"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index f1255d125d..eb1bfcaddc 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Desactivar"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Desactivar Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index e41304948a..2c0f23c2bc 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deaktivoi"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktivoi pumppu"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index 30a0f36da6..ad431ddb52 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Désactiver"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Désactiver le Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index e5a65aceb3..7b7c9b6d65 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactivate"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings index 31660bf330..7503963a0a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactivate"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index a171c1ad24..09e488b442 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Disattiva"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Disattiva Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index eca1fc4e17..f9feed5eb7 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deaktiver"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 67917dc46b..7be4f70dc4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactiveer"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactiveer Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 08d9e94b7d..8eee00341a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Dezaktywuj"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Dezaktywuj POD'a"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index 72b1e743f3..e888aa5a4d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Desativar"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Desativar Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 2718eea445..62cc7db41d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deactivate"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index ddc9d602c2..3f033a0f7a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Деактивировать"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Сдвиньте для деактивации"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Деактивировать Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index cff69338bd..827c53da42 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Deaktivovať"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktivovať pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 9d2a4613a2..91eed0e78c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Inaktivera"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Svep för att inaktivera podd"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Inaktivera podd"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 6f6f95c14a..57e1e7557f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Devre dışı bırak"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Pod'u devre dışı bırak"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 63ec6f256e..9afcc9a047 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Деактивувати"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Деактивувати Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 0473a8a4e8..494893f414 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "Hủy kích hoạt"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Hủy kích hoạt Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 61c57edcb8..51edf6dfd8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -179,6 +179,9 @@ /* Button title to deactivate pod because of fault during setup */ "Deactivate" = "解除"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "解除Pod"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index bae3bd3337..ef33741048 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -89,7 +89,7 @@ "Result" = "Kết quả"; /* For the Bolus View pop-up */ -"Your entered amount was limited by your max Bolus setting of %d%@" = "Liều thêm vào bị giới hạn bởi liều Max bolus %d%@"; +"Your entered amount was limited by your max Bolus setting of %d%@" = "Liều thêm vào bị giới hạn bởi liều \"Liều bolus tối đa\" %d%@"; /* Bolus View Continue Button */ "Continue" = "Tiếp tục"; @@ -927,10 +927,10 @@ Enact a temp Basal or a temp target */ "Unit override" = "Đơn vị ghi đè"; /* */ -"Low" = "Thấp"; +"Low" = "Low"; /* */ -"High" = "Cao"; +"High" = "High"; /* */ "glucose" = "đường huyết"; @@ -1232,7 +1232,7 @@ Enact a temp Basal or a temp target */ " U/day" = " U/ngày"; /* Total AT / Scheduled basal insulin */ -"Total" = "Tổng số"; +"Total" = "Total"; /* -------------------------------------------- FPU Strings ------------------------------------------------------*/ /* Enable FPU */ @@ -1267,7 +1267,7 @@ Enact a temp Basal or a temp target */ "Hide Fat & Protein" = "Ẩn chất béo & chất đạm"; /* Add Fat */ -"Fat" = "Chất Béo"; +"Fat" = "Chất béo"; /* Add Protein */ "Protein" = "Chất đạm"; @@ -1293,7 +1293,7 @@ Enact a temp Basal or a temp target */ "Override your Basal, ISF, CR and Target profiles" = "Ghi đè Basal, ISF, CR và Target của bạn"; /* */ -"Enable indefinitely" = "Cấp phép không giới hạn"; +"Enable indefinitely" = "Kích hoạt vô thời hạn"; /* */ "Override Profile target" = "Mục tiêu của ghi đè"; @@ -1362,7 +1362,7 @@ Enact a temp Basal or a temp target */ "Override Profile Target" = "Mục tiêu ghi đè"; /* Alert string. Keep spaces. */ -" SMBs are disabled either by schedule or during the entire duration." = " SBMs bị vô hiệu theo lịch trình hoặc theo toàn bộ thời gian."; +" SMBs are disabled either by schedule or during the entire duration." = " SMBs bị vô hiệu theo lịch trình hoặc theo toàn bộ thời gian."; /* Alert strings. Keep spaces */ " infinite duration." = " thời gian không xác định."; @@ -1392,7 +1392,7 @@ Enact a temp Basal or a temp target */ "Empty" = "Trống rỗng"; /* */ -"Delete Selected Preset" = "Xóa cài đặt trước đã chọn"; +"Delete Selected Preset" = "Xóa mẫu cài đặt trước đã chọn"; /* */ "Enter Meal Preset Name" = "Nhập tên trước bữa ăn"; @@ -1404,7 +1404,7 @@ Enact a temp Basal or a temp target */ "Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Lưu cài đặt mẫu"; +"Save as Preset" = "Lưu mẫu cài đặt"; /* */ "Predictions" = "Dự đoán"; @@ -1427,7 +1427,7 @@ Enact a temp Basal or a temp target */ "Please wait" = "Vui lòng chờ"; /* */ -"Glucose, " = "Glucose, "; +"Glucose, " = "Đường huyết, "; /* */ "Target Glucose" = "Đường huyết mục tiêu"; @@ -1632,7 +1632,7 @@ Enact a temp Basal or a temp target */ "Month" = "Month"; /* */ -"Total" = "Tổng số"; +"Total" = "Total"; /* Headline Statistics */ "Statistics" = "Thống kê"; @@ -1641,13 +1641,13 @@ Enact a temp Basal or a temp target */ "Allow Upload of Statistics to NS" = "Cho phép tải thống kê lên NS"; /* Low Glucose Threshold in Statistics settings */ -"Low" = "Thấp"; +"Low" = "Low"; /* High Glucose Threshold in Statistics settings */ -"High" = "Cao"; +"High" = "High"; /* In Range */ -"In Range" = "Trong phạm vi"; +"In Range" = "In Range"; /* Display % */ "Change HbA1c Unit" = "Thay đổi đơn vị của HbA1c"; @@ -1701,10 +1701,10 @@ Enact a temp Basal or a temp target */ "Normal" = "Normal"; /* Title High BG in statPanel */ -"High (>" = "Cao (>"; +"High (>" = "High (>"; /* Title Low BG in statPanel */ -"Low (<" = "Thấp (<"; +"Low (<" = "Low (<"; /* SD */ "SD" = "SD"; @@ -1950,13 +1950,13 @@ Enact a temp Basal or a temp target */ "The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của maxCOB là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức maxCOB và giữ nó ở mức maxCOB cho đến khi lượng carb nhập vào trên maxCOB cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; /* Headline "Bolus Snooze DIA Divisor" */ -"Bolus Snooze DIA Divisor" = "Bolus Snooze DIA Divisor"; +"Bolus Snooze DIA Divisor" = "Chế độ báo lại bolus"; /* "Bolus Snooze DIA Divisor" */ "Bolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2)." = "Chế độ báo lại bolus được kích hoạt sau khi bạn thực hiện một bữa ăn nhanh, vì vậy vòng lặp sẽ không phản tác dụng với nhiệt độ thấp khi bạn vừa ăn. Ví dụ ở đây và mặc định là 2; vì vậy DIA 3 giờ có nghĩa là thời gian báo lại bolus sẽ giảm dần trong 1,5 giờ (3DIA/2)."; /* Headline "Min 5m Carbimpact" */ -"Min 5m Carbimpact" = "Tác động tối thiểu 5m"; +"Min 5m Carbimpact" = "Tác động tối thiểu 5 phút"; /* "Min 5m Carbimpact" */ "This is a setting for default carb absorption impact per 5 minutes. The default is an expected 8 mg/dL/5min. This affects how fast COB is decayed in situations when carb absorption is not visible in BG deviations. The default of 8 mg/dL/5min corresponds to a minimum carb absorption rate of 24g/hr at a CSF of 4 mg/dL/g." = "Đây là cài đặt cho tác động hấp thụ carb mặc định trong 5 phút. Giá trị mặc định là 8 mg/dL/5 phút dự kiến. Điều này ảnh hưởng đến tốc độ phân hủy của COB trong các tình huống khi không thể nhìn thấy sự hấp thụ carb ở độ lệch BG. Giá trị mặc định là 8 mg/dL/5 phút tương ứng với tốc độ hấp thụ carb tối thiểu là 24g/giờ ở CSF là 4 mg/dL/g."; @@ -1992,7 +1992,7 @@ Enact a temp Basal or a temp target */ "Defaults to start at 30. This is the maximum minutes of basal that can be delivered by UAM as a single SMB when IOB exceeds COB. This gives the ability to make UAM more or less aggressive if you choose. It is recommended that the value is set to start at 30, in line with the default, and if you choose to increase this value, do so in no more than 15 minute increments, keeping a close eye on the effects of the changes. Reducing the value will cause UAM to dose less insulin for each SMB. It is not recommended to set this value higher than 60 mins, as this may affect the ability for the algorithm to safely zero temp. It is also recommended that pushover is used when setting the value to be greater than default, so that alerts are generated for any predicted lows or highs." = "Mặc định bắt đầu từ 30. Đây là số phút cơ bản tối đa mà UAM có thể phân phối dưới dạng một SMB khi IOB vượt quá COB. Điều này mang lại khả năng khiến UAM trở nên hung hãn hơn hoặc ít hơn nếu bạn chọn. Bạn nên đặt giá trị này để bắt đầu ở mức 30, phù hợp với giá trị mặc định và nếu bạn chọn tăng giá trị này, hãy thực hiện với khoảng tăng không quá 15 phút, đồng thời theo dõi chặt chẽ tác động của các thay đổi. Việc giảm giá trị sẽ khiến UAM giảm liều insulin cho mỗi SMB. Không nên đặt giá trị này cao hơn 60 phút vì điều này có thể ảnh hưởng đến khả năng thuật toán về nhiệt độ bằng 0 một cách an toàn. Chúng tôi cũng khuyên bạn nên sử dụng tính năng đẩy khi đặt giá trị lớn hơn giá trị mặc định để cảnh báo được tạo ra cho bất kỳ mức thấp hoặc mức cao được dự đoán nào."; /* Headline "SMB Interval" */ -"SMB Interval" = "SMB Interval"; +"SMB Interval" = "Khoảng thời gian SMB"; /* "SMB Interval" */ "Minimum duration in minutes for new SMB since last SMB or manual bolus" = "Thời lượng tối thiểu tính bằng phút cho SMB mới kể từ SMB cuối cùng hoặc liều truyền thủ công"; @@ -2156,7 +2156,7 @@ Enact a temp Basal or a temp target */ "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Dynamic settings"; +"Dynamic settings" = "Cài đặt Dynamic"; /* Insulin curve */ "Insulin curve" = "Chủng loại insulin"; From 1b89625d09d86ebf577c2aeb9f9916e87e627282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 9 Jan 2024 00:00:33 +0100 Subject: [PATCH 341/405] Just remove a typo --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 2bacc2a842..c75e417fb9 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,.5!=i.smb_delivery_ratio&&($e.reason+=", SMB Ratio: "+i.smb_delivery_ratio),$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,.5!=i.smb_delivery_ratio&&($e.reason+=", SMB Ratio: "+i.smb_delivery_ratio),$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file From 7eba97bcb65c0715396c70bb67ec6a9338f07598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 9 Jan 2024 00:27:58 +0100 Subject: [PATCH 342/405] Allow for a longer string. --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index c75e417fb9..00e535404e 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,.5!=i.smb_delivery_ratio&&($e.reason+=", SMB Ratio: "+i.smb_delivery_ratio),$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file From 9311497a5fcfdfc2b83c072c1241f107bdc5aff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 9 Jan 2024 14:42:46 +0100 Subject: [PATCH 343/405] Vietnamese Crowdin updates (#469) --- .../OmniBLE/Localizations/vi.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/vi.lproj/Localizable.strings | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 1b70b9d540..c23795298e 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Dùng loại insulin U-100."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Tháo nắp kim màu xanh của Pod và kiểm tra ống thông. Sau đó loại bỏ lớp lót giấy."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Nghe 2 tiếng bíp."; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index ef33741048..a81b629b98 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -675,7 +675,7 @@ Enact a temp Basal or a temp target */ "Remove All" = "Loại bỏ tất cả"; /* */ -"About the Process" = "Về quá trình"; +"About the Process" = "Về quá trình xử lý"; /* */ "Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Xin chắc chắn rằng Libre 2 của bạn đã được kích hoạt and hoàn thành khởi động. Nếu bạn đang có app nào kết nối với cảm biến qua bluetooth thì nên đóng các app này lại hoặc gỡ các app khỏi máy.\n\n Bạn chỉ được dùng 01 app để kết nối với cảm biến qua bluetooth. Sau đó nhấn \"pairing and connection\" để tiếp tục. Bluetooth có thể mất vài phút để kết nối trước khi bắt đầu hoạt động."; @@ -1901,7 +1901,7 @@ Enact a temp Basal or a temp target */ "Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi đỉnh của insulin"; /* Headline "Suspend Zeros IOB” */ -"Suspend Zeros IOB" = "Suspend Zeros IOB"; +"Suspend Zeros IOB" = "Đình chỉ IOB bằng 0"; /* "Suspend Zeros IOB” */ "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; From f0285188a892c31a57987c664baa2ebbed2c34bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 9 Jan 2024 17:36:38 +0100 Subject: [PATCH 344/405] Refactor (cherry picked from commit 9a2e497b2f4bd5d30b7eef418112f8ee284acb58) --- FreeAPS/Resources/javascript/prepare/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/prepare/determine-basal.js b/FreeAPS/Resources/javascript/prepare/determine-basal.js index 392931d867..274803c578 100644 --- a/FreeAPS/Resources/javascript/prepare/determine-basal.js +++ b/FreeAPS/Resources/javascript/prepare/determine-basal.js @@ -8,7 +8,7 @@ function generate(iob, currenttemp, glucose, profile, autosens = null, meal = nu try { var middlewareReason = middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock, pump_history, preferences, basalProfile, oref2_variables); middleware_was_used = (middlewareReason || "Nothing changed"); - console.log("Middleware reason: " + (middlewareReason || "Nothing changed")); + console.log("Middleware reason: " + middleware_was_used); } catch (error) { console.log("Invalid middleware: " + error); }; From 07fc4a6594669eb7297c610b03b3095a9d0fdff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:48:08 +0100 Subject: [PATCH 345/405] Display (more )empty tubes and minus IOB as red. (#468) --- .../Modules/Home/View/HomeRootView.swift | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 226eb2f4fa..706eae63a8 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -419,10 +419,15 @@ extension Home { let substance = Double(state.suggestion?.cob ?? 0) let max = max(Double(settings.preferences.maxCOB), 1) let fraction: Double = 1 - (substance / max) - let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) - TestTube(opacity: opacity, amount: fill, colourOfSubstance: .loopYellow, materialOpacity: materialOpacity) - .frame(width: 12, height: 38) - .offset(x: 0, y: -5) + let fill = CGFloat(min(Swift.max(fraction, 0.05), substance > 0 ? 0.92 : 0.97)) + TestTube( + opacity: opacity, + amount: fill, + colourOfSubstance: .loopYellow, + materialOpacity: materialOpacity + ) + .frame(width: 12, height: 38) + .offset(x: 0, y: -5) HStack(spacing: 0) { Text( numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0" @@ -434,10 +439,15 @@ extension Home { let substance = Double(state.suggestion?.iob ?? 0) let max = max(Double(settings.preferences.maxIOB), 1) let fraction: Double = 1 - (substance / max) - let fill = CGFloat(min(Swift.max(fraction, 0.10), substance > 0 ? 0.85 : 0.92)) - TestTube(opacity: opacity, amount: fill, colourOfSubstance: .insulin, materialOpacity: materialOpacity) - .frame(width: 12, height: 38) - .offset(x: 0, y: -5) + let fill = CGFloat(min(Swift.max(fraction, 0.05), substance > 0 ? 0.92 : 0.98)) + TestTube( + opacity: opacity, + amount: fill, + colourOfSubstance: substance < 0 ? .red : .insulin, + materialOpacity: materialOpacity + ) + .frame(width: 12, height: 38) + .offset(x: 0, y: -5) HStack(spacing: 0) { Text( numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0" From f1d6b6fdcaaf66bc45e1d27af951a03506114b6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 10 Jan 2024 21:32:24 +0100 Subject: [PATCH 346/405] Crowdin updates (#474) Vietnamese and Italian. --- .../it.lproj/Localizable.strings | 2 +- .../Resources/it.lproj/Localizable.strings | 2 +- .../Main/it.lproj/Localizable.strings | 42 +++++++++---------- .../Main/vi.lproj/Localizable.strings | 12 +++--- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index c088ad63bd..5041a8ffd4 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Riempi un nuovo pod con U-100 Insulina (lascia il cappuccio blu dell’ago sul pod)."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Rimuovere il cappuccio blu dell'ago del Pod e controllare la cannula. Quindi rimuovere le due coperture di carta."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Ascolta per 2 bip."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 09e488b442..07882e69d0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -180,7 +180,7 @@ "Deactivate" = "Disattiva"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Scorri per disattivare il pod"; /* Button title for pod deactivation Button title to deactivate pod */ diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 3859f8f0d5..6bb2d40adc 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -47,7 +47,7 @@ "Agree and continue" = "Acconsenti e Continua"; /* Bolus progress view */ -"of" = "of"; +"of" = "di"; /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Eseguito alle"; @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Usa server locale come sorgente glicemia"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Questo consente il caricamento di statistics.json in Nightscout, che può essere utilizzato dal Community Statistics and Demographics Project.\n\nLa partecipazione alle statistiche comunitarie è facoltativa e richiede una registrazione separata a:\n"; /* */ "Edit settings json" = "Modifica impostazioni json"; @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Usa CR Dinamico. Il rapporto dinamico sarà utilizzato per CR come segue:\n\n Quando rapporto > 1: dynCR = (newRatio - 1) / 2 + 1.\nQuando il rapporto < 1: dynCR = CR/dynCR.\n\nNon usare insieme a frazione d'insulina elevata (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Attiva Sensibilità Dinamica (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Attiva Rapporto Carboidrati Dinamico (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Regola i rapporti dinamici della costante ISF"; @@ -2069,60 +2069,60 @@ Regola la costante ISF dinamica"; "Formula" = "Formula"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sicurezza"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Usa una funzione sigmoid per ISF (e per CR, quando abilitato), invece della formula Logaritmica predefinita. Richiede l'impostazione ISF dinamica per essere abilitata nelle impostazioni\n\nL'impostazione di regolazione regola la pendenza della curva (Y: Dynamic ratio, X: Colla Di Sangue). Un valore inferiore ==> meno ripido == meno aggressivo.\n\nGli autosens. le impostazioni in/max determinano sia i limiti max/min per il rapporto dinamico E quanto il rapporto dinamico viene regolato. Se AF è la pendenza della curva, gli autosensi. in/max è l'altezza del grafico, l'intervallo Y, dove Y: rapporto dinamico. La curva avrà sempre una forma di sigmoid, indipendentemente dagli autosensi. le impostazioni in/max sono usate, il che significa che queste impostazioni hanno grandi conseguenze per il risultato del ISF dinamico calcolato. Attenzione all'impostazione di un valore autosens.max troppo alto. Con una corretta impostazione ISF del profilo, probabilmente non avrete mai bisogno di essere superiore a 1.\n\nUn limite di Autosens.max > 1.5 non è consigliabile quando si utilizza la funzione sigmoid."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Impostazione soglia"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "La soglia predefinita in FAX dipende dall'attuale obiettivo di glicemia minima, come segue:\n\nSe il vostro obiettivo minimo di glicemia = 90 mg/dl -> soglia = 65 mg/dl,\n\nse obiettivo minimo di glicemia = 100 mg/dl -> soglia = 70 mg/dl,\n\nobiettivo minimo di glicemia = 110 mg/dl -> soglia = 75 mg/dl,\n\ne se obiettivo minimo di glicemia = 130 mg/dl -> soglia = 85 mg/dl.\n\nQuesta impostazione ti permette di cambiare il valore predefinito ad una soglia più alta per il looping con dynISF. Valori validi sono 65 mg/dl<= Impostazione soglia <= 120 mg/dl."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Impostazioni calcolatore"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Mostra Previsioni"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Schermi iPhone più piccoli"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Visualizzare e consenti aggiunta di grasso e proteine"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Aggiungi impostazioni di visualizzazione pasti "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Mostra Pulsante target temporaneo(Temp)"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Pannello Pulsante Visualizzazione Home "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Nel caso in cui stai utilizzando sia i profili che gli obiettivi temporali"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Colore sempre il valore della glucosio (verde, giallo, ecc)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Impostazioni d'intestazione"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalmente il glucosio è di colore rosso solo quando sopra o sotto i limiti di notifica per alto/basso"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "La vista di scorrimento orizzontale mostra le ore visibili"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Attività in tempo reale"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "L'attività in tempo reale mostra il glucosio attivo nel sangue sulla schermata di blocco e sulla Dynamic Island(se disponibile)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Mostra attività in tempo reale"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Media ponderata di TDD. Peso delle ultime 24 ore:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index a81b629b98..f2f4093739 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -630,7 +630,7 @@ Enact a temp Basal or a temp target */ "Bluetooth Transmitters" = "Bluetooth Transmitters"; /* */ -"Modes" = "Chế độ cảm biến"; +"Modes" = "Loại cảm biến"; /* Libre 2 Direct */ "Libre 2 Direct" = "Libre 2 Direct"; @@ -771,7 +771,7 @@ Enact a temp Basal or a temp target */ "Low battery" = "Pin yếu"; /* */ -"Invalid sensor" = "Lỗi nhập không hợp lệ"; +"Invalid sensor" = "Cảm biến không hợp lệ"; /* */ "Sensor change" = "Thay đổi cảm biến"; @@ -912,7 +912,7 @@ Enact a temp Basal or a temp target */ "Adds Phone Battery" = "Hãy sạc Pin điện thoại"; /* */ -"Adds Transmitter Battery" = "Hãy sạc Pin của Transmitter"; +"Adds Transmitter Battery" = "Hãy sạc Pin Transmitter"; /* */ "Also vibrate" = "Rung"; @@ -1077,7 +1077,7 @@ Enact a temp Basal or a temp target */ "Suspend" = "Đã tạm ngưng"; /* */ -"Animated Background" = "Animated Background"; +"Animated Background" = "Nền màn hình động"; /* Sensor day(s) */ " day(s)" = " ngày(s)"; @@ -1087,7 +1087,7 @@ Enact a temp Basal or a temp target */ /* Headers for settings ----------------------- */ -"OpenAPS main settings" = "Cài đặt chính của OpenAPS"; +"OpenAPS main settings" = "Cài đặt chính OpenAPS"; "OpenAPS SMB settings" = "Cài đặt SMB OpenAPS"; @@ -1901,7 +1901,7 @@ Enact a temp Basal or a temp target */ "Defaults to false. Setting to true allows changing insulinPeakTime" = "Mặc định là False. Đặt thành True cho phép thay đổi đỉnh của insulin"; /* Headline "Suspend Zeros IOB” */ -"Suspend Zeros IOB" = "Đình chỉ IOB bằng 0"; +"Suspend Zeros IOB" = "Tạm dừng IOB bằng 0"; /* "Suspend Zeros IOB” */ "Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; From 90e2c6b2944afcd752be4b71d8dc814d684ea2d0 Mon Sep 17 00:00:00 2001 From: Joe Moran Date: Sun, 14 Jan 2024 05:49:52 -0800 Subject: [PATCH 347/405] Fix DASH pod deactivation for simulator by setting podComms delegate (#479) --- .../OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift index df1623f844..4fb4d9df05 100644 --- a/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/Dependencies/OmniBLE/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -775,6 +775,9 @@ extension OmniBLEPumpManager { self.podComms = PodComms(podState: podState, myId: state.controllerId, podId: state.podId) + self.podComms.delegate = self + self.podComms.messageLogger = self + setState({ (state) in state.updatePodStateFromPodComms(podState) state.scheduledExpirationReminderOffset = state.defaultExpirationReminderOffset From 06536413884bbdc0d95e01a93f9bedb22548a8df Mon Sep 17 00:00:00 2001 From: Deniz Cengiz <48965855+dnzxy@users.noreply.github.com> Date: Sun, 14 Jan 2024 18:57:38 +0100 Subject: [PATCH 348/405] Extend HealthKitManager with Logging (#475) --- .../Services/HealthKit/HealthKitManager.swift | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index f05e082b99..771db753ed 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -19,9 +19,9 @@ protocol HealthKitManager: GlucoseSource { func saveIfNeeded(carbs: [CarbsEntry]) /// Save Insulin to Health store func saveIfNeeded(pumpEvents events: [PumpHistoryEvent]) - /// Create observer for data passing beetwen Health Store and FreeAPS + /// Create observer for data passing beetwen Health Store and iAPS func createBGObserver() - /// Enable background delivering objects from Apple Health to FreeAPS + /// Enable background delivering objects from Apple Health to iAPS func enableBackgroundDelivery() /// Delete glucose with syncID func deleteGlucose(syncID: String) @@ -169,7 +169,19 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P ) } - healthKitStore.save(samplesToSave) { _, _ in } + healthKitStore.save(samplesToSave) { (success: Bool, error: Error?) -> Void in + if success { + for sample in samplesToSave { + debug( + .service, + "Stored blood glucose \(sample.quantity) in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" + ) + } + } else { + debug(.service, "Failed to store blood glucose in HealthKit Store!") + debug(.service, error?.localizedDescription ?? "Unknown error") + } + } } loadSamplesFromHealth(sampleType: sampleType, withIDs: bloodGlucose.map(\.id)) @@ -195,7 +207,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let sampleDates = samples.map(\.startDate) let samplesToSave = carbsWithId .filter { !sampleIDs.contains($0.id ?? "") } // id existing in AH - .filter { !sampleDates.contains($0.actualDate ?? $0.createdAt) } // not id but exaclty the same datetime + .filter { !sampleDates.contains($0.actualDate ?? $0.createdAt) } // not id but exactly the same datetime .map { HKQuantitySample( type: sampleType, @@ -211,7 +223,19 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P ) } - healthKitStore.save(samplesToSave) { _, _ in } + healthKitStore.save(samplesToSave) { (success: Bool, error: Error?) -> Void in + if success { + for sample in samplesToSave { + debug( + .service, + "Stored carb entry \(sample.quantity) in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" + ) + } + } else { + debug(.service, "Failed to store carb entry in HealthKit Store!") + debug(.service, error?.localizedDescription ?? "Unknown error") + } + } } loadSamplesFromHealth(sampleType: sampleType) @@ -276,7 +300,19 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P ) } - healthKitStore.save(bolusSamples + basalSamples) { _, _ in } + healthKitStore.save(bolusSamples + basalSamples) { (success: Bool, error: Error?) -> Void in + if success { + for sample in bolusSamples + basalSamples { + debug( + .service, + "Stored insulin entry in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" + ) + } + } else { + debug(.service, "Failed to store insulin entry in HealthKit Store!") + debug(.service, error?.localizedDescription ?? "Unknown error") + } + } } loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) From b1fb431bd1984e54ba1e30e4b4c97eaf06173b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 15 Jan 2024 00:15:23 +0100 Subject: [PATCH 349/405] Crowdin updates (#476) --- .../OmniBLE/Localizations/nl.lproj/Localizable.strings | 2 +- .../OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/vi.lproj/Localizable.strings | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 2e37adf37c..579c55c9b4 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline. Verwijder de blauwe naalddop niet."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 7be4f70dc4..febb6e08d5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -180,7 +180,7 @@ "Deactivate" = "Deactiveer"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Button title for pod deactivation Button title to deactivate pod */ diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 6bb2d40adc..b1a4685045 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -543,7 +543,7 @@ Enact a temp Basal or a temp target */ "Low target" = "Target Basso"; /* When bolusing */ -"Bolusing" = "Eseguendo bolo"; +"Bolusing" = "Bolo in corso"; /* */ "Pump suspended" = "Micorinfusore sospeso"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index f2f4093739..49423d163b 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -35,10 +35,10 @@ "Recommendation" = "LIỀU KHUYẾN NGHỊ"; /* Button */ -"Clear" = "Hủy bỏ"; +"Clear" = "Hủy"; /* Button */ -"Done" = "Hoàn thành"; +"Done" = "Xong"; /* */ "Wait please" = "Xin đợi chốc lát"; From 8f44f529ced7bed48649b94cfe1c8e5acf52c960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 15 Jan 2024 00:16:37 +0100 Subject: [PATCH 350/405] Crowdin updates (#476) (#481) --- .../OmniBLE/Localizations/nl.lproj/Localizable.strings | 2 +- .../OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- .../Sources/Localizations/Main/vi.lproj/Localizable.strings | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 2e37adf37c..579c55c9b4 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Vul een nieuwe Pod met U-100 insuline. Verwijder de blauwe naalddop niet."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Verwijder de blauwe naalddop van de Pod en controleer de canule. Verwijder vervolgens de beschermlaag van de hechtstrip."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Luister naar 2 piepjes."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 7be4f70dc4..febb6e08d5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -180,7 +180,7 @@ "Deactivate" = "Deactiveer"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Button title for pod deactivation Button title to deactivate pod */ diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 6bb2d40adc..b1a4685045 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -543,7 +543,7 @@ Enact a temp Basal or a temp target */ "Low target" = "Target Basso"; /* When bolusing */ -"Bolusing" = "Eseguendo bolo"; +"Bolusing" = "Bolo in corso"; /* */ "Pump suspended" = "Micorinfusore sospeso"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index f2f4093739..49423d163b 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -35,10 +35,10 @@ "Recommendation" = "LIỀU KHUYẾN NGHỊ"; /* Button */ -"Clear" = "Hủy bỏ"; +"Clear" = "Hủy"; /* Button */ -"Done" = "Hoàn thành"; +"Done" = "Xong"; /* */ "Wait please" = "Xin đợi chốc lát"; From b0b9b9bad0dccde97e520ac5365ef5381fcd7220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 18 Jan 2024 11:43:35 +0100 Subject: [PATCH 351/405] Set a configurable minimum threshold, co-authored by Mike Plante. --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 00e535404e..5c473187fa 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+") ":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+") ":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De+" ",we=", Basal ratio: "+De+" ",(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40);var _t=i.threshold_setting;_t>A&&_t<=120&&_t>=65?(console.error("Threshold changed in settings from "+n(A,i)+" to "+n(_t,i)+". "),A=_t):console.error("Current threshold: "+n(A,i));var yt="",xt=(o(J,1),J);if(void 0!==s&&s&&((xt=o(xt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(xt,i)):process.stderr.write("ISF unchanged: "+n(xt,i)),yt+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(xt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var St,Dt=a;if(a.length,a.length>1&&(a=Dt[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var wt=((St=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+St+"m, tempModulus:"+wt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&St>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var Gt=St-a.lastTemp.duration;if(Gt>5&&St>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+Gt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Tt=o(-a.activity*xt*5,2),Ct=o(6*(rt-Tt));Ct<0&&(Ct=o(6*(ot-Tt)))<0&&(Ct=o(6*(e.long_avgdelta-Tt)));var Ut=tt,Ot=(Ut=a.iob>0?o(tt-a.iob*xt):o(tt-a.iob*Math.min(xt,J)))+Ct;if(void 0===Ot||isNaN(Ot))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+xt+" Deviation: "+Ct,$e;var At,Rt,It=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ot,Tt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ot,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:It,minGuardBG:Rt,minPredBG:At,threshold:n(A,i)};var Ft=[],jt=[],Pt=[],Et=[];Ft.push(tt),jt.push(tt),Et.push(tt),Pt.push(tt);var qt=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),qt=!1),GNt&&(console.error("Limiting carb impact from "+kt+" to "+Nt+"mg/dL/5m (30g/h)"),kt=Nt);var Ht=3;sensitivityRatio&&(Ht/=sensitivityRatio);var Zt=Ht;if(l.carbs){Ht=Math.max(Ht,l.mealCOB/20);var $t=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),Jt=(l.carbs-l.mealCOB)/l.carbs;Zt=o(Zt=Ht+1.5*$t/60,1),console.error("Last carbs "+$t+" minutes ago; remainingCATime:"+Zt+"hours; "+o(100*Jt,1)+"% carbs absorbed")}var Kt=Math.max(0,kt/5*60*Zt/2)/csf,Qt=90,Vt=1;i.remainingCarbsCap&&(Qt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Vt=Math.min(1,i.remainingCarbsFraction));var Xt=1-Vt,Yt=Math.max(0,l.mealCOB-Kt-l.carbs*Xt),ea=(Yt=Math.min(Qt,Yt))*csf*5/60/(Zt/2),ta=o(l.slopeFromMaxDeviation,2),aa=o(l.slopeFromMinDeviation,2),ra=Math.min(ta,-aa/3);Lt=0===kt?0:Math.min(60*Zt/5/2,Math.max(0,l.mealCOB*csf/kt)),console.error("Carb Impact:"+kt+"mg/dL per 5m; CI Duration:"+o(5*Lt/60*2,1)+"hours; remaining CI ("+Zt/2+"h peak):"+o(ea,1)+"mg/dL per 5m");var oa,na,ia,sa,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=999,pa=Ot,va=tt,fa=tt,Ba=0,ba=[],Ma=[];try{Dt.forEach((function(e){var t=o(-e.activity*xt*5,2),a=o(-e.iobWithZeroTemp.activity*xt*5,2),r=Ut,n=kt*(1-Math.min(1,jt.length/12));if(!0===(U&&!Pe))pa=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+n,r=Et[Et.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Et[Et.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(pa,2)+" , ZTpredBG: "+o(r,2));else pa=jt[jt.length-1]+t+n,r=Et[Et.length-1]+a;var i=Math.max(0,Math.max(0,kt)*(1-Ft.length/Math.max(2*Lt,1))),s=Math.min(Ft.length,12*Zt-Ft.length),l=Math.max(0,s/(Zt/2*12)*ea);i+l,ba.push(o(l,0)),Ma.push(o(i,0)),COBpredBG=Ft[Ft.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,zt+Pt.length*ra),m=Math.max(0,zt*(1-Pt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(Ba=o(5*(Pt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=Pt[Pt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Pt[Pt.length-1]+t+Math.min(0,n)+d;jt.length<48&&jt.push(pa),Ft.length<48&&Ft.push(COBpredBG),Pt.length<48&&Pt.push(UAMpredBG),Et.length<48&&Et.push(r),COBpredBG18&&pava&&(va=pa),(Lt||ea>0)&&Ft.length>18&&COBpredBG0)&&COBpredBG>va&&(fa=COBpredBG),Wt&&Pt.length>12&&UAMpredBGva&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+Ma.join(" ")),console.error("remainingCIs: "+ba.join(" "))),$e.predBGs={},jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var _a=jt.length-1;_a>12&&jt[_a-1]===jt[_a];_a--)jt.pop();for($e.predBGs.IOB=jt,na=o(jt[jt.length-1]),Et.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Et.length-1;_a>6&&!(Et[_a-1]>=Et[_a]||Et[_a]<=it);_a--)Et.pop();if($e.predBGs.ZT=Et,o(Et[Et.length-1]),l.mealCOB>0&&(kt>0||ea>0)){for(Ft.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),_a=Ft.length-1;_a>12&&Ft[_a-1]===Ft[_a];_a--)Ft.pop();$e.predBGs.COB=Ft,ia=o(Ft[Ft.length-1]),Ot=Math.max(Ot,o(Ft[Ft.length-1])),console.error("COBpredBG: "+o(Ft[Ft.length-1]))}if(kt>0||ea>0){if(Wt){for(Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),_a=Pt.length-1;_a>12&&Pt[_a-1]===Pt[_a];_a--)Pt.pop();$e.predBGs.UAM=Pt,sa=o(Pt[Pt.length-1]),Pt[Pt.length-1]&&(Ot=Math.max(Ot,o(Pt[Pt.length-1])))}$e.eventualBG=Ot}console.error("UAM Impact:"+zt+"mg/dL per 5m; UAM Duration:"+Ba+"hours"),la=Math.max(39,la),ua=Math.max(39,ua),ma=Math.max(39,ma),At=o(la);var ya=l.mealCOB/l.carbs;oa=o(ma<999&&ua<999?(1-ya)*UAMpredBG+ya*COBpredBG:ua<999?(pa+COBpredBG)/2:ma<999?(pa+UAMpredBG)/2:pa),ha>oa&&(oa=ha),Rt=o(Rt=Lt||ea>0?Wt?ya*da+(1-ya)*ca:da:Wt?ca:ga);var xa=ma;if(hama&&(xa=(ma+ha)/2);if(xa=o(xa),l.carbs)if(!Wt&&ua<999)At=o(Math.max(la,ua));else if(ua<999){var Da=ya*ua+(1-ya)*xa;At=o(Math.max(la,ua,Da))}else At=Wt?xa:Rt;else Wt&&(At=o(Math.max(la,xa)));At=Math.min(At,oa),process.stderr.write("minPredBG: "+At+" minIOBPredBG: "+la+" minZTGuardBG: "+ha),ua<999&&process.stderr.write(" minCOBPredBG: "+ua),ma<999&&process.stderr.write(" minUAMPredBG: "+ma),console.error(" avgPredBG:"+oa+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),fa>tt&&(At=Math.min(At,fa)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Tt,i),$e.deviation=n(Ct,i),$e.ISF=n(xt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var wa=$e.CR;ze!=$e.CR&&(wa=ze+"→"+$e.CR),$e.reason=yt+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+wa+", Target: "+vt+", minPredBG "+n(At,i)+", minGuardBG "+n(Rt,i)+", IOBpredBG "+n(na,i),ia>0&&($e.reason+=", COBpredBG "+n(ia,i)),sa>0&&($e.reason+=", UAMpredBG "+n(sa,i)),$e.reason+=q,$e.reason+="; ";var Ga=Ut;Ga<40&&(Ga=Math.min(Rt,Ga));var Ta,Ca=A-Ga,Ua=240,Oa=240;if(l.mealCOB>0&&(kt>0||ea>0)){for(_a=0;_aTa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ta+"% of BG "+n(tt,i)+" - SMB disabled!, ",qt=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ua+"minutes"),(Oa<240||Ua<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Oa+"minutes");var Aa=Oa,Ra=i.current_basal*$*xt*Aa/60,Ia=Math.max(0,l.mealCOB-.25*l.carbs),Fa=(Ca-Ra)/csf-Ia;Ra=o(Ra),Fa=o(Fa),console.error("naive_eventualBG:",Ut,"bgUndershoot:",Ca,"zeroTempDuration:",Aa,"zeroTempEffect:",Ra,"carbsReq:",Fa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Fa>=i.carbsReqThreshold&&Oa<=45&&($e.carbsReq=Fa,$e.reason+=Fa+" add'l carbs req w/in "+Oa+"m; ");var ja=0;if(tt0&&rt>It)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(It,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var Pa=0,Ea=Qe,qa=0;if(OtIt&&rt>0&&!Fa)return Ut<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(It,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));Pa=o(Pa=2*Math.min(0,(Ot-it)/xt),2);var Wa=Math.min(0,(Ut-it)/xt);if(Wa=o(Wa,2),rt<0&&rt>It)Pa=o(Pa*(rt/It),2);Ea=r(Ea=Qe+2*Pa,i),qa=t.duration*(t.rate-Qe)/60;var ka=Math.min(Pa,Wa);if(console.log("naiveInsulinReq:"+Wa),qa5&&Ea>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Ea+"U/hr. ",$e;if(Ea<=0){if((ja=o(60*((Ca=it-Ut)/xt)/i.current_basal*$))<0?ja=0:(ja=30*o(ja/30),ja=Math.min(120,Math.max(0,ja))),ja>0)return $e.reason+=", setting "+ja+"m zero temp. ",u.setTempBasal(Ea,ja,i,$e,t)}else $e.reason+=", setting "+Ea+"U/hr. ";return u.setTempBasal(Ea,30,i,$e,t)}if(rt=2||It+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&It>0?3:rt<0&&It<=0||rt<0&&It>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),!m||!qt))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(It,i):$e.reason+="Eventual BG "+n(Ot,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(It,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ot,At)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/xt,2),$e.minPredBG=At),!m||!qt))return $e.reason+=n(Ot,i)+"-"+n(At,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ot>=lt&&($e.reason+="Eventual BG "+n(Ot,i)+" >= "+n(lt,i)+", ",Ot>lt&&($e.insulinForManualBolus=o((Ot-it)/xt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));Pa=o((Math.min(At,Ot)-it)/xt,2),O=o((Ot-it)/xt,2),Pa>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+Pa+" U)"),$e.reason+="max_iob "+mt+", ",Pa=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Pa+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Ea=r(Ea=Qe+2*Pa,i),Pa=o(Pa,3),$e.insulinReq=Pa;var La=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&qt&&tt>A){var za=30;void 0!==i.maxSMBBasalMinutes&&(za=i.maxSMBBasalMinutes);var Na=30;void 0!==i.maxUAMSMBBasalMinutes&&(Na=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==za&&(console.error("SMB Max Minutes - setting overriden from "+za+" to "+T),za=T),v.useOverride&&_&&C!==Na&&(console.error("UAM Max Minutes - setting overriden from "+Na+" to "+C),Na=C);var Ha=o(l.mealCOB/K,3),Za=0;void 0===za?(Za=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Pa>Za&&console.error("SMB limited by maxBolus: "+Za+" ( "+Pa+" U)")):a.iob>Ha&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Ha),Na?(console.error("maxUAMSMBBasalMinutes: "+Na+", profile.current_basal: "+i.current_basal*$),Za=o(i.current_basal*$*Na/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Za=o(i.current_basal*$*30/60,1)),Pa>Za?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Na+"m ]: "+Za+"U ( "+Pa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Pa+"U )")):(console.error(".maxSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Pa>(Za=o(i.current_basal*za/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+za+"m ]: "+Za+"U ( insulinReq: "+Pa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Pa+"U )"));var $a=i.bolus_increment,Ja=1/$a,Ka=i.smb_delivery_ratio;Ka>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ka,2));var Qa=Math.min(Pa*Ka,Za);Qa=Math.floor(Qa*Ja)/Ja,ja=o(60*((it-(Ut+la)/2)/xt)/i.current_basal*$),Pa>0&&Qa<$a&&(ja=0);var Va=0;ja<=0?ja=0:ja>=30?(ja=30*o(ja/30),ja=Math.min(60,Math.max(0,ja))):(Va=o(Qe*ja/30,2),ja=30),$e.reason+=" insulinReq "+Pa,Qa>=Za&&($e.reason+="; maxBolus "+Za),ja>0&&($e.reason+="; setting "+ja+"m low temp of "+Va+"U/h"),$e.reason+=". ";var Xa=3;i.SMBInterval&&(Xa=Math.min(10,Math.max(1,i.SMBInterval)));var Ya=o(Xa-La,0),er=o(60*(Xa-La),0)%60;if(console.error("naive_eventualBG "+Ut+","+ja+"m "+Va+"U/h temp needed; last bolus "+La+"m ago; maxBolus: "+Za),La>Xa?Qa>0&&($e.units=Qa,$e.reason+="Microbolusing "+Qa+"U. "):$e.reason+="Waiting "+Ya+"m "+er+"s to microbolus again. ",ja>0)return $e.rate=Va,$e.duration=ja,$e}var tr=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Ea>tr&&($e.reason+="adj. req. rate: "+Ea+" to maxSafeBasal: "+o(tr,2)+", ",Ea=r(tr,i)),(qa=t.duration*(t.rate-Qe)/60)>=2*Pa?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)):t.duration>5&&r(Ea,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Ea+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Ea+"U/hr. ",u.setTempBasal(Ea,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De,we=", Basal ratio: "+De,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40),A=Math.min(Math.max(i.threshold_setting,A,65),120),console.error("Threshold set to ${convert_bg(threshold, profile)}");var _t="",yt=(o(J,1),J);if(void 0!==s&&s&&((yt=o(yt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(yt,i)):process.stderr.write("ISF unchanged: "+n(yt,i)),_t+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(yt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var xt,St=a;if(a.length,a.length>1&&(a=St[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var Dt=((xt=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+xt+"m, tempModulus:"+Dt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&xt>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var wt=xt-a.lastTemp.duration;if(wt>5&&xt>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+wt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Gt=o(-a.activity*yt*5,2),Tt=o(6*(rt-Gt));Tt<0&&(Tt=o(6*(ot-Gt)))<0&&(Tt=o(6*(e.long_avgdelta-Gt)));var Ct=tt,Ut=(Ct=a.iob>0?o(tt-a.iob*yt):o(tt-a.iob*Math.min(yt,J)))+Tt;if(void 0===Ut||isNaN(Ut))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+yt+" Deviation: "+Tt,$e;var Ot,At,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ut,Gt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ut,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:Rt,minGuardBG:At,minPredBG:Ot,threshold:n(A,i)};var It=[],Ft=[],jt=[],Pt=[];It.push(tt),Ft.push(tt),Pt.push(tt),jt.push(tt);var Et=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),Et=!1),Gzt&&(console.error("Limiting carb impact from "+Wt+" to "+zt+"mg/dL/5m (30g/h)"),Wt=zt);var Nt=3;sensitivityRatio&&(Nt/=sensitivityRatio);var Ht=Nt;if(l.carbs){Nt=Math.max(Nt,l.mealCOB/20);var Zt=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),$t=(l.carbs-l.mealCOB)/l.carbs;Ht=o(Ht=Nt+1.5*Zt/60,1),console.error("Last carbs "+Zt+" minutes ago; remainingCATime:"+Ht+"hours; "+o(100*$t,1)+"% carbs absorbed")}var Jt=Math.max(0,Wt/5*60*Ht/2)/csf,Kt=90,Qt=1;i.remainingCarbsCap&&(Kt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Qt=Math.min(1,i.remainingCarbsFraction));var Vt=1-Qt,Xt=Math.max(0,l.mealCOB-Jt-l.carbs*Vt),Yt=(Xt=Math.min(Kt,Xt))*csf*5/60/(Ht/2),ea=o(l.slopeFromMaxDeviation,2),ta=o(l.slopeFromMinDeviation,2),aa=Math.min(ea,-ta/3);kt=0===Wt?0:Math.min(60*Ht/5/2,Math.max(0,l.mealCOB*csf/Wt)),console.error("Carb Impact:"+Wt+"mg/dL per 5m; CI Duration:"+o(5*kt/60*2,1)+"hours; remaining CI ("+Ht/2+"h peak):"+o(Yt,1)+"mg/dL per 5m");var ra,oa,na,ia,sa=999,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=Ut,pa=tt,va=tt,fa=0,Ba=[],ba=[];try{St.forEach((function(e){var t=o(-e.activity*yt*5,2),a=o(-e.iobWithZeroTemp.activity*yt*5,2),r=Ct,n=Wt*(1-Math.min(1,Ft.length/12));if(!0===(U&&!Pe))ha=Ft[Ft.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Ft[Ft.length-1],39)/Fe+1)))*5,2)+n,r=Pt[Pt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ha,2)+" , ZTpredBG: "+o(r,2));else ha=Ft[Ft.length-1]+t+n,r=Pt[Pt.length-1]+a;var i=Math.max(0,Math.max(0,Wt)*(1-It.length/Math.max(2*kt,1))),s=Math.min(It.length,12*Ht-It.length),l=Math.max(0,s/(Ht/2*12)*Yt);i+l,Ba.push(o(l,0)),ba.push(o(i,0)),COBpredBG=It[It.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Lt+jt.length*aa),m=Math.max(0,Lt*(1-jt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(fa=o(5*(jt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=jt[jt.length-1]+t+Math.min(0,n)+d;Ft.length<48&&Ft.push(ha),It.length<48&&It.push(COBpredBG),jt.length<48&&jt.push(UAMpredBG),Pt.length<48&&Pt.push(r),COBpredBG18&&hapa&&(pa=ha),(kt||Yt>0)&&It.length>18&&COBpredBG0)&&COBpredBG>pa&&(va=COBpredBG),qt&&jt.length>12&&UAMpredBGpa&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+ba.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),$e.predBGs={},Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ma=Ft.length-1;Ma>12&&Ft[Ma-1]===Ft[Ma];Ma--)Ft.pop();for($e.predBGs.IOB=Ft,oa=o(Ft[Ft.length-1]),Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=Pt.length-1;Ma>6&&!(Pt[Ma-1]>=Pt[Ma]||Pt[Ma]<=it);Ma--)Pt.pop();if($e.predBGs.ZT=Pt,o(Pt[Pt.length-1]),l.mealCOB>0&&(Wt>0||Yt>0)){for(It.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ma=It.length-1;Ma>12&&It[Ma-1]===It[Ma];Ma--)It.pop();$e.predBGs.COB=It,na=o(It[It.length-1]),Ut=Math.max(Ut,o(It[It.length-1])),console.error("COBpredBG: "+o(It[It.length-1]))}if(Wt>0||Yt>0){if(qt){for(jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=jt.length-1;Ma>12&&jt[Ma-1]===jt[Ma];Ma--)jt.pop();$e.predBGs.UAM=jt,ia=o(jt[jt.length-1]),jt[jt.length-1]&&(Ut=Math.max(Ut,o(jt[jt.length-1])))}$e.eventualBG=Ut}console.error("UAM Impact:"+Lt+"mg/dL per 5m; UAM Duration:"+fa+"hours"),sa=Math.max(39,sa),la=Math.max(39,la),ua=Math.max(39,ua),Ot=o(sa);var _a=l.mealCOB/l.carbs;ra=o(ua<999&&la<999?(1-_a)*UAMpredBG+_a*COBpredBG:la<999?(ha+COBpredBG)/2:ua<999?(ha+UAMpredBG)/2:ha),ga>ra&&(ra=ga),At=o(At=kt||Yt>0?qt?_a*ma+(1-_a)*da:ma:qt?da:ca);var ya=ua;if(gaua&&(ya=(ua+ga)/2);if(ya=o(ya),l.carbs)if(!qt&&la<999)Ot=o(Math.max(sa,la));else if(la<999){var Sa=_a*la+(1-_a)*ya;Ot=o(Math.max(sa,la,Sa))}else Ot=qt?ya:At;else qt&&(Ot=o(Math.max(sa,ya)));Ot=Math.min(Ot,ra),process.stderr.write("minPredBG: "+Ot+" minIOBPredBG: "+sa+" minZTGuardBG: "+ga),la<999&&process.stderr.write(" minCOBPredBG: "+la),ua<999&&process.stderr.write(" minUAMPredBG: "+ua),console.error(" avgPredBG:"+ra+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),va>tt&&(Ot=Math.min(Ot,va)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Gt,i),$e.deviation=n(Tt,i),$e.ISF=n(yt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var Da=$e.CR;ze!=$e.CR&&(Da=ze+"→"+$e.CR),$e.reason=_t+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+Da+", Target: "+vt+", minPredBG "+n(Ot,i)+", minGuardBG "+n(At,i)+", IOBpredBG "+n(oa,i),na>0&&($e.reason+=", COBpredBG "+n(na,i)),ia>0&&($e.reason+=", UAMpredBG "+n(ia,i)),$e.reason+=q,$e.reason+="; ";var wa=Ct;wa<40&&(wa=Math.min(At,wa));var Ga,Ta=A-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(Wt>0||Yt>0)){for(Ma=0;MaGa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ga+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ga+"% of BG "+n(tt,i)+" - SMB disabled!, ",Et=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Ua+"minutes");var Oa=Ua,Aa=i.current_basal*$*yt*Oa/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Aa)/csf-Ra;Aa=o(Aa),Ia=o(Ia),console.error("naive_eventualBG:",Ct,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Aa,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&($e.carbsReq=Ia,$e.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(tt0&&rt>Rt)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var ja=0,Pa=Qe,Ea=0;if(UtRt&&rt>0&&!Ia)return Ct<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(Rt,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));ja=o(ja=2*Math.min(0,(Ut-it)/yt),2);var qa=Math.min(0,(Ct-it)/yt);if(qa=o(qa,2),rt<0&&rt>Rt)ja=o(ja*(rt/Rt),2);Pa=r(Pa=Qe+2*ja,i),Ea=t.duration*(t.rate-Qe)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",$e;if(Pa<=0){if((Fa=o(60*((Ta=it-Ct)/yt)/i.current_basal*$))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return $e.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,$e,t)}else $e.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,$e,t)}if(rt=2||Rt+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&Rt>0?3:rt<0&&Rt<=0||rt<0&&Rt>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/yt,2),!m||!Et))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(Rt,i):$e.reason+="Eventual BG "+n(Ut,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ut,Ot)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/yt,2),$e.minPredBG=Ot),!m||!Et))return $e.reason+=n(Ut,i)+"-"+n(Ot,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ut>=lt&&($e.reason+="Eventual BG "+n(Ut,i)+" >= "+n(lt,i)+", ",Ut>lt&&($e.insulinForManualBolus=o((Ut-it)/yt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));ja=o((Math.min(Ot,Ut)-it)/yt,2),O=o((Ut-it)/yt,2),ja>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+ja+" U)"),$e.reason+="max_iob "+mt+", ",ja=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Pa=r(Pa=Qe+2*ja,i),ja=o(ja,3),$e.insulinReq=ja;var ka=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&Et&&tt>A){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+T),La=T),v.useOverride&&_&&C!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+C),za=C);var Na=o(l.mealCOB/K,3),Ha=0;void 0===La?(Ha=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Ha=o(i.current_basal*$*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*$*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*$),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((it-(Ct+sa)/2)/yt)/i.current_basal*$),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Qe*Fa/30,2),Fa=30),$e.reason+=" insulinReq "+ja,Ka>=Ha&&($e.reason+="; maxBolus "+Ha),Fa>0&&($e.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),$e.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Ct+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&($e.units=Ka,$e.reason+="Microbolusing "+Ka+"U. "):$e.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return $e.rate=Qa,$e.duration=Fa,$e}var er=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Pa>er&&($e.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Qe)/60)>=2*ja?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); From 4c6d56bd309819bc0440d9765b3e9a89f11d8e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 18 Jan 2024 11:44:31 +0100 Subject: [PATCH 352/405] Add A Remote Bolus Alert. --- .../APS/Storage/AnnouncementsStorage.swift | 14 ++++++++++ .../Modules/Bolus/BolusStateModel.swift | 28 +++++++++++++++++++ .../View/AlternativeBolusCalcRootView.swift | 22 +++++++++++++-- .../Bolus/View/DefaultBolusCalcRootView.swift | 23 +++++++++++++-- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/FreeAPS/Sources/APS/Storage/AnnouncementsStorage.swift b/FreeAPS/Sources/APS/Storage/AnnouncementsStorage.swift index 32643bd596..9db55b6f13 100644 --- a/FreeAPS/Sources/APS/Storage/AnnouncementsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/AnnouncementsStorage.swift @@ -7,6 +7,7 @@ protocol AnnouncementsStorage { func syncDate() -> Date func recent() -> Announcement? func validate() -> [Announcement] + func recentEnacted() -> Announcement? } final class BaseAnnouncementsStorage: AnnouncementsStorage, Injectable { @@ -68,6 +69,19 @@ final class BaseAnnouncementsStorage: AnnouncementsStorage, Injectable { return recent } + func recentEnacted() -> Announcement? { + guard let enactedEvents = storage.retrieve(OpenAPS.FreeAPS.announcementsEnacted, as: [Announcement].self) + else { + return nil + } + let enactedEventsLast = enactedEvents.first + + if -1 * (enactedEventsLast?.createdAt ?? .distantPast).timeIntervalSinceNow.minutes < 10 { + return enactedEventsLast + } + return nil + } + func validate() -> [Announcement] { guard let enactedEvents = storage.retrieve(OpenAPS.FreeAPS.announcementsEnacted, as: [Announcement].self)?.reversed() else { diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 993597b279..18eae0e84a 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -11,6 +11,7 @@ extension Bolus { // added for bolus calculator @Injected() var settings: SettingsManager! @Injected() var nsManager: NightscoutManager! + @Injected() var announcementStorage: AnnouncementsStorage! @Published var suggestion: Suggestion? @Published var predictions: Predictions? @@ -258,6 +259,33 @@ extension Bolus { nsManager.deleteCarbs(mealArray, complexMeal: true) } } + + func remoteBolus() -> String? { + if let enactedAnnouncement = announcementStorage.recentEnacted() { + let components = enactedAnnouncement.notes.split(separator: ":") + guard components.count == 2 else { return nil } + let command = String(components[0]).lowercased() + let arguments = String(components[1]).lowercased() + let eventual: String = units == .mmolL ? evBG.asMmolL + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) : evBG.formatted() + + if command == "bolus" { + return "\n" + NSLocalizedString("A Bolus of ", comment: "Remote Bolus Alert, part 1") + arguments + + NSLocalizedString("U was delivered ", comment: "Remote Bolus Alert, part 2") + ( + -1 * enactedAnnouncement.createdAt + .timeIntervalSinceNow + .minutes + ) + .formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + + NSLocalizedString( + " minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?" + + "\n\n" + "Predicted eventual glucose, if you don't bolus, is: " + eventual + " " + units.rawValue, + comment: "Remote Bolus Alert, part 3" + ) + } + } + return nil + } } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index b7bb69068f..6bea22e3ab 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -12,6 +12,8 @@ extension Bolus { @State private var showInfo = false @State private var exceededMaxBolus = false @State private var keepForNextWiew: Bool = false + @State private var remoteBolusAlert: Alert? + @State private var isRemoteBolusAlertPresented: Bool = false private enum Config { static let dividerHeight: CGFloat = 2 @@ -159,8 +161,21 @@ extension Bolus { if state.amount > 0 { Section { Button { - keepForNextWiew = true - state.add() + if let remoteBolus = state.remoteBolus() { + remoteBolusAlert = Alert( + title: Text("A Remote Bolus Was Just Delivered!"), + message: Text(remoteBolus), + primaryButton: .destructive(Text("Bolus"), action: { + keepForNextWiew = true + state.add() + }), + secondaryButton: .cancel() + ) + isRemoteBolusAlertPresented = true + } else { + keepForNextWiew = true + state.add() + } } label: { Text(exceededMaxBolus ? "Max Bolus exceeded!" : "Enact bolus") } .frame(maxWidth: .infinity, alignment: .center) @@ -179,6 +194,9 @@ extension Bolus { } } } + .alert(isPresented: $isRemoteBolusAlertPresented) { + remoteBolusAlert! + } .dynamicTypeSize(...DynamicTypeSize.xxLarge) .blur(radius: showInfo ? 20 : 0) .navigationTitle("Enact Bolus") diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index 2984562449..f3dfd493c4 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -14,6 +14,8 @@ extension Bolus { @State private var presentInfo = false @State private var displayError = false @State private var keepForNextWiew: Bool = false + @State private var remoteBolusAlert: Alert? + @State private var isRemoteBolusAlertPresented: Bool = false @Environment(\.colorScheme) var colorScheme @FocusState private var isFocused: Bool @@ -115,8 +117,22 @@ extension Bolus { if state.amount > 0 { Section { Button { - keepForNextWiew = true - state.add() + if let remoteBolus = state.remoteBolus() { + remoteBolusAlert = Alert( + title: Text("A Remote Bolus Was Just Delivered!"), + message: Text(remoteBolus), + primaryButton: .destructive(Text("Bolus"), action: { + keepForNextWiew = true + state.add() + }), + secondaryButton: .cancel() + ) + isRemoteBolusAlertPresented = true + + } else { + keepForNextWiew = true + state.add() + } } label: { Text(!(state.amount > state.maxBolus) ? "Enact bolus" : "Max Bolus exceeded!") } .frame(maxWidth: .infinity, alignment: .center) @@ -137,6 +153,9 @@ extension Bolus { } } .dynamicTypeSize(...DynamicTypeSize.xxLarge) + .alert(isPresented: $isRemoteBolusAlertPresented) { + remoteBolusAlert! + } .alert(isPresented: $displayError) { Alert( title: Text("Warning!"), From 3a701c6748fd3021345d4f5946322d0ede1b53bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 18 Jan 2024 11:53:31 +0100 Subject: [PATCH 353/405] Update version. --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index c76f6e35eb..34177c5d4a 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.4.5 +APP_VERSION = 2.7.0 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 8511ede4a9bb0fa55932dd80c0d53fa75728f37c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:02:24 +0100 Subject: [PATCH 354/405] Crowdin updates (#482) --- .../CGMBLEKitUI/vi.lproj/Localizable.strings | 2 +- .../fi.lproj/Localizable.strings | 4 +- .../vi.lproj/Localizable.strings | 4 +- .../G7SensorKit/fi.lproj/Localizable.strings | 2 +- .../G7SensorKit/vi.lproj/Localizable.strings | 4 +- .../Resources/vi.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 2 +- .../fi.lproj/Localizable.strings | 4 +- .../sk.lproj/Localizable.strings | 2 +- .../vi.lproj/Localizable.strings | 8 +- .../Resources/de.lproj/Localizable.strings | 2 +- .../Resources/sk.lproj/Localizable.strings | 2 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/fi.lproj/Localizable.strings | 76 +++++++++---------- .../Main/sk.lproj/Localizable.strings | 40 +++++----- .../Main/vi.lproj/Localizable.strings | 2 +- 16 files changed, 80 insertions(+), 80 deletions(-) diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings index e2071ad2db..cc3a2f8b75 100644 --- a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings @@ -27,7 +27,7 @@ Title text for the button to remove a CGM from Loop */ "Latest Reading" = "Kết quả đọc mới nhất"; /* Section title for latest connection date */ -"Latest Connection" = "Kết nối gần đây nhất"; +"Latest Connection" = "Kết nối mới nhất"; /* Button title to open CGM app */ "Open App" = "Mở ứng dụng"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings index 3b24a01c10..7cd4649dfd 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings @@ -11,7 +11,7 @@ "Bluetooth" = "Bluetooth"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Peru"; /* No comment provided by engineer. */ "Configuration" = "Configuration"; @@ -33,7 +33,7 @@ "Dexcom G7" = "Dexcom G7"; /* No comment provided by engineer. */ -"Done" = "Done"; +"Done" = "Valmis"; /* Field label */ "Glucose" = "Glucose"; diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings index 21559a57b6..3db4db9417 100644 --- a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings @@ -39,10 +39,10 @@ "Glucose" = "Đường huyết"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Thời gian ân huệ kết thúc"; +"Grace Period End" = "Kết thúc thời gian gia hạn"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Thời gian ân huệ còn lại"; +"Grace period remaining" = "Thời gian gia hạn còn lại"; /* String displayed instead of a glucose value above the CGM range */ "HIGH" = "CAO"; diff --git a/Dependencies/G7SensorKit/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/fi.lproj/Localizable.strings index d005f6a544..e50c996572 100644 --- a/Dependencies/G7SensorKit/fi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/fi.lproj/Localizable.strings @@ -8,7 +8,7 @@ "Continue" = "Jatka"; /* Button text to cancel G7 setup */ -"Cancel" = "Cancel"; +"Cancel" = "Peru"; /* Error description for unreliable state */ "Glucose data is unavailable" = "Glucose data is unavailable"; diff --git a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings index 917eec144f..af0449dc8f 100644 --- a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings +++ b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings @@ -38,7 +38,7 @@ "Sensor Expiration" = "Cảm biến hết hạn"; /* title for g7 settings row showing sensor grace period end time */ -"Grace Period End" = "Thời gian ân huệ kết thúc"; +"Grace Period End" = "Thời gian gia hạn kết thúc"; /* Field label */ "Glucose" = "Đường huyết"; @@ -108,7 +108,7 @@ "Sensor expires" = "Sensor hết hạn"; /* G7 Progress bar label when sensor grace period progress showing */ -"Grace period remaining" = "Thời gian ân huệ còn lại"; +"Grace period remaining" = "Thời gian gia hạn còn lại"; /* G7 Status highlight text for searching for sensor */ "Searching for\nSensor" = "Đang tìm kiếm \n sensor"; diff --git a/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings b/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings index 397c86b20c..3e8e547a1f 100644 --- a/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/MinimedKit/MinimedKit/Resources/vi.lproj/Localizable.strings @@ -62,7 +62,7 @@ "Pump Error" = "Bơm lỗi"; /* No comment provided by engineer. */ -"Pump is suspended" = "Bơm đang được tạm ngưng"; +"Pump is suspended" = "Bơm đang tạm ngưng"; /* No comment provided by engineer. */ "Pump responded unexpectedly" = "Bơm phản ứng bất ngờ"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index cde44da38b..b7d7e295f3 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Füllen Sie einen neuen Pod mit U-100 Insulin (lassen Sie blaue Nadelabdeckung auf dem Pod)."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Entfernen Sie die blaue Pod-Nadel Kappe und prüfen Sie die Kanüle. Danach die Klebefolien auf der Rückseite entfernen."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Auf 2 Signaltöne warten."; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index d5221527ec..b14fa4aa85 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -445,7 +445,7 @@ "Paired" = "Paired"; /* Cancel button text in navigation bar on pair pod UI */ -"Cancel" = "Cancel"; +"Cancel" = "Peru"; /* Alert title for cancel pairing modal */ "Are you sure you want to cancel Pod setup?" = "Are you sure you want to cancel Pod setup?"; @@ -688,7 +688,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body."; /* Cancel button title */ -"Cancel" = "Cancel"; +"Cancel" = "Peru"; /* Text for continue button on PodSetupView */ "Continue" = "Jatka"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 952e4ea76a..fc8768bf4f 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -436,7 +436,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Naplňte nový pod s inzulínom U-100 (modrý uzáver ihly pod nechajte nasadený)."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the blue needle Pod cover and inspect the cannula. Then remove the paper pad."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Počúvajte 2 pípnutia."; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index c23795298e..3ac65a62f9 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -225,7 +225,7 @@ "Pod Expired" = "Pod đã hết hạn"; /* Status highlight message for occlusion alarm. */ -"Pod Occlusion" = "Pod Occlusion"; +"Pod Occlusion" = "Pod bị tắc nghẽn"; /* Status highlight message for other alarm. */ "Pod Error" = "Lỗi Pod"; @@ -664,10 +664,10 @@ "Sequence Number" = "Số thứ tự"; /* description label for firmware version pod details row */ -"Firmware Version" = "Firmware Version"; +"Firmware Version" = "Phiên bản phần mềm"; /* description label for ble firmware version pod details row */ -"BLE Firmware Version" = "BLE Firmware Version"; +"BLE Firmware Version" = "Phiên bản phần mềm Bluetooth"; /* description label for activated at timne pod details row */ "Pod Activated" = "Pod đã kích hoạt"; @@ -694,7 +694,7 @@ "Continue" = "Tiếp tục"; /* Are you sure you want to skip Omnipod Onboarding? */ -"Skip Omnipod Onboarding?" = "Skip Omnipod Onboarding?"; +"Skip Omnipod Onboarding?" = "Bỏ qua giới thiệu Omnipod không?"; /* Description text on ExpirationReminderSetupView */ "The App notifies you in advance of Pod expiration.\n\nScroll to set the number of hours advance notice you would like to have." = "Ứng dụng sẽ thông báo trước cho bạn thời gian pod hết hạn.\n\n Kéo xuống để thiết lập số giờ để ứng dụng thông báo."; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index e9781baad3..9dd68a58da 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -180,7 +180,7 @@ "Deactivate" = "Deaktivieren"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; /* Button title for pod deactivation Button title to deactivate pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 827c53da42..8dc3ae86fa 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -180,7 +180,7 @@ "Deactivate" = "Deaktivovať"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Button title for pod deactivation Button title to deactivate pod */ diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 494893f414..a5e2ac1da8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -267,7 +267,7 @@ "Failed to update confidence reminder preference." = "Không cập nhật được tùy chọn lời nhắc về độ tin cậy."; /* Alert title for error when updating expiration reminder */ -"Failed to Update Expiration Reminder" = "Failed to Update Expiration Reminder"; +"Failed to Update Expiration Reminder" = "Không thể cập nhật lời nhắc hết hạn"; /* Alert title for error when updating low reservoir reminder */ "Failed to Update Low Reservoir Reminder" = "Thất bại cập nhật lời nhắc gần hết thuốc"; @@ -502,7 +502,7 @@ "Pod Fault Details" = "Thông tin lỗi Pod"; /* Error message for reservoir view when pod occlusion checks failed */ -"Pod Occlusion" = "Pod Occlusion"; +"Pod Occlusion" = "Pod bị tắc nghẽn"; /* Pairing action button accessibility label when pairing succeeded */ "Pod paired successfully. Continue." = "Pod ghép đôi thành công. Tiếp tục."; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 461a31c1f3..209e8a69d8 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -11,13 +11,13 @@ "Bolus" = "Bolus"; -"Close" = "Close"; +"Close" = "Sulje"; /* Continue after added carbs without bolus */ "Continue without bolus" = "Continue without bolus"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nAmount is more than your Max Bolus setting! \nAre you sure you want to add "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nMäärä on isompi kuin sinun maksimi Bolus asetus\nOletko varma, että haluat lisätä "; /* Header */ "Enact Bolus" = "Enact Bolus"; @@ -26,25 +26,25 @@ "Enact bolus" = "Enact bolus"; /* */ -"Insulin recommended" = "Insulin recommended"; +"Insulin recommended" = "Suositeltu insuliini"; /* */ -"Insulin required" = "Insulin required"; +"Insulin required" = "Insuliinin tarve"; /* Bolus screen */ -"Recommendation" = "Recommendation"; +"Recommendation" = "Suositus"; /* Button */ -"Clear" = "Clear"; +"Clear" = "Tyhjennä"; /* Button */ -"Done" = "Done"; +"Done" = "Valmis"; /* */ -"Wait please" = "Wait please"; +"Wait please" = "Odota"; /* */ -"Agree and continue" = "Agree and Continue"; +"Agree and continue" = "Hyväksy ja jatka"; /* Bolus progress view */ "of" = "of"; @@ -62,22 +62,22 @@ "Meal Summary" = "Meal Summary"; /* Bolus View Meal Edit Meal Button */ -"Edit Meal" = "Edit Meal"; +"Edit Meal" = "Muokkaa ateriaa"; /* Bolus View Meal Add Meal Button */ -"Add Meal" = "Add Meal"; +"Add Meal" = "Lisää ateria"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolus Summary"; +"Bolus Summary" = "Bolus yhteenveto"; /* For the Bolus View pop-up */ -"Calculations" = "Calculations"; +"Calculations" = "Laskenta"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fatty Meal"; +"Fatty Meal" = "Rasvainen ruoka"; /* For the Bolus View pop-up */ -"Full Bolus" = "Full Bolus"; +"Full Bolus" = "Täysi bolus"; /* For the Bolus View pop-up */ "Fraction" = "Fraction"; @@ -86,7 +86,7 @@ "Fatty Meal Factor" = "Fatty Meal Factor"; /* For the Bolus View pop-up */ -"Result" = "Result"; +"Result" = "Tulos"; /* For the Bolus View pop-up */ "Your entered amount was limited by your max Bolus setting of %d%@" = "Your entered amount was limited by your max Bolus setting of %d%@"; @@ -95,13 +95,13 @@ "Continue" = "Jatka"; /* Home title */ -"Home" = "Home"; +"Home" = "Koti"; /* Looping in progress */ "looping" = "looping"; /* min ago since last loop */ -"min ago" = "min ago"; +"min ago" = "minuuttia sitten"; /* Status Title */ "No suggestion" = "No suggestion"; @@ -110,43 +110,43 @@ "Replace pod" = "Replace pod"; /* Add carbs screen */ -"Add Carbs" = "Add Carbs"; +"Add Carbs" = "Lisää hiilihydraatit"; /* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */ -"Add Carbs " = "Add Carbs "; +"Add Carbs " = "Lisää hiilihydraatit "; /* */ -"Amount Carbs" = "Amount Carbs"; +"Amount Carbs" = "Hiilihydraattien määrä"; /* Grams unit */ -"grams" = "grams"; +"grams" = "gramma"; /* */ -"Carbs required" = "Carbs required"; +"Carbs required" = "Hiilihydraattien tarve"; /* Saved Food Presets */ -"Saved Food" = "Saved Food"; +"Saved Food" = "Tallennettu ruoka"; /* */ -"Are you sure?" = "Are you sure?"; +"Are you sure?" = "Oletko varma?"; /* Bottom target temp */ -"Bottom target" = "Bottom target"; +"Bottom target" = "Alempi tavoite"; /* Cancel preset name */ -"Cancel" = "Cancel"; +"Cancel" = "Peru"; /* */ "Cancel Temp Target" = "Cancel Temp Target"; /* Custom temp target */ -"Custom" = "Custom"; +"Custom" = "Muokattu"; /* */ -"Date" = "Date"; +"Date" = "Päivä"; /* */ -"Delete" = "Delete"; +"Delete" = "Poista"; /* Delete preset temp target */ "Delete preset \"%@\"" = "Delete preset \"%@\""; @@ -158,7 +158,7 @@ "Enact Temp Target" = "Enact Temp Target"; /* */ -"Target" = "Target"; +"Target" = "Tavoite"; /* */ "Basal Insulin and Sensitivity ratio" = "Basal Insulin and Sensitivity ratio"; @@ -278,32 +278,32 @@ "Autosens" = "Autosens"; /* */ -"Calculated Sensitivity" = "Calculated Sensitivity"; +"Calculated Sensitivity" = "Laske herkkyys"; /* */ -"Insulin Sensitivities" = "Insulin Sensitivities"; +"Insulin Sensitivities" = "Insuliinin herkkyys"; /* */ "Sensitivity Ratio" = "Sensitivity Ratio"; /* */ -"Dismiss" = "Dismiss"; +"Dismiss" = "Hylkää"; /* */ "Important message" = "Important message"; /* */ -"Amount" = "Amount"; +"Amount" = "Määrä"; /* */ -"Cancel Temp Basal" = "Cancel Temp Basal"; +"Cancel Temp Basal" = "Peru väliaikainen Basaali"; /* Enact Enact a temp Basal or a temp target */ -"Enact" = "Enact"; +"Enact" = "Aktivoi"; /* */ -"Manual Temp Basal" = "Manual Temp Basal"; +"Manual Temp Basal" = "Väliaikainen basaali"; /* Allow uploads to different services */ "Allow uploads" = "Allow uploads"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 7d9395ef08..1081e776e4 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2050,10 +2050,10 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Používajte dynamický CR. Dynamický pomer sa použije pre CR takto:\n\n Keď pomer > 1: dynCR = (newRatio - 1) / 2 + 1.\nKeď pomer < 1: dynCR = CR/dynCR.\n\nNepoužívajte spolu s vysokou inzulínovou frakciou (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Aktivácia funkcie Dynamic Sensitivity (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Aktivácia funkcie Dynamic Carb Ratio (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; @@ -2065,63 +2065,63 @@ Enact a temp Basal or a temp target */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Vzorec"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Bezpečnosť"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Použitie sigmoidnej funkcie pre ISF (a pre CR, ak je povolená) namiesto predvoleného logaritmického vzorca. Vyžaduje, aby bolo v nastaveniach povolené nastavenie Dynamická ISF.\n\nNastavenie Adjustment (Úprava) upravuje sklon krivky (Y: dynamický pomer, X: glykémia). Nižšia hodnota ==> menej strmá == menej agresívna.\n\nNastavenie autosens.min/max určuje limity max/min pre dynamický pomer A tiež to, ako veľmi sa dynamický pomer upravuje. Ak AF je sklon krivky, autosens.min/max je výška grafu, interval Y, kde Y: dynamický pomer. Krivka bude mať vždy sigmoidný tvar bez ohľadu na to, aké nastavenia autosens.min/max sa použijú, čo znamená, že tieto nastavenia majú veľké dôsledky na výsledok vypočítaného dynamického ISF. Buďte opatrní pri nastavení príliš vysokej hodnoty autosens.max. Pri správnom nastavení profilu ISF ju pravdepodobne nikdy nebudete potrebovať vyššiu ako 1.5\n\nLimit autosens.max > 1.5 sa pri použití sigmoidnej funkcie neodporúča."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Nastavenie prahové hodnoty"; /* Threshold Setting */ "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Nastavenia výpočtu"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Zobraziť predpovede"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Menšie obrazovky iPhonu"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Zobrazenie a povolenie vstupov pre tuky a bielkoviny"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Pridanie nastavení zobrazenia jedla "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Zobraziť dočasné cieľové tlačidlo"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Panel tlačidiel zobrazenia Domov "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "V prípade, že používate profily aj dočasný cieľ"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Vždy farebná hodnota glukózy (zelená, žltá atď.)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Nastavenia záhlavia"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normálne sa glukóza sfarbí na červeno len vtedy, keď je nad alebo pod vašimi limitmi pre vysoké/nízke hodnoty"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Horizontálne rolovacie zobrazenie Viditeľné hodiny"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Živá aktivita"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show live activity" = "Zobraziť živú aktivitu"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 49423d163b..e2f9464ecb 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -134,7 +134,7 @@ "Bottom target" = "Mục tiêu dưới cùng"; /* Cancel preset name */ -"Cancel" = "Hủy bỏ"; +"Cancel" = "Hủy"; /* */ "Cancel Temp Target" = "Hủy bỏ mục tiêu tạm thời"; From b7c9ff00543beebdbb23515a166b12dc66afb547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 19 Jan 2024 08:56:29 +0100 Subject: [PATCH 355/405] Fix threshold logging. (cherry picked from commit 1850e8d0d44f27cc1a1d328e2a5e950d8aff287c) --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 5c473187fa..627b03a71d 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr,D=v.smbIsAlwaysOff,w=v.start;var G=v.end;const T=v.smbMinutes,C=v.uamMinutes;var U=h.useNewFormula,O=0,A=B,R=0,I="",F="",j="",P="",E="",q="",W=0,k=0,L=0,z=0,N=0,H=0;const Z=v.weightedAverage;var $=1,J=i.sens,K=i.carb_ratio;v.useOverride&&($=v.overridePercentage/100,y?(J/=$,K/=$):(S&&(K/=$),x&&(J/=$)));const Q=i.weightPercentage,V=v.average_total_data;function X(e,t){var a=e.getTime();return new Date(a+36e5*t)}function Y(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function ee(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function te(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ae=Math.min(i.autosens_min,i.autosens_max),re=Math.max(i.autosens_min,i.autosens_max);function oe(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=ee(r),u=p[0].rate;for(let e=0;e=(s=te(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=te(d,l))?n=s:o=(s=te("23:59:59",l))?n=s:o0&&o1)&&(U=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(U){let e=g.length-1;var ne=new Date(g[e].timestamp),ie=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ie=new Date),(R=(ie-ne)/36e5)<23.9&&R>21)N=oe(ne,(se=24-R,le=ne.getTime(),new Date(le-36e5*se))),P="24 hours of data is required for an accurate tdd calculation. Currently only "+R.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+N.toPrecision(5)+" U. ";else R<21?(U=!1,enableDynamicCR=!1):P=""}}else console.log("Pumphistory is empty!"),U=!1,enableDynamicCR=!1;var se,le;if(U){for(let e=0;e0){W=e,H=g[e].rate;var ue=g[e-1]["duration (min)"]/60,me=ue,de=new Date(g[e-1].timestamp),ce=de,ge=0;do{if(e--,0==e){ce=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){ce=new Date(g[e].timestamp);break}var he=e-2;if(he>=0&&"Rewind"==g[he]._type){let e=g[he].timestamp;for(;he-1>=0&&"Prime"==g[he-=1]._type;)ge=(g[he].timestamp-e)/36e5;ge>=ue&&(ce=e,ge=0)}}while(e>0);var pe=(ce-de)/36e5;pe0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(N+=oe(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ve=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ve=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ve=new Date,t=g[e]["duration (min)"]/60),(ve-a)/36e5-t>0){N+=oe(ve,X(a,t))}}var fe={TDD:o(k=z+L+N,5),bolus:o(z,5),temp_basal:o(L,5),scheduled_basal:o(N,5)};R>21?(F=". Bolus insulin: "+z.toPrecision(5)+" U",j=". Temporary basal insulin: "+L.toPrecision(5)+" U",I=". Insulin with scheduled basal rate: "+N.toPrecision(5)+" U",E=P+(" TDD past 24h is: "+k.toPrecision(5)+" U")+F+j+I,q=", TDD: "+o(k,2)+" U, "+o(z/k*100,0)+"% Bolus "+o((L+N)/k*100,0)+"% Basal"):q=", TDD: Not enough pumpData (< 21h)"}var Be;const be=e.glucose,Me=h.enableDynamicCR,_e=h.adjustmentFactor,ye=B;var xe=!1,Se="",De=1,we="";V>0&&(De=Z/V),we=De>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(De=o(De=Math.min(De,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":De<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(De=o(De=Math.max(De,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+De,we=", Basal ratio: "+De,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(xe=!0),ye>=118&&xe&&(U=!1,Se="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+ye);var Ge=", Dynamic ratios log: ",Te=", AF: "+_e,Ce="BG: "+be+" mg/dl ("+(.0555*be).toPrecision(2)+" mmol/l)",Ue="",Oe="";const Ae=h.curve,Re=i.insulinPeakTime,Ie=h.useCustomPeakTime;var Fe=55,je=65;switch(Ae){case"rapid-acting":je=65;break;case"ultra-rapid":je=50}Ie?(Fe=120-Re,console.log("Custom insulinpeakTime set to :"+Re+", insulinFactor: "+Fe)):(Fe=120-je,console.log("insulinFactor set to : "+Fe)),Be=k,Q<1&&Z>0&&(k=Z,console.log("Using weighted TDD average: "+o(k,2)+" U, instead of past 24 h ("+o(Be,2)+" U), weight: "+Q),Oe=", Weighted TDD: "+o(k,2)+" U");const Pe=h.sigmoid;var Ee="";if(U){var qe=J*_e*k*Math.log(be/Fe+1)/1800;Ue=", Logarithmic formula"}if(U&&Pe){const e=ae,t=re-e,a=.0555*(be-B);var We=De,ke=re-1;1==re&&(ke=re+.01-1);const r=Math.log10(1/ke-e/ke)/Math.log10(Math.E),o=a*_e*We+r;qe=t/(1+Math.exp(-o))+e,Ue=", Sigmoid function"}var Le=K;const ze=o(K,1);var Ne="",He="";if(U&&k>0){if(Ne=", Dynamic ISF/CR: On/",qe>re?(Se=", Dynamic ISF limited by autosens_max setting: "+re+" ("+o(qe,2)+"), ",He=", Autosens/Dynamic Limit: "+re+" ("+o(qe,2)+")",qe=re):qe-.5?"+"+o(e.delta,0):o(e.delta,0);var rt=Math.min(e.delta,e.short_avgdelta),ot=Math.min(e.short_avgdelta,e.long_avgdelta),nt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(tt<=10||38===tt||at>=3)&&($e.reason="CGM is calibrating, in ??? state, or noise is high");if(tt>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=tt&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=tt&&!0),et>12||et<-5?$e.reason="If current system time "+Ve+" is correct, then BG data is too old. The last BG data was read "+et+"m ago at "+Ye:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=tt&&(e.last_cal&&e.last_cal<3?$e.reason="CGM was just calibrated":$e.reason="CGM data is unchanged ("+n(tt,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=tt&&(tt<=10||38===tt||at>=3||et>12||et<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Qe?($e.reason+=". Canceling high temp basal of "+t.rate,$e.deliverAt=Je,$e.temp="absolute",$e.duration=0,$e.rate=0,$e):0===t.rate&&t.duration>30?($e.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",$e.deliverAt=Je,$e.temp="absolute",$e.duration=30,$e.rate=0,$e):($e.reason+=". Temp "+t.rate+" <= current basal "+Qe+"U/hr; doing nothing. ",$e);var it,st,lt,ut,mt=i.max_iob;if(void 0!==B&&(st=B),void 0!==i.max_bg&&(lt=B),void 0!==i.enableSMB_high_bg_target&&(ut=i.enableSMB_high_bg_target),void 0===B)return $e.error="Error: could not determine target_bg. ",$e;it=B;var dt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ct=100,gt=160;if(gt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),gt=e}else console.log("Default Half Basal Target used: "+n(gt,i)+" "+i.out_units);if(dt&&i.temptargetSet&&it>ct||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&it=it&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(De,2)+", TDD 24h = "+o(Be,2)+"U, Weighted average TDD = "+o(Z,2)+"U, (Weight percentage = "+Q+"), Total data of TDDs (up to 14 days) average = "+o(V,2)+"U. "),Qe!==Ke*$?process.stderr.write("Adjusting basal from "+Ke*$+" U/h to "+Qe+" U/h; "):process.stderr.write("Basal unchanged: "+Qe+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){st=o((st-60)/s.ratio)+60,lt=o((lt-60)/s.ratio)+60;var pt=o((it-60)/s.ratio)+60;it===(pt=Math.max(80,pt))?process.stderr.write("target_bg unchanged: "+n(pt,i)+"; "):process.stderr.write("target_bg from "+n(pt,i)+" to "+n(pt,i)+"; "),it=pt}var vt=n(it,i);it!=B&&(vt=0!==b&&6!==b&&b!==it?n(B,i)+"→"+n(b,i)+"→"+n(it,i):n(B,i)+"→"+n(it,i));var ft=200,Bt=200,bt=200;if(e.noise>=2){var Mt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ft=o(Math.min(200,st*Mt)),Bt=o(Math.min(200,it*Mt)),bt=o(Math.min(200,lt*Mt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(pt,i)+" to "+n(Bt,i)+"; "),st=ft,it=Bt,lt=bt}A=st-.5*(st-40),A=Math.min(Math.max(i.threshold_setting,A,65),120),console.error("Threshold set to ${convert_bg(threshold, profile)}");var _t="",yt=(o(J,1),J);if(void 0!==s&&s&&((yt=o(yt=J/sensitivityRatio,1))!==J?process.stderr.write("ISF from "+n(J,i)+" to "+n(yt,i)):process.stderr.write("ISF unchanged: "+n(yt,i)),_t+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(J,i)+"→"+n(yt,i)),console.error("CR:"+K),void 0===a)return $e.error="Error: iob_data undefined. ",$e;var xt,St=a;if(a.length,a.length>1&&(a=St[0]),void 0===a.activity||void 0===a.iob)return $e.error="Error: iob_data missing some property. ",$e;var Dt=((xt=void 0!==a.lastTemp?o((new Date(Ve).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+xt+"m, tempModulus:"+Dt+"m"),$e.temp="absolute",$e.deliverAt=Je,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&xt>10&&t.duration)return $e.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,$e,t);if(t&&a.lastTemp&&t.duration>0){var wt=xt-a.lastTemp.duration;if(wt>5&&xt>10)return $e.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+wt+"m ago; canceling temp",u.setTempBasal(0,0,i,$e,t)}var Gt=o(-a.activity*yt*5,2),Tt=o(6*(rt-Gt));Tt<0&&(Tt=o(6*(ot-Gt)))<0&&(Tt=o(6*(e.long_avgdelta-Gt)));var Ct=tt,Ut=(Ct=a.iob>0?o(tt-a.iob*yt):o(tt-a.iob*Math.min(yt,J)))+Tt;if(void 0===Ut||isNaN(Ut))return $e.error="Error: could not calculate eventualBG. Sensitivity: "+yt+" Deviation: "+Tt,$e;var Ot,At,Rt=function(e,t,a){return o(a+(e-t)/24,1)}(it,Ut,Gt);$e={temp:"absolute",bg:tt,tick:Xe,eventualBG:Ut,insulinReq:0,reservoir:d,deliverAt:Je,sensitivityRatio,CR:o(K,1),TDD:Be,insulin:fe,current_target:it,insulinForManualBolus:O,manualBolusErrorString:0,minDelta:rt,expectedDelta:Rt,minGuardBG:At,minPredBG:Ot,threshold:n(A,i)};var It=[],Ft=[],jt=[],Pt=[];It.push(tt),Ft.push(tt),Pt.push(tt),jt.push(tt);var Et=function(e,t,a,r,o,i){return t?!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,tt,it,ut);if(M)if(D){let e=c.getHours();Gw&&(G+=24),e>=w&&e<=G&&(console.error("SMB disabled by profile override"),Et=!1),Gzt&&(console.error("Limiting carb impact from "+Wt+" to "+zt+"mg/dL/5m (30g/h)"),Wt=zt);var Nt=3;sensitivityRatio&&(Nt/=sensitivityRatio);var Ht=Nt;if(l.carbs){Nt=Math.max(Nt,l.mealCOB/20);var Zt=o((new Date(Ve).getTime()-l.lastCarbTime)/6e4),$t=(l.carbs-l.mealCOB)/l.carbs;Ht=o(Ht=Nt+1.5*Zt/60,1),console.error("Last carbs "+Zt+" minutes ago; remainingCATime:"+Ht+"hours; "+o(100*$t,1)+"% carbs absorbed")}var Jt=Math.max(0,Wt/5*60*Ht/2)/csf,Kt=90,Qt=1;i.remainingCarbsCap&&(Kt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Qt=Math.min(1,i.remainingCarbsFraction));var Vt=1-Qt,Xt=Math.max(0,l.mealCOB-Jt-l.carbs*Vt),Yt=(Xt=Math.min(Kt,Xt))*csf*5/60/(Ht/2),ea=o(l.slopeFromMaxDeviation,2),ta=o(l.slopeFromMinDeviation,2),aa=Math.min(ea,-ta/3);kt=0===Wt?0:Math.min(60*Ht/5/2,Math.max(0,l.mealCOB*csf/Wt)),console.error("Carb Impact:"+Wt+"mg/dL per 5m; CI Duration:"+o(5*kt/60*2,1)+"hours; remaining CI ("+Ht/2+"h peak):"+o(Yt,1)+"mg/dL per 5m");var ra,oa,na,ia,sa=999,la=999,ua=999,ma=999,da=999,ca=999,ga=999,ha=Ut,pa=tt,va=tt,fa=0,Ba=[],ba=[];try{St.forEach((function(e){var t=o(-e.activity*yt*5,2),a=o(-e.iobWithZeroTemp.activity*yt*5,2),r=Ct,n=Wt*(1-Math.min(1,Ft.length/12));if(!0===(U&&!Pe))ha=Ft[Ft.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(Ft[Ft.length-1],39)/Fe+1)))*5,2)+n,r=Pt[Pt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(k*_e*Math.log(Math.max(Pt[Pt.length-1],39)/Fe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ha,2)+" , ZTpredBG: "+o(r,2));else ha=Ft[Ft.length-1]+t+n,r=Pt[Pt.length-1]+a;var i=Math.max(0,Math.max(0,Wt)*(1-It.length/Math.max(2*kt,1))),s=Math.min(It.length,12*Ht-It.length),l=Math.max(0,s/(Ht/2*12)*Yt);i+l,Ba.push(o(l,0)),ba.push(o(i,0)),COBpredBG=It[It.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Lt+jt.length*aa),m=Math.max(0,Lt*(1-jt.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(fa=o(5*(jt.length+1)/60,1)),!0===(U&&!Pe))UAMpredBG=jt[jt.length-1]+o(-e.activity*(1800/(k*_e*Math.log(Math.max(jt[jt.length-1],39)/Fe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=jt[jt.length-1]+t+Math.min(0,n)+d;Ft.length<48&&Ft.push(ha),It.length<48&&It.push(COBpredBG),jt.length<48&&jt.push(UAMpredBG),Pt.length<48&&Pt.push(r),COBpredBG18&&hapa&&(pa=ha),(kt||Yt>0)&&It.length>18&&COBpredBG0)&&COBpredBG>pa&&(va=COBpredBG),qt&&jt.length>12&&UAMpredBGpa&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+ba.join(" ")),console.error("remainingCIs: "+Ba.join(" "))),$e.predBGs={},Ft.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ma=Ft.length-1;Ma>12&&Ft[Ma-1]===Ft[Ma];Ma--)Ft.pop();for($e.predBGs.IOB=Ft,oa=o(Ft[Ft.length-1]),Pt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=Pt.length-1;Ma>6&&!(Pt[Ma-1]>=Pt[Ma]||Pt[Ma]<=it);Ma--)Pt.pop();if($e.predBGs.ZT=Pt,o(Pt[Pt.length-1]),l.mealCOB>0&&(Wt>0||Yt>0)){for(It.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ma=It.length-1;Ma>12&&It[Ma-1]===It[Ma];Ma--)It.pop();$e.predBGs.COB=It,na=o(It[It.length-1]),Ut=Math.max(Ut,o(It[It.length-1])),console.error("COBpredBG: "+o(It[It.length-1]))}if(Wt>0||Yt>0){if(qt){for(jt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ma=jt.length-1;Ma>12&&jt[Ma-1]===jt[Ma];Ma--)jt.pop();$e.predBGs.UAM=jt,ia=o(jt[jt.length-1]),jt[jt.length-1]&&(Ut=Math.max(Ut,o(jt[jt.length-1])))}$e.eventualBG=Ut}console.error("UAM Impact:"+Lt+"mg/dL per 5m; UAM Duration:"+fa+"hours"),sa=Math.max(39,sa),la=Math.max(39,la),ua=Math.max(39,ua),Ot=o(sa);var _a=l.mealCOB/l.carbs;ra=o(ua<999&&la<999?(1-_a)*UAMpredBG+_a*COBpredBG:la<999?(ha+COBpredBG)/2:ua<999?(ha+UAMpredBG)/2:ha),ga>ra&&(ra=ga),At=o(At=kt||Yt>0?qt?_a*ma+(1-_a)*da:ma:qt?da:ca);var ya=ua;if(gaua&&(ya=(ua+ga)/2);if(ya=o(ya),l.carbs)if(!qt&&la<999)Ot=o(Math.max(sa,la));else if(la<999){var Sa=_a*la+(1-_a)*ya;Ot=o(Math.max(sa,la,Sa))}else Ot=qt?ya:At;else qt&&(Ot=o(Math.max(sa,ya)));Ot=Math.min(Ot,ra),process.stderr.write("minPredBG: "+Ot+" minIOBPredBG: "+sa+" minZTGuardBG: "+ga),la<999&&process.stderr.write(" minCOBPredBG: "+la),ua<999&&process.stderr.write(" minUAMPredBG: "+ua),console.error(" avgPredBG:"+ra+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),va>tt&&(Ot=Math.min(Ot,va)),$e.COB=l.mealCOB,$e.IOB=a.iob,$e.BGI=n(Gt,i),$e.deviation=n(Tt,i),$e.ISF=n(yt,i),$e.CR=o(K,1),$e.target_bg=n(it,i),$e.TDD=o(Be,2),$e.current_target=o(it,0);var Da=$e.CR;ze!=$e.CR&&(Da=ze+"→"+$e.CR),$e.reason=_t+", COB: "+$e.COB+", Dev: "+$e.deviation+", BGI: "+$e.BGI+", CR: "+Da+", Target: "+vt+", minPredBG "+n(Ot,i)+", minGuardBG "+n(At,i)+", IOBpredBG "+n(oa,i),na>0&&($e.reason+=", COBpredBG "+n(na,i)),ia>0&&($e.reason+=", UAMpredBG "+n(ia,i)),$e.reason+=q,$e.reason+="; ";var wa=Ct;wa<40&&(wa=Math.min(At,wa));var Ga,Ta=A-wa,Ca=240,Ua=240;if(l.mealCOB>0&&(Wt>0||Yt>0)){for(Ma=0;MaGa*tt&&(console.error("maxDelta "+n(nt,i)+" > "+100*Ga+"% of BG "+n(tt,i)+" - disabling SMB"),$e.reason+="maxDelta "+n(nt,i)+" > "+100*Ga+"% of BG "+n(tt,i)+" - SMB disabled!, ",Et=!1),console.error("BG projected to remain above "+n(st,i)+" for "+Ca+"minutes"),(Ua<240||Ca<60)&&console.error("BG projected to remain above "+n(A,i)+" for "+Ua+"minutes");var Oa=Ua,Aa=i.current_basal*$*yt*Oa/60,Ra=Math.max(0,l.mealCOB-.25*l.carbs),Ia=(Ta-Aa)/csf-Ra;Aa=o(Aa),Ia=o(Ia),console.error("naive_eventualBG:",Ct,"bgUndershoot:",Ta,"zeroTempDuration:",Oa,"zeroTempEffect:",Aa,"carbsReq:",Ia),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ia>=i.carbsReqThreshold&&Ua<=45&&($e.carbsReq=Ia,$e.reason+=Ia+" add'l carbs req w/in "+Ua+"m; ");var Fa=0;if(tt0&&rt>Rt)$e.reason+="IOB "+a.iob+" < "+o(-i.current_basal*$*20/60,2),$e.reason+=" and minDelta "+n(rt,i)+" > expectedDelta "+n(Rt,i)+"; ";else if(tt=55)return $e.reason+="; Canceling temp at "+$e.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,$e,t);var ja=0,Pa=Qe,Ea=0;if(UtRt&&rt>0&&!Ia)return Ct<40?($e.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,$e,t)):(e.delta>rt?$e.reason+=", but Delta "+n(Xe,i)+" > expectedDelta "+n(Rt,i):$e.reason+=", but Min. Delta "+rt.toFixed(2)+" > Exp. Delta "+n(Rt,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t)));ja=o(ja=2*Math.min(0,(Ut-it)/yt),2);var qa=Math.min(0,(Ct-it)/yt);if(qa=o(qa,2),rt<0&&rt>Rt)ja=o(ja*(rt/Rt),2);Pa=r(Pa=Qe+2*ja,i),Ea=t.duration*(t.rate-Qe)/60;var Wa=Math.min(ja,qa);if(console.log("naiveInsulinReq:"+qa),Ea5&&Pa>=.8*t.rate)return $e.reason+=", temp "+t.rate+" ~< req "+Pa+"U/hr. ",$e;if(Pa<=0){if((Fa=o(60*((Ta=it-Ct)/yt)/i.current_basal*$))<0?Fa=0:(Fa=30*o(Fa/30),Fa=Math.min(120,Math.max(0,Fa))),Fa>0)return $e.reason+=", setting "+Fa+"m zero temp. ",u.setTempBasal(Pa,Fa,i,$e,t)}else $e.reason+=", setting "+Pa+"U/hr. ";return u.setTempBasal(Pa,30,i,$e,t)}if(rt=2||Rt+-1*rt>=2)&&($e.manualBolusErrorString=rt>=0&&Rt>0?3:rt<0&&Rt<=0||rt<0&&Rt>=0?4:5),$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/yt,2),!m||!Et))return e.delta "+n(st,i)+" but Delta "+n(Xe,i)+" < Exp. Delta "+n(Rt,i):$e.reason+="Eventual BG "+n(Ut,i)+" > "+n(st,i)+" but Min. Delta "+rt.toFixed(2)+" < Exp. Delta "+n(Rt,i),t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Math.min(Ut,Ot)st&&($e.manualBolusErrorString=6,$e.insulinForManualBolus=o(($e.eventualBG-$e.target_bg)/yt,2),$e.minPredBG=Ot),!m||!Et))return $e.reason+=n(Ut,i)+"-"+n(Ot,i)+" in range: no temp required",t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));if(Ut>=lt&&($e.reason+="Eventual BG "+n(Ut,i)+" >= "+n(lt,i)+", ",Ut>lt&&($e.insulinForManualBolus=o((Ut-it)/yt,2))),a.iob>mt)return $e.reason+="IOB "+o(a.iob,2)+" > max_iob "+mt,t.duration>15&&r(Qe,i)===r(t.rate,i)?($e.reason+=", temp "+t.rate+" ~ req "+Qe+"U/hr. ",$e):($e.reason+="; setting current basal of "+Qe+" as temp. ",u.setTempBasal(Qe,30,i,$e,t));ja=o((Math.min(Ot,Ut)-it)/yt,2),O=o((Ut-it)/yt,2),ja>mt-a.iob?(console.error("SMB limited by maxIOB: "+mt-a.iob+" (. insulinReq: "+ja+" U)"),$e.reason+="max_iob "+mt+", ",ja=mt-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+ja+" U)."),O>mt-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+mt-a.iob+" (. insulinForManualBolus: "+O+" U)"),$e.reason+="max_iob "+mt+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+O+" U)."),Pa=r(Pa=Qe+2*ja,i),ja=o(ja,3),$e.insulinReq=ja;var ka=o((new Date(Ve).getTime()-a.lastBolusTime)/6e4,1);if(m&&Et&&tt>A){var La=30;void 0!==i.maxSMBBasalMinutes&&(La=i.maxSMBBasalMinutes);var za=30;void 0!==i.maxUAMSMBBasalMinutes&&(za=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&T!==La&&(console.error("SMB Max Minutes - setting overriden from "+La+" to "+T),La=T),v.useOverride&&_&&C!==za&&(console.error("UAM Max Minutes - setting overriden from "+za+" to "+C),za=C);var Na=o(l.mealCOB/K,3),Ha=0;void 0===La?(Ha=o(i.current_basal*$*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),ja>Ha&&console.error("SMB limited by maxBolus: "+Ha+" ( "+ja+" U)")):a.iob>Na&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Na),za?(console.error("maxUAMSMBBasalMinutes: "+za+", profile.current_basal: "+i.current_basal*$),Ha=o(i.current_basal*$*za/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),Ha=o(i.current_basal*$*30/60,1)),ja>Ha?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+za+"m ]: "+Ha+"U ( "+ja+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+ja+"U )")):(console.error(".maxSMBBasalMinutes: "+La+", profile.current_basal: "+i.current_basal*$),ja>(Ha=o(i.current_basal*La/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+La+"m ]: "+Ha+"U ( insulinReq: "+ja+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+ja+"U )"));var Za=i.bolus_increment,$a=1/Za,Ja=i.smb_delivery_ratio;Ja>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Ja,2));var Ka=Math.min(ja*Ja,Ha);Ka=Math.floor(Ka*$a)/$a,Fa=o(60*((it-(Ct+sa)/2)/yt)/i.current_basal*$),ja>0&&Ka=30?(Fa=30*o(Fa/30),Fa=Math.min(60,Math.max(0,Fa))):(Qa=o(Qe*Fa/30,2),Fa=30),$e.reason+=" insulinReq "+ja,Ka>=Ha&&($e.reason+="; maxBolus "+Ha),Fa>0&&($e.reason+="; setting "+Fa+"m low temp of "+Qa+"U/h"),$e.reason+=". ";var Va=3;i.SMBInterval&&(Va=Math.min(10,Math.max(1,i.SMBInterval)));var Xa=o(Va-ka,0),Ya=o(60*(Va-ka),0)%60;if(console.error("naive_eventualBG "+Ct+","+Fa+"m "+Qa+"U/h temp needed; last bolus "+ka+"m ago; maxBolus: "+Ha),ka>Va?Ka>0&&($e.units=Ka,$e.reason+="Microbolusing "+Ka+"U. "):$e.reason+="Waiting "+Xa+"m "+Ya+"s to microbolus again. ",Fa>0)return $e.rate=Qa,$e.duration=Fa,$e}var er=u.getMaxSafeBasal(i);return 400==tt?u.setTempBasal(i.current_basal,30,i,$e,t):(Pa>er&&($e.reason+="adj. req. rate: "+Pa+" to maxSafeBasal: "+o(er,2)+", ",Pa=r(er,i)),(Ea=t.duration*(t.rate-Qe)/60)>=2*ja?($e.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)):void 0===t.duration||0===t.duration?($e.reason+="no temp, setting "+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)):t.duration>5&&r(Pa,i)<=r(t.rate,i)?($e.reason+="temp "+t.rate+" >~ req "+Pa+"U/hr. ",$e):($e.reason+="temp "+t.rate+"<"+Pa+"U/hr. ",u.setTempBasal(Pa,30,i,$e,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr;v.smbIsAlwaysOff,v.start;v.end;const S=v.smbMinutes,D=v.uamMinutes;var w=h.useNewFormula,G=0,T=B,C=0,U="",O="",A="",R="",I="",F="",j=0,P=0,E=0,q=0,W=0,k=0;const L=v.weightedAverage;var z=1,N=i.sens,H=i.carb_ratio;v.useOverride&&(z=v.overridePercentage/100,_?(N/=z,H/=z):(x&&(H/=z),y&&(N/=z)));const Z=i.weightPercentage,$=v.average_total_data;function J(e,t){var a=e.getTime();return new Date(a+36e5*t)}function K(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Q(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function V(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const X=Math.min(i.autosens_min,i.autosens_max),Y=Math.max(i.autosens_min,i.autosens_max);function ee(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Q(r),u=p[0].rate;for(let e=0;e=(s=V(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=V(d,l))?n=s:o=(s=V("23:59:59",l))?n=s:o0&&o1)&&(w=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(w){let e=g.length-1;var te=new Date(g[e].timestamp),ae=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ae=new Date),(C=(ae-te)/36e5)<23.9&&C>21)W=ee(te,(re=24-C,oe=te.getTime(),new Date(oe-36e5*re))),R="24 hours of data is required for an accurate tdd calculation. Currently only "+C.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+W.toPrecision(5)+" U. ";else C<21?(w=!1,enableDynamicCR=!1):R=""}}else console.log("Pumphistory is empty!"),w=!1,enableDynamicCR=!1;var re,oe;if(w){for(let e=0;e0){j=e,k=g[e].rate;var ne=g[e-1]["duration (min)"]/60,ie=ne,se=new Date(g[e-1].timestamp),le=se,ue=0;do{if(e--,0==e){le=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){le=new Date(g[e].timestamp);break}var me=e-2;if(me>=0&&"Rewind"==g[me]._type){let e=g[me].timestamp;for(;me-1>=0&&"Prime"==g[me-=1]._type;)ue=(g[me].timestamp-e)/36e5;ue>=ne&&(le=e,ue=0)}}while(e>0);var de=(le-se)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(W+=ee(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ce=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ce=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ce=new Date,t=g[e]["duration (min)"]/60),(ce-a)/36e5-t>0){W+=ee(ce,J(a,t))}}var ge={TDD:o(P=q+E+W,5),bolus:o(q,5),temp_basal:o(E,5),scheduled_basal:o(W,5)};C>21?(O=". Bolus insulin: "+q.toPrecision(5)+" U",A=". Temporary basal insulin: "+E.toPrecision(5)+" U",U=". Insulin with scheduled basal rate: "+W.toPrecision(5)+" U",I=R+(" TDD past 24h is: "+P.toPrecision(5)+" U")+O+A+U,F=", TDD: "+o(P,2)+" U, "+o(q/P*100,0)+"% Bolus "+o((E+W)/P*100,0)+"% Basal"):F=", TDD: Not enough pumpData (< 21h)"}var he;const pe=e.glucose,ve=h.enableDynamicCR,fe=h.adjustmentFactor,Be=B;var be=!1,Me="",_e=1,ye="";$>0&&(_e=L/$),ye=_e>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(_e=o(_e=Math.min(_e,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":_e<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(_e=o(_e=Math.max(_e,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+_e,ye=", Basal ratio: "+_e,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(be=!0),Be>=118&&be&&(w=!1,Me="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Be);var xe=", Dynamic ratios log: ",Se=", AF: "+fe,De="BG: "+pe+" mg/dl ("+(.0555*pe).toPrecision(2)+" mmol/l)",we="",Ge="";const Te=h.curve,Ce=i.insulinPeakTime,Ue=h.useCustomPeakTime;var Oe=55,Ae=65;switch(Te){case"rapid-acting":Ae=65;break;case"ultra-rapid":Ae=50}Ue?(Oe=120-Ce,console.log("Custom insulinpeakTime set to :"+Ce+", insulinFactor: "+Oe)):(Oe=120-Ae,console.log("insulinFactor set to : "+Oe)),he=P,Z<1&&L>0&&(P=L,console.log("Using weighted TDD average: "+o(P,2)+" U, instead of past 24 h ("+o(he,2)+" U), weight: "+Z),Ge=", Weighted TDD: "+o(P,2)+" U");const Re=h.sigmoid;var Ie="";if(w){var Fe=N*fe*P*Math.log(pe/Oe+1)/1800;we=", Logarithmic formula"}if(w&&Re){const e=X,t=Y-e,a=.0555*(pe-B);var je=_e,Pe=Y-1;1==Y&&(Pe=Y+.01-1);const r=Math.log10(1/Pe-e/Pe)/Math.log10(Math.E),o=a*fe*je+r;Fe=t/(1+Math.exp(-o))+e,we=", Sigmoid function"}var Ee=H;const qe=o(H,1);var We="",ke="";if(w&&P>0){if(We=", Dynamic ISF/CR: On/",Fe>Y?(Me=", Dynamic ISF limited by autosens_max setting: "+Y+" ("+o(Fe,2)+"), ",ke=", Autosens/Dynamic Limit: "+Y+" ("+o(Fe,2)+")",Fe=Y):Fe-.5?"+"+o(e.delta,0):o(e.delta,0);var Ye=Math.min(e.delta,e.short_avgdelta),et=Math.min(e.short_avgdelta,e.long_avgdelta),tt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ve<=10||38===Ve||Xe>=3)&&(ze.reason="CGM is calibrating, in ??? state, or noise is high");if(Ve>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ve&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ve&&!0),Qe>12||Qe<-5?ze.reason="If current system time "+$e+" is correct, then BG data is too old. The last BG data was read "+Qe+"m ago at "+Ke:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ve&&(e.last_cal&&e.last_cal<3?ze.reason="CGM was just calibrated":ze.reason="CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ve&&(Ve<=10||38===Ve||Xe>=3||Qe>12||Qe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ze?(ze.reason+=". Canceling high temp basal of "+t.rate,ze.deliverAt=Ne,ze.temp="absolute",ze.duration=0,ze.rate=0,ze):0===t.rate&&t.duration>30?(ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",ze.deliverAt=Ne,ze.temp="absolute",ze.duration=30,ze.rate=0,ze):(ze.reason+=". Temp "+t.rate+" <= current basal "+Ze+"U/hr; doing nothing. ",ze);var at,rt,ot,nt,it=i.max_iob;if(void 0!==B&&(rt=B),void 0!==i.max_bg&&(ot=B),void 0!==i.enableSMB_high_bg_target&&(nt=i.enableSMB_high_bg_target),void 0===B)return ze.error="Error: could not determine target_bg. ",ze;at=B;var st=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,lt=100,ut=160;if(ut=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ut=e}else console.log("Default Half Basal Target used: "+n(ut,i)+" "+i.out_units);if(st&&i.temptargetSet&&at>lt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&at=at&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(_e,2)+", TDD 24h = "+o(he,2)+"U, Weighted average TDD = "+o(L,2)+"U, (Weight percentage = "+Z+"), Total data of TDDs (up to 14 days) average = "+o($,2)+"U. "),Ze!==He*z?process.stderr.write("Adjusting basal from "+He*z+" U/h to "+Ze+" U/h; "):process.stderr.write("Basal unchanged: "+Ze+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){rt=o((rt-60)/s.ratio)+60,ot=o((ot-60)/s.ratio)+60;var dt=o((at-60)/s.ratio)+60;at===(dt=Math.max(80,dt))?process.stderr.write("target_bg unchanged: "+n(dt,i)+"; "):process.stderr.write("target_bg from "+n(dt,i)+" to "+n(dt,i)+"; "),at=dt}var ct=n(at,i);at!=B&&(ct=0!==b&&6!==b&&b!==at?n(B,i)+"→"+n(b,i)+"→"+n(at,i):n(B,i)+"→"+n(at,i));var gt=200,ht=200,pt=200;if(e.noise>=2){var vt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);gt=o(Math.min(200,rt*vt)),ht=o(Math.min(200,at*vt)),pt=o(Math.min(200,ot*vt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(dt,i)+" to "+n(ht,i)+"; "),rt=gt,at=ht,ot=pt}T=rt-.5*(rt-40),T=Math.min(Math.max(i.threshold_setting,T,65),120),console.error("Threshold set to "+n(T,i));var ft="",Bt=(o(N,1),N);if(void 0!==s&&s&&((Bt=o(Bt=N/sensitivityRatio,1))!==N?process.stderr.write("ISF from "+n(N,i)+" to "+n(Bt,i)):process.stderr.write("ISF unchanged: "+n(Bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(N,i)+"→"+n(Bt,i)),console.error("CR:"+H),void 0===a)return ze.error="Error: iob_data undefined. ",ze;var bt,Mt=a;if(a.length,a.length>1&&(a=Mt[0]),void 0===a.activity||void 0===a.iob)return ze.error="Error: iob_data missing some property. ",ze;var _t=((bt=void 0!==a.lastTemp?o((new Date($e).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+bt+"m, tempModulus:"+_t+"m"),ze.temp="absolute",ze.deliverAt=Ne,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&bt>10&&t.duration)return ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,ze,t);if(t&&a.lastTemp&&t.duration>0){var yt=bt-a.lastTemp.duration;if(yt>5&&bt>10)return ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+yt+"m ago; canceling temp",u.setTempBasal(0,0,i,ze,t)}var xt=o(-a.activity*Bt*5,2),St=o(6*(Ye-xt));St<0&&(St=o(6*(et-xt)))<0&&(St=o(6*(e.long_avgdelta-xt)));var Dt=Ve,wt=(Dt=a.iob>0?o(Ve-a.iob*Bt):o(Ve-a.iob*Math.min(Bt,N)))+St;if(void 0===wt||isNaN(wt))return ze.error="Error: could not calculate eventualBG. Sensitivity: "+Bt+" Deviation: "+St,ze;var Gt,Tt,Ct=function(e,t,a){return o(a+(e-t)/24,1)}(at,wt,xt);ze={temp:"absolute",bg:Ve,tick:Je,eventualBG:wt,insulinReq:0,reservoir:d,deliverAt:Ne,sensitivityRatio,CR:o(H,1),TDD:he,insulin:ge,current_target:at,insulinForManualBolus:G,manualBolusErrorString:0,minDelta:Ye,expectedDelta:Ct,minGuardBG:Tt,minPredBG:Gt,threshold:n(T,i)};var Ut=[],Ot=[],At=[],Rt=[];Ut.push(Ve),Ot.push(Ve),Rt.push(Ve),At.push(Ve);var It=function(e,t,a,r,o,i,s,l){if(!t)return console.error("SMB disabled (!microBolusAllowed)"),!1;if(!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100)return console.error("SMB disabled due to high temptarget of "+o),!1;if(!0===a.bwFound&&!1===e.A52_risk_enable)return console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1;if(400==r)return console.error("Invalid CGM (HIGH). SMBs disabled."),!1;if(s.smbIsOff){if(!s.smbIsAlwaysOff)return console.error("SMBs are disabled by profile override"),!1;{let e=l.getHours();if(s.ends.start&&(s.end+=24),e>=s.start&&e<=s.end)return console.error("SMBs are disabled by profile override"),!1;if(s.end=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1)}(i,m,l,Ve,at,nt,v,c),Ft=i.enableUAM,jt=0,Pt=0;jt=o(Ye-xt,1);var Et=o(Ye-xt,1);csf=Bt/H,console.error("profile.sens:"+n(N,i)+", sens:"+n(Bt,i)+", CSF:"+o(csf,1));var qt=o(30*csf*5/60,1);jt>qt&&(console.error("Limiting carb impact from "+jt+" to "+qt+"mg/dL/5m (30g/h)"),jt=qt);var Wt=3;sensitivityRatio&&(Wt/=sensitivityRatio);var kt=Wt;if(l.carbs){Wt=Math.max(Wt,l.mealCOB/20);var Lt=o((new Date($e).getTime()-l.lastCarbTime)/6e4),zt=(l.carbs-l.mealCOB)/l.carbs;kt=o(kt=Wt+1.5*Lt/60,1),console.error("Last carbs "+Lt+" minutes ago; remainingCATime:"+kt+"hours; "+o(100*zt,1)+"% carbs absorbed")}var Nt=Math.max(0,jt/5*60*kt/2)/csf,Ht=90,Zt=1;i.remainingCarbsCap&&(Ht=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Zt=Math.min(1,i.remainingCarbsFraction));var $t=1-Zt,Jt=Math.max(0,l.mealCOB-Nt-l.carbs*$t),Kt=(Jt=Math.min(Ht,Jt))*csf*5/60/(kt/2),Qt=o(l.slopeFromMaxDeviation,2),Vt=o(l.slopeFromMinDeviation,2),Xt=Math.min(Qt,-Vt/3);Pt=0===jt?0:Math.min(60*kt/5/2,Math.max(0,l.mealCOB*csf/jt)),console.error("Carb Impact:"+jt+"mg/dL per 5m; CI Duration:"+o(5*Pt/60*2,1)+"hours; remaining CI ("+kt/2+"h peak):"+o(Kt,1)+"mg/dL per 5m");var Yt,ea,ta,aa,ra=999,oa=999,na=999,ia=999,sa=999,la=999,ua=999,ma=wt,da=Ve,ca=Ve,ga=0,ha=[],pa=[];try{Mt.forEach((function(e){var t=o(-e.activity*Bt*5,2),a=o(-e.iobWithZeroTemp.activity*Bt*5,2),r=Dt,n=jt*(1-Math.min(1,Ot.length/12));if(!0===(w&&!Re))ma=Ot[Ot.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(Ot[Ot.length-1],39)/Oe+1)))*5,2)+n,r=Rt[Rt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(P*fe*Math.log(Math.max(Rt[Rt.length-1],39)/Oe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=Ot[Ot.length-1]+t+n,r=Rt[Rt.length-1]+a;var i=Math.max(0,Math.max(0,jt)*(1-Ut.length/Math.max(2*Pt,1))),s=Math.min(Ut.length,12*kt-Ut.length),l=Math.max(0,s/(kt/2*12)*Kt);i+l,ha.push(o(l,0)),pa.push(o(i,0)),COBpredBG=Ut[Ut.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Et+At.length*Xt),m=Math.max(0,Et*(1-At.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(ga=o(5*(At.length+1)/60,1)),!0===(w&&!Re))UAMpredBG=At[At.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(At[At.length-1],39)/Oe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=At[At.length-1]+t+Math.min(0,n)+d;Ot.length<48&&Ot.push(ma),Ut.length<48&&Ut.push(COBpredBG),At.length<48&&At.push(UAMpredBG),Rt.length<48&&Rt.push(r),COBpredBG18&&mada&&(da=ma),(Pt||Kt>0)&&Ut.length>18&&COBpredBG0)&&COBpredBG>da&&(ca=COBpredBG),Ft&&At.length>12&&UAMpredBGda&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+pa.join(" ")),console.error("remainingCIs: "+ha.join(" "))),ze.predBGs={},Ot.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var va=Ot.length-1;va>12&&Ot[va-1]===Ot[va];va--)Ot.pop();for(ze.predBGs.IOB=Ot,ea=o(Ot[Ot.length-1]),Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=Rt.length-1;va>6&&!(Rt[va-1]>=Rt[va]||Rt[va]<=at);va--)Rt.pop();if(ze.predBGs.ZT=Rt,o(Rt[Rt.length-1]),l.mealCOB>0&&(jt>0||Kt>0)){for(Ut.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),va=Ut.length-1;va>12&&Ut[va-1]===Ut[va];va--)Ut.pop();ze.predBGs.COB=Ut,ta=o(Ut[Ut.length-1]),wt=Math.max(wt,o(Ut[Ut.length-1])),console.error("COBpredBG: "+o(Ut[Ut.length-1]))}if(jt>0||Kt>0){if(Ft){for(At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=At.length-1;va>12&&At[va-1]===At[va];va--)At.pop();ze.predBGs.UAM=At,aa=o(At[At.length-1]),At[At.length-1]&&(wt=Math.max(wt,o(At[At.length-1])))}ze.eventualBG=wt}console.error("UAM Impact:"+Et+"mg/dL per 5m; UAM Duration:"+ga+"hours"),ra=Math.max(39,ra),oa=Math.max(39,oa),na=Math.max(39,na),Gt=o(ra);var fa=l.mealCOB/l.carbs;Yt=o(na<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:na<999?(ma+UAMpredBG)/2:ma),ua>Yt&&(Yt=ua),Tt=o(Tt=Pt||Kt>0?Ft?fa*ia+(1-fa)*sa:ia:Ft?sa:la);var Ba=na;if(uana&&(Ba=(na+ua)/2);if(Ba=o(Ba),l.carbs)if(!Ft&&oa<999)Gt=o(Math.max(ra,oa));else if(oa<999){var Ma=fa*oa+(1-fa)*Ba;Gt=o(Math.max(ra,oa,Ma))}else Gt=Ft?Ba:Tt;else Ft&&(Gt=o(Math.max(ra,Ba)));Gt=Math.min(Gt,Yt),process.stderr.write("minPredBG: "+Gt+" minIOBPredBG: "+ra+" minZTGuardBG: "+ua),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),na<999&&process.stderr.write(" minUAMPredBG: "+na),console.error(" avgPredBG:"+Yt+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ca>Ve&&(Gt=Math.min(Gt,ca)),ze.COB=l.mealCOB,ze.IOB=a.iob,ze.BGI=n(xt,i),ze.deviation=n(St,i),ze.ISF=n(Bt,i),ze.CR=o(H,1),ze.target_bg=n(at,i),ze.TDD=o(he,2),ze.current_target=o(at,0);var _a=ze.CR;qe!=ze.CR&&(_a=qe+"→"+ze.CR),ze.reason=ft+", COB: "+ze.COB+", Dev: "+ze.deviation+", BGI: "+ze.BGI+", CR: "+_a+", Target: "+ct+", minPredBG "+n(Gt,i)+", minGuardBG "+n(Tt,i)+", IOBpredBG "+n(ea,i),ta>0&&(ze.reason+=", COBpredBG "+n(ta,i)),aa>0&&(ze.reason+=", UAMpredBG "+n(aa,i)),ze.reason+=F,ze.reason+="; ";var ya=Dt;ya<40&&(ya=Math.min(Tt,ya));var xa,Sa=T-ya,Da=240,wa=240;if(l.mealCOB>0&&(jt>0||Kt>0)){for(va=0;vaxa*Ve&&(console.error("maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - disabling SMB"),ze.reason+="maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - SMB disabled!, ",It=!1),console.error("BG projected to remain above "+n(rt,i)+" for "+Da+"minutes"),(wa<240||Da<60)&&console.error("BG projected to remain above "+n(T,i)+" for "+wa+"minutes");var Ga=wa,Ta=i.current_basal*z*Bt*Ga/60,Ca=Math.max(0,l.mealCOB-.25*l.carbs),Ua=(Sa-Ta)/csf-Ca;Ta=o(Ta),Ua=o(Ua),console.error("naive_eventualBG:",Dt,"bgUndershoot:",Sa,"zeroTempDuration:",Ga,"zeroTempEffect:",Ta,"carbsReq:",Ua),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ua>=i.carbsReqThreshold&&wa<=45&&(ze.carbsReq=Ua,ze.reason+=Ua+" add'l carbs req w/in "+wa+"m; ");var Oa=0;if(Ve0&&Ye>Ct)ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*z*20/60,2),ze.reason+=" and minDelta "+n(Ye,i)+" > expectedDelta "+n(Ct,i)+"; ";else if(Ve=55)return ze.reason+="; Canceling temp at "+ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,ze,t);var Aa=0,Ra=Ze,Ia=0;if(wtCt&&Ye>0&&!Ua)return Dt<40?(ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,ze,t)):(e.delta>Ye?ze.reason+=", but Delta "+n(Je,i)+" > expectedDelta "+n(Ct,i):ze.reason+=", but Min. Delta "+Ye.toFixed(2)+" > Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t)));Aa=o(Aa=2*Math.min(0,(wt-at)/Bt),2);var Fa=Math.min(0,(Dt-at)/Bt);if(Fa=o(Fa,2),Ye<0&&Ye>Ct)Aa=o(Aa*(Ye/Ct),2);Ra=r(Ra=Ze+2*Aa,i),Ia=t.duration*(t.rate-Ze)/60;var ja=Math.min(Aa,Fa);if(console.log("naiveInsulinReq:"+Fa),Ia5&&Ra>=.8*t.rate)return ze.reason+=", temp "+t.rate+" ~< req "+Ra+"U/hr. ",ze;if(Ra<=0){if((Oa=o(60*((Sa=at-Dt)/Bt)/i.current_basal*z))<0?Oa=0:(Oa=30*o(Oa/30),Oa=Math.min(120,Math.max(0,Oa))),Oa>0)return ze.reason+=", setting "+Oa+"m zero temp. ",u.setTempBasal(Ra,Oa,i,ze,t)}else ze.reason+=", setting "+Ra+"U/hr. ";return u.setTempBasal(Ra,30,i,ze,t)}if(Ye=2||Ct+-1*Ye>=2)&&(ze.manualBolusErrorString=Ye>=0&&Ct>0?3:Ye<0&&Ct<=0||Ye<0&&Ct>=0?4:5),ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),!m||!It))return e.delta "+n(rt,i)+" but Delta "+n(Je,i)+" < Exp. Delta "+n(Ct,i):ze.reason+="Eventual BG "+n(wt,i)+" > "+n(rt,i)+" but Min. Delta "+Ye.toFixed(2)+" < Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(Math.min(wt,Gt)rt&&(ze.manualBolusErrorString=6,ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),ze.minPredBG=Gt),!m||!It))return ze.reason+=n(wt,i)+"-"+n(Gt,i)+" in range: no temp required",t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(wt>=ot&&(ze.reason+="Eventual BG "+n(wt,i)+" >= "+n(ot,i)+", ",wt>ot&&(ze.insulinForManualBolus=o((wt-at)/Bt,2))),a.iob>it)return ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+it,t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));Aa=o((Math.min(Gt,wt)-at)/Bt,2),G=o((wt-at)/Bt,2),Aa>it-a.iob?(console.error("SMB limited by maxIOB: "+it-a.iob+" (. insulinReq: "+Aa+" U)"),ze.reason+="max_iob "+it+", ",Aa=it-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),G>it-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+it-a.iob+" (. insulinForManualBolus: "+G+" U)"),ze.reason+="max_iob "+it+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+G+" U)."),Ra=r(Ra=Ze+2*Aa,i),Aa=o(Aa,3),ze.insulinReq=Aa;var Pa=o((new Date($e).getTime()-a.lastBolusTime)/6e4,1);if(m&&It&&Ve>T){var Ea=30;void 0!==i.maxSMBBasalMinutes&&(Ea=i.maxSMBBasalMinutes);var qa=30;void 0!==i.maxUAMSMBBasalMinutes&&(qa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&S!==Ea&&(console.error("SMB Max Minutes - setting overriden from "+Ea+" to "+S),Ea=S),v.useOverride&&M&&D!==qa&&(console.error("UAM Max Minutes - setting overriden from "+qa+" to "+D),qa=D);var Wa=o(l.mealCOB/H,3),ka=0;void 0===Ea?(ka=o(i.current_basal*z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>ka&&console.error("SMB limited by maxBolus: "+ka+" ( "+Aa+" U)")):a.iob>Wa&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Wa),qa?(console.error("maxUAMSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*z),ka=o(i.current_basal*z*qa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),ka=o(i.current_basal*z*30/60,1)),Aa>ka?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+qa+"m ]: "+ka+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+Ea+", profile.current_basal: "+i.current_basal*z),Aa>(ka=o(i.current_basal*Ea/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+Ea+"m ]: "+ka+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var La=i.bolus_increment,za=1/La,Na=i.smb_delivery_ratio;Na>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Na,2));var Ha=Math.min(Aa*Na,ka);Ha=Math.floor(Ha*za)/za,Oa=o(60*((at-(Dt+ra)/2)/Bt)/i.current_basal*z),Aa>0&&Ha=30?(Oa=30*o(Oa/30),Oa=Math.min(60,Math.max(0,Oa))):(Za=o(Ze*Oa/30,2),Oa=30),ze.reason+=" insulinReq "+Aa,Ha>=ka&&(ze.reason+="; maxBolus "+ka),Oa>0&&(ze.reason+="; setting "+Oa+"m low temp of "+Za+"U/h"),ze.reason+=". ";var $a=3;i.SMBInterval&&($a=Math.min(10,Math.max(1,i.SMBInterval)));var Ja=o($a-Pa,0),Ka=o(60*($a-Pa),0)%60;if(console.error("naive_eventualBG "+Dt+","+Oa+"m "+Za+"U/h temp needed; last bolus "+Pa+"m ago; maxBolus: "+ka),Pa>$a?Ha>0&&(ze.units=Ha,ze.reason+="Microbolusing "+Ha+"U. "):ze.reason+="Waiting "+Ja+"m "+Ka+"s to microbolus again. ",Oa>0)return ze.rate=Za,ze.duration=Oa,ze}var Qa=u.getMaxSafeBasal(i);return 400==Ve?u.setTempBasal(i.current_basal,30,i,ze,t):(Ra>Qa&&(ze.reason+="adj. req. rate: "+Ra+" to maxSafeBasal: "+o(Qa,2)+", ",Ra=r(Qa,i)),(Ia=t.duration*(t.rate-Ze)/60)>=2*Aa?(ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):void 0===t.duration||0===t.duration?(ze.reason+="no temp, setting "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):t.duration>5&&r(Ra,i)<=r(t.rate,i)?(ze.reason+="temp "+t.rate+" >~ req "+Ra+"U/hr. ",ze):(ze.reason+="temp "+t.rate+"<"+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); From b674b8b5bc750b3badad83f6277f00f0590c2ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 19 Jan 2024 16:18:02 +0100 Subject: [PATCH 356/405] Just some logging. Disabled SMBs were already logged, but not (always) in the rT.reson. Now these are, which also means we now can see in Loop pop-up when SMBs are disabled. --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 627b03a71d..77da3712d4 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr;v.smbIsAlwaysOff,v.start;v.end;const S=v.smbMinutes,D=v.uamMinutes;var w=h.useNewFormula,G=0,T=B,C=0,U="",O="",A="",R="",I="",F="",j=0,P=0,E=0,q=0,W=0,k=0;const L=v.weightedAverage;var z=1,N=i.sens,H=i.carb_ratio;v.useOverride&&(z=v.overridePercentage/100,_?(N/=z,H/=z):(x&&(H/=z),y&&(N/=z)));const Z=i.weightPercentage,$=v.average_total_data;function J(e,t){var a=e.getTime();return new Date(a+36e5*t)}function K(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Q(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function V(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const X=Math.min(i.autosens_min,i.autosens_max),Y=Math.max(i.autosens_min,i.autosens_max);function ee(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Q(r),u=p[0].rate;for(let e=0;e=(s=V(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=V(d,l))?n=s:o=(s=V("23:59:59",l))?n=s:o0&&o1)&&(w=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(w){let e=g.length-1;var te=new Date(g[e].timestamp),ae=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ae=new Date),(C=(ae-te)/36e5)<23.9&&C>21)W=ee(te,(re=24-C,oe=te.getTime(),new Date(oe-36e5*re))),R="24 hours of data is required for an accurate tdd calculation. Currently only "+C.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+W.toPrecision(5)+" U. ";else C<21?(w=!1,enableDynamicCR=!1):R=""}}else console.log("Pumphistory is empty!"),w=!1,enableDynamicCR=!1;var re,oe;if(w){for(let e=0;e0){j=e,k=g[e].rate;var ne=g[e-1]["duration (min)"]/60,ie=ne,se=new Date(g[e-1].timestamp),le=se,ue=0;do{if(e--,0==e){le=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){le=new Date(g[e].timestamp);break}var me=e-2;if(me>=0&&"Rewind"==g[me]._type){let e=g[me].timestamp;for(;me-1>=0&&"Prime"==g[me-=1]._type;)ue=(g[me].timestamp-e)/36e5;ue>=ne&&(le=e,ue=0)}}while(e>0);var de=(le-se)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(W+=ee(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ce=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ce=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ce=new Date,t=g[e]["duration (min)"]/60),(ce-a)/36e5-t>0){W+=ee(ce,J(a,t))}}var ge={TDD:o(P=q+E+W,5),bolus:o(q,5),temp_basal:o(E,5),scheduled_basal:o(W,5)};C>21?(O=". Bolus insulin: "+q.toPrecision(5)+" U",A=". Temporary basal insulin: "+E.toPrecision(5)+" U",U=". Insulin with scheduled basal rate: "+W.toPrecision(5)+" U",I=R+(" TDD past 24h is: "+P.toPrecision(5)+" U")+O+A+U,F=", TDD: "+o(P,2)+" U, "+o(q/P*100,0)+"% Bolus "+o((E+W)/P*100,0)+"% Basal"):F=", TDD: Not enough pumpData (< 21h)"}var he;const pe=e.glucose,ve=h.enableDynamicCR,fe=h.adjustmentFactor,Be=B;var be=!1,Me="",_e=1,ye="";$>0&&(_e=L/$),ye=_e>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(_e=o(_e=Math.min(_e,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":_e<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(_e=o(_e=Math.max(_e,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+_e,ye=", Basal ratio: "+_e,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(be=!0),Be>=118&&be&&(w=!1,Me="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Be);var xe=", Dynamic ratios log: ",Se=", AF: "+fe,De="BG: "+pe+" mg/dl ("+(.0555*pe).toPrecision(2)+" mmol/l)",we="",Ge="";const Te=h.curve,Ce=i.insulinPeakTime,Ue=h.useCustomPeakTime;var Oe=55,Ae=65;switch(Te){case"rapid-acting":Ae=65;break;case"ultra-rapid":Ae=50}Ue?(Oe=120-Ce,console.log("Custom insulinpeakTime set to :"+Ce+", insulinFactor: "+Oe)):(Oe=120-Ae,console.log("insulinFactor set to : "+Oe)),he=P,Z<1&&L>0&&(P=L,console.log("Using weighted TDD average: "+o(P,2)+" U, instead of past 24 h ("+o(he,2)+" U), weight: "+Z),Ge=", Weighted TDD: "+o(P,2)+" U");const Re=h.sigmoid;var Ie="";if(w){var Fe=N*fe*P*Math.log(pe/Oe+1)/1800;we=", Logarithmic formula"}if(w&&Re){const e=X,t=Y-e,a=.0555*(pe-B);var je=_e,Pe=Y-1;1==Y&&(Pe=Y+.01-1);const r=Math.log10(1/Pe-e/Pe)/Math.log10(Math.E),o=a*fe*je+r;Fe=t/(1+Math.exp(-o))+e,we=", Sigmoid function"}var Ee=H;const qe=o(H,1);var We="",ke="";if(w&&P>0){if(We=", Dynamic ISF/CR: On/",Fe>Y?(Me=", Dynamic ISF limited by autosens_max setting: "+Y+" ("+o(Fe,2)+"), ",ke=", Autosens/Dynamic Limit: "+Y+" ("+o(Fe,2)+")",Fe=Y):Fe-.5?"+"+o(e.delta,0):o(e.delta,0);var Ye=Math.min(e.delta,e.short_avgdelta),et=Math.min(e.short_avgdelta,e.long_avgdelta),tt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ve<=10||38===Ve||Xe>=3)&&(ze.reason="CGM is calibrating, in ??? state, or noise is high");if(Ve>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ve&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ve&&!0),Qe>12||Qe<-5?ze.reason="If current system time "+$e+" is correct, then BG data is too old. The last BG data was read "+Qe+"m ago at "+Ke:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ve&&(e.last_cal&&e.last_cal<3?ze.reason="CGM was just calibrated":ze.reason="CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ve&&(Ve<=10||38===Ve||Xe>=3||Qe>12||Qe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ze?(ze.reason+=". Canceling high temp basal of "+t.rate,ze.deliverAt=Ne,ze.temp="absolute",ze.duration=0,ze.rate=0,ze):0===t.rate&&t.duration>30?(ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",ze.deliverAt=Ne,ze.temp="absolute",ze.duration=30,ze.rate=0,ze):(ze.reason+=". Temp "+t.rate+" <= current basal "+Ze+"U/hr; doing nothing. ",ze);var at,rt,ot,nt,it=i.max_iob;if(void 0!==B&&(rt=B),void 0!==i.max_bg&&(ot=B),void 0!==i.enableSMB_high_bg_target&&(nt=i.enableSMB_high_bg_target),void 0===B)return ze.error="Error: could not determine target_bg. ",ze;at=B;var st=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,lt=100,ut=160;if(ut=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ut=e}else console.log("Default Half Basal Target used: "+n(ut,i)+" "+i.out_units);if(st&&i.temptargetSet&&at>lt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&at=at&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(_e,2)+", TDD 24h = "+o(he,2)+"U, Weighted average TDD = "+o(L,2)+"U, (Weight percentage = "+Z+"), Total data of TDDs (up to 14 days) average = "+o($,2)+"U. "),Ze!==He*z?process.stderr.write("Adjusting basal from "+He*z+" U/h to "+Ze+" U/h; "):process.stderr.write("Basal unchanged: "+Ze+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){rt=o((rt-60)/s.ratio)+60,ot=o((ot-60)/s.ratio)+60;var dt=o((at-60)/s.ratio)+60;at===(dt=Math.max(80,dt))?process.stderr.write("target_bg unchanged: "+n(dt,i)+"; "):process.stderr.write("target_bg from "+n(dt,i)+" to "+n(dt,i)+"; "),at=dt}var ct=n(at,i);at!=B&&(ct=0!==b&&6!==b&&b!==at?n(B,i)+"→"+n(b,i)+"→"+n(at,i):n(B,i)+"→"+n(at,i));var gt=200,ht=200,pt=200;if(e.noise>=2){var vt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);gt=o(Math.min(200,rt*vt)),ht=o(Math.min(200,at*vt)),pt=o(Math.min(200,ot*vt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(dt,i)+" to "+n(ht,i)+"; "),rt=gt,at=ht,ot=pt}T=rt-.5*(rt-40),T=Math.min(Math.max(i.threshold_setting,T,65),120),console.error("Threshold set to "+n(T,i));var ft="",Bt=(o(N,1),N);if(void 0!==s&&s&&((Bt=o(Bt=N/sensitivityRatio,1))!==N?process.stderr.write("ISF from "+n(N,i)+" to "+n(Bt,i)):process.stderr.write("ISF unchanged: "+n(Bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(N,i)+"→"+n(Bt,i)),console.error("CR:"+H),void 0===a)return ze.error="Error: iob_data undefined. ",ze;var bt,Mt=a;if(a.length,a.length>1&&(a=Mt[0]),void 0===a.activity||void 0===a.iob)return ze.error="Error: iob_data missing some property. ",ze;var _t=((bt=void 0!==a.lastTemp?o((new Date($e).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+bt+"m, tempModulus:"+_t+"m"),ze.temp="absolute",ze.deliverAt=Ne,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&bt>10&&t.duration)return ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,ze,t);if(t&&a.lastTemp&&t.duration>0){var yt=bt-a.lastTemp.duration;if(yt>5&&bt>10)return ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+yt+"m ago; canceling temp",u.setTempBasal(0,0,i,ze,t)}var xt=o(-a.activity*Bt*5,2),St=o(6*(Ye-xt));St<0&&(St=o(6*(et-xt)))<0&&(St=o(6*(e.long_avgdelta-xt)));var Dt=Ve,wt=(Dt=a.iob>0?o(Ve-a.iob*Bt):o(Ve-a.iob*Math.min(Bt,N)))+St;if(void 0===wt||isNaN(wt))return ze.error="Error: could not calculate eventualBG. Sensitivity: "+Bt+" Deviation: "+St,ze;var Gt,Tt,Ct=function(e,t,a){return o(a+(e-t)/24,1)}(at,wt,xt);ze={temp:"absolute",bg:Ve,tick:Je,eventualBG:wt,insulinReq:0,reservoir:d,deliverAt:Ne,sensitivityRatio,CR:o(H,1),TDD:he,insulin:ge,current_target:at,insulinForManualBolus:G,manualBolusErrorString:0,minDelta:Ye,expectedDelta:Ct,minGuardBG:Tt,minPredBG:Gt,threshold:n(T,i)};var Ut=[],Ot=[],At=[],Rt=[];Ut.push(Ve),Ot.push(Ve),Rt.push(Ve),At.push(Ve);var It=function(e,t,a,r,o,i,s,l){if(!t)return console.error("SMB disabled (!microBolusAllowed)"),!1;if(!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100)return console.error("SMB disabled due to high temptarget of "+o),!1;if(!0===a.bwFound&&!1===e.A52_risk_enable)return console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1;if(400==r)return console.error("Invalid CGM (HIGH). SMBs disabled."),!1;if(s.smbIsOff){if(!s.smbIsAlwaysOff)return console.error("SMBs are disabled by profile override"),!1;{let e=l.getHours();if(s.ends.start&&(s.end+=24),e>=s.start&&e<=s.end)return console.error("SMBs are disabled by profile override"),!1;if(s.end=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1)}(i,m,l,Ve,at,nt,v,c),Ft=i.enableUAM,jt=0,Pt=0;jt=o(Ye-xt,1);var Et=o(Ye-xt,1);csf=Bt/H,console.error("profile.sens:"+n(N,i)+", sens:"+n(Bt,i)+", CSF:"+o(csf,1));var qt=o(30*csf*5/60,1);jt>qt&&(console.error("Limiting carb impact from "+jt+" to "+qt+"mg/dL/5m (30g/h)"),jt=qt);var Wt=3;sensitivityRatio&&(Wt/=sensitivityRatio);var kt=Wt;if(l.carbs){Wt=Math.max(Wt,l.mealCOB/20);var Lt=o((new Date($e).getTime()-l.lastCarbTime)/6e4),zt=(l.carbs-l.mealCOB)/l.carbs;kt=o(kt=Wt+1.5*Lt/60,1),console.error("Last carbs "+Lt+" minutes ago; remainingCATime:"+kt+"hours; "+o(100*zt,1)+"% carbs absorbed")}var Nt=Math.max(0,jt/5*60*kt/2)/csf,Ht=90,Zt=1;i.remainingCarbsCap&&(Ht=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Zt=Math.min(1,i.remainingCarbsFraction));var $t=1-Zt,Jt=Math.max(0,l.mealCOB-Nt-l.carbs*$t),Kt=(Jt=Math.min(Ht,Jt))*csf*5/60/(kt/2),Qt=o(l.slopeFromMaxDeviation,2),Vt=o(l.slopeFromMinDeviation,2),Xt=Math.min(Qt,-Vt/3);Pt=0===jt?0:Math.min(60*kt/5/2,Math.max(0,l.mealCOB*csf/jt)),console.error("Carb Impact:"+jt+"mg/dL per 5m; CI Duration:"+o(5*Pt/60*2,1)+"hours; remaining CI ("+kt/2+"h peak):"+o(Kt,1)+"mg/dL per 5m");var Yt,ea,ta,aa,ra=999,oa=999,na=999,ia=999,sa=999,la=999,ua=999,ma=wt,da=Ve,ca=Ve,ga=0,ha=[],pa=[];try{Mt.forEach((function(e){var t=o(-e.activity*Bt*5,2),a=o(-e.iobWithZeroTemp.activity*Bt*5,2),r=Dt,n=jt*(1-Math.min(1,Ot.length/12));if(!0===(w&&!Re))ma=Ot[Ot.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(Ot[Ot.length-1],39)/Oe+1)))*5,2)+n,r=Rt[Rt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(P*fe*Math.log(Math.max(Rt[Rt.length-1],39)/Oe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=Ot[Ot.length-1]+t+n,r=Rt[Rt.length-1]+a;var i=Math.max(0,Math.max(0,jt)*(1-Ut.length/Math.max(2*Pt,1))),s=Math.min(Ut.length,12*kt-Ut.length),l=Math.max(0,s/(kt/2*12)*Kt);i+l,ha.push(o(l,0)),pa.push(o(i,0)),COBpredBG=Ut[Ut.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Et+At.length*Xt),m=Math.max(0,Et*(1-At.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(ga=o(5*(At.length+1)/60,1)),!0===(w&&!Re))UAMpredBG=At[At.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(At[At.length-1],39)/Oe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=At[At.length-1]+t+Math.min(0,n)+d;Ot.length<48&&Ot.push(ma),Ut.length<48&&Ut.push(COBpredBG),At.length<48&&At.push(UAMpredBG),Rt.length<48&&Rt.push(r),COBpredBG18&&mada&&(da=ma),(Pt||Kt>0)&&Ut.length>18&&COBpredBG0)&&COBpredBG>da&&(ca=COBpredBG),Ft&&At.length>12&&UAMpredBGda&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+pa.join(" ")),console.error("remainingCIs: "+ha.join(" "))),ze.predBGs={},Ot.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var va=Ot.length-1;va>12&&Ot[va-1]===Ot[va];va--)Ot.pop();for(ze.predBGs.IOB=Ot,ea=o(Ot[Ot.length-1]),Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=Rt.length-1;va>6&&!(Rt[va-1]>=Rt[va]||Rt[va]<=at);va--)Rt.pop();if(ze.predBGs.ZT=Rt,o(Rt[Rt.length-1]),l.mealCOB>0&&(jt>0||Kt>0)){for(Ut.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),va=Ut.length-1;va>12&&Ut[va-1]===Ut[va];va--)Ut.pop();ze.predBGs.COB=Ut,ta=o(Ut[Ut.length-1]),wt=Math.max(wt,o(Ut[Ut.length-1])),console.error("COBpredBG: "+o(Ut[Ut.length-1]))}if(jt>0||Kt>0){if(Ft){for(At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=At.length-1;va>12&&At[va-1]===At[va];va--)At.pop();ze.predBGs.UAM=At,aa=o(At[At.length-1]),At[At.length-1]&&(wt=Math.max(wt,o(At[At.length-1])))}ze.eventualBG=wt}console.error("UAM Impact:"+Et+"mg/dL per 5m; UAM Duration:"+ga+"hours"),ra=Math.max(39,ra),oa=Math.max(39,oa),na=Math.max(39,na),Gt=o(ra);var fa=l.mealCOB/l.carbs;Yt=o(na<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:na<999?(ma+UAMpredBG)/2:ma),ua>Yt&&(Yt=ua),Tt=o(Tt=Pt||Kt>0?Ft?fa*ia+(1-fa)*sa:ia:Ft?sa:la);var Ba=na;if(uana&&(Ba=(na+ua)/2);if(Ba=o(Ba),l.carbs)if(!Ft&&oa<999)Gt=o(Math.max(ra,oa));else if(oa<999){var Ma=fa*oa+(1-fa)*Ba;Gt=o(Math.max(ra,oa,Ma))}else Gt=Ft?Ba:Tt;else Ft&&(Gt=o(Math.max(ra,Ba)));Gt=Math.min(Gt,Yt),process.stderr.write("minPredBG: "+Gt+" minIOBPredBG: "+ra+" minZTGuardBG: "+ua),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),na<999&&process.stderr.write(" minUAMPredBG: "+na),console.error(" avgPredBG:"+Yt+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ca>Ve&&(Gt=Math.min(Gt,ca)),ze.COB=l.mealCOB,ze.IOB=a.iob,ze.BGI=n(xt,i),ze.deviation=n(St,i),ze.ISF=n(Bt,i),ze.CR=o(H,1),ze.target_bg=n(at,i),ze.TDD=o(he,2),ze.current_target=o(at,0);var _a=ze.CR;qe!=ze.CR&&(_a=qe+"→"+ze.CR),ze.reason=ft+", COB: "+ze.COB+", Dev: "+ze.deviation+", BGI: "+ze.BGI+", CR: "+_a+", Target: "+ct+", minPredBG "+n(Gt,i)+", minGuardBG "+n(Tt,i)+", IOBpredBG "+n(ea,i),ta>0&&(ze.reason+=", COBpredBG "+n(ta,i)),aa>0&&(ze.reason+=", UAMpredBG "+n(aa,i)),ze.reason+=F,ze.reason+="; ";var ya=Dt;ya<40&&(ya=Math.min(Tt,ya));var xa,Sa=T-ya,Da=240,wa=240;if(l.mealCOB>0&&(jt>0||Kt>0)){for(va=0;vaxa*Ve&&(console.error("maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - disabling SMB"),ze.reason+="maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - SMB disabled!, ",It=!1),console.error("BG projected to remain above "+n(rt,i)+" for "+Da+"minutes"),(wa<240||Da<60)&&console.error("BG projected to remain above "+n(T,i)+" for "+wa+"minutes");var Ga=wa,Ta=i.current_basal*z*Bt*Ga/60,Ca=Math.max(0,l.mealCOB-.25*l.carbs),Ua=(Sa-Ta)/csf-Ca;Ta=o(Ta),Ua=o(Ua),console.error("naive_eventualBG:",Dt,"bgUndershoot:",Sa,"zeroTempDuration:",Ga,"zeroTempEffect:",Ta,"carbsReq:",Ua),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ua>=i.carbsReqThreshold&&wa<=45&&(ze.carbsReq=Ua,ze.reason+=Ua+" add'l carbs req w/in "+wa+"m; ");var Oa=0;if(Ve0&&Ye>Ct)ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*z*20/60,2),ze.reason+=" and minDelta "+n(Ye,i)+" > expectedDelta "+n(Ct,i)+"; ";else if(Ve=55)return ze.reason+="; Canceling temp at "+ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,ze,t);var Aa=0,Ra=Ze,Ia=0;if(wtCt&&Ye>0&&!Ua)return Dt<40?(ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,ze,t)):(e.delta>Ye?ze.reason+=", but Delta "+n(Je,i)+" > expectedDelta "+n(Ct,i):ze.reason+=", but Min. Delta "+Ye.toFixed(2)+" > Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t)));Aa=o(Aa=2*Math.min(0,(wt-at)/Bt),2);var Fa=Math.min(0,(Dt-at)/Bt);if(Fa=o(Fa,2),Ye<0&&Ye>Ct)Aa=o(Aa*(Ye/Ct),2);Ra=r(Ra=Ze+2*Aa,i),Ia=t.duration*(t.rate-Ze)/60;var ja=Math.min(Aa,Fa);if(console.log("naiveInsulinReq:"+Fa),Ia5&&Ra>=.8*t.rate)return ze.reason+=", temp "+t.rate+" ~< req "+Ra+"U/hr. ",ze;if(Ra<=0){if((Oa=o(60*((Sa=at-Dt)/Bt)/i.current_basal*z))<0?Oa=0:(Oa=30*o(Oa/30),Oa=Math.min(120,Math.max(0,Oa))),Oa>0)return ze.reason+=", setting "+Oa+"m zero temp. ",u.setTempBasal(Ra,Oa,i,ze,t)}else ze.reason+=", setting "+Ra+"U/hr. ";return u.setTempBasal(Ra,30,i,ze,t)}if(Ye=2||Ct+-1*Ye>=2)&&(ze.manualBolusErrorString=Ye>=0&&Ct>0?3:Ye<0&&Ct<=0||Ye<0&&Ct>=0?4:5),ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),!m||!It))return e.delta "+n(rt,i)+" but Delta "+n(Je,i)+" < Exp. Delta "+n(Ct,i):ze.reason+="Eventual BG "+n(wt,i)+" > "+n(rt,i)+" but Min. Delta "+Ye.toFixed(2)+" < Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(Math.min(wt,Gt)rt&&(ze.manualBolusErrorString=6,ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),ze.minPredBG=Gt),!m||!It))return ze.reason+=n(wt,i)+"-"+n(Gt,i)+" in range: no temp required",t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(wt>=ot&&(ze.reason+="Eventual BG "+n(wt,i)+" >= "+n(ot,i)+", ",wt>ot&&(ze.insulinForManualBolus=o((wt-at)/Bt,2))),a.iob>it)return ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+it,t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));Aa=o((Math.min(Gt,wt)-at)/Bt,2),G=o((wt-at)/Bt,2),Aa>it-a.iob?(console.error("SMB limited by maxIOB: "+it-a.iob+" (. insulinReq: "+Aa+" U)"),ze.reason+="max_iob "+it+", ",Aa=it-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),G>it-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+it-a.iob+" (. insulinForManualBolus: "+G+" U)"),ze.reason+="max_iob "+it+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+G+" U)."),Ra=r(Ra=Ze+2*Aa,i),Aa=o(Aa,3),ze.insulinReq=Aa;var Pa=o((new Date($e).getTime()-a.lastBolusTime)/6e4,1);if(m&&It&&Ve>T){var Ea=30;void 0!==i.maxSMBBasalMinutes&&(Ea=i.maxSMBBasalMinutes);var qa=30;void 0!==i.maxUAMSMBBasalMinutes&&(qa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&S!==Ea&&(console.error("SMB Max Minutes - setting overriden from "+Ea+" to "+S),Ea=S),v.useOverride&&M&&D!==qa&&(console.error("UAM Max Minutes - setting overriden from "+qa+" to "+D),qa=D);var Wa=o(l.mealCOB/H,3),ka=0;void 0===Ea?(ka=o(i.current_basal*z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>ka&&console.error("SMB limited by maxBolus: "+ka+" ( "+Aa+" U)")):a.iob>Wa&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Wa),qa?(console.error("maxUAMSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*z),ka=o(i.current_basal*z*qa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),ka=o(i.current_basal*z*30/60,1)),Aa>ka?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+qa+"m ]: "+ka+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+Ea+", profile.current_basal: "+i.current_basal*z),Aa>(ka=o(i.current_basal*Ea/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+Ea+"m ]: "+ka+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var La=i.bolus_increment,za=1/La,Na=i.smb_delivery_ratio;Na>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Na,2));var Ha=Math.min(Aa*Na,ka);Ha=Math.floor(Ha*za)/za,Oa=o(60*((at-(Dt+ra)/2)/Bt)/i.current_basal*z),Aa>0&&Ha=30?(Oa=30*o(Oa/30),Oa=Math.min(60,Math.max(0,Oa))):(Za=o(Ze*Oa/30,2),Oa=30),ze.reason+=" insulinReq "+Aa,Ha>=ka&&(ze.reason+="; maxBolus "+ka),Oa>0&&(ze.reason+="; setting "+Oa+"m low temp of "+Za+"U/h"),ze.reason+=". ";var $a=3;i.SMBInterval&&($a=Math.min(10,Math.max(1,i.SMBInterval)));var Ja=o($a-Pa,0),Ka=o(60*($a-Pa),0)%60;if(console.error("naive_eventualBG "+Dt+","+Oa+"m "+Za+"U/h temp needed; last bolus "+Pa+"m ago; maxBolus: "+ka),Pa>$a?Ha>0&&(ze.units=Ha,ze.reason+="Microbolusing "+Ha+"U. "):ze.reason+="Waiting "+Ja+"m "+Ka+"s to microbolus again. ",Oa>0)return ze.rate=Za,ze.duration=Oa,ze}var Qa=u.getMaxSafeBasal(i);return 400==Ve?u.setTempBasal(i.current_basal,30,i,ze,t):(Ra>Qa&&(ze.reason+="adj. req. rate: "+Ra+" to maxSafeBasal: "+o(Qa,2)+", ",Ra=r(Qa,i)),(Ia=t.duration*(t.rate-Ze)/60)>=2*Aa?(ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):void 0===t.duration||0===t.duration?(ze.reason+="no temp, setting "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):t.duration>5&&r(Ra,i)<=r(t.rate,i)?(ze.reason+="temp "+t.rate+" >~ req "+Ra+"U/hr. ",ze):(ze.reason+="temp "+t.rate+"<"+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr;v.smbIsAlwaysOff,v.start;v.end;const S=v.smbMinutes,D=v.uamMinutes;var w=h.useNewFormula,G=0,T=B,C=0,U="",O="",A="",R="",I="",F="",j=0,P=0,E=0,q=0,W=0,k=0;const L=v.weightedAverage;var z=1,N=i.sens,H=i.carb_ratio;v.useOverride&&(z=v.overridePercentage/100,_?(N/=z,H/=z):(x&&(H/=z),y&&(N/=z)));const Z=i.weightPercentage,$=v.average_total_data;function J(e,t){var a=e.getTime();return new Date(a+36e5*t)}function K(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Q(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function V(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const X=Math.min(i.autosens_min,i.autosens_max),Y=Math.max(i.autosens_min,i.autosens_max);function ee(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Q(r),u=p[0].rate;for(let e=0;e=(s=V(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=V(d,l))?n=s:o=(s=V("23:59:59",l))?n=s:o0&&o1)&&(w=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(w){let e=g.length-1;var te=new Date(g[e].timestamp),ae=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ae=new Date),(C=(ae-te)/36e5)<23.9&&C>21)W=ee(te,(re=24-C,oe=te.getTime(),new Date(oe-36e5*re))),R="24 hours of data is required for an accurate tdd calculation. Currently only "+C.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+W.toPrecision(5)+" U. ";else C<21?(w=!1,enableDynamicCR=!1):R=""}}else console.log("Pumphistory is empty!"),w=!1,enableDynamicCR=!1;var re,oe;if(w){for(let e=0;e0){j=e,k=g[e].rate;var ne=g[e-1]["duration (min)"]/60,ie=ne,se=new Date(g[e-1].timestamp),le=se,ue=0;do{if(e--,0==e){le=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){le=new Date(g[e].timestamp);break}var me=e-2;if(me>=0&&"Rewind"==g[me]._type){let e=g[me].timestamp;for(;me-1>=0&&"Prime"==g[me-=1]._type;)ue=(g[me].timestamp-e)/36e5;ue>=ne&&(le=e,ue=0)}}while(e>0);var de=(le-se)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(W+=ee(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ce=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ce=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ce=new Date,t=g[e]["duration (min)"]/60),(ce-a)/36e5-t>0){W+=ee(ce,J(a,t))}}var ge={TDD:o(P=q+E+W,5),bolus:o(q,5),temp_basal:o(E,5),scheduled_basal:o(W,5)};C>21?(O=". Bolus insulin: "+q.toPrecision(5)+" U",A=". Temporary basal insulin: "+E.toPrecision(5)+" U",U=". Insulin with scheduled basal rate: "+W.toPrecision(5)+" U",I=R+(" TDD past 24h is: "+P.toPrecision(5)+" U")+O+A+U,F=", TDD: "+o(P,2)+" U, "+o(q/P*100,0)+"% Bolus "+o((E+W)/P*100,0)+"% Basal"):F=", TDD: Not enough pumpData (< 21h)"}var he;const pe=e.glucose,ve=h.enableDynamicCR,fe=h.adjustmentFactor,Be=B;var be=!1,Me="",_e=1,ye="";$>0&&(_e=L/$),ye=_e>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(_e=o(_e=Math.min(_e,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":_e<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(_e=o(_e=Math.max(_e,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+_e,ye=", Basal ratio: "+_e,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(be=!0),Be>=118&&be&&(w=!1,Me="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Be);var xe=", Dynamic ratios log: ",Se=", AF: "+fe,De="BG: "+pe+" mg/dl ("+(.0555*pe).toPrecision(2)+" mmol/l)",we="",Ge="";const Te=h.curve,Ce=i.insulinPeakTime,Ue=h.useCustomPeakTime;var Oe=55,Ae=65;switch(Te){case"rapid-acting":Ae=65;break;case"ultra-rapid":Ae=50}Ue?(Oe=120-Ce,console.log("Custom insulinpeakTime set to :"+Ce+", insulinFactor: "+Oe)):(Oe=120-Ae,console.log("insulinFactor set to : "+Oe)),he=P,Z<1&&L>0&&(P=L,console.log("Using weighted TDD average: "+o(P,2)+" U, instead of past 24 h ("+o(he,2)+" U), weight: "+Z),Ge=", Weighted TDD: "+o(P,2)+" U");const Re=h.sigmoid;var Ie="";if(w){var Fe=N*fe*P*Math.log(pe/Oe+1)/1800;we=", Logarithmic formula"}if(w&&Re){const e=X,t=Y-e,a=.0555*(pe-B);var je=_e,Pe=Y-1;1==Y&&(Pe=Y+.01-1);const r=Math.log10(1/Pe-e/Pe)/Math.log10(Math.E),o=a*fe*je+r;Fe=t/(1+Math.exp(-o))+e,we=", Sigmoid function"}var Ee=H;const qe=o(H,1);var We="",ke="";if(w&&P>0){if(We=", Dynamic ISF/CR: On/",Fe>Y?(Me=", Dynamic ISF limited by autosens_max setting: "+Y+" ("+o(Fe,2)+"), ",ke=", Autosens/Dynamic Limit: "+Y+" ("+o(Fe,2)+")",Fe=Y):Fe-.5?"+"+o(e.delta,0):o(e.delta,0);var Ye=Math.min(e.delta,e.short_avgdelta),et=Math.min(e.short_avgdelta,e.long_avgdelta),tt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ve<=10||38===Ve||Xe>=3)&&(ze.reason="CGM is calibrating, in ??? state, or noise is high");if(Ve>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ve&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ve&&!0),Qe>12||Qe<-5?ze.reason="If current system time "+$e+" is correct, then BG data is too old. The last BG data was read "+Qe+"m ago at "+Ke:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ve&&(e.last_cal&&e.last_cal<3?ze.reason="CGM was just calibrated":ze.reason="CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ve&&(Ve<=10||38===Ve||Xe>=3||Qe>12||Qe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ze?(ze.reason+=". Canceling high temp basal of "+t.rate,ze.deliverAt=Ne,ze.temp="absolute",ze.duration=0,ze.rate=0,ze):0===t.rate&&t.duration>30?(ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",ze.deliverAt=Ne,ze.temp="absolute",ze.duration=30,ze.rate=0,ze):(ze.reason+=". Temp "+t.rate+" <= current basal "+Ze+"U/hr; doing nothing. ",ze);var at,rt,ot,nt,it=i.max_iob;if(void 0!==B&&(rt=B),void 0!==i.max_bg&&(ot=B),void 0!==i.enableSMB_high_bg_target&&(nt=i.enableSMB_high_bg_target),void 0===B)return ze.error="Error: could not determine target_bg. ",ze;at=B;var st=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,lt=100,ut=160;if(ut=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ut=e}else console.log("Default Half Basal Target used: "+n(ut,i)+" "+i.out_units);if(st&&i.temptargetSet&&at>lt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&at=at&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(_e,2)+", TDD 24h = "+o(he,2)+"U, Weighted average TDD = "+o(L,2)+"U, (Weight percentage = "+Z+"), Total data of TDDs (up to 14 days) average = "+o($,2)+"U. "),Ze!==He*z?process.stderr.write("Adjusting basal from "+He*z+" U/h to "+Ze+" U/h; "):process.stderr.write("Basal unchanged: "+Ze+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){rt=o((rt-60)/s.ratio)+60,ot=o((ot-60)/s.ratio)+60;var dt=o((at-60)/s.ratio)+60;at===(dt=Math.max(80,dt))?process.stderr.write("target_bg unchanged: "+n(dt,i)+"; "):process.stderr.write("target_bg from "+n(dt,i)+" to "+n(dt,i)+"; "),at=dt}var ct=n(at,i);at!=B&&(ct=0!==b&&6!==b&&b!==at?n(B,i)+"→"+n(b,i)+"→"+n(at,i):n(B,i)+"→"+n(at,i));var gt=200,ht=200,pt=200;if(e.noise>=2){var vt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);gt=o(Math.min(200,rt*vt)),ht=o(Math.min(200,at*vt)),pt=o(Math.min(200,ot*vt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(dt,i)+" to "+n(ht,i)+"; "),rt=gt,at=ht,ot=pt}T=rt-.5*(rt-40),T=Math.min(Math.max(i.threshold_setting,T,65),120),console.error("Threshold set to "+n(T,i));var ft="",Bt=(o(N,1),N);if(void 0!==s&&s&&((Bt=o(Bt=N/sensitivityRatio,1))!==N?process.stderr.write("ISF from "+n(N,i)+" to "+n(Bt,i)):process.stderr.write("ISF unchanged: "+n(Bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(N,i)+"→"+n(Bt,i)),console.error("CR:"+H),void 0===a)return ze.error="Error: iob_data undefined. ",ze;var bt,Mt=a;if(a.length,a.length>1&&(a=Mt[0]),void 0===a.activity||void 0===a.iob)return ze.error="Error: iob_data missing some property. ",ze;var _t=((bt=void 0!==a.lastTemp?o((new Date($e).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+bt+"m, tempModulus:"+_t+"m"),ze.temp="absolute",ze.deliverAt=Ne,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&bt>10&&t.duration)return ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,ze,t);if(t&&a.lastTemp&&t.duration>0){var yt=bt-a.lastTemp.duration;if(yt>5&&bt>10)return ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+yt+"m ago; canceling temp",u.setTempBasal(0,0,i,ze,t)}var xt=o(-a.activity*Bt*5,2),St=o(6*(Ye-xt));St<0&&(St=o(6*(et-xt)))<0&&(St=o(6*(e.long_avgdelta-xt)));var Dt=Ve,wt=(Dt=a.iob>0?o(Ve-a.iob*Bt):o(Ve-a.iob*Math.min(Bt,N)))+St;if(void 0===wt||isNaN(wt))return ze.error="Error: could not calculate eventualBG. Sensitivity: "+Bt+" Deviation: "+St,ze;var Gt,Tt,Ct=function(e,t,a){return o(a+(e-t)/24,1)}(at,wt,xt);ze={temp:"absolute",bg:Ve,tick:Je,eventualBG:wt,insulinReq:0,reservoir:d,deliverAt:Ne,sensitivityRatio,CR:o(H,1),TDD:he,insulin:ge,current_target:at,insulinForManualBolus:G,manualBolusErrorString:0,minDelta:Ye,expectedDelta:Ct,minGuardBG:Tt,minPredBG:Gt,threshold:n(T,i)};var Ut=[],Ot=[],At=[],Rt=[];Ut.push(Ve),Ot.push(Ve),Rt.push(Ve),At.push(Ve);var It=function(e,t,a,r,o,i,s,l){if(!t)return console.error("SMB disabled (!microBolusAllowed)"),!1;if(!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100)return console.error("SMB disabled due to high temptarget of "+o),!1;if(!0===a.bwFound&&!1===e.A52_risk_enable)return console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1;if(400==r)return console.error("Invalid CGM (HIGH). SMBs disabled."),!1;if(s.smbIsOff){if(!s.smbIsAlwaysOff)return console.error("SMBs are disabled by profile override"),!1;{let e=l.getHours();if(s.ends.start&&(s.end+=24),e>=s.start&&e<=s.end)return console.error("SMBs are disabled by profile override"),!1;if(s.end=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1)}(i,m,l,Ve,at,nt,v,c),Ft=i.enableUAM,jt=0,Pt=0;jt=o(Ye-xt,1);var Et=o(Ye-xt,1);csf=Bt/H,console.error("profile.sens:"+n(N,i)+", sens:"+n(Bt,i)+", CSF:"+o(csf,1));var qt=o(30*csf*5/60,1);jt>qt&&(console.error("Limiting carb impact from "+jt+" to "+qt+"mg/dL/5m (30g/h)"),jt=qt);var Wt=3;sensitivityRatio&&(Wt/=sensitivityRatio);var kt=Wt;if(l.carbs){Wt=Math.max(Wt,l.mealCOB/20);var Lt=o((new Date($e).getTime()-l.lastCarbTime)/6e4),zt=(l.carbs-l.mealCOB)/l.carbs;kt=o(kt=Wt+1.5*Lt/60,1),console.error("Last carbs "+Lt+" minutes ago; remainingCATime:"+kt+"hours; "+o(100*zt,1)+"% carbs absorbed")}var Nt=Math.max(0,jt/5*60*kt/2)/csf,Ht=90,Zt=1;i.remainingCarbsCap&&(Ht=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Zt=Math.min(1,i.remainingCarbsFraction));var $t=1-Zt,Jt=Math.max(0,l.mealCOB-Nt-l.carbs*$t),Kt=(Jt=Math.min(Ht,Jt))*csf*5/60/(kt/2),Qt=o(l.slopeFromMaxDeviation,2),Vt=o(l.slopeFromMinDeviation,2),Xt=Math.min(Qt,-Vt/3);Pt=0===jt?0:Math.min(60*kt/5/2,Math.max(0,l.mealCOB*csf/jt)),console.error("Carb Impact:"+jt+"mg/dL per 5m; CI Duration:"+o(5*Pt/60*2,1)+"hours; remaining CI ("+kt/2+"h peak):"+o(Kt,1)+"mg/dL per 5m");var Yt,ea,ta,aa,ra=999,oa=999,na=999,ia=999,sa=999,la=999,ua=999,ma=wt,da=Ve,ca=Ve,ga=0,ha=[],pa=[];try{Mt.forEach((function(e){var t=o(-e.activity*Bt*5,2),a=o(-e.iobWithZeroTemp.activity*Bt*5,2),r=Dt,n=jt*(1-Math.min(1,Ot.length/12));if(!0===(w&&!Re))ma=Ot[Ot.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(Ot[Ot.length-1],39)/Oe+1)))*5,2)+n,r=Rt[Rt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(P*fe*Math.log(Math.max(Rt[Rt.length-1],39)/Oe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=Ot[Ot.length-1]+t+n,r=Rt[Rt.length-1]+a;var i=Math.max(0,Math.max(0,jt)*(1-Ut.length/Math.max(2*Pt,1))),s=Math.min(Ut.length,12*kt-Ut.length),l=Math.max(0,s/(kt/2*12)*Kt);i+l,ha.push(o(l,0)),pa.push(o(i,0)),COBpredBG=Ut[Ut.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Et+At.length*Xt),m=Math.max(0,Et*(1-At.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(ga=o(5*(At.length+1)/60,1)),!0===(w&&!Re))UAMpredBG=At[At.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(At[At.length-1],39)/Oe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=At[At.length-1]+t+Math.min(0,n)+d;Ot.length<48&&Ot.push(ma),Ut.length<48&&Ut.push(COBpredBG),At.length<48&&At.push(UAMpredBG),Rt.length<48&&Rt.push(r),COBpredBG18&&mada&&(da=ma),(Pt||Kt>0)&&Ut.length>18&&COBpredBG0)&&COBpredBG>da&&(ca=COBpredBG),Ft&&At.length>12&&UAMpredBGda&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+pa.join(" ")),console.error("remainingCIs: "+ha.join(" "))),ze.predBGs={},Ot.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var va=Ot.length-1;va>12&&Ot[va-1]===Ot[va];va--)Ot.pop();for(ze.predBGs.IOB=Ot,ea=o(Ot[Ot.length-1]),Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=Rt.length-1;va>6&&!(Rt[va-1]>=Rt[va]||Rt[va]<=at);va--)Rt.pop();if(ze.predBGs.ZT=Rt,o(Rt[Rt.length-1]),l.mealCOB>0&&(jt>0||Kt>0)){for(Ut.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),va=Ut.length-1;va>12&&Ut[va-1]===Ut[va];va--)Ut.pop();ze.predBGs.COB=Ut,ta=o(Ut[Ut.length-1]),wt=Math.max(wt,o(Ut[Ut.length-1])),console.error("COBpredBG: "+o(Ut[Ut.length-1]))}if(jt>0||Kt>0){if(Ft){for(At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=At.length-1;va>12&&At[va-1]===At[va];va--)At.pop();ze.predBGs.UAM=At,aa=o(At[At.length-1]),At[At.length-1]&&(wt=Math.max(wt,o(At[At.length-1])))}ze.eventualBG=wt}console.error("UAM Impact:"+Et+"mg/dL per 5m; UAM Duration:"+ga+"hours"),ra=Math.max(39,ra),oa=Math.max(39,oa),na=Math.max(39,na),Gt=o(ra);var fa=l.mealCOB/l.carbs;Yt=o(na<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:na<999?(ma+UAMpredBG)/2:ma),ua>Yt&&(Yt=ua),Tt=o(Tt=Pt||Kt>0?Ft?fa*ia+(1-fa)*sa:ia:Ft?sa:la);var Ba=na;if(uana&&(Ba=(na+ua)/2);if(Ba=o(Ba),l.carbs)if(!Ft&&oa<999)Gt=o(Math.max(ra,oa));else if(oa<999){var Ma=fa*oa+(1-fa)*Ba;Gt=o(Math.max(ra,oa,Ma))}else Gt=Ft?Ba:Tt;else Ft&&(Gt=o(Math.max(ra,Ba)));Gt=Math.min(Gt,Yt),process.stderr.write("minPredBG: "+Gt+" minIOBPredBG: "+ra+" minZTGuardBG: "+ua),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),na<999&&process.stderr.write(" minUAMPredBG: "+na),console.error(" avgPredBG:"+Yt+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ca>Ve&&(Gt=Math.min(Gt,ca)),ze.COB=l.mealCOB,ze.IOB=a.iob,ze.BGI=n(xt,i),ze.deviation=n(St,i),ze.ISF=n(Bt,i),ze.CR=o(H,1),ze.target_bg=n(at,i),ze.TDD=o(he,2),ze.current_target=o(at,0);var _a=ze.CR;qe!=ze.CR&&(_a=qe+"→"+ze.CR),ze.reason=ft+", COB: "+ze.COB+", Dev: "+ze.deviation+", BGI: "+ze.BGI+", CR: "+_a+", Target: "+ct+", minPredBG "+n(Gt,i)+", minGuardBG "+n(Tt,i)+", IOBpredBG "+n(ea,i),ta>0&&(ze.reason+=", COBpredBG "+n(ta,i)),aa>0&&(ze.reason+=", UAMpredBG "+n(aa,i)),ze.reason+=F,ze.reason+="; ",It||(ze.reason+="SMBs Disabled. ");var ya=Dt;ya<40&&(ya=Math.min(Tt,ya));var xa,Sa=T-ya,Da=240,wa=240;if(l.mealCOB>0&&(jt>0||Kt>0)){for(va=0;vaxa*Ve&&(console.error("maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - disabling SMB"),ze.reason+="maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - SMB disabled!, ",It=!1),console.error("BG projected to remain above "+n(rt,i)+" for "+Da+"minutes"),(wa<240||Da<60)&&console.error("BG projected to remain above "+n(T,i)+" for "+wa+"minutes");var Ga=wa,Ta=i.current_basal*z*Bt*Ga/60,Ca=Math.max(0,l.mealCOB-.25*l.carbs),Ua=(Sa-Ta)/csf-Ca;Ta=o(Ta),Ua=o(Ua),console.error("naive_eventualBG:",Dt,"bgUndershoot:",Sa,"zeroTempDuration:",Ga,"zeroTempEffect:",Ta,"carbsReq:",Ua),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ua>=i.carbsReqThreshold&&wa<=45&&(ze.carbsReq=Ua,ze.reason+=Ua+" add'l carbs req w/in "+wa+"m; ");var Oa=0;if(Ve0&&Ye>Ct)ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*z*20/60,2),ze.reason+=" and minDelta "+n(Ye,i)+" > expectedDelta "+n(Ct,i)+"; ";else if(Ve=55)return ze.reason+="; Canceling temp at "+ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,ze,t);var Aa=0,Ra=Ze,Ia=0;if(wtCt&&Ye>0&&!Ua)return Dt<40?(ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,ze,t)):(e.delta>Ye?ze.reason+=", but Delta "+n(Je,i)+" > expectedDelta "+n(Ct,i):ze.reason+=", but Min. Delta "+Ye.toFixed(2)+" > Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t)));Aa=o(Aa=2*Math.min(0,(wt-at)/Bt),2);var Fa=Math.min(0,(Dt-at)/Bt);if(Fa=o(Fa,2),Ye<0&&Ye>Ct)Aa=o(Aa*(Ye/Ct),2);Ra=r(Ra=Ze+2*Aa,i),Ia=t.duration*(t.rate-Ze)/60;var ja=Math.min(Aa,Fa);if(console.log("naiveInsulinReq:"+Fa),Ia5&&Ra>=.8*t.rate)return ze.reason+=", temp "+t.rate+" ~< req "+Ra+"U/hr. ",ze;if(Ra<=0){if((Oa=o(60*((Sa=at-Dt)/Bt)/i.current_basal*z))<0?Oa=0:(Oa=30*o(Oa/30),Oa=Math.min(120,Math.max(0,Oa))),Oa>0)return ze.reason+=", setting "+Oa+"m zero temp. ",u.setTempBasal(Ra,Oa,i,ze,t)}else ze.reason+=", setting "+Ra+"U/hr. ";return u.setTempBasal(Ra,30,i,ze,t)}if(Ye=2||Ct+-1*Ye>=2)&&(ze.manualBolusErrorString=Ye>=0&&Ct>0?3:Ye<0&&Ct<=0||Ye<0&&Ct>=0?4:5),ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),!m||!It))return e.delta "+n(rt,i)+" but Delta "+n(Je,i)+" < Exp. Delta "+n(Ct,i):ze.reason+="Eventual BG "+n(wt,i)+" > "+n(rt,i)+" but Min. Delta "+Ye.toFixed(2)+" < Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(Math.min(wt,Gt)rt&&(ze.manualBolusErrorString=6,ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),ze.minPredBG=Gt),!m||!It))return ze.reason+=n(wt,i)+"-"+n(Gt,i)+" in range: no temp required",t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(wt>=ot&&(ze.reason+="Eventual BG "+n(wt,i)+" >= "+n(ot,i)+", ",wt>ot&&(ze.insulinForManualBolus=o((wt-at)/Bt,2))),a.iob>it)return ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+it,t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));Aa=o((Math.min(Gt,wt)-at)/Bt,2),G=o((wt-at)/Bt,2),Aa>it-a.iob?(console.error("SMB limited by maxIOB: "+it-a.iob+" (. insulinReq: "+Aa+" U)"),ze.reason+="max_iob "+it+", ",Aa=it-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),G>it-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+it-a.iob+" (. insulinForManualBolus: "+G+" U)"),ze.reason+="max_iob "+it+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+G+" U)."),Ra=r(Ra=Ze+2*Aa,i),Aa=o(Aa,3),ze.insulinReq=Aa;var Pa=o((new Date($e).getTime()-a.lastBolusTime)/6e4,1);if(m&&It&&Ve>T){var Ea=30;void 0!==i.maxSMBBasalMinutes&&(Ea=i.maxSMBBasalMinutes);var qa=30;void 0!==i.maxUAMSMBBasalMinutes&&(qa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&S!==Ea&&(console.error("SMB Max Minutes - setting overriden from "+Ea+" to "+S),Ea=S),v.useOverride&&M&&D!==qa&&(console.error("UAM Max Minutes - setting overriden from "+qa+" to "+D),qa=D);var Wa=o(l.mealCOB/H,3),ka=0;void 0===Ea?(ka=o(i.current_basal*z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>ka&&console.error("SMB limited by maxBolus: "+ka+" ( "+Aa+" U)")):a.iob>Wa&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Wa),qa?(console.error("maxUAMSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*z),ka=o(i.current_basal*z*qa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),ka=o(i.current_basal*z*30/60,1)),Aa>ka?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+qa+"m ]: "+ka+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+Ea+", profile.current_basal: "+i.current_basal*z),Aa>(ka=o(i.current_basal*Ea/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+Ea+"m ]: "+ka+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var La=i.bolus_increment,za=1/La,Na=i.smb_delivery_ratio;Na>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Na,2));var Ha=Math.min(Aa*Na,ka);Ha=Math.floor(Ha*za)/za,Oa=o(60*((at-(Dt+ra)/2)/Bt)/i.current_basal*z),Aa>0&&Ha=30?(Oa=30*o(Oa/30),Oa=Math.min(60,Math.max(0,Oa))):(Za=o(Ze*Oa/30,2),Oa=30),ze.reason+=" insulinReq "+Aa,Ha>=ka&&(ze.reason+="; maxBolus "+ka),Oa>0&&(ze.reason+="; setting "+Oa+"m low temp of "+Za+"U/h"),ze.reason+=". ";var $a=3;i.SMBInterval&&($a=Math.min(10,Math.max(1,i.SMBInterval)));var Ja=o($a-Pa,0),Ka=o(60*($a-Pa),0)%60;if(console.error("naive_eventualBG "+Dt+","+Oa+"m "+Za+"U/h temp needed; last bolus "+Pa+"m ago; maxBolus: "+ka),Pa>$a?Ha>0&&(ze.units=Ha,ze.reason+="Microbolusing "+Ha+"U. "):ze.reason+="Waiting "+Ja+"m "+Ka+"s to microbolus again. ",Oa>0)return ze.rate=Za,ze.duration=Oa,ze}var Qa=u.getMaxSafeBasal(i);return 400==Ve?u.setTempBasal(i.current_basal,30,i,ze,t):(Ra>Qa&&(ze.reason+="adj. req. rate: "+Ra+" to maxSafeBasal: "+o(Qa,2)+", ",Ra=r(Qa,i)),(Ia=t.duration*(t.rate-Ze)/60)>=2*Aa?(ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):void 0===t.duration||0===t.duration?(ze.reason+="no temp, setting "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):t.duration>5&&r(Ra,i)<=r(t.rate,i)?(ze.reason+="temp "+t.rate+" >~ req "+Ra+"U/hr. ",ze):(ze.reason+="temp "+t.rate+"<"+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); From c65c929b877cd1d699cb1c8a54b507dd84364e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 13:54:56 +0100 Subject: [PATCH 357/405] Localizations. Slide to activate / deactivate (cherry picked from commit f11fc56ee2fc96262eefc615bad2e7a05b9685b8) --- .../OmniBLE/Localizations/ar.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/bn.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/ca.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/da.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/de.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/en.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/es.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/fi.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/fr.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/he.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/hu.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/it.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/ja.lproj/Localizable.strings | 7 +++++++ .../OmniBLE/Localizations/lt.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/nb.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/nl.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/pl.lproj/Localizable.strings | 6 ++++++ .../Localizations/pt-BR.lproj/Localizable.strings | 6 ++++++ .../Localizations/pt-PT.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/ro.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/ru.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/sk.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/sv.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/tr.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/uk.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/Localizations/vi.lproj/Localizable.strings | 6 ++++++ .../Localizations/zh-Hans.lproj/Localizable.strings | 7 +++++++ .../OmniBLE/OmniBLE/ca.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/cs.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/da.lproj/Localizable.strings | 9 +++++++++ .../OmniBLE/OmniBLE/de.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/es.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/fi.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/fr.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/he.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/hu.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/it.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/ja.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/nb.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/nl.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/pl.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/pt-BR.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/ro.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/ru.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/sk.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/sv.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/tr.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/uk.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/vi.lproj/Localizable.strings | 6 ++++++ .../OmniBLE/OmniBLE/zh-Hans.lproj/Localizable.strings | 9 +++++++++ .../OmniKitUI/Resources/ar.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/cs.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/da.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/de.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/en.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/es.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/fi.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/fr.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/he.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/hu.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/it.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/ja.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/nb.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/nl.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/pl.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/pt-BR.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/ro.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/ru.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/sk.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/sv.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/tr.lproj/Localizable.strings | 6 ++++++ .../OmniKitUI/Resources/vi.lproj/Localizable.strings | 6 ++++++ .../Resources/zh-Hans.lproj/Localizable.strings | 6 ++++++ .../Localizations/Main/vi.lproj/Localizable.strings | 3 +++ 75 files changed, 455 insertions(+) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index e2697b569c..f151911ebe 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings index 77af0f085c..e96526d305 100644 --- a/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/bn.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings index 77af0f085c..e96526d305 100644 --- a/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ca.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index 74696c25ba..cde4e246ae 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktiverer."; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index b7d7e295f3..78eaad0843 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivierung."; diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 457ae35768..9c434fa343 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -404,6 +404,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 26b4d41624..50625a34ec 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Desactivar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index b14fa4aa85..c099ac0473 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deaktivoi pumppu"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 68e9f148a0..ebca41d986 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Désactiver le pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Désactivation."; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index e2697b569c..f151911ebe 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index 90ac66acda..fafba9da8d 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 5041a8ffd4..cb2d8343ea 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Disattiva Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deattivazione."; diff --git a/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings index 6cdb095bde..690f92c734 100644 --- a/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ja.lproj/Localizable.strings @@ -404,6 +404,13 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings index 77af0f085c..e96526d305 100644 --- a/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/lt.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 57ba996a5a..7b74faba39 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktiverer."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 579c55c9b4..1318156ecd 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactiveer Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactiveren."; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index acbaf6beed..3e4c51c92e 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Dezaktywuj PODa"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index 4f61369b04..eeb06dd3f2 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Desativar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index f82ffd6fbe..4c02f6dd8f 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings index 6cdb095bde..a83a5cf1fe 100644 --- a/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ro.lproj/Localizable.strings @@ -404,6 +404,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactivating."; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 21a81cd02b..516cc0c80c 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Деактивировать Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивировать."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index fc8768bf4f..7d276afd1e 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Deaktivovať Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivuje sa."; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index e71410d028..9e8a506294 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Inaktivera podd"; +/* */ +"Slide to Insert Cannula" = "Svep för att föra in kanyl"; + +/* */ +"Slide to Deactivate Pod" = "Svep för att inaktivera podd"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Inaktiverar."; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index deae189e4d..3204a43fcc 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Pod'u devredışı bırak"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Devre dışı bırakılıyor."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 08fe71be37..84ca0ed814 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Деактивувати Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивувати."; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 3ac65a62f9..4568548fcc 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -402,6 +402,12 @@ /* Deactivate pod action button */ "Deactivate Pod" = "Hủy kích hoạt Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Đang hủy kích hoạt."; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 463eca07b1..4f49cc0f80 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -402,6 +402,13 @@ /* Deactivate pod action button */ "Deactivate Pod" = "解除Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "停用中"; diff --git a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings index 5bf12da7f3..414b46ab55 100644 --- a/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ca.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings index b728dd9286..67b9ae351f 100644 --- a/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/cs.lproj/Localizable.strings @@ -91,6 +91,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deaktivovat Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktivováno"; diff --git a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings index e04b4b4ec2..a9a1eecd88 100644 --- a/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/da.lproj/Localizable.strings @@ -244,9 +244,18 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiveret"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktiverer."; diff --git a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings index 5d77765663..d0a902d353 100644 --- a/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/de.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings index 0567fb182f..103899798f 100644 --- a/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/es.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Desactivar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Pod desactivado"; diff --git a/Dependencies/OmniBLE/OmniBLE/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/fi.lproj/Localizable.strings index 6069150bb4..6e2a7b0903 100644 --- a/Dependencies/OmniBLE/OmniBLE/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/fi.lproj/Localizable.strings @@ -97,6 +97,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deaktivoi pumppu"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktivoitu"; diff --git a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings index 195019eb84..74a07b5a27 100644 --- a/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/fr.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Désactiver le Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Désactivé"; diff --git a/Dependencies/OmniBLE/OmniBLE/he.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/he.lproj/Localizable.strings index 4e045d8d14..19282f24af 100644 --- a/Dependencies/OmniBLE/OmniBLE/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/he.lproj/Localizable.strings @@ -84,6 +84,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings index 5d77765663..d0a902d353 100644 --- a/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/hu.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings index 46fadec09f..8f3333a187 100644 --- a/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/it.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Disattiva Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Disattivato"; diff --git a/Dependencies/OmniBLE/OmniBLE/ja.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ja.lproj/Localizable.strings index a933ee71a6..2d14e5e751 100644 --- a/Dependencies/OmniBLE/OmniBLE/ja.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ja.lproj/Localizable.strings @@ -69,6 +69,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "ポッドを無効にする"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "停止されました"; diff --git a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings index 258d3dc9dd..ba48b8ec92 100644 --- a/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nb.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktivert"; diff --git a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings index 31df48538a..72fa59c975 100644 --- a/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/nl.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deactiveer Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Gedeactiveerd"; diff --git a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings index 7c3a7beea3..bcd56dce1b 100644 --- a/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pl.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Dezaktywuj POD'a"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktywowany"; diff --git a/Dependencies/OmniBLE/OmniBLE/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pt-BR.lproj/Localizable.strings index 18fa263889..fdc1542dfc 100644 --- a/Dependencies/OmniBLE/OmniBLE/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pt-BR.lproj/Localizable.strings @@ -72,6 +72,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Desativar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Desativado"; diff --git a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings index 5bf12da7f3..414b46ab55 100644 --- a/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/pt-PT.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings index cb10880234..9152a2c25b 100644 --- a/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ro.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Dezactivează Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Dezactivat"; diff --git a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings index 8766306e8a..9609511109 100644 --- a/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/ru.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Деактивировать Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Не активен"; diff --git a/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings index 09e8ac7b2f..9cdb47c81b 100644 --- a/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/sk.lproj/Localizable.strings @@ -171,6 +171,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Deaktivovať pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktivované"; diff --git a/Dependencies/OmniBLE/OmniBLE/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/sv.lproj/Localizable.strings index 79374593d1..33cdc4208a 100644 --- a/Dependencies/OmniBLE/OmniBLE/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/sv.lproj/Localizable.strings @@ -97,6 +97,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Inaktivera podd"; +/* */ +"Slide to Insert Cannula" = "Svep för att föra in kanyl"; + +/* */ +"Slide to Deactivate Pod" = "Svep för att inaktivera"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Inaktiverad"; diff --git a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings index 1ab6aa045c..184c4e774f 100644 --- a/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/tr.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod'u devre dışı bırak"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Devre dışı"; diff --git a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings index 5bf12da7f3..414b46ab55 100644 --- a/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/uk.lproj/Localizable.strings @@ -244,6 +244,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniBLE/OmniBLE/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/vi.lproj/Localizable.strings index a256dfcdc0..113810aea8 100644 --- a/Dependencies/OmniBLE/OmniBLE/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/vi.lproj/Localizable.strings @@ -72,6 +72,12 @@ Title for deactivate pod screen */ "Deactivate Pod" = "Hủy kích hoạt Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "Đã hủy kích hoạt"; diff --git a/Dependencies/OmniBLE/OmniBLE/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/OmniBLE/zh-Hans.lproj/Localizable.strings index 2bfd353569..f30b9748d5 100644 --- a/Dependencies/OmniBLE/OmniBLE/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/OmniBLE/zh-Hans.lproj/Localizable.strings @@ -54,9 +54,18 @@ Title for deactivate pod screen */ "Deactivate Pod" = "解除Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Pod state when pod has been deactivated */ "Deactivated" = "已解除"; +/* Action button description for deactivate while pod still active */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Description for Empty reservoir pod fault */ "Empty reservoir" = "胰岛素储量为零"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index a214c79917..0b5128e82b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings index c11489e842..18d52a4234 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/cs.lproj/Localizable.strings @@ -71,6 +71,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deaktivovat Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivováno"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index 1311c51c65..154a8537c9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiveret"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 9dd68a58da..3a62f11a54 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Pod deaktivieren"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index e0ed8addab..9937158213 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index eb1bfcaddc..4c02a29301 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Desactivar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Pod desactivado"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index 2c0f23c2bc..2852c25c8d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deaktivoi pumppu"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivoitu"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index ad431ddb52..cbec42ec56 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Désactiver le Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Désactivé"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index 7b7c9b6d65..0c4602fecb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings index 7503963a0a..6dcc9cb346 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 07882e69d0..69d0a9893f 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Disattiva Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Disattivato"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ja.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ja.lproj/Localizable.strings index 0830d96ed0..95bd1a0fb7 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ja.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ja.lproj/Localizable.strings @@ -84,6 +84,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "ポッドを無効にする"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "停止されました"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index f9feed5eb7..d5b1200809 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivert"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index febb6e08d5..402c59ebfc 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactiveer Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 8eee00341a..03cd6ca2c4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Dezaktywuj POD'a"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktywowany"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index e888aa5a4d..8537006993 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Desativar Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Desativado"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings index 181c0100aa..4340610a8c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ro.lproj/Localizable.strings @@ -183,6 +183,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Dezactivează Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Dezactivat"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 3f033a0f7a..3fe6e4df94 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Деактивировать Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 8dc3ae86fa..9e947970b8 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deaktivovať pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 91eed0e78c..2e35719758 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Inaktivera podd"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Inaktiverad"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 57e1e7557f..5b438a5f5b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Pod'u devre dışı bırak"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Devre dışı"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index a5e2ac1da8..c0b65ebf5a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Hủy kích hoạt Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 51edf6dfd8..5b3d3e1837 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "解除Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "已解除"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index e2f9464ecb..1845ea4972 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -1487,6 +1487,9 @@ Enact a temp Basal or a temp target */ /* */ "Deactivating..." = "Đang hủy kích hoạt..."; +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + "Pair Pod" = "Kết nối Pod"; /* Text for previous pod information row */ From c44182a9ca6a7c12d4c8a8bff6cf4cf6749593bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 13:55:12 +0100 Subject: [PATCH 358/405] Ajust alignment (cherry picked from commit 9e4ac6839da8c8389df0240e77d3c043bca3d4dc) --- FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift index 1e0c457853..918b38bd42 100644 --- a/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift @@ -82,6 +82,7 @@ struct PumpView: View { remainingTime(time: date.timeIntervalSince(timerDate)) .font(.pumpFont) + .offset(x: -7, y: 0) } else if state.pumpName.contains("Omni") { Text("No Pod").font(.statusFont).foregroundStyle(.secondary) .offset(x: 0, y: -4) From 0b88aa1fb7859aebad701ade71ce03b5fc5d3ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 22 Jan 2024 13:57:20 +0100 Subject: [PATCH 359/405] (Italian) (#486) --- FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index b1a4685045..5362143e67 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1252,7 +1252,7 @@ Enact a temp Basal or a temp target */ "Interval In Minutes" = "Intervallo in minuti"; /* Override */ -"Override With A Factor Of " = "Fattore di Regolazione"; +"Override With A Factor Of " = "Fattore Regolazione "; /* Description */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Consenti di convertire grassi e proteine in futuri equivalenti di carboidrati utilizzando la formula di Varsavia di chilocalorie divisi per 10.\n\nQuesto diffonde gli equivilanti del carb per un'impostazione di durata massima che può essere configurata da 5-12 ore.\n\nIl ritardo è tempo da ora fino al primo ingresso futuro del carb.\n\nL'intervallo in pochi minuti è il numero di minuti tra le voci. Più breve è l'intervallo, più liscia il risultato. 10, 15, 20, 30 o 60 sono scelte ragionevoli.\n\nIl fattore di aggiustamento è il peso che il grasso e la proteina hanno sulle voci. 1.0 è effetto pieno (metodo di Varsavia originale) e 0. è a metà effetto. Nota che potresti scoprire che il tuo normale rapporto carboidrati deve aumentare ad un numero maggiore se inizi ad aggiungere voci di grasso e proteine. Per questo motivo, è meglio iniziare con un fattore di circa 0,5 per facilitare in esso.\n\nImpostazioni predefinite: Limite temporale: 8 h, Intervallo: 30 min, Fatto: 0.5, Ritardo 60 min"; From 4e96a35d5188f82430027db30be4a8a7df9d1554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:14:51 +0100 Subject: [PATCH 360/405] Dynamic ISF descriptions and new pop-ups (will/can later be used also for all of the other OpenAPS variables) * New pop-ups. * New Dynamic descriptions. * Pop-ups can now also include graphics, as seen in Threshold setting. * Adjustments for dynamic font size and string length. * Localizations (needing translations from the Crowdin translators). --- FreeAPS.xcodeproj/project.pbxproj | 8 + .../Main/en.lproj/Localizable.strings | 21 ++- .../Main/sv.lproj/Localizable.strings | 21 ++- FreeAPS/Sources/Models/Threshold.swift | 8 + .../Dynamic/View/DynamicRootView.swift | 173 +++++++++++++++++- FreeAPS/Sources/Views/DescriptionView.swift | 55 ++++++ 6 files changed, 276 insertions(+), 10 deletions(-) create mode 100644 FreeAPS/Sources/Models/Threshold.swift create mode 100644 FreeAPS/Sources/Views/DescriptionView.swift diff --git a/FreeAPS.xcodeproj/project.pbxproj b/FreeAPS.xcodeproj/project.pbxproj index 346f38cb0d..da16a93906 100644 --- a/FreeAPS.xcodeproj/project.pbxproj +++ b/FreeAPS.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 195D80B72AF697B800D25097 /* DynamicDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */; }; 195D80B92AF697F700D25097 /* DynamicProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80B82AF697F700D25097 /* DynamicProvider.swift */; }; 195D80BB2AF6980B00D25097 /* DynamicStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D80BA2AF6980B00D25097 /* DynamicStateModel.swift */; }; + 195F00482B5C267D00DAC71A /* DescriptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195F00472B5C267D00DAC71A /* DescriptionView.swift */; }; 1967DFBE29D052C200759F30 /* Icons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBD29D052C200759F30 /* Icons.swift */; }; 1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBF29D053AC00759F30 /* IconSelection.swift */; }; 1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; }; @@ -40,6 +41,7 @@ 19A910382A24EF3200C8951B /* ChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A910372A24EF3200C8951B /* ChartsView.swift */; }; 19AEF4322B1F5A98006FFE8B /* PreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */; }; 19B0EF2128F6D66200069496 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B0EF2028F6D66200069496 /* Statistics.swift */; }; + 19B60B782B5E7E97002F4F74 /* Threshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B60B772B5E7E97002F4F74 /* Threshold.swift */; }; 19D466A329AA2B80004D5F33 /* FPUConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A229AA2B80004D5F33 /* FPUConfigDataFlow.swift */; }; 19D466A529AA2BD4004D5F33 /* FPUConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A429AA2BD4004D5F33 /* FPUConfigProvider.swift */; }; 19D466A729AA2C22004D5F33 /* FPUConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D466A629AA2C22004D5F33 /* FPUConfigStateModel.swift */; }; @@ -572,6 +574,7 @@ 195D80B62AF697B800D25097 /* DynamicDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicDataFlow.swift; sourceTree = ""; }; 195D80B82AF697F700D25097 /* DynamicProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicProvider.swift; sourceTree = ""; }; 195D80BA2AF6980B00D25097 /* DynamicStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicStateModel.swift; sourceTree = ""; }; + 195F00472B5C267D00DAC71A /* DescriptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionView.swift; sourceTree = ""; }; 1967DFBD29D052C200759F30 /* Icons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icons.swift; sourceTree = ""; }; 1967DFBF29D053AC00759F30 /* IconSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconSelection.swift; sourceTree = ""; }; 1967DFC129D053D300759F30 /* IconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconImage.swift; sourceTree = ""; }; @@ -602,6 +605,7 @@ 19A910372A24EF3200C8951B /* ChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartsView.swift; sourceTree = ""; }; 19AEF4312B1F5A98006FFE8B /* PreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewView.swift; sourceTree = ""; }; 19B0EF2028F6D66200069496 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = ""; }; + 19B60B772B5E7E97002F4F74 /* Threshold.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Threshold.swift; sourceTree = ""; }; 19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; 19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; 19D466A229AA2B80004D5F33 /* FPUConfigDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FPUConfigDataFlow.swift; sourceTree = ""; }; @@ -1631,6 +1635,7 @@ 389ECDFD2601061500D86C4F /* View+Snapshot.swift */, 38EA05FF262091870064E39B /* BolusProgressViewStyle.swift */, 38DF1785276A73D400B3528F /* TagCloudView.swift */, + 195F00472B5C267D00DAC71A /* DescriptionView.swift */, ); path = Views; sourceTree = ""; @@ -1726,6 +1731,7 @@ 19A910352A24D6D700C8951B /* Configs.swift */, 193F6CDC2A512C8F001240FD /* Loops.swift */, CC6C406D2ACDD69E009B8058 /* RawFetchedProfile.swift */, + 19B60B772B5E7E97002F4F74 /* Threshold.swift */, ); path = Models; sourceTree = ""; @@ -2857,6 +2863,7 @@ 38DAB28A260D349500F74C1A /* FetchGlucoseManager.swift in Sources */, 38F37828261260DC009DB701 /* Color+Extensions.swift in Sources */, 3811DE3F25C9D4A100A708ED /* SettingsStateModel.swift in Sources */, + 19B60B782B5E7E97002F4F74 /* Threshold.swift in Sources */, CE7CA3582A064E2F004BE681 /* ListStateView.swift in Sources */, 193F6CDD2A512C8F001240FD /* Loops.swift in Sources */, 38B4F3CB25E502E200E76A18 /* WeakObjectSet.swift in Sources */, @@ -2872,6 +2879,7 @@ 38C4D33A25E9A1ED00D30B77 /* NSObject+AssociatedValues.swift in Sources */, 38DF179027733EAD00B3528F /* SnowScene.swift in Sources */, 38AAF8712600C1B0004AF583 /* MainChartView.swift in Sources */, + 195F00482B5C267D00DAC71A /* DescriptionView.swift in Sources */, 19DC677F29CA675700FD9EC4 /* OverrideProfilesDataFlow.swift in Sources */, 1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */, CE2FAD3A297D93F0001A872C /* BloodGlucoseExtensions.swift in Sources */, diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index bef35518e4..7b85fde2cb 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2063,7 +2063,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2080,8 +2080,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7320d216b6..8c6e0f050d 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Ändra AF-konstant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Individuell justering (en multipel) av hur din insulinkänslighet räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal insulinkänslighet och minimal insulinkänslighet bestäms av Autosens min/max inställningar och av din schemalagda inställning för insulinkänslighet.\n\nFör S-formad dynamisk inställning rekommendaras att börja med 0.3-0-4. För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuell justering av hur din insulinkänslighet och insulinkvot räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal och minimal insulinkänslighet och insulinkvot bestäms av dina Autosens-min/max-inställningar och av dina schemalagda profilinställningar.\n\nFör S-formad dynamisk inställning rekommenderas att börja med 0.3-0-4.\n\n För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Använd S-formad dynamisk insulinkänslighet"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Tröskelvärde"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Tröskelvärde för blodsocker beror på ditt nuvarande undre blodsockermålvärde, enligt följande:\n\nOm ditt målvräde = 5 mmol/l -> tröskelvörde = 3,6 mmol/l,\n\nOm ditt målvräde = 5,6 -> tröskelärde = 3,9 mmol/l,\n\nOm ditt målvräde = 6,1 mmol/l -> tröskelvärde = 4,2 mmol/l,\n\nOch om ditt målvräde = 7,2 mmol/l -> tröskelvärde = 4,7 mmol/l.\n\nDenna inställning tillåter dig att ändra trösklevärdet till en högre inställnig när du loopar med dynamiska kvoter. Giltiga värden är 3,6 - 6,7."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Tröskelvärde"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "När blodsocker är under denna inställning kommer inget insulin att ges.\n\nTröskelvärdet som kommer att användas kommer vara det största värdet av din inställning och det beräknade värdet:\n\nMålvärde - (Målvärde - 40) * 5\nhär med mg/dl som glukosenhet.\n\nTill exempel, om ditt målvärde är "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "kommer tröskelvärdet att vara "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "såvida inte din tröskelvärdesinställning är högre:"; + +/* Threshold Table Columns Title */ +"Setting" = "Inställning"; + +/* Threshold Table Columns Title */ +"Threshold" = "Tröskelvärde"; /* Header */ "Calculator settings" = "Boluskalkylatorinställning"; diff --git a/FreeAPS/Sources/Models/Threshold.swift b/FreeAPS/Sources/Models/Threshold.swift new file mode 100644 index 0000000000..329bfd8ae1 --- /dev/null +++ b/FreeAPS/Sources/Models/Threshold.swift @@ -0,0 +1,8 @@ +import Foundation + +struct Thresholds: Identifiable, Equatable { + var id: String { UUID().uuidString } + let glucose: String + let setting: String + let threshold: String +} diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index aefef60236..573bde32a3 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -6,6 +6,15 @@ extension Dynamic { let resolver: Resolver @StateObject var state = StateModel() + @State var isPresented = false + @State var description = Text("") + @State var descriptionHeader = Text("") + @State var scrollView = false + @State var graphics: (any View)? + + @Environment(\.colorScheme) var colorScheme + @Environment(\.sizeCategory) private var fontSize + private var conversionFormatter: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .decimal @@ -34,11 +43,31 @@ extension Dynamic { Form { Section { HStack { - Toggle("Activate Dynamic Sensitivity (ISF)", isOn: $state.useNewFormula) + Toggle(isOn: $state.useNewFormula) { + Text("Activate Dynamic Sensitivity (ISF)") + .onTapGesture { + info( + header: "Activate Dynamic Sensitivity (ISF)", + body: "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 1 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits.", + useGraphics: nil + ) + } + }.disabled(isPresented) } + if state.useNewFormula { HStack { - Toggle("Activate Dynamic Carb Ratio (CR)", isOn: $state.enableDynamicCR) + Toggle(isOn: $state.enableDynamicCR) { + Text("Activate Dynamic Carb Ratio (CR") + .onTapGesture { + scrollView = fontSize >= .extraLarge ? true : false + info( + header: "Activate Dynamic Carb Ratio (CR)", + body: "Use a Dynamic Carb Ratio (CR). The dynamic Carb Ratio will adjust your profile Carb Ratio (or your Autotuned CR if you're using Autotune) using the same dynamic adjustment as for the Dynamic Insulin Sensitivity (ISF), but with an extra safety limit.\n\n When the dynamic adjustment is > 1: Dynamic Ratio = (dynamic adjustment - 1) / 2 + 1.\nWhen dynamic adjustment < 1: Dynamic ratio = Profile CR / dynamic adjustment.\n\nPlease don't use together with a high Insulin Fraction (> 2) or together with a high Bolus Percentage (> 120 %), as this could lead to too big bolus recommendations", + useGraphics: nil + ) + } + }.disabled(isPresented) } } } header: { Text("Enable") } @@ -46,38 +75,97 @@ extension Dynamic { if state.useNewFormula { Section { HStack { - Toggle("Use Sigmoid Function", isOn: $state.sigmoid) + Toggle(isOn: $state.sigmoid) { + Text("Use Sigmoid Function") + .onTapGesture { + scrollView = true + info( + header: "Use Sigmoid Function", + body: "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function.", + useGraphics: nil + ) + } + }.disabled(isPresented) } } header: { Text("Formula") } Section { HStack { Text("Adjustment Factor") + .onTapGesture { + info( + header: "Adjustment Factor", + body: "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment.", + useGraphics: nil + ) + } Spacer() DecimalTextField("0", value: $state.adjustmentFactor, formatter: formatter) + .disabled(isPresented) } HStack { Text("Weighted Average of TDD. Weight of past 24 hours:") + .onTapGesture { + info( + header: "Weighted Average of TDD. Weight of past 24 hours:", + body: "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment).", + useGraphics: nil + ) + } Spacer() DecimalTextField("0", value: $state.weightPercentage, formatter: formatter) + .disabled(isPresented) } HStack { - Toggle("Adjust basal", isOn: $state.tddAdjBasal) + Toggle(isOn: $state.tddAdjBasal) { + Text("Adjust basal") + .onTapGesture { + info( + header: "Adjust basal", + body: "Enable adjustment of basal based on the ratio of current TDD / 7 day average TDD", + useGraphics: nil + ) + } + }.disabled(isPresented) } + } header: { Text("Settings") } } Section { HStack { Text("Threshold Setting") + .onTapGesture { + scrollView = true + graphics = thresholdTable().asAny() + let unitString = state.unit.rawValue + info( + header: "Minimum Threshold Setting", + body: NSLocalizedString( + "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is ", + comment: "Threshold string part 1" + ) + "\(glucoseString(100)) \(unitString) , " + + NSLocalizedString("the threshold will be ", comment: "Threshold string part 2") + + " \(glucoseString(70)) \(unitString), " + NSLocalizedString( + "unless your threshold setting is set higher:", + comment: "Threshold string part 3" + ), + useGraphics: graphics + ) + } Spacer() DecimalTextField("0", value: $state.threshold_setting, formatter: glucoseFormatter) + .disabled(isPresented) Text(state.unit.rawValue) } } header: { Text("Safety") } } + .blur(radius: isPresented ? 5 : 0) + .description(isPresented: isPresented, alignment: .center) { + if scrollView { infoScrollView() } else { infoView() } + } .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear(perform: configureView) .navigationBarTitle("Dynamic ISF") @@ -86,5 +174,82 @@ extension Dynamic { state.saveIfChanged() } } + + func info(header: String, body: String, useGraphics: (any View)?) { + isPresented.toggle() + description = Text(NSLocalizedString(body, comment: "Dynamic ISF Setting")) + descriptionHeader = Text(NSLocalizedString(header, comment: "Dynamic ISF Setting Title")) + graphics = useGraphics + } + + var info: some View { + VStack(spacing: 20) { + descriptionHeader.font(.title2).bold() + description.font(.body) + } + } + + func infoView() -> some View { + info + .formatDescription() + .onTapGesture { + isPresented.toggle() + } + } + + func infoScrollView() -> some View { + ScrollView { + VStack(spacing: 20) { + info + if let view = graphics { + view.asAny() + } + } + } + .formatDescription() + .onTapGesture { + isPresented.toggle() + scrollView = false + } + } + + func glucoseString(_ glucose: Int) -> String { + glucoseFormatter.string(for: state.unit == .mgdL ? glucose : glucose.asMmolL as NSNumber) ?? "" + } + + @ViewBuilder func thresholdTable() -> some View { + let entries = [ + Thresholds(glucose: glucoseString(100), setting: glucoseString(65), threshold: glucoseString(70)), + Thresholds(glucose: glucoseString(130), setting: glucoseString(65), threshold: glucoseString(85)), + Thresholds(glucose: glucoseString(90), setting: glucoseString(65), threshold: glucoseString(65)), + Thresholds(glucose: glucoseString(90), setting: glucoseString(80), threshold: glucoseString(80)) + ] + + Grid { + GridRow { + Text("Glucose Target") + Text("Setting") + Text("Threshold") + } + .bold() + Divider() + ForEach(entries) { entry in + GridRow { + Text(entry.glucose) + Text(entry.setting) + Text(entry.threshold) + } + if entry != entries.last { + Divider() + } + } + } + .padding(.all, 20) + .foregroundStyle(colorScheme == .dark ? Color.white : Color.black) + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(colorScheme == .dark ? Color(.black) : Color(.white)) + ) + } } } diff --git a/FreeAPS/Sources/Views/DescriptionView.swift b/FreeAPS/Sources/Views/DescriptionView.swift new file mode 100644 index 0000000000..9d48b85d23 --- /dev/null +++ b/FreeAPS/Sources/Views/DescriptionView.swift @@ -0,0 +1,55 @@ +import SwiftUI + +struct DescriptionView: ViewModifier { + let description: T + let isPresented: Bool + let alignment: Alignment + + init(isPresented: Bool, alignment: Alignment, @ViewBuilder content: () -> T) { + self.isPresented = isPresented + self.alignment = alignment + description = content() + } + + func body(content: Content) -> some View { + content + .overlay(popupContent()) + } + + @ViewBuilder private func popupContent() -> some View { + GeometryReader { geometry in + if isPresented { + description + .frame(width: geometry.size.width, height: geometry.size.height, alignment: alignment) + } + } + } +} + +extension View { + func description( + isPresented: Bool, + alignment: Alignment = .center, + @ViewBuilder content: () -> T + ) -> some View { + modifier(DescriptionView(isPresented: isPresented, alignment: alignment, content: content)) + } + + func formatDescription() -> some View { + modifier(DescriptionLayout()) + } +} + +struct DescriptionLayout: ViewModifier { + @Environment(\.colorScheme) var colorScheme + + func body(content: Content) -> some View { + content + .padding(.all, 20) + .foregroundStyle(Color.white) + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(colorScheme == .dark ? Color(.darkGray) : Color(.gray)) + ) + } +} From b2e7b793d19d099f88ed51a8312db1ef7436aff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 14:18:01 +0100 Subject: [PATCH 361/405] Bum version (cherry picked from commit 774b45d561fc4950d83ff24cf7ce272ceaff5d49) --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 34177c5d4a..9a0dcb91fe 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.0 +APP_VERSION = 2.7.2 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From d9767907201b89b1dda24f934d6a9b0df604bc98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 15:03:42 +0100 Subject: [PATCH 362/405] Fix Display Bug. When Glucose Target is not configured in profile override. --- .../View/OverrideProfilesRootView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 5cb88807f9..e28d29e12b 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -281,8 +281,8 @@ extension OverrideProfilesConfig { } @ViewBuilder private func profilesView(for preset: OverridePresets) -> some View { - let target = state.units == .mmolL ? (((preset.target ?? 0) as NSDecimalNumber) as Decimal) - .asMmolL : (preset.target ?? 0) as Decimal + let targetRaw = ((preset.target ?? 0) as NSDecimalNumber) as Decimal + let target = state.units == .mmolL ? targetRaw.asMmolL : targetRaw let duration = (preset.duration ?? 0) as Decimal let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name! let identifier = ((preset.emoji ?? "") == "") || (preset.emoji?.isEmpty ?? true) || @@ -293,7 +293,7 @@ extension OverrideProfilesConfig { let durationString = perpetual ? "" : "\(formatter.string(from: duration as NSNumber)!)" let scheduledSMBstring = (preset.smbIsOff && preset.smbIsAlwaysOff) ? "Scheduled SMBs" : "" let smbString = (preset.smbIsOff && scheduledSMBstring == "") ? "SMBs are off" : "" - let targetString = target != 0 ? "\(glucoseFormatter.string(from: target as NSNumber)!)" : "" + let targetString = targetRaw > 10 ? "\(glucoseFormatter.string(from: target as NSNumber)!)" : "" let maxMinutesSMB = (preset.smbMinutes as Decimal?) != nil ? (preset.smbMinutes ?? 0) as Decimal : 0 let maxMinutesUAM = (preset.uamMinutes as Decimal?) != nil ? (preset.uamMinutes ?? 0) as Decimal : 0 let isfString = preset.isf ? "ISF" : "" From ca31ce9fd672be47fa0a27895230c47b63a91229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 15:04:25 +0100 Subject: [PATCH 363/405] version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 9a0dcb91fe..2c33bae717 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.2 +APP_VERSION = 2.7.3 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From b874ad3a44062dfe9904ebadadca7fb681860c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 17:35:28 +0100 Subject: [PATCH 364/405] Typo --- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 7b85fde2cb..76592b4667 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2084,7 +2084,7 @@ Enact a temp Basal or a temp target */ "Minimum Threshold Setting" = "Minimum Threshold Setting"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; /* Minimum Threshold Setting, Part 2 */ "the threshold will be " = "the threshold will be "; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 8c6e0f050d..04f717fb23 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2080,7 +2080,7 @@ Enact a temp Basal or a temp target */ "Minimum Threshold Setting" = "Tröskelvärde"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "När blodsocker är under denna inställning kommer inget insulin att ges.\n\nTröskelvärdet som kommer att användas kommer vara det största värdet av din inställning och det beräknade värdet:\n\nMålvärde - (Målvärde - 40) * 5\nhär med mg/dl som glukosenhet.\n\nTill exempel, om ditt målvärde är "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "När blodsocker är under denna inställning kommer inget insulin att ges.\n\nTröskelvärdet som kommer att användas kommer vara det största värdet av din inställning och det beräknade värdet:\n\nMålvärde - (Målvärde - 40) / 2\n, här med mg/dl som glukosenhet.\n\nTill exempel, om ditt målvärde är "; /* Minimum Threshold Setting, Part 2 */ "the threshold will be " = "kommer tröskelvärdet att vara "; diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 573bde32a3..ab910c678a 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -144,7 +144,7 @@ extension Dynamic { info( header: "Minimum Threshold Setting", body: NSLocalizedString( - "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) * 5\nhere using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is ", + "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is ", comment: "Threshold string part 1" ) + "\(glucoseString(100)) \(unitString) , " + NSLocalizedString("the threshold will be ", comment: "Threshold string part 2") + From 0b97e1c629b546838546effd9a1276714d7ac750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 22 Jan 2024 17:57:28 +0100 Subject: [PATCH 365/405] Update strings --- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings | 2 +- FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 76592b4667..f64cbe303f 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2045,7 +2045,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 04f717fb23..7adb94b56f 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktivera dynamisk insulinkänslighet (ISF)"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index ab910c678a..73a2310bb9 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -48,7 +48,7 @@ extension Dynamic { .onTapGesture { info( header: "Activate Dynamic Sensitivity (ISF)", - body: "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 1 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits.", + body: "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits.", useGraphics: nil ) } From 339eed9e26b927790c8a04857888bb931c91f38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:59:30 +0100 Subject: [PATCH 366/405] Crowdin updates (#489) --- .../da.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 14 ++--- .../fr.lproj/Localizable.strings | 4 +- .../it.lproj/Localizable.strings | 4 +- .../nl.lproj/Localizable.strings | 4 +- .../ru.lproj/Localizable.strings | 2 +- .../sk.lproj/Localizable.strings | 2 +- .../uk.lproj/Localizable.strings | 4 +- .../vi.lproj/Localizable.strings | 6 +-- .../zh-Hans.lproj/Localizable.strings | 3 +- .../Resources/de.lproj/Localizable.strings | 4 +- .../Resources/fr.lproj/Localizable.strings | 6 +-- .../Resources/it.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/pt-PT.lproj/Localizable.strings | 6 +++ .../Resources/ru.lproj/Localizable.strings | 2 +- .../Resources/sk.lproj/Localizable.strings | 2 +- .../Resources/sv.lproj/Localizable.strings | 4 +- .../Resources/uk.lproj/Localizable.strings | 6 +++ .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/ar.lproj/Localizable.strings | 23 ++++++-- .../Main/da.lproj/Localizable.strings | 23 ++++++-- .../Main/de.lproj/Localizable.strings | 45 ++++++++++------ .../Main/es.lproj/Localizable.strings | 23 ++++++-- .../Main/fi.lproj/Localizable.strings | 23 ++++++-- .../Main/fr.lproj/Localizable.strings | 53 ++++++++++++------- .../Main/he.lproj/Localizable.strings | 23 ++++++-- .../Main/hu.lproj/Localizable.strings | 23 ++++++-- .../Main/it.lproj/Localizable.strings | 26 +++++++-- .../Main/nb.lproj/Localizable.strings | 23 ++++++-- .../Main/nl.lproj/Localizable.strings | 27 +++++++--- .../Main/pl.lproj/Localizable.strings | 23 ++++++-- .../Main/pt-BR.lproj/Localizable.strings | 23 ++++++-- .../Main/pt-PT.lproj/Localizable.strings | 23 ++++++-- .../Main/ru.lproj/Localizable.strings | 23 ++++++-- .../Main/sk.lproj/Localizable.strings | 23 ++++++-- .../Main/sv.lproj/Localizable.strings | 4 +- .../Main/tr.lproj/Localizable.strings | 23 ++++++-- .../Main/uk.lproj/Localizable.strings | 23 ++++++-- .../Main/vi.lproj/Localizable.strings | 36 ++++++++----- .../Main/zh-Hans.lproj/Localizable.strings | 23 ++++++-- 41 files changed, 463 insertions(+), 158 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index cde4e246ae..f77a2178bd 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -715,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Lavt Reservoir"; +"Low Reservoir" = "Low Reservoir"; /* */ "Save" = "Gem"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 78eaad0843..f8757c3bfa 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -30,7 +30,7 @@ "Time Change Detected" = "Zeitänderung erkannt"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Mehrfache Befehlsbenachrichtigung"; +"Multiple Command Alert" = "Mehrfache Befehlswarnungen"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ "Pod expires in %1$@." = "Pod läuft ab in %1$@."; @@ -45,7 +45,7 @@ "%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ Insulin oder weniger verfügbar im Pod. Pod bald ersetzen."; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Unterbrechung in Fortschrittserinnerung"; +"Suspend In Progress Reminder" = "Erinnerung: Pumpe vorübergehend unterbrochen"; /* Alert content body for suspendEnded pod alert */ "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Die Insulinunterbrechung ist beendet.\n\nSie können die Zufuhr über das Banner auf dem Startbildschirm oder über die Pumpeneinstellungen fortsetzen. Sie werden in 15 Minuten noch einmal erinnert."; @@ -222,7 +222,7 @@ "No Insulin" = "Kein Insulin"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "POD abgelaufen"; +"Pod Expired" = "Pod abgelaufen"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pumpe verstopft"; @@ -403,10 +403,10 @@ "Deactivate Pod" = "Pod deaktivieren"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Streichen um die Kanüle einzuführen"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Streichen um den Pod zu deaktivieren"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivierung."; @@ -415,7 +415,7 @@ "Pod deactivated successfully. Continue." = "Pod erfolgreich deaktiviert. Fortfahren."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Wiederholen"; +"Retry" = "Erneut versuchen"; /* Action button description when deactivated */ "Continue" = "Fortsetzen"; @@ -697,7 +697,7 @@ "Cancel" = "Abbrechen"; /* Text for continue button on PodSetupView */ -"Continue" = "Fortsetzen"; +"Continue" = "Weiter"; /* Are you sure you want to skip Omnipod Onboarding? */ "Skip Omnipod Onboarding?" = "Das Omnipod Onboarding überspringen?"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index ebca41d986..0d7fdc0c3b 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Désactiver le pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Glisser pour insérer la canule"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Désactivation."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index cb2d8343ea..5a46a9e46d 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Disattiva Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Scorri per inserire la Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Scorri per Disattivare il Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deattivazione."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 1318156ecd..881f5336ee 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactiveren."; @@ -715,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Reservoir bijna leeg"; +"Low Reservoir" = "Laag reservoir niveau"; /* */ "Save" = "Opslaan"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 516cc0c80c..71152c1833 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивировать."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 7d276afd1e..ac7b53e3a3 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivuje sa."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 84ca0ed814..a3b979e047 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивувати."; @@ -579,7 +579,7 @@ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Нагадування вище не звучатимуть, якщо ваш пристрій перебуває в беззвучному режимі або режимі «Не турбувати».\n\nІснують інші важливі сповіщення та будильники Podʼу, які лунатимуть, навіть якщо на пристрої встановлено режим «Без звуку» або «Не турбувати»."; /* navigation title for notification settings */ -"Notification Settings" = "Параметри Сповіщень"; +"Notification Settings" = "Параметри сповіщень"; /* Label for scheduled reminder value row */ "Time" = "Час"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 4568548fcc..26f88c6567 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Trượt để chèn ống thông"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Đang hủy kích hoạt."; @@ -694,7 +694,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy"; /* Text for continue button on PodSetupView */ "Continue" = "Tiếp tục"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 4f49cc0f80..1cd5a89e29 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -408,7 +408,6 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; - /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "停用中"; @@ -716,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; /* Label text for low reservoir value row */ -"Low Reservoir" = "低药量"; +"Low Reservoir" = "Low Reservoir"; /* */ "Save" = "保存​​"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 3a62f11a54..f78c5dec5d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Pod deaktivieren"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Streichen um die Kanüle einzuführen"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index cbec42ec56..9f04b60bc6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -180,17 +180,17 @@ "Deactivate" = "Désactiver"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Désactiver le Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Glisser pour insérer la canule"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Désactivé"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 69d0a9893f..2c874e9dd4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Disattiva Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Scorri per inserire la Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Scorri per disattivare il pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Disattivato"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 402c59ebfc..e6ee4e0279 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 62cc7db41d..245960bc59 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 3fe6e4df94..808db53fe1 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 9e947970b8..7cf32f7764 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 2e35719758..e8e76cf955 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Inaktivera podd"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Svep för att föra in kanyl"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Svep för att inaktivera podd"; /* Label text showing pod is deactivated */ "Deactivated" = "Inaktiverad"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 9afcc9a047..9e62b51b0b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Деактивувати Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Деактивовано"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index c0b65ebf5a..d56b6edbf6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Trượt để chèn ống thông"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index da774d4aa8..2def89f79e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 16f3151df8..971f50938b 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 344d448c0c..d3b7dadbb6 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -4,10 +4,10 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Insulin ohne Bolusabgabe erfassen"; +"Add insulin without actually bolusing" = "Insulin erfassen ohne tatsächliche Bolusabgabe"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Hinzufügen von %@ ohne Bolusabgabe"; +"Add %@ without bolusing" = "Hinzufügen von %@ ohne tatsächliche Bolusabgabe"; "Bolus" = "Bolus"; @@ -17,7 +17,7 @@ "Continue without bolus" = "Ohne Bolusabgabe fortfahren"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nEingegebener Bolus ist größer als Max Bolus Einstellung! Sind Sie sicher, dass er hinzugefügt werden soll "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nEingegebener Bolus ist größer als Max Bolus Einstellung! \nTrotzdem hinzufügen? "; /* Header */ "Enact Bolus" = "Bolus abgeben"; @@ -26,10 +26,10 @@ "Enact bolus" = "Bolus abgeben"; /* */ -"Insulin recommended" = "Empfohlener Bolus"; +"Insulin recommended" = "Empfohlene Insulinmenge"; /* */ -"Insulin required" = "Benötigtes Insulin"; +"Insulin required" = "Benötigte Insulinmenge"; /* Bolus screen */ "Recommendation" = "Empfehlung"; @@ -68,13 +68,13 @@ "Add Meal" = "Mahlzeit hinzufügen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolusübersicht"; +"Bolus Summary" = "Bolus-Zusammenfassung"; /* For the Bolus View pop-up */ "Calculations" = "Berechnungen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fette Mahlzeit"; +"Fatty Meal" = "Fettige Mahlzeit"; /* For the Bolus View pop-up */ "Full Bolus" = "Voller Bolus"; @@ -83,7 +83,7 @@ "Fraction" = "Fraktion"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fettspeise Faktor"; +"Fatty Meal Factor" = "Faktor für fettige Mahlzeit"; /* For the Bolus View pop-up */ "Result" = "Ergebnis"; @@ -101,7 +101,7 @@ "looping" = "Loop aktiv"; /* min ago since last loop */ -"min ago" = "min her"; +"min ago" = "Min. her"; /* Status Title */ "No suggestion" = "Kein Vorschlag"; @@ -116,13 +116,13 @@ "Add Carbs " = "Kohlenhydrate hinzufügen "; /* */ -"Amount Carbs" = "Menge Kohlenhydrate"; +"Amount Carbs" = "Kohlenhydratmenge"; /* Grams unit */ "grams" = "Gramm"; /* */ -"Carbs required" = "Kohlenhydrate erforderlich"; +"Carbs required" = "Erforderliche Kohlenhydrate"; /* Saved Food Presets */ "Saved Food" = "Gespeichertes Essen"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiviere Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Berechnet einen neuen ISF mit jedem Loop-Zyklus. Die neue ISF basiert auf dem aktuellen BG, TDD des Insulins (nach 24 Stunden oder einem gewichteten Durchschnitt) und einem Anpassungsfaktor (Standardeinstellung ist 1).\n\nDynamic ISF und CR Verhältnisse werden durch Ihre autosens.min/max Limits begrenzt.\n\nDas dynamische Verhältnis ersetzt das autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic Ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Dynamische Verhältnisse um eine Konstante anpassen. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF für einen hohen oder niedrigen BG. Die maximale Korrektur wird durch die Autosens min/max-Einstellungen bestimmt. Für die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen. Für die logarithmische Formel gibt es weniger Konsens, aber ein Anfangswert von 0,5 - 0,8 ist für die meisten Benutzer angemessener."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Grenzwert-Einstellungen"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Der Standardschwellenwert in FAX hängt von Ihrem aktuellen Minimum für BG ab, wie folgt:\n\nWenn Ihr Minimum BG Ziel = 90 mg/dl -> Schwellenwert = 65 mg/dl,\n\nwenn Minimum BG Ziel = 100 mg/dl -> Schwellenwert = 70 mg/dl,\n\nMinimum BG Ziel = 110 mg/dl -> Schwellenwert = 75 mg/dl,\n\nund wenn Minimum BG Ziel = 130 mg/dl -> Schwellenwert = 85 mg/dl.\n\nMit dieser Einstellung können Sie die Standardeinstellung auf einen höheren Schwellenwert für die Schleife mit dynISF ändern. Gültige Werte sind 65 mg/dl<= Grenzwert <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Berechnungseinstellungen"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 829a02a18d..83dbba60e0 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2047,7 +2047,7 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2065,7 +2065,7 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2082,8 +2082,23 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 209e8a69d8..929bd8b3de 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 9db7cd1186..a01b39e3e8 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -50,7 +50,7 @@ "of" = "de"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Activé à"; +"Enacted at" = "Dernier calcul à"; /* Headline in suggested pop up (at: at what time) */ "Suggested at" = "Suggéré à"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Activer ISF dynamique"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculer une nouvelle SI à chaque cycle de boucle. Le nouveau FSI sera basé sur la glycémie actuelle, le TDD d'insuline (après 24 heures ou une moyenne pondérée) et un facteur d'ajustement (valeur par défaut est 1).\n\nLes ratios ISF et CR dynamiques seront limités par vos limites autosens.min/max.\n\nRatio dynamique remplace le ratio autosens.ratio : Nouveau SI = FI statique / Ratio dynamique,\nRatio dynamique = profil. fr * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcule un nouveau facteur de sensibilité à l'insuline (FSI) à chaque cycle de boucle. Le nouveau FSI sera basé sur votre glycémie actuelle, la dose quotidienne totale d'insuline (DQT = total de toutes les doses d'insuline livrées dans les dernières 24 heures) et un facteur d'ajustement individuel (il est recommandé de commencer par 0,5 si vous utilisez la fonction Sigmoid et 0,8 si ce n'est pas le cas).\n\nTous les ajustements dynamiques du FSI et du RGI (Ratio insuline/glucides) seront limités par vos paramètres autosens min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Activer CR dynamique"; @@ -2050,66 +2050,81 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Utiliser le CR. dynamique. Le ratio dynamique sera utilisé pour CR comme suit:\n\n Quand ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nRatio < 1 : dynCR = CR/dynCR.\n\nN'utilisez pas de toghether avec une fraction d'insuline élevée (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Activer la sensibilité dynamique (FSI)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Activer le ratio de glucides dynamique (RC)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Ajuster les ratios dynamiques par une constante. La valeur par défaut est de 0,5. Plus la valeur est élevée, plus la correction de votre SI sera grande ou faible glycémie. La correction maximale est déterminée par les paramètres min/max d'Autosens. Pour la fonction Sigmoid un facteur de réglage de 0.4 - 0.5 est recommandé pour commencer. Pour la formule logaritmique threre est moins consensuel, mais commencer avec 0.5 - 0.8 est plus approprié pour la plupart des utilisateurs"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Utiliser la fonction Sigmoid"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formule"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sécurité"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Utilisez une fonction sigmoid pour ISF (et pour CR, quand activé), au lieu de la formule logarithmique par défaut. Nécessite que le paramètre ISF dynamique soit activé dans les paramètres\n\nLe paramètre Ajustement ajuste la pente de la courbe (Y : ratio dynamique, X: Glucose de sang). Une valeur inférieure ==> moins raide, == moins agressive.\n\nL'autosens. Les paramètres in/max déterminent à la fois les limites max/min pour le ratio dynamique ET combien le rapport dynamique est ajusté. Si AF est la pente de la courbe, l’autosens. in/max est la hauteur du graphique, l'intervalle Y, où le rapport dynamique, la courbe aura toujours une forme sigmoïde, peu importe l'autosens. Les paramètres in/max sont utilisés, ce qui signifie que ces paramètres ont de grandes conséquences sur le résultat de la SI dynamique calculée. Soyez prudent en définissant une valeur autosens.max trop élevée. Avec un réglage correct du profil ISF, vous n'aurez probablement jamais besoin qu'il soit supérieur à 1.\n\nUne limite Autosens.max > 1.5 n'est pas recommandée lors de l'utilisation de la fonction sigmoid."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Réglage du seuil"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Le seuil par défaut du iAPS dépend de votre cible de glycémie minimale actuelle, comme suit :\n\nSi votre cible de glycémie minimale = 90 mg/dl -> seuil = 65 mg/dl,\n\nsi cible Glycémie minimale = 100 mg/dl -> seuil = 70 mg/dl,\n\nobjectif minimum de glycémie = 110 mg/dl -> seuil = 75 mg/dl,\n\net si l'objectif de glycémie minimum = 130 mg/dl -> seuil = 85 mg/dl.\n\nCe paramètre vous permet de changer le seuil par défaut pour la boucle avec dynISF. Les valeurs valides sont 65 mg/dl<= Seuil <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Paramètre"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Réglages de la calculatrice"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Afficher les prédictions"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Petits écrans d'iPhone"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Afficher et autoriser les entrées de matières grasses et protéines"; /* UI/UX option */ "Add Meal View settings " = "Add Meal View settings "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Afficher le bouton de cible temporaire"; /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Si vous utilisez à la fois des profils et des cibles temporaires"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Toujours la valeur de glucose en couleur (vert, jaune, etc.)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Paramètres de l'en-tête"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalement, la valeur de glucose est en rouge uniquement lorsqu'elle est supérieure ou inférieure à vos limites de notification pour les valeurs hautes/basses"; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index da774d4aa8..2def89f79e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index 9eec1ef85e..6aa0dbb041 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 5362143e67..c88ed1dd7b 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Abilita ISF Dinamico"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calcola un nuovo ISF per ogni ciclo di loop. Il nuovo ISF sarà basato sulla glicemia attuale, sulla TDD dell’insulina (oltre 24 ore o media ponderata) e su un fattore di aggiustamento (valore predefinito è 1).\n\nI rapporti ISF e CR dinamici saranno limitati dai tuoi limiti autosens.min/max.\n\nIl rapporto dinamico sostituisce il rapporto autosens.ratio: New ISF = rapporto statico ISF / dinamico,\nRapporto dinamico = profilo. ens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinuti"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcola una nuova impostazione di sensibilità all'insulina (ISF) per ogni ciclo. La nuova sensibilità sarà basata sulla tua attuale Glicemia e sulla dose totale giornaliera d'insulina (TDD, cioè tutta l’insulina erogata nelle ultime 24 ore) e un fattore di aggiustamento individuale (raccomandazione di iniziare con 0, se si utilizza la funzione Sigmoid e di 0,8 se non lo è).\n\nTutte le regolazioni dinamiche ISF e CR saranno limitate dai limiti autosens.min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Abilita CR Dinamico"; @@ -2059,8 +2059,9 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Regola i rapporti dinamici della costante ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max. Per la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5. Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti -Regola la costante ISF dinamica"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max.\n\nPer la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5.\n\n Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti adulti. +Per gli utenti più giovani si consiglia di iniziare con un dosaggio ancora più basso quando si utilizza la formula logaritmica, per evitare un trattamento eccessivamente aggressivo. +Regola la costante ISF dinamica."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Usa Funzione Sigmoid"; @@ -2077,8 +2078,23 @@ Regola la costante ISF dinamica"; /* Headline Threshold Setting */ "Threshold Setting" = "Impostazione soglia"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "La soglia predefinita in FAX dipende dall'attuale obiettivo di glicemia minima, come segue:\n\nSe il vostro obiettivo minimo di glicemia = 90 mg/dl -> soglia = 65 mg/dl,\n\nse obiettivo minimo di glicemia = 100 mg/dl -> soglia = 70 mg/dl,\n\nobiettivo minimo di glicemia = 110 mg/dl -> soglia = 75 mg/dl,\n\ne se obiettivo minimo di glicemia = 130 mg/dl -> soglia = 85 mg/dl.\n\nQuesta impostazione ti permette di cambiare il valore predefinito ad una soglia più alta per il looping con dynISF. Valori validi sono 65 mg/dl<= Impostazione soglia <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Impostazioni Soglia Minima"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Questa impostazione consente di scegliere un livello al di sotto del quale non verrà somministrata insulina.\n\nLa soglia utilizza la maggior parte dell'impostazione della soglia e della soglia calcolata:\n\nTarget Glicemia - (Target Glicemia - 40) / 2\n, qui usando mg/dl come unità della glicemia.\n\nPer esempio, se il tuo Target Glicemia è "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "la soglia sarà "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "a meno che l'impostazione della soglia non sia impostata su un valore più alto:"; + +/* Threshold Table Columns Title */ +"Setting" = "Impostazioni"; + +/* Threshold Table Columns Title */ +"Threshold" = "Soglia"; /* Header */ "Calculator settings" = "Impostazioni calcolatore"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 724b172518..6a6df4e71c 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiver dynamisk ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beregn ny ISF ved hver loop-syklus. Ny ISF vil baseres på nåværende BS, TDD med insulin (siste 24 timer eller vektet gjennomsnitt) og en justeringsfaktor (standardverdi er 1).\n\nDynamisk ISF og CR-ratier vil bli begrenset av dine autosens-innstillinger.\n\nDynamisk ratio erstatter autosens-ratio: Ny ISF = Statisk ISF / Dyamisk ratio,\nDynamisk ratio = profile.sens * adjustmentFactor * tdd * Math.log(BS/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Juster dynamisk forholdstall med en konstant. Standard er 0,5. Jo høyere verdien er, jo større blir korreksjonen av ISF ved høyt eller lavt BS. Maksimal korrigering bestemmes av min/maks innstillingene for Autosens. For Sigmoidfunksjon anbefales det å starte en justeringsfaktor på 0,4-0,5. For den logaritmiske formelens er det mindre konsensus, men å starte med 0.5 – 0,8 er anbefalt for de fleste brukere"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Standard terskel i FAX er avhengig av ditt nåværende laveste BS-mål, som følger:\n\nDersom ditt laveste BS-mål = 90 mg/dL -> terskel = 65 mg/dL,\n\ndersom laveste BS-mål = 100 mg/dL -> terskel = 70 mg/dL,\n\nlaveste BS-mål = 110 mg/dL -> terskel = 75 mg/dL,\n\nog dersom laveste BS-mål = 130 mg/dL -> terskel = 85 mg/dL.\n\nDenne innstillingen tillater deg å endre til en høyere terskel for å loope med dynamisk ISF. Gyldige verdier er 65 mg/dL <= terskel-innstilling <= 120 mg/dL."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index aad07472fd..87b02f8f1a 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2041,11 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dynamische ISF inschakelen"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Bereken bij elke loopcyclus een nieuwe ISF (Insulin Sensitivity Factor). De nieuwe ISF wordt bepaald door de huidige bloedsuikerspiegel (BG), de totale dagelijkse dosis insuline (TDD) van de afgelopen 24 uur of een gemiddelde daarvan, en een aanpassingsfactor (standaard 1). De dynamische ISF en CR (Carb Ratio) worden beperkt door de minimum- en maximumwaarden die zijn ingesteld in uw autosens.min/max grenzen. De dynamische ratio vervangt de autosens.ratio:/n/n -Nieuwe ISF = Statische ISF / Dynamische ratio, -Dynamische ratio = profielgevoeligheid * aanpassingsfactor * TDD * Logaritme (BG/insulineFactor+1) / 1800, -InsulineFactor = 120 - Tijd tot insulinepiek in minuten./n/n -Eenvoudiger gezegd, het systeem past de insulinegevoeligheid aan op basis van je recente insulinegebruik en huidige bloedsuikerspiegel. De aanpassingen zijn beperkt binnen bepaalde grenzen die je hebt ingesteld"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; @@ -2067,7 +2063,7 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Verander de dynamische verhoudingen met een vaste waarde, die standaard op 0,5 staat. Als je deze waarde verhoogt, zal de aanpassing van je ISF voor hoge of lage bloedsuikerwaarden groter zijn. De grootte van de correctie is beperkt door de instellingen voor Autosens min/max. Voor de Sigmoid-functie wordt een startwaarde van 0,4 tot 0,5 aanbevolen. Voor de logaritmische formule is er geen vastgestelde norm, maar voor de meeste gebruikers is een waarde tussen 0,5 en 0,8 passender."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; @@ -2084,8 +2080,23 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* Headline Threshold Setting */ "Threshold Setting" = "Grenswaarde instellingen"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator instellingen"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index d8e4c41e7e..e7bb926255 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2043,7 +2043,7 @@ Połączono z Nightscout!"; "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2061,7 +2061,7 @@ Połączono z Nightscout!"; "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2078,8 +2078,23 @@ Połączono z Nightscout!"; /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 6e72e14f32..a620815e38 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index a8b0c751d7..1b63e5822d 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index e023b85790..badc315556 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включить динамический ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Считать новый ISF с каждым циклом петли. Новый ISF будет зависеть от текущего BG, TDD (за последние 24 часа или взвешенное среднее значение) и Adjustment Factor (по-умолчанию - 1).\n\nDynamic ratio ISF и CR будет ограничен настройками autosens.min/max.\n\nDynamic ratio заменяет autosens.ratio: Новый ISF = Постоянный ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включить динамический CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Отрегулируйте динамические коэффициенты на постоянную величину. Значение по умолчанию равно 0.5. Чем выше значение, тем больше будет коррекция вашего ISF для высокого или низкого BG. Максимальная коррекция определяется настройками Auto sens min/max. Для сигмовидной функции рекомендуется для начала использовать коэффициент регулировки 0.4 - 0.5. В отношении логарифмической формулы консенсуса меньше, но большинству пользователей более подходит начинать с 0.5 - 0.8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Настройка порога"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Настройки калькулятора"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 1081e776e4..b6b881ed4a 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Pri každom cykle slučky vypočítajte novú hodnotu ISF. Nový ISF bude založený na aktuálnom BG, TDD inzulínu (posledných 24 hodín alebo vážený priemer) a korekčnom faktore (predvolená hodnota je 1).\n\nDynamický pomer ISF a CR bude obmedzený limitmi autosens.min/max.\n\nDynamický pomer nahrádza autosens.pomer: Nový ISF = statický ISF / dynamický pomer,\nDynamický pomer = profil.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Upravte dynamické pomery pomocou konštanty. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF pre vysoký alebo nízky BG. Maximálna korekcia je určená nastavením min/max v položke Autosens. Pre funkciu Sigmoid sa na začiatku odporúča korekčný faktor 0,4 - 0,5. Pre logaritmický vzorec existuje menej konsenzu, ale pre väčšinu používateľov je vhodnejšie začať s 0,5 - 0,8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Nastavenie prahové hodnoty"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Nastavenia výpočtu"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7adb94b56f..2c33798b57 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktivera dynamisk insulinkänslighet (ISF)"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de seanst 24timmarna och en individuell juseringsfaktor (du rekommenderas att börja med 0.5 om du använder S-formad funktion, annars 0.8).\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Ändra AF-konstant"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuell justering av hur din insulinkänslighet och insulinkvot räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal och minimal insulinkänslighet och insulinkvot bestäms av dina Autosens-min/max-inställningar och av dina schemalagda profilinställningar.\n\nFör S-formad dynamisk inställning rekommenderas att börja med 0.3-0-4.\n\n För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuell justering av hur din insulinkänslighet och insulinkvot (om du använder dyamisk insulinkvot) räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering.\n\nFör S-formad dynamisk inställning rekommendaras att börja med 0.3-0-4. För logaritmisk inställning rekommenderas att börja med 0.5-0.8."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Använd S-formad dynamisk insulinkänslighet"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 4ffd98717f..b4a9248768 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dinamik İDF Etkinleştir"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Her döngü döngüsünde yeni bir İDF hesaplayın. Yeni İDF, mevcut BG'ye dayalı olacaktır, GTD'unuz (son 24 saat veya ağırlıklı bir ortalama) ve bir Ayarlama Faktörüne (varsayılan 1'dir) dayalı olacaktır.\n\nDinamik İDF ve KHO oranları, autosens.min/maks limitlerinizle sınırlanacaktır. .\n\nDinamik oran, autosens.ratio'nun yerini alır: Yeni İDF = Statik İDF / Dinamik oran,\nDynamic oran = profile.sens * AdjustFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - İnsülinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dinamik KHO Etkinleştir"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dinamik İDF sabitini ayarla"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid Fonksiyonunu Kullan"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 1de4e5eaca..6ef3bb0c83 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включити Динамічний ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Вважати новий ISF з кожним циклом петлі. Новий ISF буде залежати від поточного BG, TDD (за останні 24 години або зважене середнє значення) та Adjustment Factor (за замовчуванням - 1). nDynamic ratio замінює autosens.ratio: Новий ISF = Постійний ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPe"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Налаштуйте динамічні коефіцієнти за константою. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF для високого або низького рівня ГК. Максимальна корекція визначається параметрами min/max Автосенс. Для сигмоподібної функції спочатку рекомендується коригуючий коефіцієнт 0,4 - 0,5. Для логарифмічної формули threre є менш узгодженим, але починати з 0,5 - 0,8 є більш прийнятним для більшості користувачів"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Порогове значення"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Поріг, мг/дл, у FAX за замовчуванням залежить від Вашої поточної мінімальної мети BG, таким чином:\n\nЯкщо мінімальна мета BG = 5 ммоль/л -> поріг = 3,6 ммоль/л,\n\n мінімальна мета BG = 5.6 ммоль/л -> поріг = 3,9 ммоль/л, мінімальна мета BG = 6.1 ммоль/л -> поріг = 4,2 ммоль/л, якщо мінімальна мета BG = 7.2 ммоль/л -> поріг = 4,7 ммоль/л.\n\nЦе налаштування дозволяє збільшити рівень порога для більш безпечної роботи з dynISF. Валідним буде значення 65 мг/дл = 3,6 ммоль/л <= Threshold Setting <= 120 мг/дл = 6,7 ммоль/л."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Налаштування калькулятора"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 1845ea4972..9c343ba5ba 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -390,13 +390,13 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Các cấu hình đã được cập nhật"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị Glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Cập nhật cấu hình bị hủy bỏ."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Không thể tìm thấy Profile Nightscout mặc định."; +"Can't find the default Nightscout Profile." = "Không thể tìm thấy Hồ sơ Nightscout mặc định."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Xét nghiệm đường huyết"; +"Blood Glucose Test" = "Kiểm tra đường huyết"; /* Add Medtronic pump */ "Add Medtronic" = "Thêm Medtronic"; @@ -948,7 +948,7 @@ Enact a temp Basal or a temp target */ "Some ui element was incorrectly specified" = "Một vài yếu tố ui đã không được chỉ định"; /* */ -"Success" = "Success"; +"Success" = "Thành công"; /* */ "Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; @@ -1404,7 +1404,7 @@ Enact a temp Basal or a temp target */ "Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Lưu mẫu cài đặt"; +"Save as Preset" = "Lưu cài đặt sẵn"; /* */ "Predictions" = "Dự đoán"; @@ -1487,9 +1487,6 @@ Enact a temp Basal or a temp target */ /* */ "Deactivating..." = "Đang hủy kích hoạt..."; -/* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; - "Pair Pod" = "Kết nối Pod"; /* Text for previous pod information row */ @@ -2045,7 +2042,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Tính toán ISF mới với mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên BG, TDD hiện tại của insulin (24 giờ qua hoặc mức trung bình có trọng số) và Hệ số điều chỉnh (mặc định là 1).\n\nTỷ lệ ISF và CR động sẽ bị giới hạn bởi giới hạn autosens.min/max của bạn.\n\nTỷ lệ động thay thế tỷ lệ autosens: ISF mới = ISF tĩnh / Tỷ lệ động,\nTỷ lệ động = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD, tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Kích hoạt CR động"; @@ -2063,7 +2060,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Điều chỉnh tỷ lệ động theo một hằng số. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF của bạn sẽ càng lớn đối với BG cao hay thấp. Hiệu chỉnh tối đa được xác định bởi cài đặt tối thiểu/tối đa của Autosens. Đối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu. Đối với công thức logarit, thre có ít sự đồng thuận hơn, nhưng bắt đầu bằng 0,5 - 0,8 thì phù hợp hơn với hầu hết người dùng"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Điều chỉnh riêng các tỷ lệ động được tính toán. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF/CR của bạn đối với mức đường huyết cao hay thấp càng lớn. Hiệu chỉnh tối đa/tối thiểu được xác định bởi cài đặt tối thiểu/tối đa của Autosens.\n\nĐối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu.\n\nĐối với công thức logarit, có ít sự đồng thuận hơn, nhưng bắt đầu từ khoảng 0,8 là có lẽ phù hợp với hầu hết người dùng trưởng thành. Đối với người dùng trẻ tuổi, nên bắt đầu ở mức thấp hơn nữa khi sử dụng công thức logarit để tránh điều trị quá tích cực."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sử dụng hàm Sigmoid (SF)"; @@ -2080,8 +2077,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Cài đặt ngưỡng"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Cài đặt ngưỡng tối thiểu"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Cài đặt này cho phép bạn chọn mức dưới đó sẽ không cung cấp insulin.\n\nNgưỡng này sử dụng lượng lớn nhất trong cài đặt ngưỡng của bạn và ngưỡng được tính toán:\n\nGlucose mục tiêu - (Glucose mục tiêu - 40) "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "ngưỡng sẽ là "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "trừ khi cài đặt ngưỡng của bạn được đặt cao hơn:"; + +/* Threshold Table Columns Title */ +"Setting" = "Thiết lập"; + +/* Threshold Table Columns Title */ +"Threshold" = "Ngưỡng"; /* Header */ "Calculator settings" = "Thiết lập tính toán"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 913fd01e52..5e6f83a84a 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2043,7 +2043,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2061,7 +2061,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2078,8 +2078,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; From fd5c6cd18b72e241a8f45203482bd395a7ece4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:01:18 +0100 Subject: [PATCH 367/405] Crowdin updates --- .../da.lproj/Localizable.strings | 2 +- .../de.lproj/Localizable.strings | 14 ++--- .../fr.lproj/Localizable.strings | 4 +- .../it.lproj/Localizable.strings | 4 +- .../nl.lproj/Localizable.strings | 4 +- .../ru.lproj/Localizable.strings | 2 +- .../sk.lproj/Localizable.strings | 2 +- .../uk.lproj/Localizable.strings | 4 +- .../vi.lproj/Localizable.strings | 6 +-- .../zh-Hans.lproj/Localizable.strings | 3 +- .../Resources/de.lproj/Localizable.strings | 4 +- .../Resources/fr.lproj/Localizable.strings | 6 +-- .../Resources/it.lproj/Localizable.strings | 4 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/pt-PT.lproj/Localizable.strings | 6 +++ .../Resources/ru.lproj/Localizable.strings | 2 +- .../Resources/sk.lproj/Localizable.strings | 2 +- .../Resources/sv.lproj/Localizable.strings | 4 +- .../Resources/uk.lproj/Localizable.strings | 6 +++ .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/ar.lproj/Localizable.strings | 23 ++++++-- .../Main/da.lproj/Localizable.strings | 23 ++++++-- .../Main/de.lproj/Localizable.strings | 45 ++++++++++------ .../Main/es.lproj/Localizable.strings | 23 ++++++-- .../Main/fi.lproj/Localizable.strings | 23 ++++++-- .../Main/fr.lproj/Localizable.strings | 53 ++++++++++++------- .../Main/he.lproj/Localizable.strings | 23 ++++++-- .../Main/hu.lproj/Localizable.strings | 23 ++++++-- .../Main/it.lproj/Localizable.strings | 28 +++++++--- .../Main/nb.lproj/Localizable.strings | 23 ++++++-- .../Main/nl.lproj/Localizable.strings | 27 +++++++--- .../Main/pl.lproj/Localizable.strings | 23 ++++++-- .../Main/pt-BR.lproj/Localizable.strings | 23 ++++++-- .../Main/pt-PT.lproj/Localizable.strings | 23 ++++++-- .../Main/ru.lproj/Localizable.strings | 23 ++++++-- .../Main/sk.lproj/Localizable.strings | 23 ++++++-- .../Main/sv.lproj/Localizable.strings | 4 +- .../Main/tr.lproj/Localizable.strings | 23 ++++++-- .../Main/uk.lproj/Localizable.strings | 23 ++++++-- .../Main/vi.lproj/Localizable.strings | 36 ++++++++----- .../Main/zh-Hans.lproj/Localizable.strings | 23 ++++++-- 41 files changed, 464 insertions(+), 159 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index cde4e246ae..f77a2178bd 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -715,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Lavt Reservoir"; +"Low Reservoir" = "Low Reservoir"; /* */ "Save" = "Gem"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index 78eaad0843..f8757c3bfa 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -30,7 +30,7 @@ "Time Change Detected" = "Zeitänderung erkannt"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Mehrfache Befehlsbenachrichtigung"; +"Multiple Command Alert" = "Mehrfache Befehlswarnungen"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ "Pod expires in %1$@." = "Pod läuft ab in %1$@."; @@ -45,7 +45,7 @@ "%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ Insulin oder weniger verfügbar im Pod. Pod bald ersetzen."; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Unterbrechung in Fortschrittserinnerung"; +"Suspend In Progress Reminder" = "Erinnerung: Pumpe vorübergehend unterbrochen"; /* Alert content body for suspendEnded pod alert */ "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Die Insulinunterbrechung ist beendet.\n\nSie können die Zufuhr über das Banner auf dem Startbildschirm oder über die Pumpeneinstellungen fortsetzen. Sie werden in 15 Minuten noch einmal erinnert."; @@ -222,7 +222,7 @@ "No Insulin" = "Kein Insulin"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "POD abgelaufen"; +"Pod Expired" = "Pod abgelaufen"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pumpe verstopft"; @@ -403,10 +403,10 @@ "Deactivate Pod" = "Pod deaktivieren"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Streichen um die Kanüle einzuführen"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Streichen um den Pod zu deaktivieren"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivierung."; @@ -415,7 +415,7 @@ "Pod deactivated successfully. Continue." = "Pod erfolgreich deaktiviert. Fortfahren."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Wiederholen"; +"Retry" = "Erneut versuchen"; /* Action button description when deactivated */ "Continue" = "Fortsetzen"; @@ -697,7 +697,7 @@ "Cancel" = "Abbrechen"; /* Text for continue button on PodSetupView */ -"Continue" = "Fortsetzen"; +"Continue" = "Weiter"; /* Are you sure you want to skip Omnipod Onboarding? */ "Skip Omnipod Onboarding?" = "Das Omnipod Onboarding überspringen?"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index ebca41d986..0d7fdc0c3b 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Désactiver le pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Glisser pour insérer la canule"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Désactivation."; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index cb2d8343ea..5a46a9e46d 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Disattiva Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Scorri per inserire la Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Scorri per Disattivare il Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deattivazione."; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 1318156ecd..881f5336ee 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deactiveren."; @@ -715,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Reservoir bijna leeg"; +"Low Reservoir" = "Laag reservoir niveau"; /* */ "Save" = "Opslaan"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 516cc0c80c..71152c1833 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивировать."; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index 7d276afd1e..ac7b53e3a3 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktivuje sa."; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 84ca0ed814..a3b979e047 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -406,7 +406,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Деактивувати."; @@ -579,7 +579,7 @@ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Нагадування вище не звучатимуть, якщо ваш пристрій перебуває в беззвучному режимі або режимі «Не турбувати».\n\nІснують інші важливі сповіщення та будильники Podʼу, які лунатимуть, навіть якщо на пристрої встановлено режим «Без звуку» або «Не турбувати»."; /* navigation title for notification settings */ -"Notification Settings" = "Параметри Сповіщень"; +"Notification Settings" = "Параметри сповіщень"; /* Label for scheduled reminder value row */ "Time" = "Час"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 4568548fcc..26f88c6567 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Trượt để chèn ống thông"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Đang hủy kích hoạt."; @@ -694,7 +694,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Bỏ qua"; +"Cancel" = "Hủy"; /* Text for continue button on PodSetupView */ "Continue" = "Tiếp tục"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 4f49cc0f80..1cd5a89e29 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -408,7 +408,6 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; - /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "停用中"; @@ -716,7 +715,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; /* Label text for low reservoir value row */ -"Low Reservoir" = "低药量"; +"Low Reservoir" = "Low Reservoir"; /* */ "Save" = "保存​​"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index 3a62f11a54..f78c5dec5d 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Pod deaktivieren"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Streichen um die Kanüle einzuführen"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index cbec42ec56..9f04b60bc6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -180,17 +180,17 @@ "Deactivate" = "Désactiver"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Désactiver le Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Glisser pour insérer la canule"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Désactivé"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 69d0a9893f..2c874e9dd4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Disattiva Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Scorri per inserire la Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Scorri per disattivare il pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Disattivato"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 402c59ebfc..e6ee4e0279 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 62cc7db41d..245960bc59 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Deactivate Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 3fe6e4df94..808db53fe1 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 9e947970b8..7cf32f7764 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -190,7 +190,7 @@ "Slide to Insert Cannula" = "Slide to Insert Cannula"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index 2e35719758..e8e76cf955 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Inaktivera podd"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Svep för att föra in kanyl"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Svep för att inaktivera podd"; /* Label text showing pod is deactivated */ "Deactivated" = "Inaktiverad"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 9afcc9a047..9e62b51b0b 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -186,6 +186,12 @@ Button title to deactivate pod */ "Deactivate Pod" = "Деактивувати Pod"; +/* */ +"Slide to Insert Cannula" = "Slide to Insert Cannula"; + +/* */ +"Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; + /* Label text showing pod is deactivated */ "Deactivated" = "Деактивовано"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index c0b65ebf5a..d56b6edbf6 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -187,10 +187,10 @@ "Deactivate Pod" = "Hủy kích hoạt Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Trượt để chèn ống thông"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index da774d4aa8..2def89f79e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 16f3151df8..971f50938b 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 344d448c0c..d3b7dadbb6 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -4,10 +4,10 @@ */ /* -------------------------------- */ /* Bolus screen when adding insulin */ -"Add insulin without actually bolusing" = "Insulin ohne Bolusabgabe erfassen"; +"Add insulin without actually bolusing" = "Insulin erfassen ohne tatsächliche Bolusabgabe"; /* Add insulin from source outside of pump */ -"Add %@ without bolusing" = "Hinzufügen von %@ ohne Bolusabgabe"; +"Add %@ without bolusing" = "Hinzufügen von %@ ohne tatsächliche Bolusabgabe"; "Bolus" = "Bolus"; @@ -17,7 +17,7 @@ "Continue without bolus" = "Ohne Bolusabgabe fortfahren"; /* Alert when adding large amount without bolusing */ -"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nEingegebener Bolus ist größer als Max Bolus Einstellung! Sind Sie sicher, dass er hinzugefügt werden soll "; +"\nAmount is more than your Max Bolus setting! \nAre you sure you want to add " = "\nEingegebener Bolus ist größer als Max Bolus Einstellung! \nTrotzdem hinzufügen? "; /* Header */ "Enact Bolus" = "Bolus abgeben"; @@ -26,10 +26,10 @@ "Enact bolus" = "Bolus abgeben"; /* */ -"Insulin recommended" = "Empfohlener Bolus"; +"Insulin recommended" = "Empfohlene Insulinmenge"; /* */ -"Insulin required" = "Benötigtes Insulin"; +"Insulin required" = "Benötigte Insulinmenge"; /* Bolus screen */ "Recommendation" = "Empfehlung"; @@ -68,13 +68,13 @@ "Add Meal" = "Mahlzeit hinzufügen"; /* Bolus View Bolus Summary Header */ -"Bolus Summary" = "Bolusübersicht"; +"Bolus Summary" = "Bolus-Zusammenfassung"; /* For the Bolus View pop-up */ "Calculations" = "Berechnungen"; /* For the Bolus View pop-up */ -"Fatty Meal" = "Fette Mahlzeit"; +"Fatty Meal" = "Fettige Mahlzeit"; /* For the Bolus View pop-up */ "Full Bolus" = "Voller Bolus"; @@ -83,7 +83,7 @@ "Fraction" = "Fraktion"; /* For the Bolus View pop-up */ -"Fatty Meal Factor" = "Fettspeise Faktor"; +"Fatty Meal Factor" = "Faktor für fettige Mahlzeit"; /* For the Bolus View pop-up */ "Result" = "Ergebnis"; @@ -101,7 +101,7 @@ "looping" = "Loop aktiv"; /* min ago since last loop */ -"min ago" = "min her"; +"min ago" = "Min. her"; /* Status Title */ "No suggestion" = "Kein Vorschlag"; @@ -116,13 +116,13 @@ "Add Carbs " = "Kohlenhydrate hinzufügen "; /* */ -"Amount Carbs" = "Menge Kohlenhydrate"; +"Amount Carbs" = "Kohlenhydratmenge"; /* Grams unit */ "grams" = "Gramm"; /* */ -"Carbs required" = "Kohlenhydrate erforderlich"; +"Carbs required" = "Erforderliche Kohlenhydrate"; /* Saved Food Presets */ "Saved Food" = "Gespeichertes Essen"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiviere Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Berechnet einen neuen ISF mit jedem Loop-Zyklus. Die neue ISF basiert auf dem aktuellen BG, TDD des Insulins (nach 24 Stunden oder einem gewichteten Durchschnitt) und einem Anpassungsfaktor (Standardeinstellung ist 1).\n\nDynamic ISF und CR Verhältnisse werden durch Ihre autosens.min/max Limits begrenzt.\n\nDas dynamische Verhältnis ersetzt das autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic Ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Dynamische Verhältnisse um eine Konstante anpassen. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF für einen hohen oder niedrigen BG. Die maximale Korrektur wird durch die Autosens min/max-Einstellungen bestimmt. Für die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen. Für die logarithmische Formel gibt es weniger Konsens, aber ein Anfangswert von 0,5 - 0,8 ist für die meisten Benutzer angemessener."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Grenzwert-Einstellungen"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Der Standardschwellenwert in FAX hängt von Ihrem aktuellen Minimum für BG ab, wie folgt:\n\nWenn Ihr Minimum BG Ziel = 90 mg/dl -> Schwellenwert = 65 mg/dl,\n\nwenn Minimum BG Ziel = 100 mg/dl -> Schwellenwert = 70 mg/dl,\n\nMinimum BG Ziel = 110 mg/dl -> Schwellenwert = 75 mg/dl,\n\nund wenn Minimum BG Ziel = 130 mg/dl -> Schwellenwert = 85 mg/dl.\n\nMit dieser Einstellung können Sie die Standardeinstellung auf einen höheren Schwellenwert für die Schleife mit dynISF ändern. Gültige Werte sind 65 mg/dl<= Grenzwert <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Berechnungseinstellungen"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 829a02a18d..83dbba60e0 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2047,7 +2047,7 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2065,7 +2065,7 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2082,8 +2082,23 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 209e8a69d8..929bd8b3de 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 9db7cd1186..a01b39e3e8 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -50,7 +50,7 @@ "of" = "de"; /* Headline in enacted pop up (at: at what time) */ -"Enacted at" = "Activé à"; +"Enacted at" = "Dernier calcul à"; /* Headline in suggested pop up (at: at what time) */ "Suggested at" = "Suggéré à"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Activer ISF dynamique"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculer une nouvelle SI à chaque cycle de boucle. Le nouveau FSI sera basé sur la glycémie actuelle, le TDD d'insuline (après 24 heures ou une moyenne pondérée) et un facteur d'ajustement (valeur par défaut est 1).\n\nLes ratios ISF et CR dynamiques seront limités par vos limites autosens.min/max.\n\nRatio dynamique remplace le ratio autosens.ratio : Nouveau SI = FI statique / Ratio dynamique,\nRatio dynamique = profil. fr * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcule un nouveau facteur de sensibilité à l'insuline (FSI) à chaque cycle de boucle. Le nouveau FSI sera basé sur votre glycémie actuelle, la dose quotidienne totale d'insuline (DQT = total de toutes les doses d'insuline livrées dans les dernières 24 heures) et un facteur d'ajustement individuel (il est recommandé de commencer par 0,5 si vous utilisez la fonction Sigmoid et 0,8 si ce n'est pas le cas).\n\nTous les ajustements dynamiques du FSI et du RGI (Ratio insuline/glucides) seront limités par vos paramètres autosens min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Activer CR dynamique"; @@ -2050,66 +2050,81 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Utiliser le CR. dynamique. Le ratio dynamique sera utilisé pour CR comme suit:\n\n Quand ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nRatio < 1 : dynCR = CR/dynCR.\n\nN'utilisez pas de toghether avec une fraction d'insuline élevée (> 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Activer la sensibilité dynamique (FSI)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Activer le ratio de glucides dynamique (RC)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Ajuster les ratios dynamiques par une constante. La valeur par défaut est de 0,5. Plus la valeur est élevée, plus la correction de votre SI sera grande ou faible glycémie. La correction maximale est déterminée par les paramètres min/max d'Autosens. Pour la fonction Sigmoid un facteur de réglage de 0.4 - 0.5 est recommandé pour commencer. Pour la formule logaritmique threre est moins consensuel, mais commencer avec 0.5 - 0.8 est plus approprié pour la plupart des utilisateurs"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Utiliser la fonction Sigmoid"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formule"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sécurité"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Utilisez une fonction sigmoid pour ISF (et pour CR, quand activé), au lieu de la formule logarithmique par défaut. Nécessite que le paramètre ISF dynamique soit activé dans les paramètres\n\nLe paramètre Ajustement ajuste la pente de la courbe (Y : ratio dynamique, X: Glucose de sang). Une valeur inférieure ==> moins raide, == moins agressive.\n\nL'autosens. Les paramètres in/max déterminent à la fois les limites max/min pour le ratio dynamique ET combien le rapport dynamique est ajusté. Si AF est la pente de la courbe, l’autosens. in/max est la hauteur du graphique, l'intervalle Y, où le rapport dynamique, la courbe aura toujours une forme sigmoïde, peu importe l'autosens. Les paramètres in/max sont utilisés, ce qui signifie que ces paramètres ont de grandes conséquences sur le résultat de la SI dynamique calculée. Soyez prudent en définissant une valeur autosens.max trop élevée. Avec un réglage correct du profil ISF, vous n'aurez probablement jamais besoin qu'il soit supérieur à 1.\n\nUne limite Autosens.max > 1.5 n'est pas recommandée lors de l'utilisation de la fonction sigmoid."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Réglage du seuil"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Le seuil par défaut du iAPS dépend de votre cible de glycémie minimale actuelle, comme suit :\n\nSi votre cible de glycémie minimale = 90 mg/dl -> seuil = 65 mg/dl,\n\nsi cible Glycémie minimale = 100 mg/dl -> seuil = 70 mg/dl,\n\nobjectif minimum de glycémie = 110 mg/dl -> seuil = 75 mg/dl,\n\net si l'objectif de glycémie minimum = 130 mg/dl -> seuil = 85 mg/dl.\n\nCe paramètre vous permet de changer le seuil par défaut pour la boucle avec dynISF. Les valeurs valides sont 65 mg/dl<= Seuil <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Paramètre"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Réglages de la calculatrice"; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Afficher les prédictions"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Petits écrans d'iPhone"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Afficher et autoriser les entrées de matières grasses et protéines"; /* UI/UX option */ "Add Meal View settings " = "Add Meal View settings "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Afficher le bouton de cible temporaire"; /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "Si vous utilisez à la fois des profils et des cibles temporaires"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Toujours la valeur de glucose en couleur (vert, jaune, etc.)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Paramètres de l'en-tête"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normalement, la valeur de glucose est en rouge uniquement lorsqu'elle est supérieure ou inférieure à vos limites de notification pour les valeurs hautes/basses"; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index da774d4aa8..2def89f79e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index 9eec1ef85e..6aa0dbb041 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index b1a4685045..c88ed1dd7b 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1252,7 +1252,7 @@ Enact a temp Basal or a temp target */ "Interval In Minutes" = "Intervallo in minuti"; /* Override */ -"Override With A Factor Of " = "Fattore di Regolazione"; +"Override With A Factor Of " = "Fattore Regolazione "; /* Description */ "Allows fat and protein to be converted into future carb equivalents using the Warsaw formula of kilocalories divided by 10.\n\nThis spreads the carb equivilants over a maximum duration setting that can be configured from 5-12 hours.\n\nDelay is time from now until the first future carb entry.\n\nInterval in minutes is how many minutes are between entries. The shorter the interval, the smoother the result. 10, 15, 20, 30, or 60 are reasonable choices.\n\nAdjustment factor is how much effect the fat and protein has on the entries. 1.0 is full effect (original Warsaw Method) and 0.5 is half effect. Note that you may find that your normal carb ratio needs to increase to a larger number if you begin adding fat and protein entries. For this reason, it is best to start with a factor of about 0.5 to ease into it.\n\nDefault settings: Time Cap: 8 h, Interval: 30 min, Factor: 0.5, Delay 60 min" = "Consenti di convertire grassi e proteine in futuri equivalenti di carboidrati utilizzando la formula di Varsavia di chilocalorie divisi per 10.\n\nQuesto diffonde gli equivilanti del carb per un'impostazione di durata massima che può essere configurata da 5-12 ore.\n\nIl ritardo è tempo da ora fino al primo ingresso futuro del carb.\n\nL'intervallo in pochi minuti è il numero di minuti tra le voci. Più breve è l'intervallo, più liscia il risultato. 10, 15, 20, 30 o 60 sono scelte ragionevoli.\n\nIl fattore di aggiustamento è il peso che il grasso e la proteina hanno sulle voci. 1.0 è effetto pieno (metodo di Varsavia originale) e 0. è a metà effetto. Nota che potresti scoprire che il tuo normale rapporto carboidrati deve aumentare ad un numero maggiore se inizi ad aggiungere voci di grasso e proteine. Per questo motivo, è meglio iniziare con un fattore di circa 0,5 per facilitare in esso.\n\nImpostazioni predefinite: Limite temporale: 8 h, Intervallo: 30 min, Fatto: 0.5, Ritardo 60 min"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Abilita ISF Dinamico"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calcola un nuovo ISF per ogni ciclo di loop. Il nuovo ISF sarà basato sulla glicemia attuale, sulla TDD dell’insulina (oltre 24 ore o media ponderata) e su un fattore di aggiustamento (valore predefinito è 1).\n\nI rapporti ISF e CR dinamici saranno limitati dai tuoi limiti autosens.min/max.\n\nIl rapporto dinamico sostituisce il rapporto autosens.ratio: New ISF = rapporto statico ISF / dinamico,\nRapporto dinamico = profilo. ens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinuti"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcola una nuova impostazione di sensibilità all'insulina (ISF) per ogni ciclo. La nuova sensibilità sarà basata sulla tua attuale Glicemia e sulla dose totale giornaliera d'insulina (TDD, cioè tutta l’insulina erogata nelle ultime 24 ore) e un fattore di aggiustamento individuale (raccomandazione di iniziare con 0, se si utilizza la funzione Sigmoid e di 0,8 se non lo è).\n\nTutte le regolazioni dinamiche ISF e CR saranno limitate dai limiti autosens.min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Abilita CR Dinamico"; @@ -2059,8 +2059,9 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Regola i rapporti dinamici della costante ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max. Per la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5. Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti -Regola la costante ISF dinamica"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Regola i rapporti dinamici di una costante. Il valore predefinito è 0,5. Più alto è il valore, maggiore sarà la correzione del tuo ISF per una glicemia alta o bassa. La correzione massima è determinata dalle impostazioni Autosens min/max.\n\nPer la funzione sigmoidea si consiglia di iniziare con un fattore di correzione di 0,4 - 0,5.\n\n Per la formula logaritmica c'è meno consenso, ma iniziare con 0,5 - 0,8 è più appropriato per la maggior parte degli utenti adulti. +Per gli utenti più giovani si consiglia di iniziare con un dosaggio ancora più basso quando si utilizza la formula logaritmica, per evitare un trattamento eccessivamente aggressivo. +Regola la costante ISF dinamica."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Usa Funzione Sigmoid"; @@ -2077,8 +2078,23 @@ Regola la costante ISF dinamica"; /* Headline Threshold Setting */ "Threshold Setting" = "Impostazione soglia"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "La soglia predefinita in FAX dipende dall'attuale obiettivo di glicemia minima, come segue:\n\nSe il vostro obiettivo minimo di glicemia = 90 mg/dl -> soglia = 65 mg/dl,\n\nse obiettivo minimo di glicemia = 100 mg/dl -> soglia = 70 mg/dl,\n\nobiettivo minimo di glicemia = 110 mg/dl -> soglia = 75 mg/dl,\n\ne se obiettivo minimo di glicemia = 130 mg/dl -> soglia = 85 mg/dl.\n\nQuesta impostazione ti permette di cambiare il valore predefinito ad una soglia più alta per il looping con dynISF. Valori validi sono 65 mg/dl<= Impostazione soglia <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Impostazioni Soglia Minima"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Questa impostazione consente di scegliere un livello al di sotto del quale non verrà somministrata insulina.\n\nLa soglia utilizza la maggior parte dell'impostazione della soglia e della soglia calcolata:\n\nTarget Glicemia - (Target Glicemia - 40) / 2\n, qui usando mg/dl come unità della glicemia.\n\nPer esempio, se il tuo Target Glicemia è "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "la soglia sarà "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "a meno che l'impostazione della soglia non sia impostata su un valore più alto:"; + +/* Threshold Table Columns Title */ +"Setting" = "Impostazioni"; + +/* Threshold Table Columns Title */ +"Threshold" = "Soglia"; /* Header */ "Calculator settings" = "Impostazioni calcolatore"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 724b172518..6a6df4e71c 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiver dynamisk ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Beregn ny ISF ved hver loop-syklus. Ny ISF vil baseres på nåværende BS, TDD med insulin (siste 24 timer eller vektet gjennomsnitt) og en justeringsfaktor (standardverdi er 1).\n\nDynamisk ISF og CR-ratier vil bli begrenset av dine autosens-innstillinger.\n\nDynamisk ratio erstatter autosens-ratio: Ny ISF = Statisk ISF / Dyamisk ratio,\nDynamisk ratio = profile.sens * adjustmentFactor * tdd * Math.log(BS/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Juster dynamisk forholdstall med en konstant. Standard er 0,5. Jo høyere verdien er, jo større blir korreksjonen av ISF ved høyt eller lavt BS. Maksimal korrigering bestemmes av min/maks innstillingene for Autosens. For Sigmoidfunksjon anbefales det å starte en justeringsfaktor på 0,4-0,5. For den logaritmiske formelens er det mindre konsensus, men å starte med 0.5 – 0,8 er anbefalt for de fleste brukere"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Standard terskel i FAX er avhengig av ditt nåværende laveste BS-mål, som følger:\n\nDersom ditt laveste BS-mål = 90 mg/dL -> terskel = 65 mg/dL,\n\ndersom laveste BS-mål = 100 mg/dL -> terskel = 70 mg/dL,\n\nlaveste BS-mål = 110 mg/dL -> terskel = 75 mg/dL,\n\nog dersom laveste BS-mål = 130 mg/dL -> terskel = 85 mg/dL.\n\nDenne innstillingen tillater deg å endre til en høyere terskel for å loope med dynamisk ISF. Gyldige verdier er 65 mg/dL <= terskel-innstilling <= 120 mg/dL."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index aad07472fd..87b02f8f1a 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2041,11 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dynamische ISF inschakelen"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Bereken bij elke loopcyclus een nieuwe ISF (Insulin Sensitivity Factor). De nieuwe ISF wordt bepaald door de huidige bloedsuikerspiegel (BG), de totale dagelijkse dosis insuline (TDD) van de afgelopen 24 uur of een gemiddelde daarvan, en een aanpassingsfactor (standaard 1). De dynamische ISF en CR (Carb Ratio) worden beperkt door de minimum- en maximumwaarden die zijn ingesteld in uw autosens.min/max grenzen. De dynamische ratio vervangt de autosens.ratio:/n/n -Nieuwe ISF = Statische ISF / Dynamische ratio, -Dynamische ratio = profielgevoeligheid * aanpassingsfactor * TDD * Logaritme (BG/insulineFactor+1) / 1800, -InsulineFactor = 120 - Tijd tot insulinepiek in minuten./n/n -Eenvoudiger gezegd, het systeem past de insulinegevoeligheid aan op basis van je recente insulinegebruik en huidige bloedsuikerspiegel. De aanpassingen zijn beperkt binnen bepaalde grenzen die je hebt ingesteld"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; @@ -2067,7 +2063,7 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Verander de dynamische verhoudingen met een vaste waarde, die standaard op 0,5 staat. Als je deze waarde verhoogt, zal de aanpassing van je ISF voor hoge of lage bloedsuikerwaarden groter zijn. De grootte van de correctie is beperkt door de instellingen voor Autosens min/max. Voor de Sigmoid-functie wordt een startwaarde van 0,4 tot 0,5 aanbevolen. Voor de logaritmische formule is er geen vastgestelde norm, maar voor de meeste gebruikers is een waarde tussen 0,5 en 0,8 passender."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; @@ -2084,8 +2080,23 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* Headline Threshold Setting */ "Threshold Setting" = "Grenswaarde instellingen"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "De standaard drempelwaarde in iAPS hangt af van je huidige minimum bloedsuikerdoel. Hier is hoe het werkt:\n\n Als je minimum doel 5,0 mmol/l is, dan is de drempel 3,6 mmol/l. Bij een minimum doel van 5,5 mmol/l, wordt de drempel 3,8 mmol/l. Als je minimum doel 6,1 mmol/l is, blijft de drempel 3,8 mmol/l. Bij een minimum doel van 7,2 mmol/l, wordt de drempel 4,7 mmol/l.\n\nJe kunt deze instelling aanpassen en een hogere drempelwaarde kiezen voor het herhalen met dynISF. De geldige waarden hiervoor zijn tussen 3,6 mmol/l en 6,6 mmol/l."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator instellingen"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index d8e4c41e7e..e7bb926255 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2043,7 +2043,7 @@ Połączono z Nightscout!"; "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2061,7 +2061,7 @@ Połączono z Nightscout!"; "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2078,8 +2078,23 @@ Połączono z Nightscout!"; /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index 6e72e14f32..a620815e38 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index a8b0c751d7..1b63e5822d 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index e023b85790..badc315556 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включить динамический ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Считать новый ISF с каждым циклом петли. Новый ISF будет зависеть от текущего BG, TDD (за последние 24 часа или взвешенное среднее значение) и Adjustment Factor (по-умолчанию - 1).\n\nDynamic ratio ISF и CR будет ограничен настройками autosens.min/max.\n\nDynamic ratio заменяет autosens.ratio: Новый ISF = Постоянный ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включить динамический CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Отрегулируйте динамические коэффициенты на постоянную величину. Значение по умолчанию равно 0.5. Чем выше значение, тем больше будет коррекция вашего ISF для высокого или низкого BG. Максимальная коррекция определяется настройками Auto sens min/max. Для сигмовидной функции рекомендуется для начала использовать коэффициент регулировки 0.4 - 0.5. В отношении логарифмической формулы консенсуса меньше, но большинству пользователей более подходит начинать с 0.5 - 0.8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Настройка порога"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Порог, в мг/дл, в FAX по-умолчанию зависит от Вашей текущей минимальной цели BG, следующим образом:\n\nЕсли минимальная цель BG = 5 ммоль/л -> порог = 3,6 ммоль/л,\n\nесли минимальная цель BG = 5.6 ммоль/л -> порог = 3,9 ммоль/л,\n\nминимальная цель BG = 6.1 ммоль/л -> порог = 4,2 ммоль/л,\n\nи если минимальная цель BG = 7.2 ммоль/л -> порог = 4,7 ммоль/л.\n\nЭта настройка позволяет Вам увеличить уровень порога для более безопасной работы с dynISF. Валидным будет значение 65 мг/дл=3,6 ммоль/л <= Threshold Setting <= 120 мг/дл=6,7 ммоль/л."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Настройки калькулятора"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index 1081e776e4..b6b881ed4a 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Pri každom cykle slučky vypočítajte novú hodnotu ISF. Nový ISF bude založený na aktuálnom BG, TDD inzulínu (posledných 24 hodín alebo vážený priemer) a korekčnom faktore (predvolená hodnota je 1).\n\nDynamický pomer ISF a CR bude obmedzený limitmi autosens.min/max.\n\nDynamický pomer nahrádza autosens.pomer: Nový ISF = statický ISF / dynamický pomer,\nDynamický pomer = profil.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Upravte dynamické pomery pomocou konštanty. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF pre vysoký alebo nízky BG. Maximálna korekcia je určená nastavením min/max v položke Autosens. Pre funkciu Sigmoid sa na začiatku odporúča korekčný faktor 0,4 - 0,5. Pre logaritmický vzorec existuje menej konsenzu, ale pre väčšinu používateľov je vhodnejšie začať s 0,5 - 0,8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Nastavenie prahové hodnoty"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Predvolená prahová hodnota v iAPS závisí od vašej aktuálnej minimálnej cieľovej hodnoty BG nasledovne:\n\nAk je vaša minimálna cieľová hodnota BG = 90 mg/dl -> prahová hodnota = 65 mg/dl,\n\nak je vaša minimálna cieľová hodnota BG = 100 mg/dl -> prahová hodnota = 70 mg/dl,\n\nminimálna cieľová hodnota BG = 110 mg/dl -> prahová hodnota = 75 mg/dl,\n\na ak je vaša minimálna cieľová hodnota BG = 130 mg/dl -> prahová hodnota = 85 mg/dl. \n\nToto nastavenie umožňuje zmeniť predvolenú hodnotu na vyššiu prahovú hodnotu pre slučku s dynISF. Platné hodnoty sú 65 mg/dl<= Nastavenie prahu <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Nastavenia výpočtu"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 7adb94b56f..2c33798b57 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktivera dynamisk insulinkänslighet (ISF)"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny ISF (insulinkänslighet) beräknas på nuvarande blodsocker, TDD (insulin senaste 24 timmarna, eller ett viktad genomsnitt) och AF-konstant (standardvärde är 1).\n\nDynamiska ISF och CR (kolhydratkvot) kvoter begränsas av dina autosens.min/max-inställningar.\n\nDynamiska kvoterna ersätter autosens-kvoten: Ny ISF =inställd ISF / dynamisk kvot,\nDynamisk kvot = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - tiden, i minuter, för insulinets maximala blodsockersänkande effekt."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de seanst 24timmarna och en individuell juseringsfaktor (du rekommenderas att börja med 0.5 om du använder S-formad funktion, annars 0.8).\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Ändra AF-konstant"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuell justering av hur din insulinkänslighet och insulinkvot räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering. Maximal och minimal insulinkänslighet och insulinkvot bestäms av dina Autosens-min/max-inställningar och av dina schemalagda profilinställningar.\n\nFör S-formad dynamisk inställning rekommenderas att börja med 0.3-0-4.\n\n För logaritmisk inställning rekommenderas att börja med 0.5-0.8"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuell justering av hur din insulinkänslighet och insulinkvot (om du använder dyamisk insulinkvot) räknas ut. Stnadarvärde är 0.5. Ett högre värde betyder mer aggressiv justering.\n\nFör S-formad dynamisk inställning rekommendaras att börja med 0.3-0-4. För logaritmisk inställning rekommenderas att börja med 0.5-0.8."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Använd S-formad dynamisk insulinkänslighet"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 4ffd98717f..b4a9248768 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dinamik İDF Etkinleştir"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Her döngü döngüsünde yeni bir İDF hesaplayın. Yeni İDF, mevcut BG'ye dayalı olacaktır, GTD'unuz (son 24 saat veya ağırlıklı bir ortalama) ve bir Ayarlama Faktörüne (varsayılan 1'dir) dayalı olacaktır.\n\nDinamik İDF ve KHO oranları, autosens.min/maks limitlerinizle sınırlanacaktır. .\n\nDinamik oran, autosens.ratio'nun yerini alır: Yeni İDF = Statik İDF / Dinamik oran,\nDynamic oran = profile.sens * AdjustFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - İnsülinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dinamik KHO Etkinleştir"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dinamik İDF sabitini ayarla"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid Fonksiyonunu Kullan"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 1de4e5eaca..6ef3bb0c83 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включити Динамічний ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Вважати новий ISF з кожним циклом петлі. Новий ISF буде залежати від поточного BG, TDD (за останні 24 години або зважене середнє значення) та Adjustment Factor (за замовчуванням - 1). nDynamic ratio замінює autosens.ratio: Новий ISF = Постійний ISF/ Dynamic ratio,\nDynamic ratio = profile.sens*adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPe"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Налаштуйте динамічні коефіцієнти за константою. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF для високого або низького рівня ГК. Максимальна корекція визначається параметрами min/max Автосенс. Для сигмоподібної функції спочатку рекомендується коригуючий коефіцієнт 0,4 - 0,5. Для логарифмічної формули threre є менш узгодженим, але починати з 0,5 - 0,8 є більш прийнятним для більшості користувачів"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; @@ -2076,8 +2076,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Порогове значення"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Поріг, мг/дл, у FAX за замовчуванням залежить від Вашої поточної мінімальної мети BG, таким чином:\n\nЯкщо мінімальна мета BG = 5 ммоль/л -> поріг = 3,6 ммоль/л,\n\n мінімальна мета BG = 5.6 ммоль/л -> поріг = 3,9 ммоль/л, мінімальна мета BG = 6.1 ммоль/л -> поріг = 4,2 ммоль/л, якщо мінімальна мета BG = 7.2 ммоль/л -> поріг = 4,7 ммоль/л.\n\nЦе налаштування дозволяє збільшити рівень порога для більш безпечної роботи з dynISF. Валідним буде значення 65 мг/дл = 3,6 ммоль/л <= Threshold Setting <= 120 мг/дл = 6,7 ммоль/л."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Налаштування калькулятора"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 1845ea4972..9c343ba5ba 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -390,13 +390,13 @@ Enact a temp Basal or a temp target */ "Settings imported" = "Các cấu hình đã được cập nhật"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Sai khác đơn vị Glucose giữa Nightscout và Bơm. Cập nhật cấu hình bị bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Cập nhật cấu hình bị hủy bỏ."; /* Import Error */ -"Can't find the default Nightscout Profile." = "Không thể tìm thấy Profile Nightscout mặc định."; +"Can't find the default Nightscout Profile." = "Không thể tìm thấy Hồ sơ Nightscout mặc định."; /* Add Blood Glucose Test, header */ -"Blood Glucose Test" = "Xét nghiệm đường huyết"; +"Blood Glucose Test" = "Kiểm tra đường huyết"; /* Add Medtronic pump */ "Add Medtronic" = "Thêm Medtronic"; @@ -948,7 +948,7 @@ Enact a temp Basal or a temp target */ "Some ui element was incorrectly specified" = "Một vài yếu tố ui đã không được chỉ định"; /* */ -"Success" = "Success"; +"Success" = "Thành công"; /* */ "Schedules were saved successfully!" = "Lịch trình được lưu thành công!"; @@ -1404,7 +1404,7 @@ Enact a temp Basal or a temp target */ "Save and continue" = "Lưu và tiếp tục"; /* */ -"Save as Preset" = "Lưu mẫu cài đặt"; +"Save as Preset" = "Lưu cài đặt sẵn"; /* */ "Predictions" = "Dự đoán"; @@ -1487,9 +1487,6 @@ Enact a temp Basal or a temp target */ /* */ "Deactivating..." = "Đang hủy kích hoạt..."; -/* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; - "Pair Pod" = "Kết nối Pod"; /* Text for previous pod information row */ @@ -2045,7 +2042,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Tính toán ISF mới với mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên BG, TDD hiện tại của insulin (24 giờ qua hoặc mức trung bình có trọng số) và Hệ số điều chỉnh (mặc định là 1).\n\nTỷ lệ ISF và CR động sẽ bị giới hạn bởi giới hạn autosens.min/max của bạn.\n\nTỷ lệ động thay thế tỷ lệ autosens: ISF mới = ISF tĩnh / Tỷ lệ động,\nTỷ lệ động = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD, tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Kích hoạt CR động"; @@ -2063,7 +2060,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Điều chỉnh hằng số ISF động"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Điều chỉnh tỷ lệ động theo một hằng số. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF của bạn sẽ càng lớn đối với BG cao hay thấp. Hiệu chỉnh tối đa được xác định bởi cài đặt tối thiểu/tối đa của Autosens. Đối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu. Đối với công thức logarit, thre có ít sự đồng thuận hơn, nhưng bắt đầu bằng 0,5 - 0,8 thì phù hợp hơn với hầu hết người dùng"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Điều chỉnh riêng các tỷ lệ động được tính toán. Mặc định là 0,5. Giá trị càng cao thì mức điều chỉnh ISF/CR của bạn đối với mức đường huyết cao hay thấp càng lớn. Hiệu chỉnh tối đa/tối thiểu được xác định bởi cài đặt tối thiểu/tối đa của Autosens.\n\nĐối với hàm Sigmoid, hệ số điều chỉnh được khuyến nghị là 0,4 - 0,5 để bắt đầu.\n\nĐối với công thức logarit, có ít sự đồng thuận hơn, nhưng bắt đầu từ khoảng 0,8 là có lẽ phù hợp với hầu hết người dùng trưởng thành. Đối với người dùng trẻ tuổi, nên bắt đầu ở mức thấp hơn nữa khi sử dụng công thức logarit để tránh điều trị quá tích cực."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sử dụng hàm Sigmoid (SF)"; @@ -2080,8 +2077,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Cài đặt ngưỡng"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "Ngưỡng mặc định trong FAX tùy thuộc vào mục tiêu BG tối thiểu hiện tại của bạn, như sau:\n\nNếu mục tiêu BG tối thiểu của bạn = 90 mg/dl -> ngưỡng = 65 mg/dl,\n\nif mục tiêu BG tối thiểu = 100 mg/dl -> ngưỡng = 70 mg/dl,\n\nmục tiêu BG tối thiểu = 110 mg/dl -> ngưỡng = 75 mg/dl,\n\nand nếu mục tiêu BG tối thiểu = 130 mg/dl -> ngưỡng = 85 mg/dl.\n\nCài đặt này cho phép bạn thay đổi mặc định thành ngưỡng lặp cao hơn cho vòng lặp với dynISF. Giá trị hợp lệ là 65 mg/dl<= Cài đặt ngưỡng <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Cài đặt ngưỡng tối thiểu"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Cài đặt này cho phép bạn chọn mức dưới đó sẽ không cung cấp insulin.\n\nNgưỡng này sử dụng lượng lớn nhất trong cài đặt ngưỡng của bạn và ngưỡng được tính toán:\n\nGlucose mục tiêu - (Glucose mục tiêu - 40) "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "ngưỡng sẽ là "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "trừ khi cài đặt ngưỡng của bạn được đặt cao hơn:"; + +/* Threshold Table Columns Title */ +"Setting" = "Thiết lập"; + +/* Threshold Table Columns Title */ +"Threshold" = "Ngưỡng"; /* Header */ "Calculator settings" = "Thiết lập tính toán"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 913fd01e52..5e6f83a84a 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2043,7 +2043,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Enable Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes" = "Calculate a new ISF with every loop cycle. New ISF will be based on current BG, TDD of insulin (past 24 hours or a weighted average) and an Adjustment Factor (default is 1).\n\nDynamic ISF and CR ratios will be limited by your autosens.min/max limits.\n\nDynamic ratio replaces the autosens.ratio: New ISF = Static ISF / Dynamic ratio,\nDynamic ratio = profile.sens * adjustmentFactor * tdd * Math.log(BG/insulinFactor+1) / 1800,\ninsulinFactor = 120 - InsulinPeakTimeInMinutes"; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Enable Dynamic CR"; @@ -2061,7 +2061,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Adjust Dynamic ISF constant"; /* Adjust Dynamic ISF constant */ -"Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula there is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users" = "Adjust Dynamic ratios by a constant. Default is 0.5. The higher the value, the larger the correction of your ISF will be for a high or a low BG. Maximum correction is determined by the Autosens min/max settings. For Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with. For the logaritmic formula threre is less consensus, but starting with 0.5 - 0.8 is more appropiate for most users"; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Use Sigmoid Function"; @@ -2078,8 +2078,23 @@ Enact a temp Basal or a temp target */ /* Headline Threshold Setting */ "Threshold Setting" = "Threshold Setting"; -/* Threshold Setting */ -"The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl." = "The default threshold in FAX depends on your current minimum BG target, as follows:\n\nIf your minimum BG target = 90 mg/dl -> threshold = 65 mg/dl,\n\nif minimum BG target = 100 mg/dl -> threshold = 70 mg/dl,\n\nminimum BG target = 110 mg/dl -> threshold = 75 mg/dl,\n\nand if minimum BG target = 130 mg/dl -> threshold = 85 mg/dl.\n\nThis setting allows you to change the default to a higher threshold for looping with dynISF. Valid values are 65 mg/dl<= Threshold Setting <= 120 mg/dl."; +/* Dynamic ISF Setting Title */ +"Minimum Threshold Setting" = "Minimum Threshold Setting"; + +/* Minimum Threshold Setting, Part 1 */ +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; + +/* Minimum Threshold Setting, Part 2 */ +"the threshold will be " = "the threshold will be "; + +/* Minimum Threshold Setting, Part 3 */ +"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; + +/* Threshold Table Columns Title */ +"Setting" = "Setting"; + +/* Threshold Table Columns Title */ +"Threshold" = "Threshold"; /* Header */ "Calculator settings" = "Calculator settings"; From 97a8cc3eeb7e87b2f43c469d42f6cae1f49f0281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 23 Jan 2024 16:24:05 +0100 Subject: [PATCH 368/405] Dont display the temporary cryptic test logs (clutter) created during development of Autosens. Keep the other Autosens logging. --- FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift b/FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift index 66991b2b6f..5715fc7244 100644 --- a/FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift +++ b/FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift @@ -20,7 +20,9 @@ final class JavaScriptWorker { } } let consoleLog: @convention(block) (String) -> Void = { message in - debug(.openAPS, "JavaScript log: \(message)") + if message.count > 3 { // Remove the cryptic test logs created during development of Autosens + debug(.openAPS, "JavaScript log: \(message)") + } } context.setObject( From 7fbed0a28541056e89c94a8958614f45485f0a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 23 Jan 2024 19:38:12 +0100 Subject: [PATCH 369/405] Health Store. A Fix for deletion of carbs (finally ?)! And added logging. --- .../Services/HealthKit/HealthKitManager.swift | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 771db753ed..5681336f18 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -610,23 +610,22 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P checkAvailabilitySave(objectTypeToHealthStore: sampleType) else { return } - print("meals 4: ID: " + syncID + " FPU ID: " + fpuID) - - if syncID != "" { + if syncID.count > 2 { let predicate = HKQuery.predicateForObjects( withMetadataKey: HKMetadataKeySyncIdentifier, operatorType: .equalTo, value: syncID ) - - healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, int, error in + if let error = error { + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } else if success { + debug(.service, "\(int) carb entries with ID: " + syncID + " deleted from Health Store", printToConsole: true) + } } } - if fpuID != "" { - // processQueue.async { + if fpuID.count > 2 { let recentCarbs: [CarbsEntry] = carbsStorage.recent() let ids = recentCarbs.filter { $0.fpuID == fpuID }.compactMap(\.id) let predicate = HKQuery.predicateForObjects( @@ -634,11 +633,13 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P allowedValues: ids ) print("found IDs: " + ids.description) - healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error) + healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, int, error in + if let error = error { + warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error) + } else if success { + debug(.service, "\(int) carb entries with ID: " + syncID + " deleted from Health Store", printToConsole: true) + } } - // } } } From c994dfab7740badd6c100bb0535e9260c7a7b4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 23 Jan 2024 20:20:43 +0100 Subject: [PATCH 370/405] Health Store. Deletion of insulin and glucose. Add logging. --- .../Services/HealthKit/HealthKitManager.swift | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 5681336f18..5d05f73446 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -595,9 +595,12 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P value: syncID ) - self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, int, error in + if let error = error { + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } else if success { + debug(.service, "\(int) glucose entries deleted from Health Store", printToConsole: true) + } } } } @@ -662,9 +665,12 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P value: syncID ) - self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, int, error in + if let error = error { + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } else if success { + debug(.service, "\(int) insulin entries with ID: \(syncID) deleted from Health Store", printToConsole: true) + } } } } From b04966d8f06957015ba22a9197df75f5a78c2f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 02:27:16 +0100 Subject: [PATCH 371/405] Crowdin updates (#492) --- .../Localizations/nl.lproj/Localizable.strings | 2 +- .../Localizations/uk.lproj/Localizable.strings | 2 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/uk.lproj/Localizable.strings | 2 +- .../Main/fr.lproj/Localizable.strings | 4 ++-- .../Main/nl.lproj/Localizable.strings | 16 ++++++++-------- .../Main/sv.lproj/Localizable.strings | 2 +- .../Main/uk.lproj/Localizable.strings | 16 ++++++++-------- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 881f5336ee..cc91e4615e 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Deactiveer Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Slide om canule in te brengen"; /* */ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index a3b979e047..dbe612a8e7 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Деактивувати Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Готовий до введення канюлі"; /* */ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index e6ee4e0279..4e23a9dec5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -187,7 +187,7 @@ "Deactivate Pod" = "Deactiveer Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Slide om canule in te brengen"; /* */ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 9e62b51b0b..a93b964fd9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -187,7 +187,7 @@ "Deactivate Pod" = "Деактивувати Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Готовий до введення канюлі"; /* */ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index a01b39e3e8..f0b1df0e98 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2077,7 +2077,7 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Réglage du seuil"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Réglage du seuil minimal"; /* Minimum Threshold Setting, Part 1 */ "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; @@ -2092,7 +2092,7 @@ Enact a temp Basal or a temp target */ "Setting" = "Paramètre"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Seuil"; /* Header */ "Calculator settings" = "Réglages de la calculatrice"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 87b02f8f1a..10d1df295c 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dynamische ISF inschakelen"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Bereken een nieuwe instelling voor de insulinegevoeligheid (ISF) bij elke cyclus van de loop. De nieuwe ISF wordt gebaseerd op je huidige glucose, totale dagelijkse dosis insuline (TDD, afgelopen 24 uur van alle toegediende insuline) en een individuele aanpassingsfactor (aanbevolen wordt om te beginnen met 0,5 als u de Sigmoid-functie gebruikt en 0,8 als dat niet het geval is).\n\nAlle dynamische ISF- en CR-aanpassingen worden beperkt door je autosens.min/max-limieten."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; @@ -2063,7 +2063,7 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuele aanpassing van de berekende dynamische verhoudingen. De standaardwaarde is 0,5. Hoe hoger de waarde, hoe groter de correctie van je ISF/CR zal zijn voor een hoge of lage bloedglucosewaarde.\n\nDe maximale/minimale correctie wordt bepaald door de Autosens min/max instellingen.\\Voor de Sigmoid functie wordt een aanpassingsfactor van 0.4 - 0.5 aanbevolen om mee te beginnen.n\nVoor de logaritmische formule is er minder overeenstemming, maar beginnen rond de 0.8 is waarschijnlijk goed voor de meeste volwassen gebruikers. Voor jongere gebruikers is het aan te raden om nog lager te beginnen met de logaritmische formule, om een te agressieve behandeling te voorkomen."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; @@ -2081,22 +2081,22 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Threshold Setting" = "Grenswaarde instellingen"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Instelling minimale grenswaarde"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Met deze instelling kun je een grenswaarde kiezen waaronder geen insuline wordt toegediend. De grenswaarde is de grootste waarde van je grenswaarde-instelling en de berekende grenswaarde: \n\nStreefwaarde Glucose - (Streefwaarde Glucose - 2,2) / 2 = 1,1) \n---> hier met mmol/l als glucose-eenheid "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "de grenswaarde wordt "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "tenzij uw grenswaarde hoger is ingesteld:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Instelling"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Grenswaarde"; /* Header */ "Calculator settings" = "Calculator instellingen"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 2c33798b57..09e835cd38 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktivera dynamisk insulinkänslighet (ISF)"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de seanst 24timmarna och en individuell juseringsfaktor (du rekommenderas att börja med 0.5 om du använder S-formad funktion, annars 0.8).\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de senaste 24 timmarna och en individuell justeringsfaktor.\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 6ef3bb0c83..a7cc1ea426 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включити Динамічний ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Обчислюйте новий параметр чутливості до інсуліну (ISF) після кожного циклу Петлі. Новий ISF базуватиметься на вашій поточній глюкозі, загальній добовій дозі інсуліну (TDD, останні 24 години всього доставленого інсуліну) та індивідуальному коригуючому факторі (рекомендація для початку становить 0,5, якщо використовується сигмоподібна функція, і 0,8, якщо ні).\\ n\nУсі налаштування Dynamic ISF і CR будуть обмежені вашими обмеженнями autosens.min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Індивідуальне налаштування розрахованих динамічних коефіцієнтів. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF/CR для високого або низького рівня глюкози в крові. Максимальна/мінімальна корекція визначається мінімальними/максимальними налаштуваннями Autosens.\n\nДля сигмоїдної функції спочатку рекомендується коригувальний коефіцієнт 0,4–0,5.\n\nДля логаритмічної формули три є менш узгодженими, але починаючи приблизно з 0,8 ймовірно підходить для більшості дорослих користувачів. Для молодших користувачів рекомендується починати ще нижче при використанні логарифмічної формули, щоб уникнути занадто агресивного лікування."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; @@ -2077,22 +2077,22 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Порогове значення"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Налаштування Мінімального Порогу"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Цей параметр дає змогу вибрати рівень, нижче якого інсулін не вводитиметься.\n\nПорогове значення використовує найбільшу кількість вашого порогового налаштування та обчисленого порогу:\n\nЦільовий рівень глюкози - (Цільовий рівень глюкози - 40) / 2\n , тут використовується мг/дл як одиниця глюкози.\n\nНаприклад, якщо ваш цільовий рівень глюкози"; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "поріг буде"; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "якщо ваше порогове значення не встановлено вище:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Налаштування"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Поріг"; /* Header */ "Calculator settings" = "Налаштування калькулятора"; From 78574b8754ef62464543e332df6d1768ec25b6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 06:51:41 +0100 Subject: [PATCH 372/405] Update version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 2c33bae717..fc3d48a46a 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.3 +APP_VERSION = 2.7.4 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 59bdf02a4067cd9e4b23ef76783b4c250f579dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 27 Jan 2024 21:24:43 +0100 Subject: [PATCH 373/405] Bug Fixes * Nightscout delete carbs and FPUs. * Fetch Carbs from Nightscout. * Refactor Bolus/Add Meal View to work with deletion of carbs and FPUs. * Revert hard coded backgroundTask, to prevent eventual issues fetching from Health Store. Not sure if actually needed yet. Test. * Revert PR #475 by dnzxy, due to MBs of excessive inexpedient logging. Only log errors. * Health Store fixes (part 1 and 2 already merged into dev). Proper deletion from Health Store of carbs and FPUs seems to be working now. --- Config.xcconfig | 2 +- FreeAPS/Sources/APS/APSManager.swift | 35 ++++--- FreeAPS/Sources/APS/FetchGlucoseManager.swift | 53 ++++++----- .../Sources/APS/Storage/CarbsStorage.swift | 4 +- .../Modules/Bolus/BolusStateModel.swift | 33 +++---- .../View/AlternativeBolusCalcRootView.swift | 4 +- .../Bolus/View/DefaultBolusCalcRootView.swift | 4 +- .../Services/HealthKit/HealthKitManager.swift | 42 ++------- .../Services/Network/NightscoutAPI.swift | 14 ++- .../Services/Network/NightscoutManager.swift | 91 ++++++++++++++++--- 10 files changed, 160 insertions(+), 122 deletions(-) diff --git a/Config.xcconfig b/Config.xcconfig index fc3d48a46a..f11b876ce0 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.4 +APP_VERSION = 2.7.5 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index ee8407eb91..7cdb6a9fe1 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -195,12 +195,14 @@ final class BaseAPSManager: APSManager, Injectable { return } - // start background time extension - backGroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "Loop starting") { - guard let backgroundTask = self.backGroundTaskID else { return } - UIApplication.shared.endBackgroundTask(backgroundTask) - self.backGroundTaskID = .invalid - } + /* + // start background time extension + backGroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "Loop starting") { + guard let backgroundTask = self.backGroundTaskID else { return } + UIApplication.shared.endBackgroundTask(backgroundTask) + self.backGroundTaskID = .invalid + } + */ debug(.apsManager, "Starting loop with a delay of \(UIApplication.shared.backgroundTimeRemaining.rounded())") @@ -270,10 +272,11 @@ final class BaseAPSManager: APSManager, Injectable { if let error = error { warning(.apsManager, "Loop failed with error: \(error.localizedDescription)") - if let backgroundTask = backGroundTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundTaskID = .invalid - } + /* + if let backgroundTask = backGroundTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundTaskID = .invalid + }*/ processError(error) } else { debug(.apsManager, "Loop succeeded") @@ -287,11 +290,13 @@ final class BaseAPSManager: APSManager, Injectable { reportEnacted(received: error == nil) } - // end of the BG tasks - if let backgroundTask = backGroundTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundTaskID = .invalid - } + /* + // end of the BG tasks + if let backgroundTask = backGroundTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundTaskID = .invalid + } + */ } private func verifyStatus() -> Error? { diff --git a/FreeAPS/Sources/APS/FetchGlucoseManager.swift b/FreeAPS/Sources/APS/FetchGlucoseManager.swift index 98da3c0765..88a5990f3f 100644 --- a/FreeAPS/Sources/APS/FetchGlucoseManager.swift +++ b/FreeAPS/Sources/APS/FetchGlucoseManager.swift @@ -101,19 +101,22 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { var filteredByDate: [BloodGlucose] = [] var filtered: [BloodGlucose] = [] - // start background time extension - var backGroundFetchBGTaskID: UIBackgroundTaskIdentifier? - backGroundFetchBGTaskID = UIApplication.shared.beginBackgroundTask(withName: "save BG starting") { - guard let bg = backGroundFetchBGTaskID else { return } - UIApplication.shared.endBackgroundTask(bg) - backGroundFetchBGTaskID = .invalid - } + /* + // start background time extension + var backGroundFetchBGTaskID: UIBackgroundTaskIdentifier? + backGroundFetchBGTaskID = UIApplication.shared.beginBackgroundTask(withName: "save BG starting") { + guard let bg = backGroundFetchBGTaskID else { return } + UIApplication.shared.endBackgroundTask(bg) + backGroundFetchBGTaskID = .invalid + } + */ guard allGlucose.isNotEmpty else { - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - } + /* + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + }*/ return } @@ -122,10 +125,11 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { guard filtered.isNotEmpty else { // end of the BG tasks - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - } + /* + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + }*/ return } debug(.deviceManager, "New glucose found") @@ -151,23 +155,18 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { nightscoutManager.uploadGlucose() - let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) } + // end of the BG tasks + /* + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + }*/ + let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) } guard glucoseForHealth.isNotEmpty else { - // end of the BG tasks - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - } return } healthKitManager.saveIfNeeded(bloodGlucose: glucoseForHealth) - - // end of the BG tasks - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - } } /// The function used to start the timer sync - Function of the variable defined in config diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index d9a65ebf58..86f64cac2f 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -161,7 +161,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { processQueue.sync { var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? [] - if fpuID != "" { + if fpuID.count > 3 { if allValues.firstIndex(where: { $0.fpuID == fpuID }) == nil { debug(.default, "Didn't find any carb equivalents to delete. ID to search for: " + fpuID.description) } else { @@ -173,7 +173,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { } } - if fpuID == "" || complex { + if fpuID.count < 3 || complex { if allValues.firstIndex(where: { $0.id == uniqueID }) == nil { debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description) } else { diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index 18eae0e84a..bf605708be 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -223,9 +223,16 @@ extension Bolus { } } - func backToCarbsView(complexEntry: Bool, _ meal: FetchedResults, override: Bool) { - delete(deleteTwice: complexEntry, meal: meal) - showModal(for: .addCarbs(editMode: complexEntry, override: override)) + // To do rewrite everything! Looking ridiculous now. + func backToCarbsView( + complexEntry: Bool, + _ meal: FetchedResults, + override: Bool, + deleteNothing: Bool, + editMode: Bool + ) { + if !deleteNothing { delete(deleteTwice: complexEntry, meal: meal) } + showModal(for: .addCarbs(editMode: editMode, override: override)) } func delete(deleteTwice: Bool, meal: FetchedResults) { @@ -233,30 +240,20 @@ extension Bolus { return } - var date = Date() - - if let mealDate = meals.actualDate { - date = mealDate - } else if let mealdate = meals.createdAt { - date = mealdate - } - let mealArray = DataTable.Treatment( units: units, type: .carbs, - date: date, + date: (deleteTwice ? (meals.createdAt ?? Date()) : meals.actualDate) ?? Date(), id: meals.id ?? "", isFPU: deleteTwice ? true : false, fpuID: deleteTwice ? (meals.fpuID ?? "") : "" ) - print( - "meals 2: ID: " + mealArray.id.description + " FPU ID: " + (mealArray.fpuID ?? "") - .description - ) - if deleteTwice { - nsManager.deleteCarbs(mealArray, complexMeal: true) + nsManager.deleteNormalCarbs(mealArray) + nsManager.deleteFPUs(mealArray) + } else { + nsManager.deleteNormalCarbs(mealArray) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 6bea22e3ab..37dad98800 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -320,9 +320,9 @@ extension Bolus { func carbsView() { if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: true, meal, override: false) + state.backToCarbsView(complexEntry: hasFatOrProtein, meal, override: false, deleteNothing: false, editMode: true) } else { - state.backToCarbsView(complexEntry: false, meal, override: true) + state.backToCarbsView(complexEntry: false, meal, override: true, deleteNothing: true, editMode: false) } } diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index f3dfd493c4..dbf8fa62d4 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -228,9 +228,9 @@ extension Bolus { func carbsView() { if fetch { keepForNextWiew = true - state.backToCarbsView(complexEntry: fetch, meal, override: false) + state.backToCarbsView(complexEntry: hasFatOrProtein, meal, override: false, deleteNothing: false, editMode: true) } else { - state.backToCarbsView(complexEntry: false, meal, override: true) + state.backToCarbsView(complexEntry: false, meal, override: true, deleteNothing: true, editMode: false) } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 5d05f73446..9c4eb68f84 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -168,18 +168,9 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P ] ) } - healthKitStore.save(samplesToSave) { (success: Bool, error: Error?) -> Void in - if success { - for sample in samplesToSave { - debug( - .service, - "Stored blood glucose \(sample.quantity) in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" - ) - } - } else { - debug(.service, "Failed to store blood glucose in HealthKit Store!") - debug(.service, error?.localizedDescription ?? "Unknown error") + if !success, let error = error { + debug(.service, "Failed to store blood glucose in HealthKit Store! Error: " + error.localizedDescription) } } } @@ -224,16 +215,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P } healthKitStore.save(samplesToSave) { (success: Bool, error: Error?) -> Void in - if success { - for sample in samplesToSave { - debug( - .service, - "Stored carb entry \(sample.quantity) in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" - ) - } - } else { - debug(.service, "Failed to store carb entry in HealthKit Store!") - debug(.service, error?.localizedDescription ?? "Unknown error") + if !success, let error = error { + debug(.service, "Failed to store carb entry in HealthKit Store! Error: " + error.localizedDescription) } } } @@ -261,8 +244,9 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P value: syncID ) self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in - guard let error = error else { return } - warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + if let error = error { + warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) + } } } let bolusTotal = bolus + bolusToModify @@ -301,16 +285,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P } healthKitStore.save(bolusSamples + basalSamples) { (success: Bool, error: Error?) -> Void in - if success { - for sample in bolusSamples + basalSamples { - debug( - .service, - "Stored insulin entry in HealthKit Store! Metadata: \(String(describing: sample.metadata?.values))" - ) - } - } else { - debug(.service, "Failed to store insulin entry in HealthKit Store!") - debug(.service, error?.localizedDescription ?? "Unknown error") + if !success, let error = error { + debug(.service, "Failed to store insulin entry in HealthKit Store! Error: " + error.localizedDescription) } } } diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 1994583dea..393710043f 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -141,22 +141,20 @@ extension NightscoutAPI { .eraseToAnyPublisher() } - func deleteCarbs(_ treatement: DataTable.Treatment) -> AnyPublisher { + func deleteCarbs(_ treatement: DataTable.Treatment, _isFPU: Bool) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme components.host = url.host components.port = url.port components.path = Config.treatmentsPath - var arguments = "find[id][$eq]" - if treatement.isFPU ?? false { - arguments = "find[fpuID][$eq]" - } - let value = !(treatement.isFPU ?? false) ? treatement.id : (treatement.fpuID ?? "") + let arguments = _isFPU ? "find[fpuID][$eq]" : "find[created_at][$eq]" + + let value = _isFPU ? (treatement.fpuID ?? "") : Formatter.iso8601withFractionalSeconds + .string(from: treatement.date) components.queryItems = [ - // Removed below because it prevented all futire entries to be deleted. Don't know why? - /* URLQueryItem(name: "find[carbs][$exists]", value: "true"), */ + URLQueryItem(name: "find[carbs][$exists]", value: "true"), URLQueryItem( name: arguments, value: value diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index c71d967bde..1f8a6c1432 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -10,6 +10,8 @@ protocol NightscoutManager: GlucoseSource { func fetchTempTargets() -> AnyPublisher<[TempTarget], Never> func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> func deleteCarbs(_ treatement: DataTable.Treatment, complexMeal: Bool) + func deleteNormalCarbs(_ treatement: DataTable.Treatment) + func deleteFPUs(_ treatement: DataTable.Treatment) func deleteInsulin(at date: Date) func deleteManualGlucose(at: Date) func uploadStatus() @@ -183,12 +185,10 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { return } - print("meals 3: ID: " + (treatement.id ?? "").description + " FPU ID: " + (treatement.fpuID ?? "").description) - var arg1 = "" var arg2 = "" if complexMeal { - arg1 = treatement.id ?? "" + arg1 = treatement.id arg2 = treatement.fpuID ?? "" } else if treatement.isFPU ?? false { arg1 = "" @@ -200,13 +200,22 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { healthkitManager.deleteCarbs(syncID: arg1, fpuID: arg2) if complexMeal { - nightscout.deleteCarbs(treatement) + carbsStorage.deleteCarbs(at: treatement.id, fpuID: treatement.fpuID ?? "", complex: true) + } else if treatement.isFPU ?? false { + carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + } else { + carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) + } + + if complexMeal { + // carbsStorage.deleteCarbs(at: treatement.id, fpuID: treatement.fpuID ?? "", complex: true) + nightscout.deleteCarbs(treatement, _isFPU: false) .collect() .sink { completion in - self.carbsStorage.deleteCarbs(at: treatement.id ?? "", fpuID: treatement.fpuID ?? "", complex: true) switch completion { case .finished: - debug(.nightscout, "Carbs deleted") + let value = !(treatement.isFPU ?? false) ? treatement.id : (treatement.fpuID ?? "") + debug(.nightscout, "Carbs with ID \(value) deleted from NS.") case let .failure(error): info( .nightscout, @@ -217,8 +226,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } receiveValue: { _ in } .store(in: &lifetime) - if (treatement.fpuID ?? "") != "" { - nightscout.deleteCarbs(treatement) + if (treatement.fpuID ?? "").count > 3 { + nightscout.deleteCarbs(treatement, _isFPU: true) .collect() .sink { completion in switch completion { @@ -235,10 +244,10 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { .store(in: &lifetime) } } else if treatement.isFPU ?? false { - nightscout.deleteCarbs(treatement) + // carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + nightscout.deleteCarbs(treatement, _isFPU: true) .collect() .sink { completion in - self.carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) switch completion { case .finished: debug(.nightscout, "Carb equivalents deleted") @@ -252,13 +261,13 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } receiveValue: { _ in } .store(in: &lifetime) } else { - nightscout.deleteCarbs(treatement) + // carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) + nightscout.deleteCarbs(treatement, _isFPU: false) .collect() .sink { completion in - self.carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) switch completion { case .finished: - debug(.nightscout, "Carbs deleted") + debug(.nightscout, "Carbs with Date \(treatement) deleted from NS.") case let .failure(error): info( .nightscout, @@ -271,6 +280,60 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } } + func deleteNormalCarbs(_ treatement: DataTable.Treatment) { + guard let nightscout = nightscoutAPI, isUploadEnabled else { + carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) + return + } + + carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) + + healthkitManager.deleteCarbs(syncID: treatement.id, fpuID: "") + + nightscout.deleteCarbs(treatement, _isFPU: false) + .collect() + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Carbs with Date \(treatement) deleted from NS.") + case let .failure(error): + info( + .nightscout, + "Deletion of carbs in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } + + func deleteFPUs(_ treatement: DataTable.Treatment) { + guard let nightscout = nightscoutAPI, isUploadEnabled else { + carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + return + } + + carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + + healthkitManager.deleteCarbs(syncID: "", fpuID: treatement.fpuID ?? "") + + nightscout.deleteCarbs(treatement, _isFPU: true) + .collect() + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Carb equivalents deleted from NS") + case let .failure(error): + info( + .nightscout, + "Deletion of carb equivalents in NightScout not done \n \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } + func deleteInsulin(at date: Date) { guard let nightscout = nightscoutAPI, isUploadEnabled else { pumpHistoryStorage.deleteInsulin(at: date) @@ -282,7 +345,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { switch completion { case .finished: self.pumpHistoryStorage.deleteInsulin(at: date) - debug(.nightscout, "Carbs deleted") + debug(.nightscout, "Insulin deleted from NS") case let .failure(error): debug(.nightscout, error.localizedDescription) } From d95e57d51ab957bab2aa935a44c2777e6c4113dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 29 Jan 2024 16:52:31 +0100 Subject: [PATCH 374/405] Revert. 24 hours Average loop duration 0.8 seconds faster with bacground task. Could very well be coincidental and n just 1, but the reason I removed the background task was a test to se if Health Store integrations would work better, which I don't see after testng for a few days. (cherry picked from commit 9468929382fcfd50e78283716635ad75422f35d8) --- FreeAPS/Sources/APS/APSManager.swift | 35 +++++++-------- FreeAPS/Sources/APS/FetchGlucoseManager.swift | 43 ++++++++----------- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index 7cdb6a9fe1..ee8407eb91 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -195,14 +195,12 @@ final class BaseAPSManager: APSManager, Injectable { return } - /* - // start background time extension - backGroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "Loop starting") { - guard let backgroundTask = self.backGroundTaskID else { return } - UIApplication.shared.endBackgroundTask(backgroundTask) - self.backGroundTaskID = .invalid - } - */ + // start background time extension + backGroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "Loop starting") { + guard let backgroundTask = self.backGroundTaskID else { return } + UIApplication.shared.endBackgroundTask(backgroundTask) + self.backGroundTaskID = .invalid + } debug(.apsManager, "Starting loop with a delay of \(UIApplication.shared.backgroundTimeRemaining.rounded())") @@ -272,11 +270,10 @@ final class BaseAPSManager: APSManager, Injectable { if let error = error { warning(.apsManager, "Loop failed with error: \(error.localizedDescription)") - /* - if let backgroundTask = backGroundTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundTaskID = .invalid - }*/ + if let backgroundTask = backGroundTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundTaskID = .invalid + } processError(error) } else { debug(.apsManager, "Loop succeeded") @@ -290,13 +287,11 @@ final class BaseAPSManager: APSManager, Injectable { reportEnacted(received: error == nil) } - /* - // end of the BG tasks - if let backgroundTask = backGroundTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundTaskID = .invalid - } - */ + // end of the BG tasks + if let backgroundTask = backGroundTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundTaskID = .invalid + } } private func verifyStatus() -> Error? { diff --git a/FreeAPS/Sources/APS/FetchGlucoseManager.swift b/FreeAPS/Sources/APS/FetchGlucoseManager.swift index 88a5990f3f..e163d53a0f 100644 --- a/FreeAPS/Sources/APS/FetchGlucoseManager.swift +++ b/FreeAPS/Sources/APS/FetchGlucoseManager.swift @@ -101,22 +101,19 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { var filteredByDate: [BloodGlucose] = [] var filtered: [BloodGlucose] = [] - /* - // start background time extension - var backGroundFetchBGTaskID: UIBackgroundTaskIdentifier? - backGroundFetchBGTaskID = UIApplication.shared.beginBackgroundTask(withName: "save BG starting") { - guard let bg = backGroundFetchBGTaskID else { return } - UIApplication.shared.endBackgroundTask(bg) - backGroundFetchBGTaskID = .invalid - } - */ + // start background time extension + var backGroundFetchBGTaskID: UIBackgroundTaskIdentifier? + backGroundFetchBGTaskID = UIApplication.shared.beginBackgroundTask(withName: "save BG starting") { + guard let bg = backGroundFetchBGTaskID else { return } + UIApplication.shared.endBackgroundTask(bg) + backGroundFetchBGTaskID = .invalid + } guard allGlucose.isNotEmpty else { - /* - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - }*/ + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + } return } @@ -125,11 +122,10 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { guard filtered.isNotEmpty else { // end of the BG tasks - /* - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - }*/ + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + } return } debug(.deviceManager, "New glucose found") @@ -156,11 +152,10 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable { nightscoutManager.uploadGlucose() // end of the BG tasks - /* - if let backgroundTask = backGroundFetchBGTaskID { - UIApplication.shared.endBackgroundTask(backgroundTask) - backGroundFetchBGTaskID = .invalid - }*/ + if let backgroundTask = backGroundFetchBGTaskID { + UIApplication.shared.endBackgroundTask(backgroundTask) + backGroundFetchBGTaskID = .invalid + } let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) } guard glucoseForHealth.isNotEmpty else { From 4c27695ba674cf718c761faad03b6356ce469543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 29 Jan 2024 16:55:45 +0100 Subject: [PATCH 375/405] Test. It shouldn't do any difference, but after clearing all Health Store data + this commit Health Integration works without crashing (crasing was caused by writiung insulin to Health Store, still unsure of why). (cherry picked from commit b68a711ec207c171403d9f85ca6dc70a4f8bf4a3) --- .../Services/HealthKit/HealthKitManager.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 9c4eb68f84..0600c43a6b 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -157,7 +157,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P .map { HKQuantitySample( type: sampleType, - quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: Double($0.glucose!)), + quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: Double($0.glucose ?? 0)), start: $0.dateString, end: $0.dateString, metadata: [ @@ -259,8 +259,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P end: $0.date, metadata: [ HKMetadataKeyInsulinDeliveryReason: NSNumber(2), - HKMetadataKeyExternalUUID: $0.id, - HKMetadataKeySyncIdentifier: $0.id, + HKMetadataKeyExternalUUID: NSString(string: $0.id), + HKMetadataKeySyncIdentifier: NSString(string: $0.id), HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true ] @@ -276,8 +276,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P end: $0.endDelivery, metadata: [ HKMetadataKeyInsulinDeliveryReason: NSNumber(1), - HKMetadataKeyExternalUUID: $0.id, - HKMetadataKeySyncIdentifier: $0.id, + HKMetadataKeyExternalUUID: NSString(string: $0.id), + HKMetadataKeySyncIdentifier: NSString(string: $0.id), HKMetadataKeySyncVersion: 1, Config.freeAPSMetaKey: true ] @@ -481,8 +481,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P newGlucose += samples .compactMap { sample -> HealthKitSample? in - let fromFAX = sample.metadata?[Config.freeAPSMetaKey] as? Bool ?? false - guard !fromFAX else { return nil } + let fromiAPS = sample.metadata?[Config.freeAPSMetaKey] as? Bool ?? false + guard !fromiAPS else { return nil } return HealthKitSample( healthKitId: sample.uuid.uuidString, date: sample.startDate, From 1a31de4d05f8c70cb729e9f416ff4ef99f0619ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Mon, 29 Jan 2024 16:57:12 +0100 Subject: [PATCH 376/405] Bump version --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index f11b876ce0..2a491a828b 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.5 +APP_VERSION = 2.7.6 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From bf39d6602eb552b95448356c15fb28f193c1d863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:58:33 +0100 Subject: [PATCH 377/405] Crowdin updates (#494) Vietnamese and Italian --- .../Localizations/Main/it.lproj/Localizable.strings | 2 +- .../Localizations/Main/vi.lproj/Localizable.strings | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index c88ed1dd7b..4d420677f4 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Salva Profilo"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override"; +"Cancel Profile Override" = "Cancella Profilo"; /* Alert */ "Cancel Temp Target" = "Cancella basali temporanee"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 9c343ba5ba..61d448f711 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -1065,7 +1065,7 @@ Enact a temp Basal or a temp target */ "Note" = "Lưu ý"; /* */ -"Temp Basal" = "Liều cơ bản tạm thời"; +"Temp Basal" = "Temp Basal"; /* */ "Temp Target" = "Mục tiêu tạm thời"; @@ -1217,7 +1217,7 @@ Enact a temp Basal or a temp target */ "Manual" = "Thủ công"; /* An Automatic delivered bolus (SMB) */ -"SMB" = "Liều tiêm tự động (SMB)"; +"SMB" = "SMB"; /* A manually entered dose of external insulin */ "External Insulin" = "Liều insulin tiêm ngoài"; @@ -1871,7 +1871,7 @@ Enact a temp Basal or a temp target */ "Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; /* "Enable SMB With Temptarget” */ -"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép supermicrobolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép Super Micro Bolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; /* Headline "Enable SMB Always" */ "Enable SMB Always" = "Luôn bật SMB"; @@ -1883,7 +1883,7 @@ Enact a temp Basal or a temp target */ "Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; /* "Enable SMB After Carbs" */ -"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật supermicrobolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật Super Micro Bolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ "Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; @@ -1892,7 +1892,7 @@ Enact a temp Basal or a temp target */ "Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép supermicrobolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ "Use Custom Peak Time" = "Sử dụng giờ cao điểm tùy chỉnh"; @@ -2134,7 +2134,7 @@ Enact a temp Basal or a temp target */ "Live Activity" = "Hoạt động trực tiếp"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hoạt động trực tiếp hiển thị đường huyết trực tiếp trên màn hình khóa và trên đảo động (nếu có)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Notification option */ "Show live activity" = "Hiển thị hoạt động trực tiếp"; From d5d56a7d84c0c51a7c2de528f61dad20ea49a1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:00:20 +0100 Subject: [PATCH 378/405] Crowdin (#496) --- .../Localizations/nl.lproj/Localizable.strings | 2 +- .../Localizations/uk.lproj/Localizable.strings | 2 +- .../Resources/nl.lproj/Localizable.strings | 2 +- .../Resources/uk.lproj/Localizable.strings | 2 +- .../Main/fr.lproj/Localizable.strings | 4 ++-- .../Main/it.lproj/Localizable.strings | 2 +- .../Main/nl.lproj/Localizable.strings | 16 ++++++++-------- .../Main/sv.lproj/Localizable.strings | 2 +- .../Main/uk.lproj/Localizable.strings | 16 ++++++++-------- .../Main/vi.lproj/Localizable.strings | 12 ++++++------ 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index 881f5336ee..cc91e4615e 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Deactiveer Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Slide om canule in te brengen"; /* */ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index a3b979e047..dbe612a8e7 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Деактивувати Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Готовий до введення канюлі"; /* */ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index e6ee4e0279..4e23a9dec5 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -187,7 +187,7 @@ "Deactivate Pod" = "Deactiveer Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Slide om canule in te brengen"; /* */ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 9e62b51b0b..a93b964fd9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -187,7 +187,7 @@ "Deactivate Pod" = "Деактивувати Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Готовий до введення канюлі"; /* */ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index a01b39e3e8..f0b1df0e98 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2077,7 +2077,7 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Réglage du seuil"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Réglage du seuil minimal"; /* Minimum Threshold Setting, Part 1 */ "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; @@ -2092,7 +2092,7 @@ Enact a temp Basal or a temp target */ "Setting" = "Paramètre"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Seuil"; /* Header */ "Calculator settings" = "Réglages de la calculatrice"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index c88ed1dd7b..4d420677f4 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -1338,7 +1338,7 @@ Enact a temp Basal or a temp target */ "Save as Profile" = "Salva Profilo"; /* Alert */ -"Cancel Profile Override" = "Cancel Profile Override"; +"Cancel Profile Override" = "Cancella Profilo"; /* Alert */ "Cancel Temp Target" = "Cancella basali temporanee"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 87b02f8f1a..10d1df295c 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Dynamische ISF inschakelen"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Bereken een nieuwe instelling voor de insulinegevoeligheid (ISF) bij elke cyclus van de loop. De nieuwe ISF wordt gebaseerd op je huidige glucose, totale dagelijkse dosis insuline (TDD, afgelopen 24 uur van alle toegediende insuline) en een individuele aanpassingsfactor (aanbevolen wordt om te beginnen met 0,5 als u de Sigmoid-functie gebruikt en 0,8 als dat niet het geval is).\n\nAlle dynamische ISF- en CR-aanpassingen worden beperkt door je autosens.min/max-limieten."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Dynamische CR inschakelen"; @@ -2063,7 +2063,7 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Adjust Dynamic ISF constant" = "Dynamische ISF-constante aanpassen"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuele aanpassing van de berekende dynamische verhoudingen. De standaardwaarde is 0,5. Hoe hoger de waarde, hoe groter de correctie van je ISF/CR zal zijn voor een hoge of lage bloedglucosewaarde.\n\nDe maximale/minimale correctie wordt bepaald door de Autosens min/max instellingen.\\Voor de Sigmoid functie wordt een aanpassingsfactor van 0.4 - 0.5 aanbevolen om mee te beginnen.n\nVoor de logaritmische formule is er minder overeenstemming, maar beginnen rond de 0.8 is waarschijnlijk goed voor de meeste volwassen gebruikers. Voor jongere gebruikers is het aan te raden om nog lager te beginnen met de logaritmische formule, om een te agressieve behandeling te voorkomen."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Gebruik Sigmoid functie"; @@ -2081,22 +2081,22 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Threshold Setting" = "Grenswaarde instellingen"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Instelling minimale grenswaarde"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Met deze instelling kun je een grenswaarde kiezen waaronder geen insuline wordt toegediend. De grenswaarde is de grootste waarde van je grenswaarde-instelling en de berekende grenswaarde: \n\nStreefwaarde Glucose - (Streefwaarde Glucose - 2,2) / 2 = 1,1) \n---> hier met mmol/l als glucose-eenheid "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "de grenswaarde wordt "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "tenzij uw grenswaarde hoger is ingesteld:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Instelling"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Grenswaarde"; /* Header */ "Calculator settings" = "Calculator instellingen"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 2c33798b57..09e835cd38 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktivera dynamisk insulinkänslighet (ISF)"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de seanst 24timmarna och en individuell juseringsfaktor (du rekommenderas att börja med 0.5 om du använder S-formad funktion, annars 0.8).\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beräkna ny insulinkänslighet varje loopcykel. Ny beräknad ISF (insulinkänslighet) är baserad på ditt nuvarande blodsocker, total mängd doserat insulin (TDD) de senaste 24 timmarna och en individuell justeringsfaktor.\n\nAlla dina dynamiska juseringar av insullinkänslighet och insulinkvoter kommer att begränsas av dina min/max-inställningar för autosens."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktivera dynamisk insulinkvot (CR)"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 6ef3bb0c83..a7cc1ea426 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включити Динамічний ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Обчислюйте новий параметр чутливості до інсуліну (ISF) після кожного циклу Петлі. Новий ISF базуватиметься на вашій поточній глюкозі, загальній добовій дозі інсуліну (TDD, останні 24 години всього доставленого інсуліну) та індивідуальному коригуючому факторі (рекомендація для початку становить 0,5, якщо використовується сигмоподібна функція, і 0,8, якщо ні).\\ n\nУсі налаштування Dynamic ISF і CR будуть обмежені вашими обмеженнями autosens.min/max."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включити Динамічний CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Налаштувати константу Динамічного ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Індивідуальне налаштування розрахованих динамічних коефіцієнтів. За замовчуванням 0,5. Чим вище значення, тим більшою буде корекція вашого ISF/CR для високого або низького рівня глюкози в крові. Максимальна/мінімальна корекція визначається мінімальними/максимальними налаштуваннями Autosens.\n\nДля сигмоїдної функції спочатку рекомендується коригувальний коефіцієнт 0,4–0,5.\n\nДля логаритмічної формули три є менш узгодженими, але починаючи приблизно з 0,8 ймовірно підходить для більшості дорослих користувачів. Для молодших користувачів рекомендується починати ще нижче при використанні логарифмічної формули, щоб уникнути занадто агресивного лікування."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Використовувати Сігмоїдну Функцію"; @@ -2077,22 +2077,22 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Порогове значення"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Налаштування Мінімального Порогу"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Цей параметр дає змогу вибрати рівень, нижче якого інсулін не вводитиметься.\n\nПорогове значення використовує найбільшу кількість вашого порогового налаштування та обчисленого порогу:\n\nЦільовий рівень глюкози - (Цільовий рівень глюкози - 40) / 2\n , тут використовується мг/дл як одиниця глюкози.\n\nНаприклад, якщо ваш цільовий рівень глюкози"; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "поріг буде"; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "якщо ваше порогове значення не встановлено вище:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Налаштування"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Поріг"; /* Header */ "Calculator settings" = "Налаштування калькулятора"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 9c343ba5ba..61d448f711 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -1065,7 +1065,7 @@ Enact a temp Basal or a temp target */ "Note" = "Lưu ý"; /* */ -"Temp Basal" = "Liều cơ bản tạm thời"; +"Temp Basal" = "Temp Basal"; /* */ "Temp Target" = "Mục tiêu tạm thời"; @@ -1217,7 +1217,7 @@ Enact a temp Basal or a temp target */ "Manual" = "Thủ công"; /* An Automatic delivered bolus (SMB) */ -"SMB" = "Liều tiêm tự động (SMB)"; +"SMB" = "SMB"; /* A manually entered dose of external insulin */ "External Insulin" = "Liều insulin tiêm ngoài"; @@ -1871,7 +1871,7 @@ Enact a temp Basal or a temp target */ "Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; /* "Enable SMB With Temptarget” */ -"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép supermicrobolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; +"This enables supermicrobolus (SMB) with eating soon / low temp targets. With this feature enabled, any temporary target below 100mg/dL, such as a temp target of 99 (or 80, the typical eating soon target) will enable SMB." = "Điều này cho phép Super Micro Bolus (SMB) đạt được mục tiêu ăn sớm / nhiệt độ thấp. Khi tính năng này được bật, mọi mục tiêu tạm thời dưới 100mg/dL, chẳng hạn như mục tiêu tạm thời là 99 (hoặc 80, mục tiêu ăn sớm thông thường) sẽ kích hoạt SMB."; /* Headline "Enable SMB Always" */ "Enable SMB Always" = "Luôn bật SMB"; @@ -1883,7 +1883,7 @@ Enact a temp Basal or a temp target */ "Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; /* "Enable SMB After Carbs" */ -"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật supermicrobolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; +"Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật Super Micro Bolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ "Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; @@ -1892,7 +1892,7 @@ Enact a temp Basal or a temp target */ "Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép supermicrobolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ "Use Custom Peak Time" = "Sử dụng giờ cao điểm tùy chỉnh"; @@ -2134,7 +2134,7 @@ Enact a temp Basal or a temp target */ "Live Activity" = "Hoạt động trực tiếp"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hoạt động trực tiếp hiển thị đường huyết trực tiếp trên màn hình khóa và trên đảo động (nếu có)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Notification option */ "Show live activity" = "Hiển thị hoạt động trực tiếp"; From 649c5e7ca5459bd95d983e3303abff47fcbfb80a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 30 Jan 2024 14:33:28 +0100 Subject: [PATCH 379/405] Localization. New strings. --- .../Main/en.lproj/Localizable.strings | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index f64cbe303f..793577b381 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2101,6 +2101,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2119,6 +2131,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2134,6 +2155,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2141,7 +2168,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ + "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From d92425fab55ed72da373a932d3d8a1a4c938a46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Tue, 30 Jan 2024 14:59:35 +0100 Subject: [PATCH 380/405] Add more strings. Fix OmniPod localizations. --- .../OmniBLE/Localizations/en.lproj/Localizable.strings | 3 +++ .../OmniBLE/Localizations/sv.lproj/Localizable.strings | 3 +++ .../OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings | 5 ++++- .../OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings | 5 ++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings index 9c434fa343..ecc6fc321d 100644 --- a/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/en.lproj/Localizable.strings @@ -494,6 +494,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 9e8a506294..7968a07bb1 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -495,6 +495,9 @@ /* Label text indicating insertion finished. */ "Inserted" = "Kanyl har förts in"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Svep reglage nedan för att föra in kanyl."; + /* Check Cannula */ "Check Cannula" = "Kontrollera kanyl"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings index 9937158213..a80e3136f9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/en.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; @@ -282,7 +285,7 @@ "Fault" = "Fault"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings index e8e76cf955..b303fe3ed2 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Svep för att inaktivera podd"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Svep reglaget nedan för att föra in kanyl."; + /* Label text showing pod is deactivated */ "Deactivated" = "Inaktiverad"; @@ -282,7 +285,7 @@ "Fault" = "Fel"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fyll en ny podd med U-100 Insulin (låt nålskyddet sitta kvar). Lyssna efter 2 pip."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fyll en ny podd med U-100 Insulin (låt nålskyddet sitta kvar). Lyssna efter 2 pip."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Avsluta inaktivering"; From c6b3f54e1089a44aaac07514f8b8369a72db6e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 31 Jan 2024 07:38:17 +0100 Subject: [PATCH 381/405] Crowdin updates --- .../ar.lproj/Localizable.strings | 3 ++ .../da.lproj/Localizable.strings | 5 +- .../de.lproj/Localizable.strings | 13 +++-- .../es.lproj/Localizable.strings | 3 ++ .../fi.lproj/Localizable.strings | 3 ++ .../fr.lproj/Localizable.strings | 3 ++ .../he.lproj/Localizable.strings | 3 ++ .../hu.lproj/Localizable.strings | 3 ++ .../it.lproj/Localizable.strings | 3 ++ .../nb.lproj/Localizable.strings | 3 ++ .../nl.lproj/Localizable.strings | 5 +- .../pl.lproj/Localizable.strings | 3 ++ .../pt-BR.lproj/Localizable.strings | 3 ++ .../pt-PT.lproj/Localizable.strings | 3 ++ .../ru.lproj/Localizable.strings | 5 +- .../sk.lproj/Localizable.strings | 3 ++ .../sv.lproj/Localizable.strings | 3 ++ .../tr.lproj/Localizable.strings | 3 ++ .../uk.lproj/Localizable.strings | 5 +- .../vi.lproj/Localizable.strings | 5 +- .../zh-Hans.lproj/Localizable.strings | 5 +- .../Resources/vi.lproj/Localizable.strings | 2 +- .../Resources/ar.lproj/Localizable.strings | 5 +- .../Resources/da.lproj/Localizable.strings | 5 +- .../Resources/de.lproj/Localizable.strings | 5 +- .../Resources/es.lproj/Localizable.strings | 5 +- .../Resources/fi.lproj/Localizable.strings | 5 +- .../Resources/fr.lproj/Localizable.strings | 5 +- .../Resources/he.lproj/Localizable.strings | 5 +- .../Resources/hu.lproj/Localizable.strings | 5 +- .../Resources/it.lproj/Localizable.strings | 5 +- .../Resources/nb.lproj/Localizable.strings | 5 +- .../Resources/nl.lproj/Localizable.strings | 5 +- .../Resources/pl.lproj/Localizable.strings | 5 +- .../Resources/pt-BR.lproj/Localizable.strings | 5 +- .../Resources/pt-PT.lproj/Localizable.strings | 5 +- .../Resources/ru.lproj/Localizable.strings | 7 ++- .../Resources/sk.lproj/Localizable.strings | 5 +- .../Resources/tr.lproj/Localizable.strings | 5 +- .../Resources/uk.lproj/Localizable.strings | 5 +- .../Resources/vi.lproj/Localizable.strings | 5 +- .../zh-Hans.lproj/Localizable.strings | 5 +- .../Main/ar.lproj/Localizable.strings | 35 ++++++++++++- .../Main/da.lproj/Localizable.strings | 35 ++++++++++++- .../Main/de.lproj/Localizable.strings | 35 ++++++++++++- .../Main/es.lproj/Localizable.strings | 35 ++++++++++++- .../Main/fi.lproj/Localizable.strings | 35 ++++++++++++- .../Main/fr.lproj/Localizable.strings | 35 ++++++++++++- .../Main/he.lproj/Localizable.strings | 35 ++++++++++++- .../Main/hu.lproj/Localizable.strings | 35 ++++++++++++- .../Main/it.lproj/Localizable.strings | 35 ++++++++++++- .../Main/nb.lproj/Localizable.strings | 35 ++++++++++++- .../Main/nl.lproj/Localizable.strings | 35 ++++++++++++- .../Main/pl.lproj/Localizable.strings | 35 ++++++++++++- .../Main/pt-BR.lproj/Localizable.strings | 35 ++++++++++++- .../Main/pt-PT.lproj/Localizable.strings | 35 ++++++++++++- .../Main/ru.lproj/Localizable.strings | 51 +++++++++++++++---- .../Main/sk.lproj/Localizable.strings | 35 ++++++++++++- .../Main/sv.lproj/Localizable.strings | 35 ++++++++++++- .../Main/tr.lproj/Localizable.strings | 35 ++++++++++++- .../Main/uk.lproj/Localizable.strings | 35 ++++++++++++- .../Main/vi.lproj/Localizable.strings | 35 ++++++++++++- .../Main/zh-Hans.lproj/Localizable.strings | 35 ++++++++++++- 63 files changed, 878 insertions(+), 62 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings index f151911ebe..0f30a43591 100644 --- a/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ar.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings index f77a2178bd..3952235a6a 100644 --- a/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/da.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Vent, indtil indsættelsen er afsluttet."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Indsat"; @@ -715,7 +718,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "Appen giver dig besked, når mængden af insulin i Pod'en når dette niveau (50-10 E)\n\nIndstil antallet enheder, du vil bruge som påmindelse."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "Lavt Reservoir"; /* */ "Save" = "Gem"; diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index f8757c3bfa..f80a32eee9 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -30,7 +30,7 @@ "Time Change Detected" = "Zeitänderung erkannt"; /* Alert content body for multiCommand pod alert */ -"Multiple Command Alert" = "Mehrfache Befehlswarnungen"; +"Multiple Command Alert" = "Mehrfache Befehlsbenachrichtigung"; /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */ "Pod expires in %1$@." = "Pod läuft ab in %1$@."; @@ -45,7 +45,7 @@ "%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ Insulin oder weniger verfügbar im Pod. Pod bald ersetzen."; /* Alert content body for suspendInProgress pod alert */ -"Suspend In Progress Reminder" = "Erinnerung: Pumpe vorübergehend unterbrochen"; +"Suspend In Progress Reminder" = "Unterbrechung in Fortschrittserinnerung"; /* Alert content body for suspendEnded pod alert */ "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Die Insulinunterbrechung ist beendet.\n\nSie können die Zufuhr über das Banner auf dem Startbildschirm oder über die Pumpeneinstellungen fortsetzen. Sie werden in 15 Minuten noch einmal erinnert."; @@ -222,7 +222,7 @@ "No Insulin" = "Kein Insulin"; /* Status highlight message for podExpired alarm. */ -"Pod Expired" = "Pod abgelaufen"; +"Pod Expired" = "POD abgelaufen"; /* Status highlight message for occlusion alarm. */ "Pod Occlusion" = "Pumpe verstopft"; @@ -415,7 +415,7 @@ "Pod deactivated successfully. Continue." = "Pod erfolgreich deaktiviert. Fortfahren."; /* Action button description for deactivate after failed attempt */ -"Retry" = "Erneut versuchen"; +"Retry" = "Wiederholen"; /* Action button description when deactivated */ "Continue" = "Fortsetzen"; @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Warten Sie, bis die Einführung abgeschlossen ist."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Eingeführt"; @@ -697,7 +700,7 @@ "Cancel" = "Abbrechen"; /* Text for continue button on PodSetupView */ -"Continue" = "Weiter"; +"Continue" = "Fortsetzen"; /* Are you sure you want to skip Omnipod Onboarding? */ "Skip Omnipod Onboarding?" = "Das Omnipod Onboarding überspringen?"; diff --git a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings index 50625a34ec..84ef29f74b 100644 --- a/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/es.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings index c099ac0473..dd72854034 100644 --- a/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fi.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings index 0d7fdc0c3b..25bd63b4fe 100644 --- a/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/fr.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Attendez que l'insertion soit terminée."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inséré"; diff --git a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings index f151911ebe..0f30a43591 100644 --- a/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/he.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings index fafba9da8d..f7d770d78c 100644 --- a/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/hu.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings index 5a46a9e46d..b86b78b414 100644 --- a/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/it.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Aspetta fino a che l'inserimento è completo."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Scorri l'interruttore sottostante per avviare l'inserimento della cannula."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserito"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index 7b74faba39..d6b9506e0c 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Vent til innsettingen er fullført."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Kanyle er satt inn"; diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index cc91e4615e..ac450cf45a 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wacht tot het inbrengen is voltooid."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Ingebracht"; @@ -715,7 +718,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "iAPS geeft een melding als de hoeveelheid insuline in de Pod dit niveau bereikt (50-10 E).\n\nScroll om in te stellen bij welk aantal eenheden je wilt worden herinnerd."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Laag reservoir niveau"; +"Low Reservoir" = "Reservoir bijna leeg"; /* */ "Save" = "Opslaan"; diff --git a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings index 3e4c51c92e..5e75acc908 100644 --- a/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pl.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings index eeb06dd3f2..56dea73cba 100644 --- a/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-BR.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings index 4c02f6dd8f..9e8f1a98a3 100644 --- a/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/pt-PT.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Wait until insertion is completed."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Inserted"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 71152c1833..2c34f1cfd7 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Деактивировать Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Сдвиньте, чтобы вставить канюлю"; /* */ "Slide to Deactivate Pod" = "Сдвиньте для деактивации"; @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Дождитесь окончания введения канюли."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Введено"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index ac7b53e3a3..f5e8607195 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Počkajte kým nie je zavedenie ukončené."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Vložené do tela"; diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index 7968a07bb1..b628c863cb 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Vänta tills kanyl förts in."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Svep reglaget nedan för att föra in kanyl."; + /* Label text indicating insertion finished. */ "Inserted" = "Kanyl har förts in"; diff --git a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings index 3204a43fcc..0b4864c333 100644 --- a/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/tr.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Ekleme tamamlanana kadar bekleyin."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Yerleştirildi"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index dbe612a8e7..3884f02677 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Дочекайтеся завершення введення канюлі."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Введено"; @@ -579,7 +582,7 @@ /* Description text for critical alerts */ "The reminders above will not sound if your device is in Silent or Do Not Disturb mode.\n\nThere are other critical Pod alerts and alarms that will sound even if your device is set to Silent or Do Not Disturb mode." = "Нагадування вище не звучатимуть, якщо ваш пристрій перебуває в беззвучному режимі або режимі «Не турбувати».\n\nІснують інші важливі сповіщення та будильники Podʼу, які лунатимуть, навіть якщо на пристрої встановлено режим «Без звуку» або «Не турбувати»."; /* navigation title for notification settings */ -"Notification Settings" = "Параметри сповіщень"; +"Notification Settings" = "Параметри Сповіщень"; /* Label for scheduled reminder value row */ "Time" = "Час"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 26f88c6567..115599fa9f 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "Đã gắn"; @@ -694,7 +697,7 @@ "You will now begin the process of configuring your reminders, filling your Pod with insulin, pairing to your device and placing it on your body." = "Bạn bắt đầu quá trình cài đặt các lời nhắc, đổ đầy thuốc vào pod, ghép đôi thiết bị và gắn pod lên người."; /* Cancel button title */ -"Cancel" = "Hủy"; +"Cancel" = "Bỏ qua"; /* Text for continue button on PodSetupView */ "Continue" = "Tiếp tục"; diff --git a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings index 1cd5a89e29..da4bfaabe7 100644 --- a/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/zh-Hans.lproj/Localizable.strings @@ -492,6 +492,9 @@ /* Label text for step two of insert cannula instructions */ "Wait until insertion is completed." = "等待,直到插入完成"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text indicating insertion finished. */ "Inserted" = "插入完毕"; @@ -715,7 +718,7 @@ "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded." = "The App notifies you when the amount of insulin in the Pod reaches this level (50-10 U).\n\nScroll to set the number of units at which you would like to be reminded."; /* Label text for low reservoir value row */ -"Low Reservoir" = "Low Reservoir"; +"Low Reservoir" = "低药量"; /* */ "Save" = "保存​​"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings index 6bf56b90fd..9dbf965731 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/vi.lproj/Localizable.strings @@ -368,7 +368,7 @@ "Tank power activated" = "Pod được kích hoạt"; /* Pump Event title for UnfinalizedDose with doseType of .tempBasal */ -"Temp Basal" = "Liều cơ bản tạm thời"; +"Temp Basal" = "Temp Basal"; /* Error message shown when temp basal could not be set due to existing temp basal in progress */ "Temp basal in progress" = "Liều basal tạm thời đang tiến hành"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings index 0b5128e82b..147f3748f1 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ar.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; @@ -282,7 +285,7 @@ "Fault" = "Fault"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings index 154a8537c9..84d63a6985 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/da.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiveret"; @@ -282,7 +285,7 @@ "Fault" = "Fejl"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fyld en ny Pod med 100 E insulin (lad podnålehætten sidde på). Lyt efter 2 bip."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Afslut deaktivering"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index f78c5dec5d..fadf6e327a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; @@ -282,7 +285,7 @@ "Fault" = "Störung"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Füllen Sie einen neuen Pod mit U-100-Insulin (Entfernen Sie nicht den Nadelverschluss). Warten Sie auf 2 Pieptöne."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings index 4c02a29301..e5712e4a0c 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/es.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Pod desactivado"; @@ -282,7 +285,7 @@ "Fault" = "Fallo"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Llene un nuevo pod con Insulina U-100 (deje puesta la tapa de la aguja del pod). Escuche 2 tonos."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finalizar la desactivación"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings index 2852c25c8d..586d92eced 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fi.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivoitu"; @@ -282,7 +285,7 @@ "Fault" = "Virhe"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings index 9f04b60bc6..d179be1a32 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/fr.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Glisser pour désactiver le Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Désactivé"; @@ -282,7 +285,7 @@ "Fault" = "Erreur"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Remplir un nouveau Pod avec de l'insuline U-100 (laisser le capuchon de l'aiguille du Pod en place). 2 bips se feront entendre."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Terminer la désactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings index 0c4602fecb..72e9c910d0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/he.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; @@ -282,7 +285,7 @@ "Fault" = "Fault"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings index 6dcc9cb346..1b5c0b8463 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/hu.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; @@ -282,7 +285,7 @@ "Fault" = "Fault"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings index 2c874e9dd4..2968f98312 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/it.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Scorri per disattivare il pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Scorri l'interruttore sottostante per avviare l'inserimento della cannula."; + /* Label text showing pod is deactivated */ "Deactivated" = "Disattivato"; @@ -282,7 +285,7 @@ "Fault" = "Guasto"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Riempire un nuovo Pod con insulina U-100 (lasciare il cappuccio dell'ago Pod). Ascolta 2 segnali acustici."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Riempi un nuovo Pod con 100-U d'insulina (lascia inserito il cappuccio trasparente dell'ago del pod). Ascolta 2 segnali acustici."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Completa la disattivazione"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index d5b1200809..e317864aa3 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivert"; @@ -282,7 +285,7 @@ "Fault" = "Feil"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fyll en ny pod med U-100 insulin (la kanylehetten være på). Lytt etter 2 pip."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Fullfør deaktivering"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 4e23a9dec5..3e281364dd 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; @@ -282,7 +285,7 @@ "Fault" = "Fout"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Vul een nieuwe pod met U-100 insuline (laat de Podnaalddop zitten). Luister naar 2 piepjes."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Voltooi deactivering"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings index 03cd6ca2c4..4b2fbeb602 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pl.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktywowany"; @@ -282,7 +285,7 @@ "Fault" = "Usterka"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Napełnij nowego POD'a insuliną U-100 (minimum 80j). Pozostaw niebieską osłonkę igły. Powinieneś usłyszeć dwa sygnały dźwiękowe."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Zakończ dezaktywację"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings index 8537006993..54d785d3ad 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-BR.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Desativado"; @@ -282,7 +285,7 @@ "Fault" = "Falha"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings index 245960bc59..b2357348ca 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/pt-PT.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deactivated"; @@ -282,7 +285,7 @@ "Fault" = "Fault"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Finish deactivation"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 808db53fe1..59afddc47a 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -187,11 +187,14 @@ "Deactivate Pod" = "Деактивировать Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Сдвиньте, чтобы вставить канюлю"; /* */ "Slide to Deactivate Pod" = "Сдвиньте для деактивации"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; @@ -282,7 +285,7 @@ "Fault" = "Сбой"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Заправьте новый под инсулином (не менее 100 единиц, крышка канюли должна быть на месте). Дождитесь 2 звуковых сигналов."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершение деактивации"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index 7cf32f7764..d4ac4dd3cc 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; @@ -282,7 +285,7 @@ "Fault" = "Chyba"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Naplňte nový pod inzulínom U-100 (kryt ihly ponechajte nasadený). Budete počuť 2 pípnutia."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Dokončiť deaktiváciu"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings index 5b438a5f5b..2b0865b40e 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/tr.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Devre dışı"; @@ -282,7 +285,7 @@ "Fault" = "Hata"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Yeni bir podu U-100 İnsülin ile doldurun (Pod iğne kapağını çıkarmayın). 2 bip sesini dinleyin."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Devre Dışı Bırakmayı Bitir"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index a93b964fd9..269b6f87a0 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Деактивовано"; @@ -282,7 +285,7 @@ "Fault" = "Збій"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Заправити новий Pod інсуліном (не менше U-100, не знімати кришку канюлі). Дочекатись 2 сигналів."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершити деактивацію"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index d56b6edbf6..26cc066a74 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; @@ -282,7 +285,7 @@ "Fault" = "Lỗi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Dùng loại insulin U-100 cho pod. Lắng nghe 2 tiếng bíp."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings index 5b3d3e1837..415c345980 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/zh-Hans.lproj/Localizable.strings @@ -192,6 +192,9 @@ /* */ "Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +/* Label text for step one of insert cannula instructions */ +"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; + /* Label text showing pod is deactivated */ "Deactivated" = "已解除"; @@ -282,7 +285,7 @@ "Fault" = "错误"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "完成停用"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 2def89f79e..17be2e206e 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 971f50938b..63c6c55a16 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index d3b7dadbb6..a434afe6f8 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Berechnungseinstellungen"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Prognosen anzeigen"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home-Schaltflächenleiste "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Falls Sie sowohl Profile als auch temporäre Ziele verwenden"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontale Scroll-Ansicht sichtbare Stunden"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live-Aktivitäten"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Notification option */ -"Show live activity" = "Live Aktivitäten anzeigen"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 83dbba60e0..6ab229af2b 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2103,6 +2103,18 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2121,6 +2133,15 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2135,6 +2156,12 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2142,7 +2169,13 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index 929bd8b3de..a56e8631d2 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index f0b1df0e98..7e4313a2fd 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Réglages de la calculatrice"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Utiliser la calculatrice de bolus alternative"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Repas riche en matières grasses"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Appliquer le facteur pour les repas riche en matières grasses"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Le nouveau calculateur alternatif de bolus est une option au calculateur par défaut dans iAPS. Quand activé, vous utilisez ce calculateur de bolus et non pas le calculateur iAPS original. À la fin du calcul, un facteur personnalisé est appliqué, comme il est censé l'être lors de l'utilisation de SMBs (par défaut 0,8).\n\nVous pouvez également ajouter l'option d'appliquer un autre facteur personnalisable (!) à la fin du calcul, ce qui pourrait être utile pour les repas riches en matières grasses, par exemple, une pizza (par défaut 0,7)."; + /* UI/UX option */ "Display Predictions" = "Afficher les prédictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Paramètres du graphique de la page d'accueil "; + +/* UI/UX title */ +"Statistics settings " = "Paramètres des statistiques "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Si vous utilisez à la fois des profils et des cibles temporaires"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Calculateur de Bolus"; + +/* Setting title */ +"Dynamic ISF" = "Facteur de sensibilité à l'insuline (FSI) dynamique"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 2def89f79e..17be2e206e 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index 6aa0dbb041..79d73cca2b 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 4d420677f4..1744cbd8fa 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -2099,6 +2099,18 @@ Regola la costante ISF dinamica."; /* Header */ "Calculator settings" = "Impostazioni calcolatore"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Usa calcolatore bolo alternativo"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Pasti Grassi"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Applica fattore per i pasti grassi"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Il nuovo calcolatore alternativo di bolo è un altro approccio al calcolatore di bolo predefinito in iAPS. Se l'interruttore è acceso, si utilizza questa calcolatrice per il bolo e non la calcolatrice iAPS originale. Alla fine del calcolo viene applicato un fattore personalizzato come si suppone che sia quando si utilizza smbs (predefinita 0.8).\n\nPuoi anche aggiungere l'opzione nella calcolatrice del bolo per applicarne un altro (!) fattore personalizzabile al termine del calcolo che potrebbe essere utile per i pasti grassi. es. Pizza (predefinita 0.7)."; + /* UI/UX option */ "Display Predictions" = "Mostra Previsioni"; @@ -2117,6 +2129,15 @@ Regola la costante ISF dinamica."; /* UI/UX option */ "Home View Button Panel " = "Pannello Pulsante Visualizzazione Home "; +/* UI/UX title */ +"Home Chart settings " = "Impostazioni grafico Home "; + +/* UI/UX title */ +"Statistics settings " = "Impostazioni statistiche"; + +/* UI/UX title */ +"Override HbA1c Unit" = "Ignora Unità HbA1c"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Nel caso in cui stai utilizzando sia i profili che gli obiettivi temporali"; @@ -2131,6 +2152,12 @@ Regola la costante ISF dinamica."; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "La vista di scorrimento orizzontale mostra le ore visibili"; +/* Setting title */ +"Bolus Calculator" = "Calcolatore Bolo"; + +/* Setting title */ +"Dynamic ISF" = "Sensibilità Dinamica"; + /* Notification option */ "Live Activity" = "Attività in tempo reale"; @@ -2138,7 +2165,13 @@ Regola la costante ISF dinamica."; "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "L'attività in tempo reale mostra il glucosio attivo nel sangue sulla schermata di blocco e sulla Dynamic Island(se disponibile)"; /* Notification option */ -"Show live activity" = "Mostra attività in tempo reale"; +"Show Live activity" = "Mostra attività dal vivo"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "L'attività in tempo reale mostra il glucosio attivo nel sangue sulla schermata di blocco e sulla Dynamic Island(se disponibile)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Le attività dal vivo sono disattivate nelle impostazioni di sistema. Per abilitare le attività dal vivo, vai su Impostazioni app -> iAPS -> Attiva attività dal vivo.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Media ponderata di TDD. Peso delle ultime 24 ore:"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 6a6df4e71c..5a1d6003ef 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vektet snitt av TDD. Vekting av siste 24 timer:"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 10d1df295c..8011f00160 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2101,6 +2101,18 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* Header */ "Calculator settings" = "Calculator instellingen"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Geef voorspellingen weer"; @@ -2119,6 +2131,15 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* UI/UX option */ "Home View Button Panel " = "Beginscherm knoppaneel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In het geval dat je zowel profielen als tijdelijke doelen gebruikt"; @@ -2133,6 +2154,12 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live activiteit"; @@ -2140,7 +2167,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Notification option */ -"Show live activity" = "Toon live activiteit"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index e7bb926255..ca27be9072 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2099,6 +2099,18 @@ Połączono z Nightscout!"; /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2117,6 +2129,15 @@ Połączono z Nightscout!"; /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2131,6 +2152,12 @@ Połączono z Nightscout!"; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2138,7 +2165,13 @@ Połączono z Nightscout!"; "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index a620815e38..cb1e2641b0 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 1b63e5822d..676e827336 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index badc315556..72f946b16f 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Включить динамический ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Рассчитывать новое значение чувствительности к инсулину (ISF) при каждом цикле петли. Новый ISF будет основан на вашем текущем уровне глюкозы, общей суточной дозе инсулина (TDD, количество введенного инсулина за последние 24 часа) и индивидуальном корректирующем коэффициенте (рекомендуется начинать с 0,5, если используется сигмоидная функция, и 0,8, если нет).\n\nДинамические настройки ISF и CR будут ограничены максимумом и минимумом алгоритма autosens."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Включить динамический CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Настроить константу динамического ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Индивидуальная настройка рассчитанных динамических коэффициентов. Значение по умолчанию равно 0.5. Чем выше значение, тем больше будет коррекция вашего ISF/CR для высокого или низкого уровня глюкозы в крови. Максимальная/минимальная коррекция определяется настройками autosens min/max.\n\nДля сигмоидной функции рекомендуется для начала использовать коэффициент 0.4 - 0.5.\n\nДля логарифмической формулы существует меньшее единодушие, но для большинства взрослых пользователей, вероятно, подходит значение, начинающееся примерно с 0.8. Для более молодых пользователей рекомендуется начинать с еще меньшего значения при использовании логарифмической формулы, чтобы избежать чрезмерно агрессивного лечения."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Использовать Сигмоидную функцию"; @@ -2077,26 +2077,38 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Настройка порога"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Минимальный порог"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Этот параметр позволяет вам выбрать уровень, ниже которого инсулин вводиться не будет.\n\nВ качестве порогового значения используется наибольшее значение вашей настройки порога и вычисленное пороговое значение:\n\nЦелевая глюкоза - (Целевая глюкоза - 40) / 2\n, здесь в качестве единицы измерения глюкозы используется мг/дл.\n\nНапример, если ваш целевой уровень глюкозы равен "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "пороговое значение будет равно "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "пока порог не установлен выше:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Параметр"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Порог"; /* Header */ "Calculator settings" = "Настройки калькулятора"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Отображать прогнозы"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Панель кнопок главного экрана "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "В случае, если вы используете как профили, так и временные цели"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Эфир активности"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Notification option */ -"Show live activity" = "Отображать эфир активности"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index b6b881ed4a..a4fc1f87aa 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Nastavenia výpočtu"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Zobraziť predpovede"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Panel tlačidiel zobrazenia Domov "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "V prípade, že používate profily aj dočasný cieľ"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontálne rolovacie zobrazenie Viditeľné hodiny"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Živá aktivita"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Notification option */ -"Show live activity" = "Zobraziť živú aktivitu"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 09e835cd38..2d23cad3af 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Boluskalkylatorinställning"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Använd alternativ boluskalkylator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fet måltid"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Justera för fet mat"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Den alternativa boluskalkylatorn använder en annan algoritm för beräkning av bolus. För individuell justering kan du ändra justeringsfaktor (standardvärde 0.8) beroende på om du vill få högre (över 1) eller mindre (under 1) bolusrekommendationer.\n\nFö extra feta måltider, tex pizza, finns möjlighet att minska rekommenderad bolus med en annan faktor (standard 0,7)."; + /* UI/UX option */ "Display Predictions" = "Visa prognoser"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Knappar på hemskärmen "; +/* UI/UX title */ +"Home Chart settings " = "Hemskärmens diagram "; + +/* UI/UX title */ +"Statistics settings " = "Statistikskärmen "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Byt HbA1c-enhet"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Om du använder både profiler och tillfälliga målvärden"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Antal synliga timmar i hemfönstret"; +/* Setting title */ +"Bolus Calculator" = "Boluskalkylator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamisk insulinkänslighet"; + /* Notification option */ "Live Activity" = "Liveaktiviteter"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Liveaktivitet visar senaste blodsockeravläsning på låsskärmen och på Dynamic Island, om sådan finns på din iPhone-modell"; /* Notification option */ -"Show live activity" = "Visa Liveaktivitet"; +"Show Live activity" = "Visa Liveaktiviteter"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Liveaktivitet visar senaste blodsockeravläsning på låsskärmen och på Dynamic Island, om sådan finns på din iPhone-modell"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Inställning för Liveaktiviteter är av i dina iPhone-inställningar. För att aktivera behöver du öppna inställningar -> iAPS -> Liveaktiviteter -> reglage.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Viktat Genomsnitt av TDD. Vikt de senaste 24 timmarna:"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index b4a9248768..76c53fe294 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index a7cc1ea426..b3a1d1c1fa 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2097,6 +2097,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Налаштування калькулятора"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Показати передбачення"; @@ -2115,6 +2127,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Панель кнопок домашнього перегляду"; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Якщо ви використовуєте профілі та тимчасові цілі"; @@ -2129,6 +2150,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Дії наживо"; @@ -2136,7 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Notification option */ -"Show live activity" = "Показати дії наживо"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 61d448f711..19cc697e86 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -2098,6 +2098,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Thiết lập tính toán"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Hiển thị dự đoán"; @@ -2116,6 +2128,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Bảng nút xem trang chủ "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "Trong trường hợp bạn đang sử dụng cả hồ sơ và mục tiêu tạm thời"; @@ -2130,6 +2151,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Hoạt động trực tiếp"; @@ -2137,7 +2164,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Notification option */ -"Show live activity" = "Hiển thị hoạt động trực tiếp"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Trung bình có trọng số của TDD. Trọng lượng trong 24 giờ qua:"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 5e6f83a84a..2bcea631f4 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2099,6 +2099,18 @@ Enact a temp Basal or a temp target */ /* Header */ "Calculator settings" = "Calculator settings"; +/* Bolus Calculator Setting */ +"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; + +/* Bolus Calculator Setting */ +"Fatty Meals" = "Fatty Meals"; + +/* Bolus Calculator Setting */ +"Apply factor for fatty meals" = "Apply factor for fatty meals"; + +/* Bolus Calculator Footer */ +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; + /* UI/UX option */ "Display Predictions" = "Display Predictions"; @@ -2117,6 +2129,15 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Home View Button Panel " = "Home View Button Panel "; +/* UI/UX title */ +"Home Chart settings " = "Home Chart settings "; + +/* UI/UX title */ +"Statistics settings " = "Statistics settings "; + +/* UI/UX title */ +"Override HbA1c Unit" = "Override HbA1c Unit"; + /* UI/UX option */ "In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; @@ -2131,6 +2152,12 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* Setting title */ +"Bolus Calculator" = "Bolus Calculator"; + +/* Setting title */ +"Dynamic ISF" = "Dynamic ISF"; + /* Notification option */ "Live Activity" = "Live Activity"; @@ -2138,7 +2165,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show live activity" = "Show live activity"; +"Show Live activity" = "Show Live activity"; + +/* Live Activity Footer */ +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; + +/* Live Activity Footer when off */ +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Weighted Average of TDD. Weight of past 24 hours:"; From 51757f97fb5f7867b6b80bdf2fb3f7b7e65129c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:53:27 +0100 Subject: [PATCH 382/405] Crowdin updates (#498) Dutch, Ukrainian and Vietnamese --- .../uk.lproj/Localizable.strings | 2 +- .../vi.lproj/Localizable.strings | 2 +- .../Resources/uk.lproj/Localizable.strings | 4 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/nl.lproj/Localizable.strings | 6 +- .../Main/uk.lproj/Localizable.strings | 22 +++--- .../Main/vi.lproj/Localizable.strings | 70 +++++++++---------- 7 files changed, 55 insertions(+), 55 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 3884f02677..a2cf90837b 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Дочекайтеся завершення введення канюлі."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Посуньте перемикач нижче, щоб розпочати введення канюлі."; /* Label text indicating insertion finished. */ "Inserted" = "Введено"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 115599fa9f..89f649d4cd 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Trượt bên dưới để bắt đầu chèn Cannula."; /* Label text indicating insertion finished. */ "Inserted" = "Đã gắn"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 269b6f87a0..03d58e64a7 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Посуньте перемикач нижче, щоб розпочати введення канюлі."; /* Label text showing pod is deactivated */ "Deactivated" = "Деактивовано"; @@ -285,7 +285,7 @@ "Fault" = "Збій"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Заправити новий Pod інсуліном (не менше U-100, не знімати кришку канюлі). Дочекатись 2 сигналів."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершити деактивацію"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 26cc066a74..94c2972acb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Trượt bên dưới để bắt đầu chèn Cannula."; /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; @@ -285,7 +285,7 @@ "Fault" = "Lỗi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Dùng loại insulin U-100 cho pod (để nguyên nắp kim trong của Pod). Lắng nghe 2 tiếng bíp."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 8011f00160..e8431fd756 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2102,13 +2102,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Calculator settings" = "Calculator instellingen"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Gebruik alternatieve Bolus Calculator"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Vette maaltijd"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Pas factor toe voor vette maaltijden"; /* Bolus Calculator Footer */ "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index b3a1d1c1fa..684f9758be 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2098,16 +2098,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Налаштування калькулятора"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Використати альтернативний болюсний калькулятор"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Жирна їжа"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Застосувати коефіцієнт жирної їжі"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Новий альтернативний болюсний калькулятор є іншим підходом до стандартного болюсного калькулятора в iAPS. Якщо перемикач увімкнено, ви використовуєте цей болюсний калькулятор, а не оригінальний калькулятор iAPS. Наприкінці обчислення застосовано спеціальний коефіцієнт, як це має бути під час використання smbs (за замовчуванням 0,8).\n\nВи також можете додати опцію у своєму болюсному калькуляторі, щоб застосувати інший (!) настроюваний коефіцієнт наприкінці обчислення, яке може бути корисним для жирних страв, наприклад, піци (за замовчуванням 0,7)."; /* UI/UX option */ "Display Predictions" = "Показати передбачення"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Панель кнопок домашнього перегляду"; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Налаштування домашньої діаграми"; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Налаштування статистики "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Замінити одиницю HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Якщо ви використовуєте профілі та тимчасові цілі"; @@ -2151,10 +2151,10 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Калькулятор Болюса"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Динамічний ISF"; /* Notification option */ "Live Activity" = "Дії наживо"; @@ -2163,13 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Показати дії наживо"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Активність у реальному часі вимкнено в налаштуваннях системи. Щоб увімкнути дії в реальному часі, перейдіть у додаток Налаштування -> iAPS -> УВІМКНУТИ дії в реальному часі.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 19cc697e86..bfd611b30a 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -324,7 +324,7 @@ Enact a temp Basal or a temp target */ "Invalid URL" = "URL không xác thực"; /* */ -"Local glucose source" = "NGUỒN GLUCOSE NỘI TẠI"; +"Local glucose source" = "Nguồn Glucose cục bộ"; /* Header */ "Nightscout Config" = "Cấu hình Nightscout"; @@ -336,7 +336,7 @@ Enact a temp Basal or a temp target */ "URL" = "URL"; /**/ -"Use local glucose server" = "Sử dụng nguồn glucose nội tại"; +"Use local glucose server" = "Sử dụng nguồn glucose cục bộ"; /* Enable Statistics */ "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Điều này cho phép tải số liệu thống kê lên Nightscout mà có thể được sử dụng bởi Dự án Community Statictics và Demographics. \n\nTham gia vào Thống kê Cộng đồng là tùy chọn và yêu cầu đăng ký riêng tại:\n"; @@ -378,19 +378,19 @@ Enact a temp Basal or a temp target */ "Yes, Import" = "Đồng ý, hãy cập nhật"; /* */ -"Import settings from Nightscout" = "Cập nhật cấu hình từ Nightscout"; +"Import settings from Nightscout" = "Nhập cấu hình từ Nightscout"; /* */ -"Import settings?" = "Cập nhật các cấu hình?"; +"Import settings?" = "Nhập các cấu hình?"; /* */ -"Import from Nightscout" = "Cập nhật từ Nightscout"; +"Import from Nightscout" = "Nhập từ Nightscout"; /* */ -"Settings imported" = "Các cấu hình đã được cập nhật"; +"Settings imported" = "Các cấu hình đã được nhập"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Cập nhật cấu hình bị hủy bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Nhập cấu hình bị hủy bỏ."; /* Import Error */ "Can't find the default Nightscout Profile." = "Không thể tìm thấy Hồ sơ Nightscout mặc định."; @@ -588,7 +588,7 @@ Enact a temp Basal or a temp target */ "Delete Insulin?" = "Xóa Insulin?"; /* Treatments list */ -"Treatments" = "Phương pháp điều trị"; +"Treatments" = "Đã xử lý"; /* " min" in Treatments list */ " min" = " phút"; @@ -1764,10 +1764,10 @@ Enact a temp Basal or a temp target */ "Display Loop Cycle statistics" = "Hiển thị số liệu thống kê theo vòng tròn"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong statPanel trong Chế độ xem trang chủ"; +"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong bảng điều khiển trong Chế độ xem trang chủ"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong statPanlel. Đơn vị trong statPanel sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong bảng điều khiển. Đơn vị trong bảng điều khiển sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; /* HbA1c for all glucose storage days */ "all" = "Tất cả"; @@ -1811,7 +1811,7 @@ Enact a temp Basal or a temp target */ "Low Temptarget Lowers Sensitivity" = "Mục tiêu tạm thời thấp sẽ làm giảm độ nhạy"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với Một nửa mục tiêu cơ bản mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ "Sensitivity Raises Target" = "Độ nhạy tăng mục tiêu"; @@ -1841,13 +1841,13 @@ Enact a temp Basal or a temp target */ "Wide BG Target Range" = "Phạm vi mục tiêu BG rộng"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng Phạm vi mục tiêu BG rộng: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng Phạm vi mục tiêu BG rộng: true để buộc liều tạm thời trung tính trên phạm vi BG cuối cùng rộng hơn."; /* Headline "Skip Neutral Temps" */ -"Skip Neutral Temps" = "Bỏ qua tạm thời trung lập"; +"Skip Neutral Temps" = "Bỏ qua liều tạm thời trung lập"; /* "Skip Neutral Temps" */ -"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Temp “trung tính” (giống như Temp cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Liều tạm thời “trung tính” (giống như Liều tạm thời cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; /* Headline "Unsuspend If No Temp” */ "Unsuspend If No Temp" = "Bỏ tạm dừng nếu không có tạm thời"; @@ -1865,7 +1865,7 @@ Enact a temp Basal or a temp target */ "Enable SMB With COB" = "Kích hoạt SMB đối với COB"; /* Enable SMB With COB" */ -"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép supermicrobolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép Super Micro Bolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; /* Headline "Enable SMB With Temptarget” */ "Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; @@ -1877,7 +1877,7 @@ Enact a temp Basal or a temp target */ "Enable SMB Always" = "Luôn bật SMB"; /* "Enable SMB Always" */ -"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật supermicrobolus (trừ khi bị tắt bởi high temptarget)."; +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật Super Micro Bolus (trừ khi bị tắt bởi high temptarget)."; /* Headline "Enable SMB After Carbs" */ "Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; @@ -1886,13 +1886,13 @@ Enact a temp Basal or a temp target */ "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật Super Micro Bolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; +"Allow SMB With High Temptarget" = "Cho phép SMB với mục tiêu tạm thời cao"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; +"Allow SMB With High Temptarget" = "Cho phép SMB với mục tiêu tạm thời cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được kích hoạt khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ "Use Custom Peak Time" = "Sử dụng giờ cao điểm tùy chỉnh"; @@ -1904,13 +1904,13 @@ Enact a temp Basal or a temp target */ "Suspend Zeros IOB" = "Tạm dừng IOB bằng 0"; /* "Suspend Zeros IOB” */ -"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Liều cơ bản tạm thời 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; /* Headline "Max IOB" */ "Max IOB" = "IOB tối đa"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (Hệ số tối đa an toàn hàng ngày và Hệ số an toàn cơ bản hiện tại), Tối đa IOB được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (Hệ số tối đa an toàn hàng ngày và Hệ số an toàn cơ bản hiện tại), Tối đa IOB được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra liều cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ "Max Daily Safety Multiplier" = "Hệ số tối đa an toàn hàng ngày"; @@ -1947,7 +1947,7 @@ Enact a temp Basal or a temp target */ "Max COB" = "COB tối đa"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của maxCOB là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức maxCOB và giữ nó ở mức maxCOB cho đến khi lượng carb nhập vào trên maxCOB cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của COB tối đa là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức COB tối đa và giữ nó ở mức COB tối đa cho đến khi lượng carb nhập vào trên COB tối đa cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Chế độ báo lại bolus"; @@ -1965,7 +1965,7 @@ Enact a temp Basal or a temp target */ "Autotune ISF Adjustment Fraction" = "Phân số (AF) điều chỉnh ISF tự động điều chỉnh"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của fullNewISF và PumpISF. 1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của ISF điều chỉnh hoàn toàn và ISF điều chỉnh từ bơm (1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF)."; /* Headline "Remaining Carbs Fraction" */ "Remaining Carbs Fraction" = "Phần carb còn lại"; @@ -2042,7 +2042,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD, tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD: tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Kích hoạt CR động"; @@ -2099,16 +2099,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Thiết lập tính toán"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Sử dụng Máy tính Bolus thay thế"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Bữa ăn nhiều chất béo"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Áp dụng hệ số cho bữa ăn nhiều chất béo"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Công cụ tính bolus thay thế mới là một cách tiếp cận khác với công cụ tính bolus mặc định trong iAPS. Nếu bật nút này, bạn sẽ sử dụng máy tính bolus này chứ không phải máy tính iAPS gốc. Khi kết thúc phép tính, một hệ số tùy chỉnh sẽ được áp dụng như lẽ ra phải như vậy khi sử dụng smbs (mặc định là 0,8).\n\nBạn cũng có thể thêm tùy chọn trong máy tính bolus của mình để áp dụng một hệ số tùy chỉnh (!) khác ở cuối phép tính, phép tính có thể hữu ích cho các bữa ăn nhiều chất béo, ví dụ: Pizza (mặc định là 0,7)."; /* UI/UX option */ "Display Predictions" = "Hiển thị dự đoán"; @@ -2129,10 +2129,10 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Bảng nút xem trang chủ "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Trang chủ Cài đặt biểu đồ "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Cài đặt thống kê "; /* UI/UX title */ "Override HbA1c Unit" = "Override HbA1c Unit"; @@ -2152,10 +2152,10 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Tính toán Bolus"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Độ nhạy Insulin (ISF) động"; /* Notification option */ "Live Activity" = "Hoạt động trực tiếp"; @@ -2164,13 +2164,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Hiển thị hoạt động trực tiếp"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Để bật các hoạt động trực tiếp, hãy đi tới ứng dụng Cài đặt -> iAPS -> BẬT Hoạt động trực tiếp.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Trung bình có trọng số của TDD. Trọng lượng trong 24 giờ qua:"; @@ -2204,7 +2204,7 @@ Enact a temp Basal or a temp target */ "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Cài đặt Dynamic"; +"Dynamic settings" = "Dynamic Settings"; /* Insulin curve */ "Insulin curve" = "Chủng loại insulin"; From 6000175617c2b65c5a695d090ceeb6c2c379a3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 1 Feb 2024 16:06:37 +0100 Subject: [PATCH 383/405] New localized string --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 793577b381..ef0b01607d 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2182,6 +2182,9 @@ Enact a temp Basal or a temp target */ /* Weight of past 24 hours of insulin */ "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; +/* Setting title */ +"Activate Dynamic Carb Ratio (CR") = "Activate Dynamic Carb Ratio (CR"); + /* Headline "Adjust basal" */ "Adjust basal" = "Adjust basal"; From f8b72e9d03b0ed7f1ddfe9117d1392f487893abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 1 Feb 2024 16:07:40 +0100 Subject: [PATCH 384/405] Typo --- FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index ef0b01607d..475190339f 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2183,7 +2183,7 @@ Enact a temp Basal or a temp target */ "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; /* Setting title */ -"Activate Dynamic Carb Ratio (CR") = "Activate Dynamic Carb Ratio (CR"); +"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; /* Headline "Adjust basal" */ "Adjust basal" = "Adjust basal"; From 00cd94030df3a53dbfe4f5044c76c4d1e23667ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Thu, 1 Feb 2024 16:10:54 +0100 Subject: [PATCH 385/405] Revert --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 --- FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 475190339f..793577b381 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2182,9 +2182,6 @@ Enact a temp Basal or a temp target */ /* Weight of past 24 hours of insulin */ "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)." = "Has to be > 0 and <= 1.\nDefault is 0.65 (65 %) * TDD. The rest will be from average of total data (up to 14 days) of all TDD calculations (35 %). To only use past 24 hours, set this to 1.\n\nTo avoid sudden fluctuations, for instance after a big meal, an average of the past 2 hours of TDD calculations is used instead of just the current TDD (past 24 hours at this moment)."; -/* Setting title */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; - /* Headline "Adjust basal" */ "Adjust basal" = "Adjust basal"; diff --git a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift index 73a2310bb9..8e05f9b5f5 100644 --- a/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift +++ b/FreeAPS/Sources/Modules/Dynamic/View/DynamicRootView.swift @@ -58,7 +58,7 @@ extension Dynamic { if state.useNewFormula { HStack { Toggle(isOn: $state.enableDynamicCR) { - Text("Activate Dynamic Carb Ratio (CR") + Text("Activate Dynamic Carb Ratio (CR)") .onTapGesture { scrollView = fontSize >= .extraLarge ? true : false info( From 9db6266c0689135967778200174f2b32316a2c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:13:37 +0100 Subject: [PATCH 386/405] New translations (French) (#499) --- .../Localizations/Main/fr.lproj/Localizable.strings | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 7e4313a2fd..69125bdb30 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2038,7 +2038,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Activer ISF dynamique"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Activer ISF dynamique"; +"Enable Dynamic ISF" = "Activer le facteur de sensibilité à l'insuline (FSI) dynamique"; /* Enable Dynamic ISF */ "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcule un nouveau facteur de sensibilité à l'insuline (FSI) à chaque cycle de boucle. Le nouveau FSI sera basé sur votre glycémie actuelle, la dose quotidienne totale d'insuline (DQT = total de toutes les doses d'insuline livrées dans les dernières 24 heures) et un facteur d'ajustement individuel (il est recommandé de commencer par 0,5 si vous utilisez la fonction Sigmoid et 0,8 si ce n'est pas le cas).\n\nTous les ajustements dynamiques du FSI et du RGI (Ratio insuline/glucides) seront limités par vos paramètres autosens min/max."; @@ -2056,7 +2056,7 @@ Enact a temp Basal or a temp target */ "Activate Dynamic Carb Ratio (CR)" = "Activer le ratio de glucides dynamique (RC)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; +"Adjust Dynamic ISF constant" = "Ajuster la constante du FSI Dynamique"; /* Adjust Dynamic ISF constant */ "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; @@ -2134,7 +2134,7 @@ Enact a temp Basal or a temp target */ "Statistics settings " = "Paramètres des statistiques "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Outrepasser l'unité HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Si vous utilisez à la fois des profils et des cibles temporaires"; @@ -2163,13 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Afficher l'activité en direct"; /* Live Activity Footer */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "L'activité en direct affiche la glycémie sur l'écran de verrouillage et sur l'île dynamique (si disponible)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Les activités en direct sont désactivées dans les paramètres du système. Pour activer les activités en direct, allez dans Réglages -> iAPS -> Activer les activités en direct.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; From f0cf1e12444119c85a84b7eb724223ca83d8b76e Mon Sep 17 00:00:00 2001 From: Gary Dalley <4158482+gonkowonko@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:26:05 +0000 Subject: [PATCH 387/405] Adding missing variable to WatchState, new function to convert the direction trend character to text version. Fixed a method spelling mistake (#470) (cherry picked from commit 09800eee4226420b037ecc50e57416004f0dab0f) --- .../Services/WatchManager/WatchManager.swift | 35 +++++++++++++++++-- .../DataFlow.swift | 1 + 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index 1c2fce42d0..f5e5a580e9 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -60,8 +60,12 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.glucose = glucoseValues.glucose self.state.trend = glucoseValues.trend self.state.delta = glucoseValues.delta - self.state.trendRaw = readings.first?.direction ?? "↔︎" + self.state.trendRaw = self.convertTrendToDirectionText(trend: glucoseValues.trend) self.state.glucoseDate = readings.first?.date ?? .distantPast + self.state.glucoseDateInterval = self.state.glucoseDate.map { + guard $0.timeIntervalSince1970 > 0 else { return 0 } + return UInt64($0.timeIntervalSince1970) + } self.state.lastLoopDate = self.enactedSuggestion?.recieved == true ? self.enactedSuggestion?.deliverAt : self .apsManager.lastLoopDate self.state.lastLoopDateInterval = self.state.lastLoopDate.map { @@ -115,7 +119,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.displayOnWatch = self.settingsManager.settings.displayOnWatch self.state.displayFatAndProteinOnWatch = self.settingsManager.settings.displayFatAndProteinOnWatch - let eBG = self.evetualBGStraing() + let eBG = self.eventualBGString() self.state.eventualBG = eBG.map { "⇢ " + $0 } self.state.eventualBGRaw = eBG @@ -192,7 +196,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { return description } - private func evetualBGStraing() -> String? { + private func eventualBGString() -> String? { guard let eventualBG = suggestion?.eventualBG else { return nil } @@ -202,6 +206,31 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { )! } + private func convertTrendToDirectionText(trend: String) -> String { + switch trend { + case "↑↑↑": + return Direction.tripleUp.rawValue + case "↑↑": + return Direction.doubleUp.rawValue + case "↑": + return Direction.singleUp.rawValue + case "↗︎": + return Direction.fortyFiveUp.rawValue + case "→": + return Direction.flat.rawValue + case "↘︎": + return Direction.fortyFiveDown.rawValue + case "↓": + return Direction.singleDown.rawValue + case "↓↓↓": + return Direction.tripleDown.rawValue + case "↓↓": + return Direction.doubleDown.rawValue + default: + return Direction.notComputable.rawValue + } + } + private func newBolusCalc(delta: [Readings], suggestion _: Suggestion?) -> Decimal { var conversion: Decimal = 1 // Settings diff --git a/FreeAPSWatch WatchKit Extension/DataFlow.swift b/FreeAPSWatch WatchKit Extension/DataFlow.swift index cd781b7e36..d6f7848c13 100644 --- a/FreeAPSWatch WatchKit Extension/DataFlow.swift +++ b/FreeAPSWatch WatchKit Extension/DataFlow.swift @@ -6,6 +6,7 @@ struct WatchState: Codable { var trendRaw: String? var delta: String? var glucoseDate: Date? + var glucoseDateInterval: UInt64? var lastLoopDate: Date? var lastLoopDateInterval: UInt64? var bolusIncrement: Decimal? From 5695955ee5ffbd6bcc48a7a646f102f5a683684f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 3 Feb 2024 14:08:00 +0100 Subject: [PATCH 388/405] Crowdin updates (#503) --- .../Localizations/nl.lproj/Localizable.strings | 2 +- .../Resources/nl.lproj/Localizable.strings | 4 ++-- .../Main/de.lproj/Localizable.strings | 2 +- .../Main/nl.lproj/Localizable.strings | 16 ++++++++-------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index ac450cf45a..9c15f8104f 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Wacht tot het inbrengen is voltooid."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schuif om canule te starten."; /* Label text indicating insertion finished. */ "Inserted" = "Ingebracht"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 3e281364dd..43a8fb43b4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schuif om canule te starten."; /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; @@ -285,7 +285,7 @@ "Fault" = "Fout"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Vul een nieuwe pod met U-100 insuline (laat de Podnaalddop zitten). Luister naar 2 piepjes."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Voltooi deactivering"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index a434afe6f8..82bcfa4598 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiviere Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Berechnen Sie bei jedem Loop-Zyklus eine neue Insulinempfindlichkeitseinstellung (ISF). Die neue ISF basiert auf Ihrem aktuellen Blutzucker, der täglichen Gesamtinsulindosis (TDD, alle in den letzten 24 Stunden abgegebenen Insuline) und einem individuellen Anpassungsfaktor (die Empfehlung für den Anfang ist 0,5, wenn Sie die Sigmoid-Funktion verwenden, und 0,8, wenn nicht).\n\nAlle dynamischen ISF- und CR-Anpassungen werden durch Ihre autosens.min/max-Grenzwerte begrenzt."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index e8431fd756..ba1a326ed4 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2111,7 +2111,7 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Apply factor for fatty meals" = "Pas factor toe voor vette maaltijden"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "De nieuwe alternatieve boluscalculator is een andere benadering van de standaard boluscalculator in iAPS. Als de knop aan staat, gebruik je deze boluscalculator en niet de originele iAPS-calculator. Aan het einde van de berekening wordt een aangepaste factor toegepast, zoals het hoort bij het gebruik van smbs (standaard 0,8).\n\nJe kunt ook de optie toevoegen in je boluscalculator om een andere (!) aanpasbare factor toe te passen aan het einde van de berekening, wat handig kan zijn voor vette maaltijden, zoals pizza (standaard 0,7)."; /* UI/UX option */ "Display Predictions" = "Geef voorspellingen weer"; @@ -2132,13 +2132,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Home View Button Panel " = "Beginscherm knoppaneel "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Home grafiek instellingen "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Statistiek instellingen "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c eenheid overschrijven"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "In het geval dat je zowel profielen als tijdelijke doelen gebruikt"; @@ -2155,10 +2155,10 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Bolus calculator"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamische ISF"; /* Notification option */ "Live Activity" = "Live activiteit"; @@ -2167,13 +2167,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Toon live activiteit"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activiteiten zijn uitgeschakeld in systeem instellingen. Ga naar Instellingen -> iAPS -> Live activiteiten\n\n om live activiteiten in te schakelen."; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; From 228b05d448d3604ea3b51398163eb6a1cd04ce02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 3 Feb 2024 15:48:30 +0100 Subject: [PATCH 389/405] Crowdin (#505) --- .../nl.lproj/Localizable.strings | 2 +- .../uk.lproj/Localizable.strings | 2 +- .../vi.lproj/Localizable.strings | 2 +- .../Resources/nl.lproj/Localizable.strings | 4 +- .../Resources/uk.lproj/Localizable.strings | 4 +- .../Resources/vi.lproj/Localizable.strings | 4 +- .../Main/de.lproj/Localizable.strings | 2 +- .../Main/fr.lproj/Localizable.strings | 12 ++-- .../Main/nl.lproj/Localizable.strings | 22 +++--- .../Main/uk.lproj/Localizable.strings | 22 +++--- .../Main/vi.lproj/Localizable.strings | 70 +++++++++---------- 11 files changed, 73 insertions(+), 73 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings index ac450cf45a..9c15f8104f 100644 --- a/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nl.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Wacht tot het inbrengen is voltooid."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schuif om canule te starten."; /* Label text indicating insertion finished. */ "Inserted" = "Ingebracht"; diff --git a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings index 3884f02677..a2cf90837b 100644 --- a/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/uk.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Дочекайтеся завершення введення канюлі."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Посуньте перемикач нижче, щоб розпочати введення канюлі."; /* Label text indicating insertion finished. */ "Inserted" = "Введено"; diff --git a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings index 115599fa9f..89f649d4cd 100644 --- a/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/vi.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Đợi đến khi việc gắn hoàn tất."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Trượt bên dưới để bắt đầu chèn Cannula."; /* Label text indicating insertion finished. */ "Inserted" = "Đã gắn"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings index 3e281364dd..43a8fb43b4 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nl.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Veeg om Pod te deactiveren"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schuif om canule te starten."; /* Label text showing pod is deactivated */ "Deactivated" = "Gedeactiveerd"; @@ -285,7 +285,7 @@ "Fault" = "Fout"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Vul een nieuwe pod met U-100 insuline (laat de Podnaalddop zitten). Luister naar 2 piepjes."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Voltooi deactivering"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings index 269b6f87a0..03d58e64a7 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Проведіть, щоб деактивувати Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Посуньте перемикач нижче, щоб розпочати введення канюлі."; /* Label text showing pod is deactivated */ "Deactivated" = "Деактивовано"; @@ -285,7 +285,7 @@ "Fault" = "Збій"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Заправити новий Pod інсуліном (не менше U-100, не знімати кришку канюлі). Дочекатись 2 сигналів."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершити деактивацію"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings index 26cc066a74..94c2972acb 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/vi.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Trượt để vô hiệu hóa Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Trượt bên dưới để bắt đầu chèn Cannula."; /* Label text showing pod is deactivated */ "Deactivated" = "Đã hủy kích hoạt"; @@ -285,7 +285,7 @@ "Fault" = "Lỗi"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Dùng loại insulin U-100 cho pod (để nguyên nắp kim trong của Pod). Lắng nghe 2 tiếng bíp."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Hoàn tất việc ngưng kích hoạt"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index a434afe6f8..82bcfa4598 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiviere Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Berechnen Sie bei jedem Loop-Zyklus eine neue Insulinempfindlichkeitseinstellung (ISF). Die neue ISF basiert auf Ihrem aktuellen Blutzucker, der täglichen Gesamtinsulindosis (TDD, alle in den letzten 24 Stunden abgegebenen Insuline) und einem individuellen Anpassungsfaktor (die Empfehlung für den Anfang ist 0,5, wenn Sie die Sigmoid-Funktion verwenden, und 0,8, wenn nicht).\n\nAlle dynamischen ISF- und CR-Anpassungen werden durch Ihre autosens.min/max-Grenzwerte begrenzt."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiviere dynamischen CR"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 7e4313a2fd..69125bdb30 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -2038,7 +2038,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Activer ISF dynamique"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Activer ISF dynamique"; +"Enable Dynamic ISF" = "Activer le facteur de sensibilité à l'insuline (FSI) dynamique"; /* Enable Dynamic ISF */ "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcule un nouveau facteur de sensibilité à l'insuline (FSI) à chaque cycle de boucle. Le nouveau FSI sera basé sur votre glycémie actuelle, la dose quotidienne totale d'insuline (DQT = total de toutes les doses d'insuline livrées dans les dernières 24 heures) et un facteur d'ajustement individuel (il est recommandé de commencer par 0,5 si vous utilisez la fonction Sigmoid et 0,8 si ce n'est pas le cas).\n\nTous les ajustements dynamiques du FSI et du RGI (Ratio insuline/glucides) seront limités par vos paramètres autosens min/max."; @@ -2056,7 +2056,7 @@ Enact a temp Basal or a temp target */ "Activate Dynamic Carb Ratio (CR)" = "Activer le ratio de glucides dynamique (RC)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; +"Adjust Dynamic ISF constant" = "Ajuster la constante du FSI Dynamique"; /* Adjust Dynamic ISF constant */ "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; @@ -2134,7 +2134,7 @@ Enact a temp Basal or a temp target */ "Statistics settings " = "Paramètres des statistiques "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Outrepasser l'unité HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Si vous utilisez à la fois des profils et des cibles temporaires"; @@ -2163,13 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Afficher l'activité en direct"; /* Live Activity Footer */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "L'activité en direct affiche la glycémie sur l'écran de verrouillage et sur l'île dynamique (si disponible)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Les activités en direct sont désactivées dans les paramètres du système. Pour activer les activités en direct, allez dans Réglages -> iAPS -> Activer les activités en direct.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Moyenne pondérée de TDD. Poids des dernières 24 heures:"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index 8011f00160..ba1a326ed4 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2102,16 +2102,16 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Calculator settings" = "Calculator instellingen"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Gebruik alternatieve Bolus Calculator"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Vette maaltijd"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Pas factor toe voor vette maaltijden"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "De nieuwe alternatieve boluscalculator is een andere benadering van de standaard boluscalculator in iAPS. Als de knop aan staat, gebruik je deze boluscalculator en niet de originele iAPS-calculator. Aan het einde van de berekening wordt een aangepaste factor toegepast, zoals het hoort bij het gebruik van smbs (standaard 0,8).\n\nJe kunt ook de optie toevoegen in je boluscalculator om een andere (!) aanpasbare factor toe te passen aan het einde van de berekening, wat handig kan zijn voor vette maaltijden, zoals pizza (standaard 0,7)."; /* UI/UX option */ "Display Predictions" = "Geef voorspellingen weer"; @@ -2132,13 +2132,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Home View Button Panel " = "Beginscherm knoppaneel "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Home grafiek instellingen "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Statistiek instellingen "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c eenheid overschrijven"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "In het geval dat je zowel profielen als tijdelijke doelen gebruikt"; @@ -2155,10 +2155,10 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Bolus calculator"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamische ISF"; /* Notification option */ "Live Activity" = "Live activiteit"; @@ -2167,13 +2167,13 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Toon live activiteit"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "De 'Live activiteit' toont bloedglucose op het vergrendelscherm en op het Dynamische Island (indien beschikbaar).\n\nDynamic Island vervangt de traditionele statische 'notch' (inkeping) aan de bovenkant van de iPhone-schermen"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activiteiten zijn uitgeschakeld in systeem instellingen. Ga naar Instellingen -> iAPS -> Live activiteiten\n\n om live activiteiten in te schakelen."; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewogen gemiddelde van TDD van afgelopen 24 uur:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index b3a1d1c1fa..684f9758be 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2098,16 +2098,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Налаштування калькулятора"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Використати альтернативний болюсний калькулятор"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Жирна їжа"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Застосувати коефіцієнт жирної їжі"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Новий альтернативний болюсний калькулятор є іншим підходом до стандартного болюсного калькулятора в iAPS. Якщо перемикач увімкнено, ви використовуєте цей болюсний калькулятор, а не оригінальний калькулятор iAPS. Наприкінці обчислення застосовано спеціальний коефіцієнт, як це має бути під час використання smbs (за замовчуванням 0,8).\n\nВи також можете додати опцію у своєму болюсному калькуляторі, щоб застосувати інший (!) настроюваний коефіцієнт наприкінці обчислення, яке може бути корисним для жирних страв, наприклад, піци (за замовчуванням 0,7)."; /* UI/UX option */ "Display Predictions" = "Показати передбачення"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Панель кнопок домашнього перегляду"; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Налаштування домашньої діаграми"; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Налаштування статистики "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Замінити одиницю HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Якщо ви використовуєте профілі та тимчасові цілі"; @@ -2151,10 +2151,10 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Калькулятор Болюса"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Динамічний ISF"; /* Notification option */ "Live Activity" = "Дії наживо"; @@ -2163,13 +2163,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Показати дії наживо"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Дії наживо відображає рівень глюкози в крові в прямому ефірі на екрані блокування та на динамічному острові (якщо доступний)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Активність у реальному часі вимкнено в налаштуваннях системи. Щоб увімкнути дії в реальному часі, перейдіть у додаток Налаштування -> iAPS -> УВІМКНУТИ дії в реальному часі.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Виважене Середнє Значення TDD. Вага останніх 24 годин:"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index 19cc697e86..bfd611b30a 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -324,7 +324,7 @@ Enact a temp Basal or a temp target */ "Invalid URL" = "URL không xác thực"; /* */ -"Local glucose source" = "NGUỒN GLUCOSE NỘI TẠI"; +"Local glucose source" = "Nguồn Glucose cục bộ"; /* Header */ "Nightscout Config" = "Cấu hình Nightscout"; @@ -336,7 +336,7 @@ Enact a temp Basal or a temp target */ "URL" = "URL"; /**/ -"Use local glucose server" = "Sử dụng nguồn glucose nội tại"; +"Use local glucose server" = "Sử dụng nguồn glucose cục bộ"; /* Enable Statistics */ "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Điều này cho phép tải số liệu thống kê lên Nightscout mà có thể được sử dụng bởi Dự án Community Statictics và Demographics. \n\nTham gia vào Thống kê Cộng đồng là tùy chọn và yêu cầu đăng ký riêng tại:\n"; @@ -378,19 +378,19 @@ Enact a temp Basal or a temp target */ "Yes, Import" = "Đồng ý, hãy cập nhật"; /* */ -"Import settings from Nightscout" = "Cập nhật cấu hình từ Nightscout"; +"Import settings from Nightscout" = "Nhập cấu hình từ Nightscout"; /* */ -"Import settings?" = "Cập nhật các cấu hình?"; +"Import settings?" = "Nhập các cấu hình?"; /* */ -"Import from Nightscout" = "Cập nhật từ Nightscout"; +"Import from Nightscout" = "Nhập từ Nightscout"; /* */ -"Settings imported" = "Các cấu hình đã được cập nhật"; +"Settings imported" = "Các cấu hình đã được nhập"; /* Import Error */ -"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Cập nhật cấu hình bị hủy bỏ."; +"\nMismatching glucose units in Nightscout and Pump Settings. Import settings aborted." = "\n Đơn vị glucose không khớp trong Cài đặt Nightscout và Pump. Nhập cấu hình bị hủy bỏ."; /* Import Error */ "Can't find the default Nightscout Profile." = "Không thể tìm thấy Hồ sơ Nightscout mặc định."; @@ -588,7 +588,7 @@ Enact a temp Basal or a temp target */ "Delete Insulin?" = "Xóa Insulin?"; /* Treatments list */ -"Treatments" = "Phương pháp điều trị"; +"Treatments" = "Đã xử lý"; /* " min" in Treatments list */ " min" = " phút"; @@ -1764,10 +1764,10 @@ Enact a temp Basal or a temp target */ "Display Loop Cycle statistics" = "Hiển thị số liệu thống kê theo vòng tròn"; /* Description for Display Loop statistics */ -"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong statPanel trong Chế độ xem trang chủ"; +"Displays Loop statistics in the statPanel in Home View" = "Hiển thị số liệu thống kê vòng lặp trong bảng điều khiển trong Chế độ xem trang chủ"; /* Description for Override HbA1c unit */ -"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong statPanlel. Đơn vị trong statPanel sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; +"Change default HbA1c unit in statPanlel. The unit in statPanel will be updateded with next statistics.json update" = "Thay đổi đơn vị HbA1c mặc định trong bảng điều khiển. Đơn vị trong bảng điều khiển sẽ được cập nhật với bản cập nhật stats.json tiếp theo"; /* HbA1c for all glucose storage days */ "all" = "Tất cả"; @@ -1811,7 +1811,7 @@ Enact a temp Basal or a temp target */ "Low Temptarget Lowers Sensitivity" = "Mục tiêu tạm thời thấp sẽ làm giảm độ nhạy"; /* ”Low Temptarget Lowers Sensitivity" */ -"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với HalfBasalTarget mặc định là 160)."; +"Defaults to false. When set to true, can lower sensitivity (higher sensitivity ratio) for temptargets <= 99. The lower your temp target below 100 will result in less sensitive (higher) ratios, e.g., temp target of 95 results in sensitivity ratio of 1.09, while 85 results in 1.33 (with default halfBasalTarget of 160)." = "Mặc định là False. Khi được đặt thành True, có thể giảm độ nhạy (tỷ lệ độ nhạy cao hơn) cho mục tiêu tạm thời <= 99. Mục tiêu tạm thời của bạn càng thấp dưới 100 sẽ dẫn đến tỷ lệ kém nhạy hơn (cao hơn), ví dụ: mục tiêu tạm thời là 95 dẫn đến tỷ lệ độ nhạy là 1,09, trong khi 85 kết quả là 1,33 (với Một nửa mục tiêu cơ bản mặc định là 160)."; /* Headline ”Sensitivity Raises Target" */ "Sensitivity Raises Target" = "Độ nhạy tăng mục tiêu"; @@ -1841,13 +1841,13 @@ Enact a temp Basal or a temp target */ "Wide BG Target Range" = "Phạm vi mục tiêu BG rộng"; /* "Wide BG Target Range" */ -"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng Phạm vi mục tiêu BG rộng: true để buộc nhiệt độ trung tính trên phạm vi BG cuối cùng rộng hơn."; +"Defaults to false, which means by default only the low end of the pump’s BG target range is used as OpenAPS target. This is a safety feature to prevent too-wide targets and less-optimal outcomes. Therefore the higher end of the target range is used only for avoiding bolus wizard overcorrections. Use wide_bg_target_range: true to force neutral temps over a wider range of eventualBGs." = "Giá trị mặc định là False, có nghĩa là theo mặc định chỉ phần thấp nhất trong phạm vi mục tiêu BG của máy bơm được sử dụng làm mục tiêu OpenAPS. Đây là tính năng an toàn nhằm ngăn chặn các mục tiêu quá rộng và kết quả kém tối ưu. Do đó, mức cao hơn của phạm vi mục tiêu chỉ được sử dụng để tránh việc điều chỉnh quá mức của thuật sĩ truyền nhanh. Sử dụng Phạm vi mục tiêu BG rộng: true để buộc liều tạm thời trung tính trên phạm vi BG cuối cùng rộng hơn."; /* Headline "Skip Neutral Temps" */ -"Skip Neutral Temps" = "Bỏ qua tạm thời trung lập"; +"Skip Neutral Temps" = "Bỏ qua liều tạm thời trung lập"; /* "Skip Neutral Temps" */ -"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Temp “trung tính” (giống như Temp cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; +"Defaults to false, so that iAPS will set temps whenever it can, so it will be easier to see if the system is working, even when you are offline. This means iAPS will set a “neutral” temp (same as your default basal) if no adjustments are needed. This is an old setting for OpenAPS to have the options to minimise sounds and notifications from the 'rig', that may wake you up during the night." = "Mặc định là False, do đó iAPS sẽ đặt nhiệt độ bất cứ khi nào có thể, do đó, sẽ dễ dàng hơn để xem hệ thống có hoạt động hay không, ngay cả khi bạn ngoại tuyến. Điều này có nghĩa là OpenAPS sẽ đặt Liều tạm thời “trung tính” (giống như Liều tạm thời cơ bản mặc định của bạn) nếu không cần điều chỉnh. Đây là cài đặt cũ để OpenAPS có các tùy chọn giảm thiểu âm thanh và thông báo từ 'giàn khoan' có thể đánh thức bạn vào ban đêm. "; /* Headline "Unsuspend If No Temp” */ "Unsuspend If No Temp" = "Bỏ tạm dừng nếu không có tạm thời"; @@ -1865,7 +1865,7 @@ Enact a temp Basal or a temp target */ "Enable SMB With COB" = "Kích hoạt SMB đối với COB"; /* Enable SMB With COB" */ -"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép supermicrobolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; +"This enables supermicrobolus (SMB) while carbs on board (COB) are positive." = "Điều này cho phép Super Micro Bolus (SMB) trong khi lượng carb đang hoạt động (COB) ở mức dương."; /* Headline "Enable SMB With Temptarget” */ "Enable SMB With Temptarget" = "Kích hoạt SMB với mục tiêu tạm thời"; @@ -1877,7 +1877,7 @@ Enact a temp Basal or a temp target */ "Enable SMB Always" = "Luôn bật SMB"; /* "Enable SMB Always" */ -"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật supermicrobolus (trừ khi bị tắt bởi high temptarget)."; +"Defaults to false. When true, always enable supermicrobolus (unless disabled by high temptarget)." = "Mặc định là False. Khi True, hãy luôn bật Super Micro Bolus (trừ khi bị tắt bởi high temptarget)."; /* Headline "Enable SMB After Carbs" */ "Enable SMB After Carbs" = "Kích hoạt SMB sau Carbs"; @@ -1886,13 +1886,13 @@ Enact a temp Basal or a temp target */ "Defaults to false. When true, enables supermicrobolus (SMB) for 6h after carbs, even with 0 carbs on board (COB)." = "Mặc định là False. Khi True, hãy bật Super Micro Bolus (SMB) trong 6 giờ sau khi nạp carbs, ngay cả khi không có carbs (COB)."; /* Enable "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; +"Allow SMB With High Temptarget" = "Cho phép SMB với mục tiêu tạm thời cao"; /* Headline "Allow SMB With High Temptarget" */ -"Allow SMB With High Temptarget" = "Cho phép SMB có Temptarget cao"; +"Allow SMB With High Temptarget" = "Cho phép SMB với mục tiêu tạm thời cao"; /* "Allow SMB With High Temptarget" */ -"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được bật khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; +"Defaults to false. When true, allows supermicrobolus (if otherwise enabled) even with high temp targets (> 100 mg/dl)." = "Mặc định là False. Khi True, cho phép Super Micro Bolus (nếu được kích hoạt khác) ngay cả với mục tiêu nhiệt độ cao (> 100 mg/dl)."; /* Headline "Use Custom Peak Time” */ "Use Custom Peak Time" = "Sử dụng giờ cao điểm tùy chỉnh"; @@ -1904,13 +1904,13 @@ Enact a temp Basal or a temp target */ "Suspend Zeros IOB" = "Tạm dừng IOB bằng 0"; /* "Suspend Zeros IOB” */ -"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Temp Basals 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; +"Default is false. Any existing temp basals during times the pump was suspended will be deleted and 0 temp basals to negate the profile basal rates during times pump is suspended will be added." = "Mặc định là False. Mọi mức Temp Basals hiện có trong thời gian máy bơm bị tạm dừng sẽ bị xóa và mức Liều cơ bản tạm thời 0 để phủ nhận tốc độ cơ bản của hồ sơ trong thời gian máy bơm bị tạm dừng sẽ được thêm vào."; /* Headline "Max IOB" */ "Max IOB" = "IOB tối đa"; /* "Max IOB" */ -"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (Hệ số tối đa an toàn hàng ngày và Hệ số an toàn cơ bản hiện tại), Tối đa IOB được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra lãi suất cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; +"Max IOB is the maximum amount of insulin on board from all sources – both basal (or SMB correction) and bolus insulin – that your loop is allowed to accumulate to treat higher-than-target BG. Unlike the other two OpenAPS safety settings (max_daily_safety_multiplier and current_basal_safety_multiplier), max_iob is set as a fixed number of units of insulin. As of now manual boluses are NOT limited by this setting. \n\n To test your basal rates during nighttime, you can modify the Max IOB setting to zero while in Closed Loop. This will enable low glucose suspend mode while testing your basal rates settings\n\n(Tip from https://www.loopandlearn.org/freeaps-x/#open-loop)." = "IOB Max là lượng insulin tối đa được cung cấp từ tất cả các nguồn – cả insulin cơ bản (hoặc hiệu chỉnh SMB) và insulin bolus – mà vòng lặp của bạn được phép tích lũy để điều trị BG cao hơn mục tiêu. Không giống như hai cài đặt an toàn OpenAPS khác (Hệ số tối đa an toàn hàng ngày và Hệ số an toàn cơ bản hiện tại), Tối đa IOB được đặt thành số lượng đơn vị insulin cố định. Tính đến thời điểm hiện tại, việc tiêm liều thủ công KHÔNG bị giới hạn bởi cài đặt này. \n\n Để kiểm tra liều cơ bản của bạn vào ban đêm, bạn có thể sửa đổi cài đặt IOB tối đa thành 0 khi ở Vòng kín. Điều này sẽ kích hoạt chế độ tạm ngưng lượng glucose thấp trong khi kiểm tra cài đặt tốc độ cơ bản của bạn\n\n(Mẹo từ https://www.loopandlearn.org/freeaps-x/#open-loop)."; /* Headline "Max Daily Safety Multiplier" */ "Max Daily Safety Multiplier" = "Hệ số tối đa an toàn hàng ngày"; @@ -1947,7 +1947,7 @@ Enact a temp Basal or a temp target */ "Max COB" = "COB tối đa"; /* "Max COB" */ -"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của maxCOB là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức maxCOB và giữ nó ở mức maxCOB cho đến khi lượng carb nhập vào trên maxCOB cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; +"The default of maxCOB is 120. (If someone enters more carbs in one or multiple entries, iAPS will cap COB to maxCOB and keep it at maxCOB until the carbs entered above maxCOB have shown to be absorbed. Essentially, this just limits UAM as a safety cap against weird COB calculations due to fluky data.)" = "Giá trị mặc định của COB tối đa là 120. (Nếu ai đó nạp nhiều carbs hơn vào một hoặc nhiều mục, iAPS sẽ giới hạn COB ở mức COB tối đa và giữ nó ở mức COB tối đa cho đến khi lượng carb nhập vào trên COB tối đa cho thấy đã được hấp thụ. Về cơ bản, điều này chỉ giới hạn UAM như một giới hạn an toàn chống lại các phép tính COB kỳ lạ do dữ liệu không ổn định.)"; /* Headline "Bolus Snooze DIA Divisor" */ "Bolus Snooze DIA Divisor" = "Chế độ báo lại bolus"; @@ -1965,7 +1965,7 @@ Enact a temp Basal or a temp target */ "Autotune ISF Adjustment Fraction" = "Phân số (AF) điều chỉnh ISF tự động điều chỉnh"; /* "Autotune ISF Adjustment Fraction" */ -"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của fullNewISF và PumpISF. 1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF."; +"The default of 0.5 for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 1.0 allows full adjustment, 0 is no adjustment from pump ISF." = "Giá trị mặc định là 0,5 cho giá trị này giữ cho ISF tự động điều chỉnh gần hơn với ISF bơm thông qua mức trung bình có trọng số của ISF điều chỉnh hoàn toàn và ISF điều chỉnh từ bơm (1.0 cho phép điều chỉnh hoàn toàn, 0 là không điều chỉnh từ bơm ISF)."; /* Headline "Remaining Carbs Fraction" */ "Remaining Carbs Fraction" = "Phần carb còn lại"; @@ -2042,7 +2042,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Kích hoạt ISF động"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD, tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Tính toán Cài đặt độ nhạy Insulin (ISF) mới sau mỗi chu kỳ vòng lặp. ISF mới sẽ dựa trên Glucose hiện tại của bạn, tổng liều insulin hàng ngày (TDD: tổng lượng insulin được cung cấp trong 24 giờ qua) và Hệ số Điều chỉnh riêng lẻ (khuyến nghị bắt đầu là 0,5 nếu sử dụng Chức năng Sigmoid và 0,8 nếu không sử dụng).\\ n\nTất cả các điều chỉnh ISF động và CR sẽ bị giới hạn bởi autosens.min của bạn."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Kích hoạt CR động"; @@ -2099,16 +2099,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Thiết lập tính toán"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Sử dụng Máy tính Bolus thay thế"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Bữa ăn nhiều chất béo"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Áp dụng hệ số cho bữa ăn nhiều chất béo"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Công cụ tính bolus thay thế mới là một cách tiếp cận khác với công cụ tính bolus mặc định trong iAPS. Nếu bật nút này, bạn sẽ sử dụng máy tính bolus này chứ không phải máy tính iAPS gốc. Khi kết thúc phép tính, một hệ số tùy chỉnh sẽ được áp dụng như lẽ ra phải như vậy khi sử dụng smbs (mặc định là 0,8).\n\nBạn cũng có thể thêm tùy chọn trong máy tính bolus của mình để áp dụng một hệ số tùy chỉnh (!) khác ở cuối phép tính, phép tính có thể hữu ích cho các bữa ăn nhiều chất béo, ví dụ: Pizza (mặc định là 0,7)."; /* UI/UX option */ "Display Predictions" = "Hiển thị dự đoán"; @@ -2129,10 +2129,10 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Bảng nút xem trang chủ "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Trang chủ Cài đặt biểu đồ "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Cài đặt thống kê "; /* UI/UX title */ "Override HbA1c Unit" = "Override HbA1c Unit"; @@ -2152,10 +2152,10 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Tính toán Bolus"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Độ nhạy Insulin (ISF) động"; /* Notification option */ "Live Activity" = "Hoạt động trực tiếp"; @@ -2164,13 +2164,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Hiển thị hoạt động trực tiếp"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Hiển thị hoạt động trực tiếp đường huyết trên màn hình khóa"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Để bật các hoạt động trực tiếp, hãy đi tới ứng dụng Cài đặt -> iAPS -> BẬT Hoạt động trực tiếp.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Trung bình có trọng số của TDD. Trọng lượng trong 24 giờ qua:"; @@ -2204,7 +2204,7 @@ Enact a temp Basal or a temp target */ "Enable SMBs when a high BG is detected, based on the high BG target (adjusted or profile)" = "Kích hoạt SMB khi phát hiện BG cao, dựa trên mục tiêu BG cao (đã điều chỉnh hoặc cấu hình)"; /* Headline "Dynamic settings" */ -"Dynamic settings" = "Cài đặt Dynamic"; +"Dynamic settings" = "Dynamic Settings"; /* Insulin curve */ "Insulin curve" = "Chủng loại insulin"; From ef0bd95bbd665cb9df392b28b394159dc289109c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 3 Feb 2024 16:02:28 +0100 Subject: [PATCH 390/405] New localized string --- .../Sources/Localizations/Main/en.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 793577b381..5eaa9a3c6c 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -2155,6 +2155,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; From 7861c266a1bc6124f37a5c413063405e4311130d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 3 Feb 2024 17:46:49 +0100 Subject: [PATCH 391/405] Missing override variable. Change details here: https://github.com/Artificial-Pancreas/oref2/commit/a9bdbb139b3d512d6c846a978b21729f5d01e7c1 --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index 77da3712d4..a065a827ab 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr;v.smbIsAlwaysOff,v.start;v.end;const S=v.smbMinutes,D=v.uamMinutes;var w=h.useNewFormula,G=0,T=B,C=0,U="",O="",A="",R="",I="",F="",j=0,P=0,E=0,q=0,W=0,k=0;const L=v.weightedAverage;var z=1,N=i.sens,H=i.carb_ratio;v.useOverride&&(z=v.overridePercentage/100,_?(N/=z,H/=z):(x&&(H/=z),y&&(N/=z)));const Z=i.weightPercentage,$=v.average_total_data;function J(e,t){var a=e.getTime();return new Date(a+36e5*t)}function K(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Q(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function V(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const X=Math.min(i.autosens_min,i.autosens_max),Y=Math.max(i.autosens_min,i.autosens_max);function ee(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Q(r),u=p[0].rate;for(let e=0;e=(s=V(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=V(d,l))?n=s:o=(s=V("23:59:59",l))?n=s:o0&&o1)&&(w=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(w){let e=g.length-1;var te=new Date(g[e].timestamp),ae=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ae=new Date),(C=(ae-te)/36e5)<23.9&&C>21)W=ee(te,(re=24-C,oe=te.getTime(),new Date(oe-36e5*re))),R="24 hours of data is required for an accurate tdd calculation. Currently only "+C.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+W.toPrecision(5)+" U. ";else C<21?(w=!1,enableDynamicCR=!1):R=""}}else console.log("Pumphistory is empty!"),w=!1,enableDynamicCR=!1;var re,oe;if(w){for(let e=0;e0){j=e,k=g[e].rate;var ne=g[e-1]["duration (min)"]/60,ie=ne,se=new Date(g[e-1].timestamp),le=se,ue=0;do{if(e--,0==e){le=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){le=new Date(g[e].timestamp);break}var me=e-2;if(me>=0&&"Rewind"==g[me]._type){let e=g[me].timestamp;for(;me-1>=0&&"Prime"==g[me-=1]._type;)ue=(g[me].timestamp-e)/36e5;ue>=ne&&(le=e,ue=0)}}while(e>0);var de=(le-se)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(W+=ee(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ce=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ce=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ce=new Date,t=g[e]["duration (min)"]/60),(ce-a)/36e5-t>0){W+=ee(ce,J(a,t))}}var ge={TDD:o(P=q+E+W,5),bolus:o(q,5),temp_basal:o(E,5),scheduled_basal:o(W,5)};C>21?(O=". Bolus insulin: "+q.toPrecision(5)+" U",A=". Temporary basal insulin: "+E.toPrecision(5)+" U",U=". Insulin with scheduled basal rate: "+W.toPrecision(5)+" U",I=R+(" TDD past 24h is: "+P.toPrecision(5)+" U")+O+A+U,F=", TDD: "+o(P,2)+" U, "+o(q/P*100,0)+"% Bolus "+o((E+W)/P*100,0)+"% Basal"):F=", TDD: Not enough pumpData (< 21h)"}var he;const pe=e.glucose,ve=h.enableDynamicCR,fe=h.adjustmentFactor,Be=B;var be=!1,Me="",_e=1,ye="";$>0&&(_e=L/$),ye=_e>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(_e=o(_e=Math.min(_e,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":_e<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(_e=o(_e=Math.max(_e,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+_e,ye=", Basal ratio: "+_e,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(be=!0),Be>=118&&be&&(w=!1,Me="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Be);var xe=", Dynamic ratios log: ",Se=", AF: "+fe,De="BG: "+pe+" mg/dl ("+(.0555*pe).toPrecision(2)+" mmol/l)",we="",Ge="";const Te=h.curve,Ce=i.insulinPeakTime,Ue=h.useCustomPeakTime;var Oe=55,Ae=65;switch(Te){case"rapid-acting":Ae=65;break;case"ultra-rapid":Ae=50}Ue?(Oe=120-Ce,console.log("Custom insulinpeakTime set to :"+Ce+", insulinFactor: "+Oe)):(Oe=120-Ae,console.log("insulinFactor set to : "+Oe)),he=P,Z<1&&L>0&&(P=L,console.log("Using weighted TDD average: "+o(P,2)+" U, instead of past 24 h ("+o(he,2)+" U), weight: "+Z),Ge=", Weighted TDD: "+o(P,2)+" U");const Re=h.sigmoid;var Ie="";if(w){var Fe=N*fe*P*Math.log(pe/Oe+1)/1800;we=", Logarithmic formula"}if(w&&Re){const e=X,t=Y-e,a=.0555*(pe-B);var je=_e,Pe=Y-1;1==Y&&(Pe=Y+.01-1);const r=Math.log10(1/Pe-e/Pe)/Math.log10(Math.E),o=a*fe*je+r;Fe=t/(1+Math.exp(-o))+e,we=", Sigmoid function"}var Ee=H;const qe=o(H,1);var We="",ke="";if(w&&P>0){if(We=", Dynamic ISF/CR: On/",Fe>Y?(Me=", Dynamic ISF limited by autosens_max setting: "+Y+" ("+o(Fe,2)+"), ",ke=", Autosens/Dynamic Limit: "+Y+" ("+o(Fe,2)+")",Fe=Y):Fe-.5?"+"+o(e.delta,0):o(e.delta,0);var Ye=Math.min(e.delta,e.short_avgdelta),et=Math.min(e.short_avgdelta,e.long_avgdelta),tt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ve<=10||38===Ve||Xe>=3)&&(ze.reason="CGM is calibrating, in ??? state, or noise is high");if(Ve>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ve&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ve&&!0),Qe>12||Qe<-5?ze.reason="If current system time "+$e+" is correct, then BG data is too old. The last BG data was read "+Qe+"m ago at "+Ke:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ve&&(e.last_cal&&e.last_cal<3?ze.reason="CGM was just calibrated":ze.reason="CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ve&&(Ve<=10||38===Ve||Xe>=3||Qe>12||Qe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ze?(ze.reason+=". Canceling high temp basal of "+t.rate,ze.deliverAt=Ne,ze.temp="absolute",ze.duration=0,ze.rate=0,ze):0===t.rate&&t.duration>30?(ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",ze.deliverAt=Ne,ze.temp="absolute",ze.duration=30,ze.rate=0,ze):(ze.reason+=". Temp "+t.rate+" <= current basal "+Ze+"U/hr; doing nothing. ",ze);var at,rt,ot,nt,it=i.max_iob;if(void 0!==B&&(rt=B),void 0!==i.max_bg&&(ot=B),void 0!==i.enableSMB_high_bg_target&&(nt=i.enableSMB_high_bg_target),void 0===B)return ze.error="Error: could not determine target_bg. ",ze;at=B;var st=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,lt=100,ut=160;if(ut=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ut=e}else console.log("Default Half Basal Target used: "+n(ut,i)+" "+i.out_units);if(st&&i.temptargetSet&&at>lt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&at=at&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(_e,2)+", TDD 24h = "+o(he,2)+"U, Weighted average TDD = "+o(L,2)+"U, (Weight percentage = "+Z+"), Total data of TDDs (up to 14 days) average = "+o($,2)+"U. "),Ze!==He*z?process.stderr.write("Adjusting basal from "+He*z+" U/h to "+Ze+" U/h; "):process.stderr.write("Basal unchanged: "+Ze+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){rt=o((rt-60)/s.ratio)+60,ot=o((ot-60)/s.ratio)+60;var dt=o((at-60)/s.ratio)+60;at===(dt=Math.max(80,dt))?process.stderr.write("target_bg unchanged: "+n(dt,i)+"; "):process.stderr.write("target_bg from "+n(dt,i)+" to "+n(dt,i)+"; "),at=dt}var ct=n(at,i);at!=B&&(ct=0!==b&&6!==b&&b!==at?n(B,i)+"→"+n(b,i)+"→"+n(at,i):n(B,i)+"→"+n(at,i));var gt=200,ht=200,pt=200;if(e.noise>=2){var vt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);gt=o(Math.min(200,rt*vt)),ht=o(Math.min(200,at*vt)),pt=o(Math.min(200,ot*vt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(dt,i)+" to "+n(ht,i)+"; "),rt=gt,at=ht,ot=pt}T=rt-.5*(rt-40),T=Math.min(Math.max(i.threshold_setting,T,65),120),console.error("Threshold set to "+n(T,i));var ft="",Bt=(o(N,1),N);if(void 0!==s&&s&&((Bt=o(Bt=N/sensitivityRatio,1))!==N?process.stderr.write("ISF from "+n(N,i)+" to "+n(Bt,i)):process.stderr.write("ISF unchanged: "+n(Bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(N,i)+"→"+n(Bt,i)),console.error("CR:"+H),void 0===a)return ze.error="Error: iob_data undefined. ",ze;var bt,Mt=a;if(a.length,a.length>1&&(a=Mt[0]),void 0===a.activity||void 0===a.iob)return ze.error="Error: iob_data missing some property. ",ze;var _t=((bt=void 0!==a.lastTemp?o((new Date($e).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+bt+"m, tempModulus:"+_t+"m"),ze.temp="absolute",ze.deliverAt=Ne,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&bt>10&&t.duration)return ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,ze,t);if(t&&a.lastTemp&&t.duration>0){var yt=bt-a.lastTemp.duration;if(yt>5&&bt>10)return ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+yt+"m ago; canceling temp",u.setTempBasal(0,0,i,ze,t)}var xt=o(-a.activity*Bt*5,2),St=o(6*(Ye-xt));St<0&&(St=o(6*(et-xt)))<0&&(St=o(6*(e.long_avgdelta-xt)));var Dt=Ve,wt=(Dt=a.iob>0?o(Ve-a.iob*Bt):o(Ve-a.iob*Math.min(Bt,N)))+St;if(void 0===wt||isNaN(wt))return ze.error="Error: could not calculate eventualBG. Sensitivity: "+Bt+" Deviation: "+St,ze;var Gt,Tt,Ct=function(e,t,a){return o(a+(e-t)/24,1)}(at,wt,xt);ze={temp:"absolute",bg:Ve,tick:Je,eventualBG:wt,insulinReq:0,reservoir:d,deliverAt:Ne,sensitivityRatio,CR:o(H,1),TDD:he,insulin:ge,current_target:at,insulinForManualBolus:G,manualBolusErrorString:0,minDelta:Ye,expectedDelta:Ct,minGuardBG:Tt,minPredBG:Gt,threshold:n(T,i)};var Ut=[],Ot=[],At=[],Rt=[];Ut.push(Ve),Ot.push(Ve),Rt.push(Ve),At.push(Ve);var It=function(e,t,a,r,o,i,s,l){if(!t)return console.error("SMB disabled (!microBolusAllowed)"),!1;if(!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100)return console.error("SMB disabled due to high temptarget of "+o),!1;if(!0===a.bwFound&&!1===e.A52_risk_enable)return console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1;if(400==r)return console.error("Invalid CGM (HIGH). SMBs disabled."),!1;if(s.smbIsOff){if(!s.smbIsAlwaysOff)return console.error("SMBs are disabled by profile override"),!1;{let e=l.getHours();if(s.ends.start&&(s.end+=24),e>=s.start&&e<=s.end)return console.error("SMBs are disabled by profile override"),!1;if(s.end=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1)}(i,m,l,Ve,at,nt,v,c),Ft=i.enableUAM,jt=0,Pt=0;jt=o(Ye-xt,1);var Et=o(Ye-xt,1);csf=Bt/H,console.error("profile.sens:"+n(N,i)+", sens:"+n(Bt,i)+", CSF:"+o(csf,1));var qt=o(30*csf*5/60,1);jt>qt&&(console.error("Limiting carb impact from "+jt+" to "+qt+"mg/dL/5m (30g/h)"),jt=qt);var Wt=3;sensitivityRatio&&(Wt/=sensitivityRatio);var kt=Wt;if(l.carbs){Wt=Math.max(Wt,l.mealCOB/20);var Lt=o((new Date($e).getTime()-l.lastCarbTime)/6e4),zt=(l.carbs-l.mealCOB)/l.carbs;kt=o(kt=Wt+1.5*Lt/60,1),console.error("Last carbs "+Lt+" minutes ago; remainingCATime:"+kt+"hours; "+o(100*zt,1)+"% carbs absorbed")}var Nt=Math.max(0,jt/5*60*kt/2)/csf,Ht=90,Zt=1;i.remainingCarbsCap&&(Ht=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Zt=Math.min(1,i.remainingCarbsFraction));var $t=1-Zt,Jt=Math.max(0,l.mealCOB-Nt-l.carbs*$t),Kt=(Jt=Math.min(Ht,Jt))*csf*5/60/(kt/2),Qt=o(l.slopeFromMaxDeviation,2),Vt=o(l.slopeFromMinDeviation,2),Xt=Math.min(Qt,-Vt/3);Pt=0===jt?0:Math.min(60*kt/5/2,Math.max(0,l.mealCOB*csf/jt)),console.error("Carb Impact:"+jt+"mg/dL per 5m; CI Duration:"+o(5*Pt/60*2,1)+"hours; remaining CI ("+kt/2+"h peak):"+o(Kt,1)+"mg/dL per 5m");var Yt,ea,ta,aa,ra=999,oa=999,na=999,ia=999,sa=999,la=999,ua=999,ma=wt,da=Ve,ca=Ve,ga=0,ha=[],pa=[];try{Mt.forEach((function(e){var t=o(-e.activity*Bt*5,2),a=o(-e.iobWithZeroTemp.activity*Bt*5,2),r=Dt,n=jt*(1-Math.min(1,Ot.length/12));if(!0===(w&&!Re))ma=Ot[Ot.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(Ot[Ot.length-1],39)/Oe+1)))*5,2)+n,r=Rt[Rt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(P*fe*Math.log(Math.max(Rt[Rt.length-1],39)/Oe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=Ot[Ot.length-1]+t+n,r=Rt[Rt.length-1]+a;var i=Math.max(0,Math.max(0,jt)*(1-Ut.length/Math.max(2*Pt,1))),s=Math.min(Ut.length,12*kt-Ut.length),l=Math.max(0,s/(kt/2*12)*Kt);i+l,ha.push(o(l,0)),pa.push(o(i,0)),COBpredBG=Ut[Ut.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Et+At.length*Xt),m=Math.max(0,Et*(1-At.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(ga=o(5*(At.length+1)/60,1)),!0===(w&&!Re))UAMpredBG=At[At.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(At[At.length-1],39)/Oe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=At[At.length-1]+t+Math.min(0,n)+d;Ot.length<48&&Ot.push(ma),Ut.length<48&&Ut.push(COBpredBG),At.length<48&&At.push(UAMpredBG),Rt.length<48&&Rt.push(r),COBpredBG18&&mada&&(da=ma),(Pt||Kt>0)&&Ut.length>18&&COBpredBG0)&&COBpredBG>da&&(ca=COBpredBG),Ft&&At.length>12&&UAMpredBGda&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+pa.join(" ")),console.error("remainingCIs: "+ha.join(" "))),ze.predBGs={},Ot.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var va=Ot.length-1;va>12&&Ot[va-1]===Ot[va];va--)Ot.pop();for(ze.predBGs.IOB=Ot,ea=o(Ot[Ot.length-1]),Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=Rt.length-1;va>6&&!(Rt[va-1]>=Rt[va]||Rt[va]<=at);va--)Rt.pop();if(ze.predBGs.ZT=Rt,o(Rt[Rt.length-1]),l.mealCOB>0&&(jt>0||Kt>0)){for(Ut.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),va=Ut.length-1;va>12&&Ut[va-1]===Ut[va];va--)Ut.pop();ze.predBGs.COB=Ut,ta=o(Ut[Ut.length-1]),wt=Math.max(wt,o(Ut[Ut.length-1])),console.error("COBpredBG: "+o(Ut[Ut.length-1]))}if(jt>0||Kt>0){if(Ft){for(At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=At.length-1;va>12&&At[va-1]===At[va];va--)At.pop();ze.predBGs.UAM=At,aa=o(At[At.length-1]),At[At.length-1]&&(wt=Math.max(wt,o(At[At.length-1])))}ze.eventualBG=wt}console.error("UAM Impact:"+Et+"mg/dL per 5m; UAM Duration:"+ga+"hours"),ra=Math.max(39,ra),oa=Math.max(39,oa),na=Math.max(39,na),Gt=o(ra);var fa=l.mealCOB/l.carbs;Yt=o(na<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:na<999?(ma+UAMpredBG)/2:ma),ua>Yt&&(Yt=ua),Tt=o(Tt=Pt||Kt>0?Ft?fa*ia+(1-fa)*sa:ia:Ft?sa:la);var Ba=na;if(uana&&(Ba=(na+ua)/2);if(Ba=o(Ba),l.carbs)if(!Ft&&oa<999)Gt=o(Math.max(ra,oa));else if(oa<999){var Ma=fa*oa+(1-fa)*Ba;Gt=o(Math.max(ra,oa,Ma))}else Gt=Ft?Ba:Tt;else Ft&&(Gt=o(Math.max(ra,Ba)));Gt=Math.min(Gt,Yt),process.stderr.write("minPredBG: "+Gt+" minIOBPredBG: "+ra+" minZTGuardBG: "+ua),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),na<999&&process.stderr.write(" minUAMPredBG: "+na),console.error(" avgPredBG:"+Yt+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ca>Ve&&(Gt=Math.min(Gt,ca)),ze.COB=l.mealCOB,ze.IOB=a.iob,ze.BGI=n(xt,i),ze.deviation=n(St,i),ze.ISF=n(Bt,i),ze.CR=o(H,1),ze.target_bg=n(at,i),ze.TDD=o(he,2),ze.current_target=o(at,0);var _a=ze.CR;qe!=ze.CR&&(_a=qe+"→"+ze.CR),ze.reason=ft+", COB: "+ze.COB+", Dev: "+ze.deviation+", BGI: "+ze.BGI+", CR: "+_a+", Target: "+ct+", minPredBG "+n(Gt,i)+", minGuardBG "+n(Tt,i)+", IOBpredBG "+n(ea,i),ta>0&&(ze.reason+=", COBpredBG "+n(ta,i)),aa>0&&(ze.reason+=", UAMpredBG "+n(aa,i)),ze.reason+=F,ze.reason+="; ",It||(ze.reason+="SMBs Disabled. ");var ya=Dt;ya<40&&(ya=Math.min(Tt,ya));var xa,Sa=T-ya,Da=240,wa=240;if(l.mealCOB>0&&(jt>0||Kt>0)){for(va=0;vaxa*Ve&&(console.error("maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - disabling SMB"),ze.reason+="maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - SMB disabled!, ",It=!1),console.error("BG projected to remain above "+n(rt,i)+" for "+Da+"minutes"),(wa<240||Da<60)&&console.error("BG projected to remain above "+n(T,i)+" for "+wa+"minutes");var Ga=wa,Ta=i.current_basal*z*Bt*Ga/60,Ca=Math.max(0,l.mealCOB-.25*l.carbs),Ua=(Sa-Ta)/csf-Ca;Ta=o(Ta),Ua=o(Ua),console.error("naive_eventualBG:",Dt,"bgUndershoot:",Sa,"zeroTempDuration:",Ga,"zeroTempEffect:",Ta,"carbsReq:",Ua),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ua>=i.carbsReqThreshold&&wa<=45&&(ze.carbsReq=Ua,ze.reason+=Ua+" add'l carbs req w/in "+wa+"m; ");var Oa=0;if(Ve0&&Ye>Ct)ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*z*20/60,2),ze.reason+=" and minDelta "+n(Ye,i)+" > expectedDelta "+n(Ct,i)+"; ";else if(Ve=55)return ze.reason+="; Canceling temp at "+ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,ze,t);var Aa=0,Ra=Ze,Ia=0;if(wtCt&&Ye>0&&!Ua)return Dt<40?(ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,ze,t)):(e.delta>Ye?ze.reason+=", but Delta "+n(Je,i)+" > expectedDelta "+n(Ct,i):ze.reason+=", but Min. Delta "+Ye.toFixed(2)+" > Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t)));Aa=o(Aa=2*Math.min(0,(wt-at)/Bt),2);var Fa=Math.min(0,(Dt-at)/Bt);if(Fa=o(Fa,2),Ye<0&&Ye>Ct)Aa=o(Aa*(Ye/Ct),2);Ra=r(Ra=Ze+2*Aa,i),Ia=t.duration*(t.rate-Ze)/60;var ja=Math.min(Aa,Fa);if(console.log("naiveInsulinReq:"+Fa),Ia5&&Ra>=.8*t.rate)return ze.reason+=", temp "+t.rate+" ~< req "+Ra+"U/hr. ",ze;if(Ra<=0){if((Oa=o(60*((Sa=at-Dt)/Bt)/i.current_basal*z))<0?Oa=0:(Oa=30*o(Oa/30),Oa=Math.min(120,Math.max(0,Oa))),Oa>0)return ze.reason+=", setting "+Oa+"m zero temp. ",u.setTempBasal(Ra,Oa,i,ze,t)}else ze.reason+=", setting "+Ra+"U/hr. ";return u.setTempBasal(Ra,30,i,ze,t)}if(Ye=2||Ct+-1*Ye>=2)&&(ze.manualBolusErrorString=Ye>=0&&Ct>0?3:Ye<0&&Ct<=0||Ye<0&&Ct>=0?4:5),ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),!m||!It))return e.delta "+n(rt,i)+" but Delta "+n(Je,i)+" < Exp. Delta "+n(Ct,i):ze.reason+="Eventual BG "+n(wt,i)+" > "+n(rt,i)+" but Min. Delta "+Ye.toFixed(2)+" < Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(Math.min(wt,Gt)rt&&(ze.manualBolusErrorString=6,ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),ze.minPredBG=Gt),!m||!It))return ze.reason+=n(wt,i)+"-"+n(Gt,i)+" in range: no temp required",t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(wt>=ot&&(ze.reason+="Eventual BG "+n(wt,i)+" >= "+n(ot,i)+", ",wt>ot&&(ze.insulinForManualBolus=o((wt-at)/Bt,2))),a.iob>it)return ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+it,t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));Aa=o((Math.min(Gt,wt)-at)/Bt,2),G=o((wt-at)/Bt,2),Aa>it-a.iob?(console.error("SMB limited by maxIOB: "+it-a.iob+" (. insulinReq: "+Aa+" U)"),ze.reason+="max_iob "+it+", ",Aa=it-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),G>it-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+it-a.iob+" (. insulinForManualBolus: "+G+" U)"),ze.reason+="max_iob "+it+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+G+" U)."),Ra=r(Ra=Ze+2*Aa,i),Aa=o(Aa,3),ze.insulinReq=Aa;var Pa=o((new Date($e).getTime()-a.lastBolusTime)/6e4,1);if(m&&It&&Ve>T){var Ea=30;void 0!==i.maxSMBBasalMinutes&&(Ea=i.maxSMBBasalMinutes);var qa=30;void 0!==i.maxUAMSMBBasalMinutes&&(qa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&S!==Ea&&(console.error("SMB Max Minutes - setting overriden from "+Ea+" to "+S),Ea=S),v.useOverride&&M&&D!==qa&&(console.error("UAM Max Minutes - setting overriden from "+qa+" to "+D),qa=D);var Wa=o(l.mealCOB/H,3),ka=0;void 0===Ea?(ka=o(i.current_basal*z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>ka&&console.error("SMB limited by maxBolus: "+ka+" ( "+Aa+" U)")):a.iob>Wa&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Wa),qa?(console.error("maxUAMSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*z),ka=o(i.current_basal*z*qa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),ka=o(i.current_basal*z*30/60,1)),Aa>ka?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+qa+"m ]: "+ka+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+Ea+", profile.current_basal: "+i.current_basal*z),Aa>(ka=o(i.current_basal*Ea/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+Ea+"m ]: "+ka+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var La=i.bolus_increment,za=1/La,Na=i.smb_delivery_ratio;Na>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Na,2));var Ha=Math.min(Aa*Na,ka);Ha=Math.floor(Ha*za)/za,Oa=o(60*((at-(Dt+ra)/2)/Bt)/i.current_basal*z),Aa>0&&Ha=30?(Oa=30*o(Oa/30),Oa=Math.min(60,Math.max(0,Oa))):(Za=o(Ze*Oa/30,2),Oa=30),ze.reason+=" insulinReq "+Aa,Ha>=ka&&(ze.reason+="; maxBolus "+ka),Oa>0&&(ze.reason+="; setting "+Oa+"m low temp of "+Za+"U/h"),ze.reason+=". ";var $a=3;i.SMBInterval&&($a=Math.min(10,Math.max(1,i.SMBInterval)));var Ja=o($a-Pa,0),Ka=o(60*($a-Pa),0)%60;if(console.error("naive_eventualBG "+Dt+","+Oa+"m "+Za+"U/h temp needed; last bolus "+Pa+"m ago; maxBolus: "+ka),Pa>$a?Ha>0&&(ze.units=Ha,ze.reason+="Microbolusing "+Ha+"U. "):ze.reason+="Waiting "+Ja+"m "+Ka+"s to microbolus again. ",Oa>0)return ze.rate=Za,ze.duration=Oa,ze}var Qa=u.getMaxSafeBasal(i);return 400==Ve?u.setTempBasal(i.current_basal,30,i,ze,t):(Ra>Qa&&(ze.reason+="adj. req. rate: "+Ra+" to maxSafeBasal: "+o(Qa,2)+", ",Ra=r(Qa,i)),(Ia=t.duration*(t.rate-Ze)/60)>=2*Aa?(ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):void 0===t.duration||0===t.duration?(ze.reason+="no temp, setting "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):t.duration>5&&r(Ra,i)<=r(t.rate,i)?(ze.reason+="temp "+t.rate+" >~ req "+Ra+"U/hr. ",ze):(ze.reason+="temp "+t.rate+"<"+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); +var freeaps_determineBasal;(()=>{var e={5546:(e,t,a)=>{var r=a(6880);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,f){var B=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(B=b);v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr;v.smbIsAlwaysOff,v.start;v.end;const S=v.smbMinutes,D=v.uamMinutes;var w=h.useNewFormula,G=0,T=B,C=0,U="",O="",A="",R="",I="",F="",j=0,P=0,E=0,q=0,W=0,k=0;const L=v.weightedAverage;var z=1,N=i.sens,H=i.carb_ratio;v.useOverride&&(z=v.overridePercentage/100,_?(N/=z,H/=z):(x&&(H/=z),y&&(N/=z)));const Z=i.weightPercentage,$=v.average_total_data;function J(e,t){var a=e.getTime();return new Date(a+36e5*t)}function K(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function Q(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function V(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const X=Math.min(i.autosens_min,i.autosens_max),Y=Math.max(i.autosens_min,i.autosens_max);function ee(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=Q(r),u=p[0].rate;for(let e=0;e=(s=V(p[e+1].start,p[e].start))?n=s:o=s?n=s:om)if(e+1=(s=V(d,l))?n=s:o=(s=V("23:59:59",l))?n=s:o0&&o1)&&(w=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(w){let e=g.length-1;var te=new Date(g[e].timestamp),ae=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(ae=new Date),(C=(ae-te)/36e5)<23.9&&C>21)W=ee(te,(re=24-C,oe=te.getTime(),new Date(oe-36e5*re))),R="24 hours of data is required for an accurate tdd calculation. Currently only "+C.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+W.toPrecision(5)+" U. ";else C<21?(w=!1,enableDynamicCR=!1):R=""}}else console.log("Pumphistory is empty!"),w=!1,enableDynamicCR=!1;var re,oe;if(w){for(let e=0;e0){j=e,k=g[e].rate;var ne=g[e-1]["duration (min)"]/60,ie=ne,se=new Date(g[e-1].timestamp),le=se,ue=0;do{if(e--,0==e){le=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){le=new Date(g[e].timestamp);break}var me=e-2;if(me>=0&&"Rewind"==g[me]._type){let e=g[me].timestamp;for(;me-1>=0&&"Prime"==g[me-=1]._type;)ue=(g[me].timestamp-e)/36e5;ue>=ne&&(le=e,ue=0)}}while(e>0);var de=(le-se)/36e5;de0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(W+=ee(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var ce=a;let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){ce=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(ce=new Date,t=g[e]["duration (min)"]/60),(ce-a)/36e5-t>0){W+=ee(ce,J(a,t))}}var ge={TDD:o(P=q+E+W,5),bolus:o(q,5),temp_basal:o(E,5),scheduled_basal:o(W,5)};C>21?(O=". Bolus insulin: "+q.toPrecision(5)+" U",A=". Temporary basal insulin: "+E.toPrecision(5)+" U",U=". Insulin with scheduled basal rate: "+W.toPrecision(5)+" U",I=R+(" TDD past 24h is: "+P.toPrecision(5)+" U")+O+A+U,F=", TDD: "+o(P,2)+" U, "+o(q/P*100,0)+"% Bolus "+o((E+W)/P*100,0)+"% Basal"):F=", TDD: Not enough pumpData (< 21h)"}var he;const pe=e.glucose,ve=h.enableDynamicCR,fe=h.adjustmentFactor,Be=B;var be=!1,Me="",_e=1,ye="";$>0&&(_e=L/$),ye=_e>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(_e=o(_e=Math.min(_e,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":_e<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(_e=o(_e=Math.max(_e,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+_e,ye=", Basal ratio: "+_e,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(be=!0),Be>=118&&be&&(w=!1,Me="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Be);var xe=", Dynamic ratios log: ",Se=", AF: "+fe,De="BG: "+pe+" mg/dl ("+(.0555*pe).toPrecision(2)+" mmol/l)",we="",Ge="";const Te=h.curve,Ce=i.insulinPeakTime,Ue=h.useCustomPeakTime;var Oe=55,Ae=65;switch(Te){case"rapid-acting":Ae=65;break;case"ultra-rapid":Ae=50}Ue?(Oe=120-Ce,console.log("Custom insulinpeakTime set to :"+Ce+", insulinFactor: "+Oe)):(Oe=120-Ae,console.log("insulinFactor set to : "+Oe)),he=P,Z<1&&L>0&&(P=L,console.log("Using weighted TDD average: "+o(P,2)+" U, instead of past 24 h ("+o(he,2)+" U), weight: "+Z),Ge=", Weighted TDD: "+o(P,2)+" U");const Re=h.sigmoid;var Ie="";if(w){var Fe=N*fe*P*Math.log(pe/Oe+1)/1800;we=", Logarithmic formula"}if(w&&Re){const e=X,t=Y-e,a=.0555*(pe-B);var je=_e,Pe=Y-1;1==Y&&(Pe=Y+.01-1);const r=Math.log10(1/Pe-e/Pe)/Math.log10(Math.E),o=a*fe*je+r;Fe=t/(1+Math.exp(-o))+e,we=", Sigmoid function"}var Ee=H;const qe=o(H,1);var We="",ke="";if(w&&P>0){if(We=", Dynamic ISF/CR: On/",Fe>Y?(Me=", Dynamic ISF limited by autosens_max setting: "+Y+" ("+o(Fe,2)+"), ",ke=", Autosens/Dynamic Limit: "+Y+" ("+o(Fe,2)+")",Fe=Y):Fe-.5?"+"+o(e.delta,0):o(e.delta,0);var Ye=Math.min(e.delta,e.short_avgdelta),et=Math.min(e.short_avgdelta,e.long_avgdelta),tt=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Ve<=10||38===Ve||Xe>=3)&&(ze.reason="CGM is calibrating, in ??? state, or noise is high");if(Ve>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Ve&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Ve&&!0),Qe>12||Qe<-5?ze.reason="If current system time "+$e+" is correct, then BG data is too old. The last BG data was read "+Qe+"m ago at "+Ke:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Ve&&(e.last_cal&&e.last_cal<3?ze.reason="CGM was just calibrated":ze.reason="CGM data is unchanged ("+n(Ve,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Ve&&(Ve<=10||38===Ve||Xe>=3||Qe>12||Qe<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Ze?(ze.reason+=". Canceling high temp basal of "+t.rate,ze.deliverAt=Ne,ze.temp="absolute",ze.duration=0,ze.rate=0,ze):0===t.rate&&t.duration>30?(ze.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",ze.deliverAt=Ne,ze.temp="absolute",ze.duration=30,ze.rate=0,ze):(ze.reason+=". Temp "+t.rate+" <= current basal "+Ze+"U/hr; doing nothing. ",ze);var at,rt,ot,nt,it=i.max_iob;if(void 0!==B&&(rt=B),void 0!==i.max_bg&&(ot=B),void 0!==i.enableSMB_high_bg_target&&(nt=i.enableSMB_high_bg_target),void 0===B)return ze.error="Error: could not determine target_bg. ",ze;at=B;var st=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,lt=100,ut=160;if(ut=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),ut=e}else console.log("Default Half Basal Target used: "+n(ut,i)+" "+i.out_units);if(st&&i.temptargetSet&&at>lt||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&at=at&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(_e,2)+", TDD 24h = "+o(he,2)+"U, Weighted average TDD = "+o(L,2)+"U, (Weight percentage = "+Z+"), Total data of TDDs (up to 14 days) average = "+o($,2)+"U. "),Ze!==He*z?process.stderr.write("Adjusting basal from "+He*z+" U/h to "+Ze+" U/h; "):process.stderr.write("Basal unchanged: "+Ze+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){rt=o((rt-60)/s.ratio)+60,ot=o((ot-60)/s.ratio)+60;var dt=o((at-60)/s.ratio)+60;at===(dt=Math.max(80,dt))?process.stderr.write("target_bg unchanged: "+n(dt,i)+"; "):process.stderr.write("target_bg from "+n(dt,i)+" to "+n(dt,i)+"; "),at=dt}var ct=n(at,i);at!=B&&(ct=0!==b&&6!==b&&b!==at?n(B,i)+"→"+n(b,i)+"→"+n(at,i):n(B,i)+"→"+n(at,i));var gt=200,ht=200,pt=200;if(e.noise>=2){var vt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);gt=o(Math.min(200,rt*vt)),ht=o(Math.min(200,at*vt)),pt=o(Math.min(200,ot*vt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(dt,i)+" to "+n(ht,i)+"; "),rt=gt,at=ht,ot=pt}T=rt-.5*(rt-40),T=Math.min(Math.max(i.threshold_setting,T,65),120),console.error("Threshold set to "+n(T,i));var ft="",Bt=(o(N,1),N);if(void 0!==s&&s&&((Bt=o(Bt=N/sensitivityRatio,1))!==N?process.stderr.write("ISF from "+n(N,i)+" to "+n(Bt,i)):process.stderr.write("ISF unchanged: "+n(Bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(N,i)+"→"+n(Bt,i)),console.error("CR:"+H),void 0===a)return ze.error="Error: iob_data undefined. ",ze;var bt,Mt=a;if(a.length,a.length>1&&(a=Mt[0]),void 0===a.activity||void 0===a.iob)return ze.error="Error: iob_data missing some property. ",ze;var _t=((bt=void 0!==a.lastTemp?o((new Date($e).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+bt+"m, tempModulus:"+_t+"m"),ze.temp="absolute",ze.deliverAt=Ne,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&bt>10&&t.duration)return ze.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,ze,t);if(t&&a.lastTemp&&t.duration>0){var yt=bt-a.lastTemp.duration;if(yt>5&&bt>10)return ze.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+yt+"m ago; canceling temp",u.setTempBasal(0,0,i,ze,t)}var xt=o(-a.activity*Bt*5,2),St=o(6*(Ye-xt));St<0&&(St=o(6*(et-xt)))<0&&(St=o(6*(e.long_avgdelta-xt)));var Dt=Ve,wt=(Dt=a.iob>0?o(Ve-a.iob*Bt):o(Ve-a.iob*Math.min(Bt,N)))+St;if(void 0===wt||isNaN(wt))return ze.error="Error: could not calculate eventualBG. Sensitivity: "+Bt+" Deviation: "+St,ze;var Gt,Tt,Ct=function(e,t,a){return o(a+(e-t)/24,1)}(at,wt,xt);ze={temp:"absolute",bg:Ve,tick:Je,eventualBG:wt,insulinReq:0,reservoir:d,deliverAt:Ne,sensitivityRatio,CR:o(H,1),TDD:he,insulin:ge,current_target:at,insulinForManualBolus:G,manualBolusErrorString:0,minDelta:Ye,expectedDelta:Ct,minGuardBG:Tt,minPredBG:Gt,threshold:n(T,i)};var Ut=[],Ot=[],At=[],Rt=[];Ut.push(Ve),Ot.push(Ve),Rt.push(Ve),At.push(Ve);var It=function(e,t,a,r,o,i,s,l){if(!t)return console.error("SMB disabled (!microBolusAllowed)"),!1;if(!e.allowSMB_with_high_temptarget&&e.temptargetSet&&o>100)return console.error("SMB disabled due to high temptarget of "+o),!1;if(!0===a.bwFound&&!1===e.A52_risk_enable)return console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1;if(400==r)return console.error("Invalid CGM (HIGH). SMBs disabled."),!1;if(s.smbIsOff){if(!s.smbIsAlwaysOff)return console.error("SMBs are disabled by profile override"),!1;{let e=l.getHours();if(s.ends.start&&(s.end+=24),e>=s.start&&e<=s.end)return console.error("SMBs are disabled by profile override"),!1;if(s.end=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1)}(i,m,l,Ve,at,nt,v,c),Ft=i.enableUAM,jt=0,Pt=0;jt=o(Ye-xt,1);var Et=o(Ye-xt,1);csf=Bt/H,console.error("profile.sens:"+n(N,i)+", sens:"+n(Bt,i)+", CSF:"+o(csf,1));var qt=o(30*csf*5/60,1);jt>qt&&(console.error("Limiting carb impact from "+jt+" to "+qt+"mg/dL/5m (30g/h)"),jt=qt);var Wt=3;sensitivityRatio&&(Wt/=sensitivityRatio);var kt=Wt;if(l.carbs){Wt=Math.max(Wt,l.mealCOB/20);var Lt=o((new Date($e).getTime()-l.lastCarbTime)/6e4),zt=(l.carbs-l.mealCOB)/l.carbs;kt=o(kt=Wt+1.5*Lt/60,1),console.error("Last carbs "+Lt+" minutes ago; remainingCATime:"+kt+"hours; "+o(100*zt,1)+"% carbs absorbed")}var Nt=Math.max(0,jt/5*60*kt/2)/csf,Ht=90,Zt=1;i.remainingCarbsCap&&(Ht=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&(Zt=Math.min(1,i.remainingCarbsFraction));var $t=1-Zt,Jt=Math.max(0,l.mealCOB-Nt-l.carbs*$t),Kt=(Jt=Math.min(Ht,Jt))*csf*5/60/(kt/2),Qt=o(l.slopeFromMaxDeviation,2),Vt=o(l.slopeFromMinDeviation,2),Xt=Math.min(Qt,-Vt/3);Pt=0===jt?0:Math.min(60*kt/5/2,Math.max(0,l.mealCOB*csf/jt)),console.error("Carb Impact:"+jt+"mg/dL per 5m; CI Duration:"+o(5*Pt/60*2,1)+"hours; remaining CI ("+kt/2+"h peak):"+o(Kt,1)+"mg/dL per 5m");var Yt,ea,ta,aa,ra=999,oa=999,na=999,ia=999,sa=999,la=999,ua=999,ma=wt,da=Ve,ca=Ve,ga=0,ha=[],pa=[];try{Mt.forEach((function(e){var t=o(-e.activity*Bt*5,2),a=o(-e.iobWithZeroTemp.activity*Bt*5,2),r=Dt,n=jt*(1-Math.min(1,Ot.length/12));if(!0===(w&&!Re))ma=Ot[Ot.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(Ot[Ot.length-1],39)/Oe+1)))*5,2)+n,r=Rt[Rt.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(P*fe*Math.log(Math.max(Rt[Rt.length-1],39)/Oe+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=Ot[Ot.length-1]+t+n,r=Rt[Rt.length-1]+a;var i=Math.max(0,Math.max(0,jt)*(1-Ut.length/Math.max(2*Pt,1))),s=Math.min(Ut.length,12*kt-Ut.length),l=Math.max(0,s/(kt/2*12)*Kt);i+l,ha.push(o(l,0)),pa.push(o(i,0)),COBpredBG=Ut[Ut.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,Et+At.length*Xt),m=Math.max(0,Et*(1-At.length/Math.max(36,1))),d=Math.min(u,m);if(d>0&&(ga=o(5*(At.length+1)/60,1)),!0===(w&&!Re))UAMpredBG=At[At.length-1]+o(-e.activity*(1800/(P*fe*Math.log(Math.max(At[At.length-1],39)/Oe+1)))*5,2)+Math.min(0,n)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=At[At.length-1]+t+Math.min(0,n)+d;Ot.length<48&&Ot.push(ma),Ut.length<48&&Ut.push(COBpredBG),At.length<48&&At.push(UAMpredBG),Rt.length<48&&Rt.push(r),COBpredBG18&&mada&&(da=ma),(Pt||Kt>0)&&Ut.length>18&&COBpredBG0)&&COBpredBG>da&&(ca=COBpredBG),Ft&&At.length>12&&UAMpredBGda&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+pa.join(" ")),console.error("remainingCIs: "+ha.join(" "))),ze.predBGs={},Ot.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var va=Ot.length-1;va>12&&Ot[va-1]===Ot[va];va--)Ot.pop();for(ze.predBGs.IOB=Ot,ea=o(Ot[Ot.length-1]),Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=Rt.length-1;va>6&&!(Rt[va-1]>=Rt[va]||Rt[va]<=at);va--)Rt.pop();if(ze.predBGs.ZT=Rt,o(Rt[Rt.length-1]),l.mealCOB>0&&(jt>0||Kt>0)){for(Ut.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),va=Ut.length-1;va>12&&Ut[va-1]===Ut[va];va--)Ut.pop();ze.predBGs.COB=Ut,ta=o(Ut[Ut.length-1]),wt=Math.max(wt,o(Ut[Ut.length-1])),console.error("COBpredBG: "+o(Ut[Ut.length-1]))}if(jt>0||Kt>0){if(Ft){for(At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),va=At.length-1;va>12&&At[va-1]===At[va];va--)At.pop();ze.predBGs.UAM=At,aa=o(At[At.length-1]),At[At.length-1]&&(wt=Math.max(wt,o(At[At.length-1])))}ze.eventualBG=wt}console.error("UAM Impact:"+Et+"mg/dL per 5m; UAM Duration:"+ga+"hours"),ra=Math.max(39,ra),oa=Math.max(39,oa),na=Math.max(39,na),Gt=o(ra);var fa=l.mealCOB/l.carbs;Yt=o(na<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:na<999?(ma+UAMpredBG)/2:ma),ua>Yt&&(Yt=ua),Tt=o(Tt=Pt||Kt>0?Ft?fa*ia+(1-fa)*sa:ia:Ft?sa:la);var Ba=na;if(uana&&(Ba=(na+ua)/2);if(Ba=o(Ba),l.carbs)if(!Ft&&oa<999)Gt=o(Math.max(ra,oa));else if(oa<999){var Ma=fa*oa+(1-fa)*Ba;Gt=o(Math.max(ra,oa,Ma))}else Gt=Ft?Ba:Tt;else Ft&&(Gt=o(Math.max(ra,Ba)));Gt=Math.min(Gt,Yt),process.stderr.write("minPredBG: "+Gt+" minIOBPredBG: "+ra+" minZTGuardBG: "+ua),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),na<999&&process.stderr.write(" minUAMPredBG: "+na),console.error(" avgPredBG:"+Yt+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ca>Ve&&(Gt=Math.min(Gt,ca)),ze.COB=l.mealCOB,ze.IOB=a.iob,ze.BGI=n(xt,i),ze.deviation=n(St,i),ze.ISF=n(Bt,i),ze.CR=o(H,1),ze.target_bg=n(at,i),ze.TDD=o(he,2),ze.current_target=o(at,0);var _a=ze.CR;qe!=ze.CR&&(_a=qe+"→"+ze.CR),ze.reason=ft+", COB: "+ze.COB+", Dev: "+ze.deviation+", BGI: "+ze.BGI+", CR: "+_a+", Target: "+ct+", minPredBG "+n(Gt,i)+", minGuardBG "+n(Tt,i)+", IOBpredBG "+n(ea,i),ta>0&&(ze.reason+=", COBpredBG "+n(ta,i)),aa>0&&(ze.reason+=", UAMpredBG "+n(aa,i)),ze.reason+=F,ze.reason+="; ",It||(ze.reason+="SMBs Disabled. ");var ya=Dt;ya<40&&(ya=Math.min(Tt,ya));var xa,Sa=T-ya,Da=240,wa=240;if(l.mealCOB>0&&(jt>0||Kt>0)){for(va=0;vaxa*Ve&&(console.error("maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - disabling SMB"),ze.reason+="maxDelta "+n(tt,i)+" > "+100*xa+"% of BG "+n(Ve,i)+" - SMB disabled!, ",It=!1),console.error("BG projected to remain above "+n(rt,i)+" for "+Da+"minutes"),(wa<240||Da<60)&&console.error("BG projected to remain above "+n(T,i)+" for "+wa+"minutes");var Ga=wa,Ta=i.current_basal*z*Bt*Ga/60,Ca=Math.max(0,l.mealCOB-.25*l.carbs),Ua=(Sa-Ta)/csf-Ca;Ta=o(Ta),Ua=o(Ua),console.error("naive_eventualBG:",Dt,"bgUndershoot:",Sa,"zeroTempDuration:",Ga,"zeroTempEffect:",Ta,"carbsReq:",Ua),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Ua>=i.carbsReqThreshold&&wa<=45&&(ze.carbsReq=Ua,ze.reason+=Ua+" add'l carbs req w/in "+wa+"m; ");var Oa=0;if(Ve0&&Ye>Ct)ze.reason+="IOB "+a.iob+" < "+o(-i.current_basal*z*20/60,2),ze.reason+=" and minDelta "+n(Ye,i)+" > expectedDelta "+n(Ct,i)+"; ";else if(Ve=55)return ze.reason+="; Canceling temp at "+ze.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,ze,t);var Aa=0,Ra=Ze,Ia=0;if(wtCt&&Ye>0&&!Ua)return Dt<40?(ze.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,ze,t)):(e.delta>Ye?ze.reason+=", but Delta "+n(Je,i)+" > expectedDelta "+n(Ct,i):ze.reason+=", but Min. Delta "+Ye.toFixed(2)+" > Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t)));Aa=o(Aa=2*Math.min(0,(wt-at)/Bt),2);var Fa=Math.min(0,(Dt-at)/Bt);if(Fa=o(Fa,2),Ye<0&&Ye>Ct)Aa=o(Aa*(Ye/Ct),2);Ra=r(Ra=Ze+2*Aa,i),Ia=t.duration*(t.rate-Ze)/60;var ja=Math.min(Aa,Fa);if(console.log("naiveInsulinReq:"+Fa),Ia5&&Ra>=.8*t.rate)return ze.reason+=", temp "+t.rate+" ~< req "+Ra+"U/hr. ",ze;if(Ra<=0){if((Oa=o(60*((Sa=at-Dt)/Bt)/i.current_basal*z))<0?Oa=0:(Oa=30*o(Oa/30),Oa=Math.min(120,Math.max(0,Oa))),Oa>0)return ze.reason+=", setting "+Oa+"m zero temp. ",u.setTempBasal(Ra,Oa,i,ze,t)}else ze.reason+=", setting "+Ra+"U/hr. ";return u.setTempBasal(Ra,30,i,ze,t)}if(Ye=2||Ct+-1*Ye>=2)&&(ze.manualBolusErrorString=Ye>=0&&Ct>0?3:Ye<0&&Ct<=0||Ye<0&&Ct>=0?4:5),ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),!m||!It))return e.delta "+n(rt,i)+" but Delta "+n(Je,i)+" < Exp. Delta "+n(Ct,i):ze.reason+="Eventual BG "+n(wt,i)+" > "+n(rt,i)+" but Min. Delta "+Ye.toFixed(2)+" < Exp. Delta "+n(Ct,i),t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(Math.min(wt,Gt)rt&&(ze.manualBolusErrorString=6,ze.insulinForManualBolus=o((ze.eventualBG-ze.target_bg)/Bt,2),ze.minPredBG=Gt),!m||!It))return ze.reason+=n(wt,i)+"-"+n(Gt,i)+" in range: no temp required",t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));if(wt>=ot&&(ze.reason+="Eventual BG "+n(wt,i)+" >= "+n(ot,i)+", ",wt>ot&&(ze.insulinForManualBolus=o((wt-at)/Bt,2))),a.iob>it)return ze.reason+="IOB "+o(a.iob,2)+" > max_iob "+it,t.duration>15&&r(Ze,i)===r(t.rate,i)?(ze.reason+=", temp "+t.rate+" ~ req "+Ze+"U/hr. ",ze):(ze.reason+="; setting current basal of "+Ze+" as temp. ",u.setTempBasal(Ze,30,i,ze,t));Aa=o((Math.min(Gt,wt)-at)/Bt,2),G=o((wt-at)/Bt,2),Aa>it-a.iob?(console.error("SMB limited by maxIOB: "+it-a.iob+" (. insulinReq: "+Aa+" U)"),ze.reason+="max_iob "+it+", ",Aa=it-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),G>it-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+it-a.iob+" (. insulinForManualBolus: "+G+" U)"),ze.reason+="max_iob "+it+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+G+" U)."),Ra=r(Ra=Ze+2*Aa,i),Aa=o(Aa,3),ze.insulinReq=Aa;var Pa=o((new Date($e).getTime()-a.lastBolusTime)/6e4,1);if(m&&It&&Ve>T){var Ea=30;void 0!==i.maxSMBBasalMinutes&&(Ea=i.maxSMBBasalMinutes);var qa=30;void 0!==i.maxUAMSMBBasalMinutes&&(qa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&S!==Ea&&(console.error("SMB Max Minutes - setting overriden from "+Ea+" to "+S),Ea=S),v.useOverride&&M&&D!==qa&&(console.error("UAM Max Minutes - setting overriden from "+qa+" to "+D),qa=D);var Wa=o(l.mealCOB/H,3),ka=0;void 0===Ea?(ka=o(i.current_basal*z*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>ka&&console.error("SMB limited by maxBolus: "+ka+" ( "+Aa+" U)")):a.iob>Wa&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+Wa),qa?(console.error("maxUAMSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*z),ka=o(i.current_basal*z*qa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),ka=o(i.current_basal*z*30/60,1)),Aa>ka?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+qa+"m ]: "+ka+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+Ea+", profile.current_basal: "+i.current_basal*z),Aa>(ka=o(i.current_basal*z*Ea/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+Ea+"m ]: "+ka+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var La=i.bolus_increment,za=1/La,Na=Math.min(i.smb_delivery_ratio,1);Na>.5&&console.error("SMB Delivery Ratio increased from default 0.5 to "+o(Na,2));var Ha=Math.min(Aa*Na,ka);Ha=Math.floor(Ha*za)/za,Oa=o(60*((at-(Dt+ra)/2)/Bt)/i.current_basal*z),Aa>0&&Ha=30?(Oa=30*o(Oa/30),Oa=Math.min(60,Math.max(0,Oa))):(Za=o(Ze*Oa/30,2),Oa=30),ze.reason+=" insulinReq "+Aa,Ha>=ka&&(ze.reason+="; maxBolus "+ka),Oa>0&&(ze.reason+="; setting "+Oa+"m low temp of "+Za+"U/h"),ze.reason+=". ";var $a=3;i.SMBInterval&&($a=Math.min(10,Math.max(1,i.SMBInterval)));var Ja=o($a-Pa,0),Ka=o(60*($a-Pa),0)%60;if(console.error("naive_eventualBG "+Dt+","+Oa+"m "+Za+"U/h temp needed; last bolus "+Pa+"m ago; maxBolus: "+ka),Pa>$a?Ha>0&&(ze.units=Ha,ze.reason+="Microbolusing "+Ha+"U. "):ze.reason+="Waiting "+Ja+"m "+Ka+"s to microbolus again. ",Oa>0)return ze.rate=Za,ze.duration=Oa,ze}var Qa=u.getMaxSafeBasal(i);return 400==Ve?u.setTempBasal(i.current_basal,30,i,ze,t):(Ra>Qa&&(ze.reason+="adj. req. rate: "+Ra+" to maxSafeBasal: "+o(Qa,2)+", ",Ra=r(Qa,i)),(Ia=t.duration*(t.rate-Ze)/60)>=2*Aa?(ze.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):void 0===t.duration||0===t.duration?(ze.reason+="no temp, setting "+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)):t.duration>5&&r(Ra,i)<=r(t.rate,i)?(ze.reason+="temp "+t.rate+" >~ req "+Ra+"U/hr. ",ze):(ze.reason+="temp "+t.rate+"<"+Ra+"U/hr. ",u.setTempBasal(Ra,30,i,ze,t)))}},6880:(e,t,a)=>{var r=a(6654);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},2705:(e,t,a)=>{var r=a(5639).Symbol;e.exports=r},9932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},4239:(e,t,a)=>{var r=a(2705),o=a(9607),n=a(2333),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},531:(e,t,a)=>{var r=a(2705),o=a(9932),n=a(1469),i=a(3448),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a}},7561:(e,t,a)=>{var r=a(7990),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},1957:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},9607:(e,t,a)=>{var r=a(2705),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},2333:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5639:(e,t,a)=>{var r=a(1957),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},7990:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},6654:(e,t,a)=>{var r=a(9750),o=a(531),n=a(554),i=a(9833);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},1469:e=>{var t=Array.isArray;e.exports=t},3218:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3448:(e,t,a)=>{var r=a(4239),o=a(7005);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},8601:(e,t,a)=>{var r=a(4841),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,a)=>{var r=a(8601);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},4841:(e,t,a)=>{var r=a(7561),o=a(3218),n=a(3448),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},9833:(e,t,a)=>{var r=a(531);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(5546);freeaps_determineBasal=r})(); From 0e36b62e36b83f630c959138ab142ca804b75d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 3 Feb 2024 19:26:52 +0100 Subject: [PATCH 392/405] Change symbol in the alternate bolus calculator for a more homogenous design language. --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 37dad98800..e24341be07 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -80,7 +80,9 @@ extension Bolus { Button(action: { showInfo.toggle() }, label: { - Image(systemName: "info.circle") + Image(systemName: "info.bubble") + .symbolRenderingMode(.palette) + .foregroundStyle(colorScheme == .light ? .black : .white, .blue) Text("Calculations") }) .foregroundStyle(.blue) From 7bfade0924d67c93d51ff512d55ef128bd99fa72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sun, 4 Feb 2024 15:38:54 +0100 Subject: [PATCH 393/405] Localization Use the same string as default bolus calculator. --- .../Modules/Bolus/View/AlternativeBolusCalcRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index 37dad98800..7716535f0c 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -108,7 +108,7 @@ extension Bolus { } } else { HStack { - Text("Recommended Bolus") + Text("Insulin recommended") Spacer() Text( formatter From 313c220687951f48adf57c83f9e237f32490cf12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sun, 4 Feb 2024 15:46:22 +0100 Subject: [PATCH 394/405] Crowdin updates (#506) --- .../OmniBLE/Localizations/sv.lproj/Localizable.strings | 3 --- .../Localizations/Main/ar.lproj/Localizable.strings | 3 +++ .../Localizations/Main/da.lproj/Localizable.strings | 3 +++ .../Localizations/Main/de.lproj/Localizable.strings | 3 +++ .../Localizations/Main/es.lproj/Localizable.strings | 3 +++ .../Localizations/Main/fi.lproj/Localizable.strings | 3 +++ .../Localizations/Main/fr.lproj/Localizable.strings | 9 ++++++--- .../Localizations/Main/he.lproj/Localizable.strings | 3 +++ .../Localizations/Main/hu.lproj/Localizable.strings | 3 +++ .../Localizations/Main/it.lproj/Localizable.strings | 3 +++ .../Localizations/Main/nb.lproj/Localizable.strings | 3 +++ .../Localizations/Main/nl.lproj/Localizable.strings | 3 +++ .../Localizations/Main/pl.lproj/Localizable.strings | 3 +++ .../Localizations/Main/pt-BR.lproj/Localizable.strings | 3 +++ .../Localizations/Main/pt-PT.lproj/Localizable.strings | 3 +++ .../Localizations/Main/ru.lproj/Localizable.strings | 3 +++ .../Localizations/Main/sk.lproj/Localizable.strings | 3 +++ .../Localizations/Main/sv.lproj/Localizable.strings | 3 +++ .../Localizations/Main/tr.lproj/Localizable.strings | 3 +++ .../Localizations/Main/uk.lproj/Localizable.strings | 3 +++ .../Localizations/Main/vi.lproj/Localizable.strings | 5 ++++- .../Localizations/Main/zh-Hans.lproj/Localizable.strings | 3 +++ 22 files changed, 67 insertions(+), 7 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings index b628c863cb..1f3880fd91 100644 --- a/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings @@ -498,9 +498,6 @@ /* Label text indicating insertion finished. */ "Inserted" = "Kanyl har förts in"; -/* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Svep reglage nedan för att föra in kanyl."; - /* Check Cannula */ "Check Cannula" = "Kontrollera kanyl"; diff --git a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings index 17be2e206e..c05b3c4ca1 100644 --- a/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings index 63c6c55a16..2f9326fb1d 100644 --- a/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index 82bcfa4598..eb19ddbbcc 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontale Scroll-Ansicht sichtbare Stunden"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings index 6ab229af2b..b945164a51 100644 --- a/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings @@ -2156,6 +2156,9 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings index a56e8631d2..91bdc9e32c 100644 --- a/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings index 69125bdb30..25508b660a 100644 --- a/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings @@ -1583,7 +1583,7 @@ Enact a temp Basal or a temp target */ "This PumpManager has not been configured with a maximum basal rate because it was added before manual temp basal was a feature. Please go to therapy settings -> delivery limits and set a new maximum basal rate." = "Le Gestionnaire de Pompes n'a pas été configuré avec un débit de base maximum car il a été ajouté avant que le Basal temporaire manuel soit une fonctionnalité. Veuillez aller dans les paramètres de thérapie -> limites de délivrance et définir un nouveau taux de basal maximum."; /* description label for active time pod details row */ -"Active Time" = "Heure d’activation"; +"Active Time" = "Durée d’activité"; /* description label for total delivery pod details row */ "Total Delivery" = " Total délivré"; @@ -2038,7 +2038,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Activer ISF dynamique"; /* Headline "Enable Dynamic ISF" */ -"Enable Dynamic ISF" = "Activer le facteur de sensibilité à l'insuline (FSI) dynamique"; +"Enable Dynamic ISF" = "Activer ISF dynamique"; /* Enable Dynamic ISF */ "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calcule un nouveau facteur de sensibilité à l'insuline (FSI) à chaque cycle de boucle. Le nouveau FSI sera basé sur votre glycémie actuelle, la dose quotidienne totale d'insuline (DQT = total de toutes les doses d'insuline livrées dans les dernières 24 heures) et un facteur d'ajustement individuel (il est recommandé de commencer par 0,5 si vous utilisez la fonction Sigmoid et 0,8 si ce n'est pas le cas).\n\nTous les ajustements dynamiques du FSI et du RGI (Ratio insuline/glucides) seront limités par vos paramètres autosens min/max."; @@ -2056,7 +2056,7 @@ Enact a temp Basal or a temp target */ "Activate Dynamic Carb Ratio (CR)" = "Activer le ratio de glucides dynamique (RC)"; /* Headline "Adjust Dynamic ISF constant" */ -"Adjust Dynamic ISF constant" = "Ajuster la constante du FSI Dynamique"; +"Adjust Dynamic ISF constant" = "Ajuster la constante ISF Dynamique"; /* Adjust Dynamic ISF constant */ "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Calculateur de Bolus"; diff --git a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings index 17be2e206e..c05b3c4ca1 100644 --- a/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings index 79d73cca2b..a08e3b81a1 100644 --- a/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings index 1744cbd8fa..96f01f0559 100644 --- a/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings @@ -2152,6 +2152,9 @@ Regola la costante ISF dinamica."; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "La vista di scorrimento orizzontale mostra le ore visibili"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Mostra Pulsante Impostazione nell'intervallo di tempo"; + /* Setting title */ "Bolus Calculator" = "Calcolatore Bolo"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 5a1d6003ef..891a8133b7 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings index ba1a326ed4..fe9e9923c5 100644 --- a/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings @@ -2154,6 +2154,9 @@ Eenvoudig gezegd, de Dynamische Carb Ratio past de koolhydraatverhouding aan op /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontale scrolweergave zichtbare uren"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings index ca27be9072..be5270d8b0 100644 --- a/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings @@ -2152,6 +2152,9 @@ Połączono z Nightscout!"; /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings index cb1e2641b0..7d4331b80f 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings index 676e827336..d4de4b553d 100644 --- a/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 72f946b16f..5e7f444416 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index a4fc1f87aa..c0bc83d563 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontálne rolovacie zobrazenie Viditeľné hodiny"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index 2d23cad3af..c06ae5454b 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Antal synliga timmar i hemfönstret"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Visa knapp för tillfälligt målvärde"; + /* Setting title */ "Bolus Calculator" = "Boluskalkylator"; diff --git a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings index 76c53fe294..cc89fbb7c1 100644 --- a/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 684f9758be..33efa9b8bc 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2150,6 +2150,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Калькулятор Болюса"; diff --git a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings index bfd611b30a..da92463af7 100644 --- a/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/vi.lproj/Localizable.strings @@ -1974,7 +1974,7 @@ Enact a temp Basal or a temp target */ "This is the fraction of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là tỷ lệ carbs mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy sự hấp thụ carb."; /* Headline "Remaining Carbs Cap" */ -"Remaining Carbs Cap" = "Phần carb còn lại"; +"Remaining Carbs Cap" = "Giới hạn lượng carb còn lại"; /* "Remaining Carbs Cap" */ "This is the amount of the maximum number of carbs we’ll assume will absorb over 4h if we don’t yet see carb absorption." = "Đây là lượng carb tối đa mà chúng tôi cho rằng sẽ hấp thụ trong 4 giờ nếu chúng tôi chưa thấy khả năng hấp thụ carb."; @@ -2151,6 +2151,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Chế độ xem cuộn ngang Giờ hiển thị"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Nút cài đặt khoảng thời gian hiển thị"; + /* Setting title */ "Bolus Calculator" = "Tính toán Bolus"; diff --git a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings index 2bcea631f4..1e966eb0d0 100644 --- a/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings @@ -2152,6 +2152,9 @@ Enact a temp Basal or a temp target */ /* UI/UX option */ "Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +/* UI/UX option */ +"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; + /* Setting title */ "Bolus Calculator" = "Bolus Calculator"; From 711a97ef86617a06897060ea9d0eaeab6ffaa16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Wed, 7 Feb 2024 01:46:52 +0100 Subject: [PATCH 395/405] Crowdin updates (#507) --- .../ru.lproj/Localizable.strings | 2 +- .../Resources/ru.lproj/Localizable.strings | 4 ++-- .../Main/de.lproj/Localizable.strings | 10 ++++---- .../Main/ru.lproj/Localizable.strings | 24 +++++++++---------- .../Main/uk.lproj/Localizable.strings | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 2c34f1cfd7..73292c094b 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Дождитесь окончания введения канюли."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Сдвиньте переключатель ниже, чтобы начать введение канюли."; /* Label text indicating insertion finished. */ "Inserted" = "Введено"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 59afddc47a..847aaf1dcd 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Сдвиньте переключатель ниже, чтобы начать введение канюли."; /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; @@ -285,7 +285,7 @@ "Fault" = "Сбой"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода). Прослушайте 2 звуковых сигнала."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершение деактивации"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index eb19ddbbcc..fbb5f30ebb 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1686,7 +1686,7 @@ Enact a temp Basal or a temp target */ "Average" = "Mittelwert"; /* Median BG */ -"Median" = "Mittelwert"; +"Median" = "Median"; /* CGM readings in statView */ "Readings" = "Lesungen"; @@ -2134,7 +2134,7 @@ Enact a temp Basal or a temp target */ "Statistics settings " = "Statistics settings "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c-Einheit überschreiben"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Falls Sie sowohl Profile als auch temporäre Ziele verwenden"; @@ -2154,10 +2154,10 @@ Enact a temp Basal or a temp target */ "Display Time Interval Setting Button" = "Display Time Interval Setting Button"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Bolus-Rechner"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamischer ISF"; /* Notification option */ "Live Activity" = "Live-Aktivitäten"; @@ -2166,7 +2166,7 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Live Aktivitäten anzeigen"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 5e7f444416..1050bf1d57 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2098,16 +2098,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Настройки калькулятора"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Альтернативный калькулятор болюса"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Жирная пища"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Применить фактор для жирной пищи"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Альтернативный калькулятор болюса использует другой алгоритм расчета болюса. Для индивидуальной настройки вы можете изменить поправочный коэффициент (значение по умолчанию 0.8) в зависимости от того, хотите ли вы более высокие (выше 1) или меньшие (ниже 1) рекомендации по болюсу.\n\nДля особо жирных блюд, таких как пицца, существует возможность уменьшить рекомендуемый болюс еще на один коэффициент (стандартно 0.7)."; /* UI/UX option */ "Display Predictions" = "Отображать прогнозы"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Панель кнопок главного экрана "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Схема главного экрана "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Настройки статистики "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c в процентах"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "В случае, если вы используете как профили, так и временные цели"; @@ -2151,13 +2151,13 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Отображать кнопку выбора интервала времени"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Калькулятор болюса"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Динамический ISF"; /* Notification option */ "Live Activity" = "Эфир активности"; @@ -2166,13 +2166,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Отображать эфир активности"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "\"Эфир активности\" отключен в системных настройках. Чтобы включить \"эфир активности\", перейдите в Настройки -> iAPS -> \"Эфир активности\" -> ВКЛ.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 33efa9b8bc..4b52afda99 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2151,7 +2151,7 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Відображення Кнопки Налаштування Інтервалу Часу"; /* Setting title */ "Bolus Calculator" = "Калькулятор Болюса"; From c9c5e7e24489899e51290d92430fb519dcf8e652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:36:49 +0100 Subject: [PATCH 396/405] Crowdin updates (#511) --- .../de.lproj/Localizable.strings | 2 +- .../nb.lproj/Localizable.strings | 36 +++---- .../sk.lproj/Localizable.strings | 4 +- .../Resources/nb.lproj/Localizable.strings | 4 +- .../Resources/de.lproj/Localizable.strings | 4 +- .../Resources/nb.lproj/Localizable.strings | 38 +++---- .../Resources/sk.lproj/Localizable.strings | 6 +- .../Main/de.lproj/Localizable.strings | 30 +++--- .../Main/nb.lproj/Localizable.strings | 102 +++++++++--------- .../Main/sk.lproj/Localizable.strings | 40 +++---- 10 files changed, 133 insertions(+), 133 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index f80a32eee9..74f3ad9e61 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Warten Sie, bis die Einführung abgeschlossen ist."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schieben Sie den Schalter unten, um mit dem Einfügen von Kanülen zu beginnen."; /* Label text indicating insertion finished. */ "Inserted" = "Eingeführt"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index d6b9506e0c..998ff46ebf 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Deaktiver Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Sveip for å sette inn kanyle"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktiverer."; @@ -442,7 +442,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny Pod med U-100 insulin (la den blå hetten være på)."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens blå kanylehette og sjekk kanylen. Fjern deretter papirbeskyttelsen."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Vent til innsettingen er fullført."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Sveip under for å starte innsetting av kanylen."; /* Label text indicating insertion finished. */ "Inserted" = "Kanyle er satt inn"; @@ -611,10 +611,10 @@ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Du vil høre påminnelseslyder for kommandoer du starter, slik som bolus, avbryt bolus, pause, gjenoppta, lagre innstillinger, osv. Når appen automatisk justerer insulinlevering hører du ingen påminnelseslyder."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Du vil høre påminnelseslyder når appen automatisk justerer insulinlevering, og for kommandoer du starter."; /* Label text for temporary basal rate summary */ "Rate" = "Ratio"; @@ -796,36 +796,36 @@ "%@ ago" = "%@ siden"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Dempet"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal driftsmodus der Pod piper for alle Pod-varslinger og når påminnelsesvarsler er aktivert."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Pipelyder er slått av for alle Pod-varsler og påminnelsesvarsler er slått av. Pod'en vil kun pipe hvis den slutter å virke og når du ber om test-lyd.\n\n⚠️Advarsel - Når pipelyder er slått av må du passe på å ha Pod'en innenfor Bluetooth-rekkevidde til mobiltelefonen slik at du kan motta varsler på telefonen ved feil på Pod'en."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Stillemodus slår av alle pipelyder for Pod'en."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Stillemodus"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-detaljer"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Detaljer fra forrige Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Detaljer for pumpehåndtering"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Henter detaljer for pumpehåndtering..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Oppdater detaljer for pumpehåndtering"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Les Pod-status"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index f5e8607195..86f00bc053 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Deaktivovať Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Pripravené na zavedenie kanyly"; /* */ "Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Počkajte kým nie je zavedenie ukončené."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Posunutím spínača nižšie spustite zavádzanie kanyly."; /* Label text indicating insertion finished. */ "Inserted" = "Vložené do tela"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings index eeb705f2a4..4a4f5c2fb5 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikasjonsproblem: Ukjent kommando venter."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Du vil høre påminnelseslyder for kommandoer du starter, slik som bolus, avbryt bolus, pause, gjenoppta, lagre innstillinger, osv. Når appen automatisk justerer insulinlevering hører du ingen påminnelseslyder."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Du vil høre påminnelseslyder når appen automatisk justerer insulinlevering, og for kommandoer du starter."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Pod-feil"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index fadf6e327a..6356abd2d9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schieben Sie den Schalter unten, um mit dem Einfügen von Kanülen zu beginnen."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; @@ -285,7 +285,7 @@ "Fault" = "Störung"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Füllen Sie einen neuen Pod mit U-100-Insulin (Entfernen Sie nicht den Nadelverschluss). Warten Sie auf 2 Pieptöne."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index e317864aa3..d6898a4b17 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekreftelser"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påminnelsesvarsler er pipelyder fra Pod'en som kan brukes til å bekrefte valgte kommandoer når Pod'en ikke er i stillemodus."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurasjon"; @@ -180,20 +180,20 @@ "Deactivate" = "Deaktiver"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Sveip for å sette inn kanyle"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Sveip under for å starte innsetting av kanylen."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivert"; @@ -285,7 +285,7 @@ "Fault" = "Feil"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fyll en ny Pod med U-100 insulin (la kanylehetten være på). Lytt etter 2 pip."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Fullfør deaktivering"; @@ -559,7 +559,7 @@ "Remove Pump" = "Fjern pumpen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Da av Pod'ens kanylehette og sjekk kanylen. Fjern deretter papirbeskyttelsen."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -778,39 +778,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod kan fortsatt levere insulin.\nFjern den fra kroppen din, og trykk deretter på \"Fortsett\"."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Dempet"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal driftsmodus der Pod piper for alle Pod-varslinger og når påminnelsesvarsler er aktivert."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Pipelyder er slått av for alle Pod-varsler og påminnelsesvarsler er slått av. Pod'en vil kun pipe hvis den slutter å virke og når du ber om test-lyd.\n\n⚠️Advarsel - Når pipelyder er slått av må du passe på å ha Pod'en innenfor Bluetooth-rekkevidde til mobiltelefonen slik at du kan motta varsler på telefonen ved feil på Pod'en."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Stillemodus"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-detaljer"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Detaljer fra forrige Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Detaljer for pumpehåndtering"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Henter detaljer for pumpehåndtering..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Oppdater detaljer for pumpehåndtering"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Kunne ikke oppdatere innstillingen."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Les Pod-status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index d4ac4dd3cc..23df402336 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -187,13 +187,13 @@ "Deactivate Pod" = "Deaktivovať pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Pripravené na zavedenie kanyly"; /* */ "Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Posunutím spínača nižšie spustite zavádzanie kanyly."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; @@ -285,7 +285,7 @@ "Fault" = "Chyba"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Naplňte nový pod inzulínom U-100 (kryt ihly ponechajte nasadený). Budete počuť 2 pípnutia."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Dokončiť deaktiváciu"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index fbb5f30ebb..7170383034 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuelle Anpassung der berechneten dynamischen Verhältnisse. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF/CR für einen hohen oder niedrigen Blutzuckerwert. Die maximale/minimale Korrektur wird durch die Min/Max-Einstellungen von Autosens bestimmt.\n\nFür die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen.\n\nFür die logarithmische Formel gibt es weniger Konsens, aber ein Wert von 0,8 ist wahrscheinlich für die meisten erwachsenen Benutzer angemessen. Für jüngere Anwender wird empfohlen, bei der logaritmischen Formel noch niedriger anzusetzen, um eine zu aggressive Behandlung zu vermeiden."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; @@ -2077,37 +2077,37 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Grenzwert-Einstellungen"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Minimale Grenzwerteinstellung"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Mit dieser Einstellung können Sie einen Wert wählen, unterhalb dessen kein Insulin verabreicht wird.\n\nDer Schwellenwert ergibt sich aus dem größten Wert Ihrer Schwellenwerteinstellung und dem berechneten Schwellenwert:\n\nZielglukose - (Zielglukose - 40) / 2\n, wobei hier mg/dl als Glukoseeinheit verwendet wird.\n\nWenn Ihr Zielglukose-Wert beispielsweise "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "der Grenzwert wird sein "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "es sei denn, Sie haben einen höheren Grenzwert eingestellt:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Einstellung"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Grenzwert"; /* Header */ "Calculator settings" = "Berechnungseinstellungen"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Alternativer Bolusrechner verwenden"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Fettige Mahlzeit"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Faktor für fette Mahlzeiten anwenden"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Der neue alternative Bolusrechner ist ein anderer Ansatz als der Standard-Bolusrechner in iAPS. Wenn die Umschaltfunktion aktiviert ist, wird dieser Bolusrechner und nicht der ursprüngliche iAPS-Rechner verwendet. Am Ende der Berechnung wird ein benutzerdefinierter Faktor angewandt, wie es bei der Verwendung von smbs der Fall sein sollte (Standardwert 0,8).\n\nSie können in Ihrem Bolusrechner auch die Option hinzufügen, am Ende der Berechnung einen weiteren (!) benutzerdefinierten Faktor anzuwenden, der für fetthaltige Mahlzeiten, z. B. Pizza, nützlich sein könnte (Standardwert 0,7)."; /* UI/UX option */ "Display Predictions" = "Prognosen anzeigen"; @@ -2128,10 +2128,10 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Home-Schaltflächenleiste "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Home-Chart Einstellungen "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Statistik-Einstellungen "; /* UI/UX title */ "Override HbA1c Unit" = "HbA1c-Einheit überschreiben"; @@ -2151,7 +2151,7 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Horizontale Scroll-Ansicht sichtbare Stunden"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Anzeigeintervall Einstellungs-Button"; /* Setting title */ "Bolus Calculator" = "Bolus-Rechner"; @@ -2172,7 +2172,7 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live-Aktivitäten werden in den Systemeinstellungen AUS aktiviert. Um Live-Aktivitäten zu aktivieren, gehen Sie zu Einstellungen -> iAPS -> Live-Aktivitäten einschalten.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 891a8133b7..c40c097cdf 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -47,7 +47,7 @@ "Agree and continue" = "Godta og fortsett"; /* Bolus progress view */ -"of" = "of"; +"of" = "av"; /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Utført kl."; @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Bruk lokal glukoseserver"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Dette skrur på opplasting av statistics.json til Nightscout, som kan brukes av prosjektet \"Community Statistics and Demographics\".\n\nDeltakelse er frivillig og krever en egen registrering på:\n"; /* */ "Edit settings json" = "Rediger \"freeaps_settings.json\""; @@ -582,10 +582,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Slette karbohydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Slette insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1377,13 +1377,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistikk og startskjerm"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Slette karboekvivalenter?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Alle karboekvivalenter for måltidet vil bli slettet."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Slette blodsukker?"; /* */ "Meal Presets" = "Forvalg av måltid"; @@ -1671,16 +1671,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 timer"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 timer"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 timer"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 timer"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 timer"; /* Average BG = */ "Average" = "Gj.snitt"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiver dynamisk ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beregne ny insulinsensitivitet (ISF) ved hver loop-syklus. Den nye ISF-verdien vil bli basert på nåværende blodsukker, total daglig insulindose (TDD, siste 24 timer med levert insulin) og en individuell justeringsfaktor (anbefalingen er å starte med 0.5 hvis man benytter Sigmoid og ellers 0.8).\n\nAlle dynamiske justeringer av ISF og CR blir begrenset av dine Autosens MIN/MAX-innstillinger."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; @@ -2050,129 +2050,129 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Bruk dynamisk CR. Dynamisk ratio brukes for CR som følger:\n\n Når ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nNår ratio < 1: dynCR = CR/dynCR.\n\nIkke bruk denne innstillingen sammen med en høy insulinbrøk (Insulin Fraction > 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Aktivere dynamisk insulinfølsomhet (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Aktivere dynamisk karbohydratforhold (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Justeringsfaktoren brukes til å bestemme hvor mye ISF/CR skal justeres når man benytter dynamisk ISF/CR. Standardverdi er 0.5. Jo høyere verdi, jo større blir korrigeringen av ISF/CR ved høyt eller lavt blodsukker. Maks/min korrigering avgjøres av dine Autosens maks/min-innstillinger.\n\nFor Sigmoid anbefales det en justeringsfaktor på 0.4 - 0.5 til å begynne med.\n\nNår Sigmoid ikke er i bruk anbefales det å starte på 0.8 for voksne brukere. For yngre brukere er det anbefalt å starte med en lavere justeringsfaktor for å unngå aggresiv behandling."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formel"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sikkerhet"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Terskelinnstilling"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Minimum terskelinnstilling"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Denne innstillingen lar deg velge et blodsukkernivå for å stoppe insulintilførsel.\n\nSystemet ser på denne innstillingen og den beregnede terskelverdien, og velger den høyeste av disse:\n\nMålverdi - (Målverdi - 40) / 2\n, her med mg/dl.\n\nFor eksempel, hvis blodsukkermålet ditt er "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "så vil terskelverdien bli "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "med mindre din terskelinnstilling er satt høyere:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Innstilling"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Terskel"; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Innstillinger for kalkulator"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Bruk alternativ boluskalkulator"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Måltid med høyt fettinnhold"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Bruk egen faktor for fete måltider"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Den nye alternative boluskalkulatoren bruker en annen tilnærming enn den vanlige boluskalkulatoren i iAPS. Ved slutten av beregningen brukes det en faktor for å begrense hvor mye av beregnet bolus som blir gitt med en gang. Tanken er at resten av nødvendig insulin blir gitt via SMB. Standard faktor er 0.8, som betyr at kalkulatoren foreslår å dosere 80% av insulinbehovet som bolus.\n\nDu kan også legge til en annen faktor for måltider med høyt fettinnhold, for eksempel pizza. Tanken er at slike måltider trenger mindre insulin ved måltidsstart. Standard faktor er derfor 0.7 (70%)."; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Vis prognoser"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Mindre iPhone-skjermer"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Vis og tillat registrering av fett og protein"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Innstillinger for registrering av måltid "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Vis knapp for midlertidig mål"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Knapperad på startskjerm "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Innstillinger for graf på startskjerm "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Innstillinger for statistikk "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Overstyre HbA1c-enhet"; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "I tilfelle du bruker både profiler og midlertidige mål"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Alltid bruk farge på blodsukkerverdi (grønn, gul, osv)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Innstillinger for topplinjen"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Vanligvis er blodsukkerverdien rød bare når den er over og under varslingsinnstillingene for høy/lav"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Antall synlige timer for horisontal visning"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Vis knapp for tidsintervall"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Boluskalkulator"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamisk ISF"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Oppdateringer i sanntid"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Sanntidsoppdatering (Live Activity) viser blodsukkerverdi på låseskjerm og i Dynamic Island (hvis telefonen har dette)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Vis sanntidsoppdatering"; /* Live Activity Footer */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Sanntidsoppdatering (Live Activity) viser blodsukkerverdi på låseskjerm og i Dynamic Island (hvis telefonen har dette)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Sanntidsoppdatering er skrudd av i systeminnstillingene. For å skru på, gå til Innstillinger-appen -> iAPS og skru på Oppdateringer i sanntid.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vektet snitt av TDD. Vekting av siste 24 timer:"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index c0bc83d563..e7db241ce8 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Vypočítajte nové nastavenie citlivosti na inzulín (ISF) pri každom cykle slučky. Nové nastavenie ISF bude založené na vašej aktuálnej glykémii, celkovej dennej dávke inzulínu (TDD, posledných 24 hodín všetkého podaného inzulínu) a vašom individuálnom korekčnom faktore (odporúčanie na začiatok je 0,5, ak používate sigmoidnú funkciu, a 0,8, ak nie).\n\\Všetky dynamické úpravy ISF a CR budú obmedzené vašimi limitmi min/max automatického snímania."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuálne nastavenie vypočítaných dynamických pomerov. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF/CR pre vysokú alebo nízku hladinu glukózy v krvi. Maximálna/minimálna korekcia je určená nastavením min/max v programe Autosens.\n\nPre sigmoidnú funkciu sa na začiatok odporúča korekčný faktor 0,4 - 0,5.\n\nPre logaritmický vzorec existuje menej konsenzu, ale začiatok okolo 0,8 je pravdepodobne vhodný pre väčšinu dospelých používateľov. U mladších používateľov sa pri používaní logaritmickej formuly odporúča začať ešte nižšie, aby sa zabránilo príliš agresívnej liečbe."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; @@ -2077,37 +2077,37 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Nastavenie prahové hodnoty"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Nastavenie minimálneho prahu"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Toto nastavenie vám umožňuje zvoliť hladinu, pod ktorou nebude podaný žiadny inzulín.\n\nPrahová hodnota používa najväčšiu hodnotu vášho nastavenia prahovej hodnoty a vypočítanú prahovú hodnotu:\n\nCielová glykémia - (cieľová glykémia - 40) / 2\n, tu s použitím mg/dl ako jednotky glukózy.\n\nNapr. ak je vaša cieľová glykémia "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "prahová hodnota bude "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "pokiaľ nie je nastavená vyššia prahová hodnota:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Nastavenia"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Hranica"; /* Header */ "Calculator settings" = "Nastavenia výpočtu"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Použite alternatívnu kalkulačku Bolus"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Mastné jedlo"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Použite faktor pre mastné jedlá"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Nová alternatívna bolusová kalkulačka je ďalším prístupom k predvolenej bolusovej kalkulačke v systéme iAPS. Ak je prepínač zapnutý, používate túto kalkulačku bolusu a nie pôvodnú kalkulačku iAPS. Na konci výpočtu sa použije vlastný faktor, ako to má byť pri používaní smbs (predvolene 0,8).\n\nV kalkulačke bolusu môžete tiež pridať možnosť použiť na konci výpočtu ďalší (!) prispôsobiteľný faktor, ktorý by mohol byť užitočný pre tučné jedlá, napr. pizzu (predvolene 0,7)."; /* UI/UX option */ "Display Predictions" = "Zobraziť predpovede"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Panel tlačidiel zobrazenia Domov "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Domov Nastavenia grafu "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Nastavenia štatistík "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Prepísanie jednotky HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "V prípade, že používate profily aj dočasný cieľ"; @@ -2151,13 +2151,13 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Horizontálne rolovacie zobrazenie Viditeľné hodiny"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Tlačidlo nastavenia časového intervalu zobrazenia"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Kalkulátor bolusu"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamická ISF"; /* Notification option */ "Live Activity" = "Živá aktivita"; @@ -2166,13 +2166,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Zobraziť živú aktivitu"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Aktivity v režime Live sú v nastaveniach systému vypnuté. Ak chcete zapnúť živé aktivity, prejdite do Nastavenia -> iAPS -> Zapnúť živé aktivity.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; From dd2574f8b9d599516c048cf1b4ec3dd45da08c6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:11:48 +0100 Subject: [PATCH 397/405] Crowdin translations (#513) --- .../de.lproj/Localizable.strings | 2 +- .../nb.lproj/Localizable.strings | 36 +++---- .../ru.lproj/Localizable.strings | 2 +- .../sk.lproj/Localizable.strings | 4 +- .../Resources/nb.lproj/Localizable.strings | 4 +- .../Resources/de.lproj/Localizable.strings | 4 +- .../Resources/nb.lproj/Localizable.strings | 38 +++---- .../Resources/ru.lproj/Localizable.strings | 4 +- .../Resources/sk.lproj/Localizable.strings | 6 +- .../Main/de.lproj/Localizable.strings | 40 +++---- .../Main/nb.lproj/Localizable.strings | 102 +++++++++--------- .../Main/ru.lproj/Localizable.strings | 24 ++--- .../Main/sk.lproj/Localizable.strings | 40 +++---- .../Main/uk.lproj/Localizable.strings | 2 +- 14 files changed, 154 insertions(+), 154 deletions(-) diff --git a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings index f80a32eee9..74f3ad9e61 100644 --- a/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/de.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Warten Sie, bis die Einführung abgeschlossen ist."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schieben Sie den Schalter unten, um mit dem Einfügen von Kanülen zu beginnen."; /* Label text indicating insertion finished. */ "Inserted" = "Eingeführt"; diff --git a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings index d6b9506e0c..998ff46ebf 100644 --- a/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/nb.lproj/Localizable.strings @@ -403,10 +403,10 @@ "Deactivate Pod" = "Deaktiver Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Sveip for å sette inn kanyle"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Deactivate pod action button accessibility label while deactivating */ "Deactivating." = "Deaktiverer."; @@ -442,7 +442,7 @@ "Fill a new pod with U-100 Insulin (leave blue Pod needle cap on)." = "Fyll en ny Pod med U-100 insulin (la den blå hetten være på)."; /* Label text for step 1 of pair pod instructions */ -"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Remove the Pod's blue needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's blue needle cap and check cannula. Then remove paper backing." = "Fjern Pod'ens blå kanylehette og sjekk kanylen. Fjern deretter papirbeskyttelsen."; /* Label text for step 2 of pair pod instructions */ "Listen for 2 beeps." = "Lytt etter 2 pip."; @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Vent til innsettingen er fullført."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Sveip under for å starte innsetting av kanylen."; /* Label text indicating insertion finished. */ "Inserted" = "Kanyle er satt inn"; @@ -611,10 +611,10 @@ "No confidence reminders are used." = "Det brukes ingen bekreftelseslyder."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Du vil høre påminnelseslyder for kommandoer du starter, slik som bolus, avbryt bolus, pause, gjenoppta, lagre innstillinger, osv. Når appen automatisk justerer insulinlevering hører du ingen påminnelseslyder."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Du vil høre påminnelseslyder når appen automatisk justerer insulinlevering, og for kommandoer du starter."; /* Label text for temporary basal rate summary */ "Rate" = "Ratio"; @@ -796,36 +796,36 @@ "%@ ago" = "%@ siden"; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Dempet"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal driftsmodus der Pod piper for alle Pod-varslinger og når påminnelsesvarsler er aktivert."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Pipelyder er slått av for alle Pod-varsler og påminnelsesvarsler er slått av. Pod'en vil kun pipe hvis den slutter å virke og når du ber om test-lyd.\n\n⚠️Advarsel - Når pipelyder er slått av må du passe på å ha Pod'en innenfor Bluetooth-rekkevidde til mobiltelefonen slik at du kan motta varsler på telefonen ved feil på Pod'en."; /* Help text for Silence Pod view */ -"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping."; +"Silence Pod mode suppresses all Pod alert and confirmation reminder beeping." = "Stillemodus slår av alle pipelyder for Pod'en."; /* navigation title for Silnce Pod */ -"Silence Pod" = "Silence Pod"; +"Silence Pod" = "Stillemodus"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-detaljer"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Detaljer fra forrige Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Detaljer for pumpehåndtering"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Henter detaljer for pumpehåndtering..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Oppdater detaljer for pumpehåndtering"; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Les Pod-status"; diff --git a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings index 2c34f1cfd7..73292c094b 100644 --- a/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/ru.lproj/Localizable.strings @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Дождитесь окончания введения канюли."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Сдвиньте переключатель ниже, чтобы начать введение канюли."; /* Label text indicating insertion finished. */ "Inserted" = "Введено"; diff --git a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings index f5e8607195..86f00bc053 100644 --- a/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings +++ b/Dependencies/OmniBLE/Localizations/sk.lproj/Localizable.strings @@ -403,7 +403,7 @@ "Deactivate Pod" = "Deaktivovať Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Pripravené na zavedenie kanyly"; /* */ "Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; @@ -493,7 +493,7 @@ "Wait until insertion is completed." = "Počkajte kým nie je zavedenie ukončené."; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Posunutím spínača nižšie spustite zavádzanie kanyly."; /* Label text indicating insertion finished. */ "Inserted" = "Vložené do tela"; diff --git a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings index eeb705f2a4..4a4f5c2fb5 100644 --- a/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKit/Resources/nb.lproj/Localizable.strings @@ -63,10 +63,10 @@ "Communication issue: Unacknowledged command pending." = "Kommunikasjonsproblem: Ukjent kommando venter."; /* Description for BeepPreference.manualCommands */ -"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used."; +"Confidence reminders will sound for commands you initiate, like bolus, cancel bolus, suspend, resume, save notification reminders, etc. When the app automatically adjusts delivery, no confidence reminders are used." = "Du vil høre påminnelseslyder for kommandoer du starter, slik som bolus, avbryt bolus, pause, gjenoppta, lagre innstillinger, osv. Når appen automatisk justerer insulinlevering hører du ingen påminnelseslyder."; /* Description for BeepPreference.extended */ -"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate."; +"Confidence reminders will sound when the app automatically adjusts delivery as well as for commands you initiate." = "Du vil høre påminnelseslyder når appen automatisk justerer insulinlevering, og for kommandoer du starter."; /* The title for AlarmCode.other notification */ "Critical Pod Error" = "Pod-feil"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings index fadf6e327a..6356abd2d9 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/de.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Slide zum Deaktivieren von Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Schieben Sie den Schalter unten, um mit dem Einfügen von Kanülen zu beginnen."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktiviert"; @@ -285,7 +285,7 @@ "Fault" = "Störung"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Füllen Sie einen neuen Pod mit U-100-Insulin (Entfernen Sie nicht den Nadelverschluss). Warten Sie auf 2 Pieptöne."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Deaktivierung abschließen"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings index e317864aa3..d6898a4b17 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/nb.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Confidence Reminders" = "Bekreftelser"; /* Help text for BeepPreferenceSelectionView */ -"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced."; +"Confidence reminders are beeps from the Pod which can be used to acknowledge selected commands when the Pod is not silenced." = "Påminnelsesvarsler er pipelyder fra Pod'en som kan brukes til å bekrefte valgte kommandoer når Pod'en ikke er i stillemodus."; /* The title of the configuration section in settings */ "Configuration" = "Konfigurasjon"; @@ -180,20 +180,20 @@ "Deactivate" = "Deaktiver"; /* Action button description for deactivate while pod still active */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Button title for pod deactivation Button title to deactivate pod */ "Deactivate Pod" = "Deaktiver Pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Sveip for å sette inn kanyle"; /* */ -"Slide to Deactivate Pod" = "Slide to Deactivate Pod"; +"Slide to Deactivate Pod" = "Sveip for å deaktivere Pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Sveip under for å starte innsetting av kanylen."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivert"; @@ -285,7 +285,7 @@ "Fault" = "Feil"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fyll en ny Pod med U-100 insulin (la kanylehetten være på). Lytt etter 2 pip."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Fullfør deaktivering"; @@ -559,7 +559,7 @@ "Remove Pump" = "Fjern pumpen"; /* Label text for step two of attach pod instructions */ -"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Remove the Pod's clear needle cap and check cannula. Then remove paper backing."; +"Remove the Pod's clear needle cap and check cannula. Then remove paper backing." = "Da av Pod'ens kanylehette og sjekk kanylen. Fjern deretter papirbeskyttelsen."; /* Label indicating pod replacement necessary The title of the command to replace pod */ @@ -778,39 +778,39 @@ "Your Pod may still be delivering Insulin.\nRemove it from your body, then tap “Continue.“" = "Pod kan fortsatt levere insulin.\nFjern den fra kroppen din, og trykk deretter på \"Fortsett\"."; /* Title string for SilencePodPreference.enabled */ -"Silenced" = "Silenced"; +"Silenced" = "Dempet"; /* Description for SilencePodPreference.disabled */ -"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled."; +"Normal operation mode where audible Pod beeps are used for all Pod alerts and when confidence reminders are enabled." = "Normal driftsmodus der Pod piper for alle Pod-varslinger og når påminnelsesvarsler er aktivert."; /* Description for SilencePodPreference.enabled */ -"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts."; +"All Pod alerts use no beeps and confirmation reminder beeps are suppressed. The Pod will only beep for fatal Pod faults and when playing test beeps.\n\n⚠️Warning - Whenever the Pod is silenced it must be kept within Bluetooth range of this device to receive notifications for Pod alerts." = "Pipelyder er slått av for alle Pod-varsler og påminnelsesvarsler er slått av. Pod'en vil kun pipe hvis den slutter å virke og når du ber om test-lyd.\n\n⚠️Advarsel - Når pipelyder er slått av må du passe på å ha Pod'en innenfor Bluetooth-rekkevidde til mobiltelefonen slik at du kan motta varsler på telefonen ved feil på Pod'en."; /* Help text for Silence Pod view */ /* navigation title for Silnce Pod" */ "Silence Pod mode suppresses all Pod alert and confirmation reminder beeping. -Silence Pod" = "Silence Pod"; +Silence Pod" = "Stillemodus"; /* title for pod details page */ -"Pod Details" = "Pod Details"; +"Pod Details" = "Pod-detaljer"; /* Text for previous pod details row" */ -"Previous Pod Details" = "Previous Pod Details"; +"Previous Pod Details" = "Detaljer fra forrige Pod"; /* Text for pump manager details navigation link */ -"Pump Manager Details" = "Pump Manager Details"; +"Pump Manager Details" = "Detaljer for pumpehåndtering"; /* button title when retrieving pump manager details */ -"Retrieving Pump Manager Details..." = "Retrieving Pump Manager Details..."; +"Retrieving Pump Manager Details..." = "Henter detaljer for pumpehåndtering..."; /* button title to refresh pump manager details */ -"Refresh Pump Manager Details" = "Refresh Pump Manager Details"; +"Refresh Pump Manager Details" = "Oppdater detaljer for pumpehåndtering"; /* Alert title for error when updating silence pod preference */ -"Failed to update silence pod preference." = "Failed to update silence pod preference."; +"Failed to update silence pod preference." = "Kunne ikke oppdatere innstillingen."; /* Section header for diagnostic section */ -"Diagnostics" = "Diagnostics"; +"Diagnostics" = "Diagnose"; /* Text for read pod status navigation link */ -"Read Pod Status" = "Read Pod Status"; +"Read Pod Status" = "Les Pod-status"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings index 59afddc47a..847aaf1dcd 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/ru.lproj/Localizable.strings @@ -193,7 +193,7 @@ "Slide to Deactivate Pod" = "Сдвиньте для деактивации"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Сдвиньте переключатель ниже, чтобы начать введение канюли."; /* Label text showing pod is deactivated */ "Deactivated" = "Не активен"; @@ -285,7 +285,7 @@ "Fault" = "Сбой"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Заполните новый Под U-100 инсулином (оставьте синюю защитную крышку Пода). Прослушайте 2 звуковых сигнала."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Завершение деактивации"; diff --git a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings index d4ac4dd3cc..23df402336 100644 --- a/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings +++ b/Dependencies/OmniKit/OmniKitUI/Resources/sk.lproj/Localizable.strings @@ -187,13 +187,13 @@ "Deactivate Pod" = "Deaktivovať pod"; /* */ -"Slide to Insert Cannula" = "Slide to Insert Cannula"; +"Slide to Insert Cannula" = "Pripravené na zavedenie kanyly"; /* */ "Slide to Deactivate Pod" = "Posunutím deaktivujte pod"; /* Label text for step one of insert cannula instructions */ -"Slide the switch below to start cannula insertion." = "Slide the switch below to start cannula insertion."; +"Slide the switch below to start cannula insertion." = "Posunutím spínača nižšie spustite zavádzanie kanyly."; /* Label text showing pod is deactivated */ "Deactivated" = "Deaktivované"; @@ -285,7 +285,7 @@ "Fault" = "Chyba"; /* Label text for step 1 of pair pod instructions */ -"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps."; +"Fill a new pod with U-100 Insulin (leave clear Pod needle cap on). Listen for 2 beeps." = "Naplňte nový pod inzulínom U-100 (kryt ihly ponechajte nasadený). Budete počuť 2 pípnutia."; /* Settings page link description when next lifecycle action is to finish deactivation */ "Finish deactivation" = "Dokončiť deaktiváciu"; diff --git a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings index eb19ddbbcc..7170383034 100644 --- a/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings @@ -1686,7 +1686,7 @@ Enact a temp Basal or a temp target */ "Average" = "Mittelwert"; /* Median BG */ -"Median" = "Mittelwert"; +"Median" = "Median"; /* CGM readings in statView */ "Readings" = "Lesungen"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Dynamic ISF-Konstante anpassen"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuelle Anpassung der berechneten dynamischen Verhältnisse. Die Voreinstellung ist 0,5. Je höher der Wert, desto größer ist die Korrektur Ihres ISF/CR für einen hohen oder niedrigen Blutzuckerwert. Die maximale/minimale Korrektur wird durch die Min/Max-Einstellungen von Autosens bestimmt.\n\nFür die Sigmoid-Funktion wird für den Anfang ein Anpassungsfaktor von 0,4 - 0,5 empfohlen.\n\nFür die logarithmische Formel gibt es weniger Konsens, aber ein Wert von 0,8 ist wahrscheinlich für die meisten erwachsenen Benutzer angemessen. Für jüngere Anwender wird empfohlen, bei der logaritmischen Formel noch niedriger anzusetzen, um eine zu aggressive Behandlung zu vermeiden."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Sigmoid-Funktion verwenden"; @@ -2077,37 +2077,37 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Grenzwert-Einstellungen"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Minimale Grenzwerteinstellung"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Mit dieser Einstellung können Sie einen Wert wählen, unterhalb dessen kein Insulin verabreicht wird.\n\nDer Schwellenwert ergibt sich aus dem größten Wert Ihrer Schwellenwerteinstellung und dem berechneten Schwellenwert:\n\nZielglukose - (Zielglukose - 40) / 2\n, wobei hier mg/dl als Glukoseeinheit verwendet wird.\n\nWenn Ihr Zielglukose-Wert beispielsweise "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "der Grenzwert wird sein "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "es sei denn, Sie haben einen höheren Grenzwert eingestellt:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Einstellung"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Grenzwert"; /* Header */ "Calculator settings" = "Berechnungseinstellungen"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Alternativer Bolusrechner verwenden"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Fettige Mahlzeit"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Faktor für fette Mahlzeiten anwenden"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Der neue alternative Bolusrechner ist ein anderer Ansatz als der Standard-Bolusrechner in iAPS. Wenn die Umschaltfunktion aktiviert ist, wird dieser Bolusrechner und nicht der ursprüngliche iAPS-Rechner verwendet. Am Ende der Berechnung wird ein benutzerdefinierter Faktor angewandt, wie es bei der Verwendung von smbs der Fall sein sollte (Standardwert 0,8).\n\nSie können in Ihrem Bolusrechner auch die Option hinzufügen, am Ende der Berechnung einen weiteren (!) benutzerdefinierten Faktor anzuwenden, der für fetthaltige Mahlzeiten, z. B. Pizza, nützlich sein könnte (Standardwert 0,7)."; /* UI/UX option */ "Display Predictions" = "Prognosen anzeigen"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Home-Schaltflächenleiste "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Home-Chart Einstellungen "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Statistik-Einstellungen "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c-Einheit überschreiben"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "Falls Sie sowohl Profile als auch temporäre Ziele verwenden"; @@ -2151,13 +2151,13 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Horizontale Scroll-Ansicht sichtbare Stunden"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Anzeigeintervall Einstellungs-Button"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Bolus-Rechner"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamischer ISF"; /* Notification option */ "Live Activity" = "Live-Aktivitäten"; @@ -2166,13 +2166,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Live Aktivitäten anzeigen"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Die Live-Aktivität zeigt die Blutzucker live auf dem Sperrbildschirm und auf der dynamischen Insel (falls verfügbar)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live-Aktivitäten werden in den Systemeinstellungen AUS aktiviert. Um Live-Aktivitäten zu aktivieren, gehen Sie zu Einstellungen -> iAPS -> Live-Aktivitäten einschalten.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Gewichteter Durchschnitt von TDD. Gewichtung von 24 Stunden:"; diff --git a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings index 891a8133b7..c40c097cdf 100644 --- a/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings @@ -47,7 +47,7 @@ "Agree and continue" = "Godta og fortsett"; /* Bolus progress view */ -"of" = "of"; +"of" = "av"; /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Utført kl."; @@ -339,7 +339,7 @@ Enact a temp Basal or a temp target */ "Use local glucose server" = "Bruk lokal glukoseserver"; /* Enable Statistics */ -"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n"; +"This enables uploading of statistics.json to Nightscout, which can be used by the Community Statistics and Demographics Project.\n\nParticipation in Community Statistics is opt-in, and requires separate registration at:\n" = "Dette skrur på opplasting av statistics.json til Nightscout, som kan brukes av prosjektet \"Community Statistics and Demographics\".\n\nDeltakelse er frivillig og krever en egen registrering på:\n"; /* */ "Edit settings json" = "Rediger \"freeaps_settings.json\""; @@ -582,10 +582,10 @@ Enact a temp Basal or a temp target */ "Temp Targets" = "Midlertidige mål"; /* Delete carbs from data table and Nightscout */ -"Delete Carbs?" = "Delete Carbs?"; +"Delete Carbs?" = "Slette karbohydrater?"; /* Delete insulin from pump history and Nightscout */ -"Delete Insulin?" = "Delete Insulin?"; +"Delete Insulin?" = "Slette insulin?"; /* Treatments list */ "Treatments" = "Behandlinger"; @@ -1377,13 +1377,13 @@ Enact a temp Basal or a temp target */ "Statistics and Home View" = "Statistikk og startskjerm"; /* Alert text */ -"Delete Carb Equivalents?" = "Delete Carb Equivalents?"; +"Delete Carb Equivalents?" = "Slette karboekvivalenter?"; /* */ -"All FPUs of the meal will be deleted." = "All FPUs of the meal will be deleted."; +"All FPUs of the meal will be deleted." = "Alle karboekvivalenter for måltidet vil bli slettet."; /* */ -"Delete Glucose?" = "Delete Glucose?"; +"Delete Glucose?" = "Slette blodsukker?"; /* */ "Meal Presets" = "Forvalg av måltid"; @@ -1671,16 +1671,16 @@ Enact a temp Basal or a temp target */ "2 hours" = "2 timer"; /* */ -"4 hours" = "4 hours"; +"4 hours" = "4 timer"; /* */ -"6 hours" = "6 hours"; +"6 hours" = "6 timer"; /* */ -"12 hours" = "12 hours"; +"12 hours" = "12 timer"; /* */ -"24 hours" = "24 hours"; +"24 hours" = "24 timer"; /* Average BG = */ "Average" = "Gj.snitt"; @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Aktiver dynamisk ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Beregne ny insulinsensitivitet (ISF) ved hver loop-syklus. Den nye ISF-verdien vil bli basert på nåværende blodsukker, total daglig insulindose (TDD, siste 24 timer med levert insulin) og en individuell justeringsfaktor (anbefalingen er å starte med 0.5 hvis man benytter Sigmoid og ellers 0.8).\n\nAlle dynamiske justeringer av ISF og CR blir begrenset av dine Autosens MIN/MAX-innstillinger."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Aktiver dynamisk CR"; @@ -2050,129 +2050,129 @@ Enact a temp Basal or a temp target */ "Use Dynamic CR. The dynamic ratio will be used for CR as follows:\n\n When ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nWhen ratio < 1: dynCR = CR/dynCR.\n\nDon't use toghether with a high Insulin Fraction (> 2)" = "Bruk dynamisk CR. Dynamisk ratio brukes for CR som følger:\n\n Når ratio > 1: dynCR = (newRatio - 1) / 2 + 1.\nNår ratio < 1: dynCR = CR/dynCR.\n\nIkke bruk denne innstillingen sammen med en høy insulinbrøk (Insulin Fraction > 2)"; /* Enable Dyn ISF */ -"Activate Dynamic Sensitivity (ISF)" = "Activate Dynamic Sensitivity (ISF)"; +"Activate Dynamic Sensitivity (ISF)" = "Aktivere dynamisk insulinfølsomhet (ISF)"; /* Enable Dyn CR */ -"Activate Dynamic Carb Ratio (CR)" = "Activate Dynamic Carb Ratio (CR)"; +"Activate Dynamic Carb Ratio (CR)" = "Aktivere dynamisk karbohydratforhold (CR)"; /* Headline "Adjust Dynamic ISF constant" */ "Adjust Dynamic ISF constant" = "Juster konstant for dynamisk ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Justeringsfaktoren brukes til å bestemme hvor mye ISF/CR skal justeres når man benytter dynamisk ISF/CR. Standardverdi er 0.5. Jo høyere verdi, jo større blir korrigeringen av ISF/CR ved høyt eller lavt blodsukker. Maks/min korrigering avgjøres av dine Autosens maks/min-innstillinger.\n\nFor Sigmoid anbefales det en justeringsfaktor på 0.4 - 0.5 til å begynne med.\n\nNår Sigmoid ikke er i bruk anbefales det å starte på 0.8 for voksne brukere. For yngre brukere er det anbefalt å starte med en lavere justeringsfaktor for å unngå aggresiv behandling."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Bruk sigmoid-funksjon"; /* Which dyn ISF function to use */ -"Formula" = "Formula"; +"Formula" = "Formel"; /* Extra Safety Features when using dyn ISF */ -"Safety" = "Safety"; +"Safety" = "Sikkerhet"; /* Use Sigmoid Function */ "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function." = "Use a sigmoid function for ISF (and for CR, when enabled), instead of the default Logarithmic formula. Requires the Dynamic ISF setting to be enabled in settings\n\nThe Adjustment setting adjusts the slope of the curve (Y: Dynamic ratio, X: Blood Glucose). A lower value ==> less steep == less aggressive.\n\nThe autosens.min/max settings determines both the max/min limits for the dynamic ratio AND how much the dynamic ratio is adjusted. If AF is the slope of the curve, the autosens.min/max is the height of the graph, the Y-interval, where Y: dynamic ratio. The curve will always have a sigmoid shape, no matter which autosens.min/max settings are used, meaning these settings have big consequences for the outcome of the computed dynamic ISF. Please be careful setting a too high autosens.max value. With a proper profile ISF setting, you will probably never need it to be higher than 1.5\n\nAn Autosens.max limit > 1.5 is not advisable when using the sigmoid function."; /* Headline Threshold Setting */ -"Threshold Setting" = "Threshold Setting"; +"Threshold Setting" = "Terskelinnstilling"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Minimum terskelinnstilling"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Denne innstillingen lar deg velge et blodsukkernivå for å stoppe insulintilførsel.\n\nSystemet ser på denne innstillingen og den beregnede terskelverdien, og velger den høyeste av disse:\n\nMålverdi - (Målverdi - 40) / 2\n, her med mg/dl.\n\nFor eksempel, hvis blodsukkermålet ditt er "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "så vil terskelverdien bli "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "med mindre din terskelinnstilling er satt høyere:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Innstilling"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Terskel"; /* Header */ -"Calculator settings" = "Calculator settings"; +"Calculator settings" = "Innstillinger for kalkulator"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Bruk alternativ boluskalkulator"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Måltid med høyt fettinnhold"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Bruk egen faktor for fete måltider"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Den nye alternative boluskalkulatoren bruker en annen tilnærming enn den vanlige boluskalkulatoren i iAPS. Ved slutten av beregningen brukes det en faktor for å begrense hvor mye av beregnet bolus som blir gitt med en gang. Tanken er at resten av nødvendig insulin blir gitt via SMB. Standard faktor er 0.8, som betyr at kalkulatoren foreslår å dosere 80% av insulinbehovet som bolus.\n\nDu kan også legge til en annen faktor for måltider med høyt fettinnhold, for eksempel pizza. Tanken er at slike måltider trenger mindre insulin ved måltidsstart. Standard faktor er derfor 0.7 (70%)."; /* UI/UX option */ -"Display Predictions" = "Display Predictions"; +"Display Predictions" = "Vis prognoser"; /* UI/UX option */ -"Smaller iPhone Screens" = "Smaller iPhone Screens"; +"Smaller iPhone Screens" = "Mindre iPhone-skjermer"; /* UI/UX option */ -"Display and allow Fat and Protein entries" = "Display and allow Fat and Protein entries"; +"Display and allow Fat and Protein entries" = "Vis og tillat registrering av fett og protein"; /* UI/UX option */ -"Add Meal View settings " = "Add Meal View settings "; +"Add Meal View settings " = "Innstillinger for registrering av måltid "; /* UI/UX option */ -"Display Temp Targets Button" = "Display Temp Targets Button"; +"Display Temp Targets Button" = "Vis knapp for midlertidig mål"; /* UI/UX option */ -"Home View Button Panel " = "Home View Button Panel "; +"Home View Button Panel " = "Knapperad på startskjerm "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Innstillinger for graf på startskjerm "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Innstillinger for statistikk "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Overstyre HbA1c-enhet"; /* UI/UX option */ -"In case you're using both profiles and temp targets" = "In case you're using both profiles and temp targets"; +"In case you're using both profiles and temp targets" = "I tilfelle du bruker både profiler og midlertidige mål"; /* UI/UX option */ -"Always Color Glucose Value (green, yellow etc)" = "Always Color Glucose Value (green, yellow etc)"; +"Always Color Glucose Value (green, yellow etc)" = "Alltid bruk farge på blodsukkerverdi (grønn, gul, osv)"; /* UI/UX option */ -"Header settings" = "Header settings"; +"Header settings" = "Innstillinger for topplinjen"; /* UI/UX option */ -"Normally glucose is colored red only when over or under your notification limits for high/low" = "Normally glucose is colored red only when over or under your notification limits for high/low"; +"Normally glucose is colored red only when over or under your notification limits for high/low" = "Vanligvis er blodsukkerverdien rød bare når den er over og under varslingsinnstillingene for høy/lav"; /* UI/UX option */ -"Horizontal Scroll View Visible hours" = "Horizontal Scroll View Visible hours"; +"Horizontal Scroll View Visible hours" = "Antall synlige timer for horisontal visning"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Vis knapp for tidsintervall"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Boluskalkulator"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamisk ISF"; /* Notification option */ -"Live Activity" = "Live Activity"; +"Live Activity" = "Oppdateringer i sanntid"; /* Notification option */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Sanntidsoppdatering (Live Activity) viser blodsukkerverdi på låseskjerm og i Dynamic Island (hvis telefonen har dette)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Vis sanntidsoppdatering"; /* Live Activity Footer */ -"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)"; +"Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Sanntidsoppdatering (Live Activity) viser blodsukkerverdi på låseskjerm og i Dynamic Island (hvis telefonen har dette)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Sanntidsoppdatering er skrudd av i systeminnstillingene. For å skru på, gå til Innstillinger-appen -> iAPS og skru på Oppdateringer i sanntid.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vektet snitt av TDD. Vekting av siste 24 timer:"; diff --git a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings index 5e7f444416..1050bf1d57 100644 --- a/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings @@ -2098,16 +2098,16 @@ Enact a temp Basal or a temp target */ "Calculator settings" = "Настройки калькулятора"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Альтернативный калькулятор болюса"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Жирная пища"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Применить фактор для жирной пищи"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Альтернативный калькулятор болюса использует другой алгоритм расчета болюса. Для индивидуальной настройки вы можете изменить поправочный коэффициент (значение по умолчанию 0.8) в зависимости от того, хотите ли вы более высокие (выше 1) или меньшие (ниже 1) рекомендации по болюсу.\n\nДля особо жирных блюд, таких как пицца, существует возможность уменьшить рекомендуемый болюс еще на один коэффициент (стандартно 0.7)."; /* UI/UX option */ "Display Predictions" = "Отображать прогнозы"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Панель кнопок главного экрана "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Схема главного экрана "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Настройки статистики "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "HbA1c в процентах"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "В случае, если вы используете как профили, так и временные цели"; @@ -2151,13 +2151,13 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Интервал при горизонтальной прокрутке"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Отображать кнопку выбора интервала времени"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Калькулятор болюса"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Динамический ISF"; /* Notification option */ "Live Activity" = "Эфир активности"; @@ -2166,13 +2166,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Отображать эфир активности"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Эфир активности - в реальном времени отображает уровень глюкозы в крови на экране блокировки и на динамическом островке Dynamic Island (если доступно)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "\"Эфир активности\" отключен в системных настройках. Чтобы включить \"эфир активности\", перейдите в Настройки -> iAPS -> \"Эфир активности\" -> ВКЛ.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Взвешенное среднее значение TDD. Вес последних 24 часов:"; diff --git a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings index c0bc83d563..e7db241ce8 100644 --- a/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings @@ -2041,7 +2041,7 @@ Enact a temp Basal or a temp target */ "Enable Dynamic ISF" = "Povolenie funkcie Dynamic ISF"; /* Enable Dynamic ISF */ -"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits."; +"Calculate a new Insulin Sensitivity Setting (ISF) upon every loop cycle. The new ISF will be based on your current Glucose, total daily dose of insulin (TDD, past 24 hours of all delivered insulin) and an individual Adjustment Factor (recommendation to start with is 0.5 if using Sigmoid Function and 0.8 if not).\n\nAll of the Dynamic ISF and CR adjustments will be limited by your autosens.min/max limits." = "Vypočítajte nové nastavenie citlivosti na inzulín (ISF) pri každom cykle slučky. Nové nastavenie ISF bude založené na vašej aktuálnej glykémii, celkovej dennej dávke inzulínu (TDD, posledných 24 hodín všetkého podaného inzulínu) a vašom individuálnom korekčnom faktore (odporúčanie na začiatok je 0,5, ak používate sigmoidnú funkciu, a 0,8, ak nie).\n\\Všetky dynamické úpravy ISF a CR budú obmedzené vašimi limitmi min/max automatického snímania."; /* Headline Enable Dynamic CR */ "Enable Dynamic CR" = "Povolenie funkcie Dynamic CR"; @@ -2059,7 +2059,7 @@ Enact a temp Basal or a temp target */ "Adjust Dynamic ISF constant" = "Nastavenie konštanty Dynamic ISF"; /* Adjust Dynamic ISF constant */ -"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment."; +"Individual adjustment of the computed dynamic ratios. Default is 0.5. The higher the value, the larger the correction of your ISF/CR will be for a high or a low blood glucose. Maximum/minumum correction is determined by the Autosens min/max settings.\n\nFor Sigmoid function an adjustment factor of 0.4 - 0.5 is recommended to begin with.\n\nFor the logaritmic formula threre is less consensus, but starting around 0.8 is probably appropiate for most adult users. For younger users it's recommended to start even lower when using logaritmic formula, to avoid overly aggressive treatment." = "Individuálne nastavenie vypočítaných dynamických pomerov. Predvolená hodnota je 0,5. Čím vyššia je táto hodnota, tým väčšia bude korekcia vášho ISF/CR pre vysokú alebo nízku hladinu glukózy v krvi. Maximálna/minimálna korekcia je určená nastavením min/max v programe Autosens.\n\nPre sigmoidnú funkciu sa na začiatok odporúča korekčný faktor 0,4 - 0,5.\n\nPre logaritmický vzorec existuje menej konsenzu, ale začiatok okolo 0,8 je pravdepodobne vhodný pre väčšinu dospelých používateľov. U mladších používateľov sa pri používaní logaritmickej formuly odporúča začať ešte nižšie, aby sa zabránilo príliš agresívnej liečbe."; /* Headline Use Sigmoid Function */ "Use Sigmoid Function" = "Použitie funkcie Sigmoid"; @@ -2077,37 +2077,37 @@ Enact a temp Basal or a temp target */ "Threshold Setting" = "Nastavenie prahové hodnoty"; /* Dynamic ISF Setting Title */ -"Minimum Threshold Setting" = "Minimum Threshold Setting"; +"Minimum Threshold Setting" = "Nastavenie minimálneho prahu"; /* Minimum Threshold Setting, Part 1 */ -"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is "; +"This setting lets you choose a level below which no insulin will be given.\n\nThe threshold is using the largest amount of your threshold setting and the computed threshold:\n\nTarget Glucose - (Target Glucose - 40) / 2\n, here using mg/dl as glucose unit.\n\nFor example, if your Target Glucose is " = "Toto nastavenie vám umožňuje zvoliť hladinu, pod ktorou nebude podaný žiadny inzulín.\n\nPrahová hodnota používa najväčšiu hodnotu vášho nastavenia prahovej hodnoty a vypočítanú prahovú hodnotu:\n\nCielová glykémia - (cieľová glykémia - 40) / 2\n, tu s použitím mg/dl ako jednotky glukózy.\n\nNapr. ak je vaša cieľová glykémia "; /* Minimum Threshold Setting, Part 2 */ -"the threshold will be " = "the threshold will be "; +"the threshold will be " = "prahová hodnota bude "; /* Minimum Threshold Setting, Part 3 */ -"unless your threshold setting is set higher:" = "unless your threshold setting is set higher:"; +"unless your threshold setting is set higher:" = "pokiaľ nie je nastavená vyššia prahová hodnota:"; /* Threshold Table Columns Title */ -"Setting" = "Setting"; +"Setting" = "Nastavenia"; /* Threshold Table Columns Title */ -"Threshold" = "Threshold"; +"Threshold" = "Hranica"; /* Header */ "Calculator settings" = "Nastavenia výpočtu"; /* Bolus Calculator Setting */ -"Use alternate Bolus Calculator" = "Use alternate Bolus Calculator"; +"Use alternate Bolus Calculator" = "Použite alternatívnu kalkulačku Bolus"; /* Bolus Calculator Setting */ -"Fatty Meals" = "Fatty Meals"; +"Fatty Meals" = "Mastné jedlo"; /* Bolus Calculator Setting */ -"Apply factor for fatty meals" = "Apply factor for fatty meals"; +"Apply factor for fatty meals" = "Použite faktor pre mastné jedlá"; /* Bolus Calculator Footer */ -"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)."; +"The new alternate bolus calculator is another approach to the default bolus calculator in iAPS. If the toggle is on you use this bolus calculator and not the original iAPS calculator. At the end of the calculation a custom factor is applied as it is supposed to be when using smbs (default 0.8).\n\nYou can also add the option in your bolus calculator to apply another (!) customizable factor at the end of the calculation which could be useful for fatty meals, e.g Pizza (default 0.7)." = "Nová alternatívna bolusová kalkulačka je ďalším prístupom k predvolenej bolusovej kalkulačke v systéme iAPS. Ak je prepínač zapnutý, používate túto kalkulačku bolusu a nie pôvodnú kalkulačku iAPS. Na konci výpočtu sa použije vlastný faktor, ako to má byť pri používaní smbs (predvolene 0,8).\n\nV kalkulačke bolusu môžete tiež pridať možnosť použiť na konci výpočtu ďalší (!) prispôsobiteľný faktor, ktorý by mohol byť užitočný pre tučné jedlá, napr. pizzu (predvolene 0,7)."; /* UI/UX option */ "Display Predictions" = "Zobraziť predpovede"; @@ -2128,13 +2128,13 @@ Enact a temp Basal or a temp target */ "Home View Button Panel " = "Panel tlačidiel zobrazenia Domov "; /* UI/UX title */ -"Home Chart settings " = "Home Chart settings "; +"Home Chart settings " = "Domov Nastavenia grafu "; /* UI/UX title */ -"Statistics settings " = "Statistics settings "; +"Statistics settings " = "Nastavenia štatistík "; /* UI/UX title */ -"Override HbA1c Unit" = "Override HbA1c Unit"; +"Override HbA1c Unit" = "Prepísanie jednotky HbA1c"; /* UI/UX option */ "In case you're using both profiles and temp targets" = "V prípade, že používate profily aj dočasný cieľ"; @@ -2151,13 +2151,13 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Horizontálne rolovacie zobrazenie Viditeľné hodiny"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Tlačidlo nastavenia časového intervalu zobrazenia"; /* Setting title */ -"Bolus Calculator" = "Bolus Calculator"; +"Bolus Calculator" = "Kalkulátor bolusu"; /* Setting title */ -"Dynamic ISF" = "Dynamic ISF"; +"Dynamic ISF" = "Dynamická ISF"; /* Notification option */ "Live Activity" = "Živá aktivita"; @@ -2166,13 +2166,13 @@ Enact a temp Basal or a temp target */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Notification option */ -"Show Live activity" = "Show Live activity"; +"Show Live activity" = "Zobraziť živú aktivitu"; /* Live Activity Footer */ "Live activity displays blood glucose live on the lock screen and on the dynamic island (if available)" = "Živá aktivita zobrazuje glukózu v krvi na uzamknutej obrazovke a na dynamickom ostrove (ak je k dispozícii)"; /* Live Activity Footer when off */ -"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n"; +"Live activities are turned OFF in system settings. To enable live activities, go to Settings app -> iAPS -> Turn live Activities ON.\n\n" = "Aktivity v režime Live sú v nastaveniach systému vypnuté. Ak chcete zapnúť živé aktivity, prejdite do Nastavenia -> iAPS -> Zapnúť živé aktivity.\n\n"; /* Headline "Weighted Average of TDD. Weight of past 24 hours:" */ "Weighted Average of TDD. Weight of past 24 hours:" = "Vážený priemer TDD. Váha za posledných 24 hodín:"; diff --git a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings index 33efa9b8bc..4b52afda99 100644 --- a/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings @@ -2151,7 +2151,7 @@ Enact a temp Basal or a temp target */ "Horizontal Scroll View Visible hours" = "Горизонтальна прокрутка Видимі години"; /* UI/UX option */ -"Display Time Interval Setting Button" = "Display Time Interval Setting Button"; +"Display Time Interval Setting Button" = "Відображення Кнопки Налаштування Інтервалу Часу"; /* Setting title */ "Bolus Calculator" = "Калькулятор Болюса"; From 464cee7a211b6275b6048f9c047c7f75bfba2c75 Mon Sep 17 00:00:00 2001 From: MikePlante1 <82073483+MikePlante1@users.noreply.github.com> Date: Fri, 9 Feb 2024 11:18:12 -0500 Subject: [PATCH 398/405] Add an option to confirm boluses faster on Apple Watch (#508) --- .../Resources/json/defaults/freeaps/freeaps_settings.json | 1 + FreeAPS/Sources/Models/FreeAPSSettings.swift | 5 +++++ .../Modules/WatchConfig/View/WatchConfigRootView.swift | 2 ++ .../Sources/Modules/WatchConfig/WatchConfigStateModel.swift | 2 ++ FreeAPS/Sources/Services/WatchManager/WatchManager.swift | 1 + FreeAPSWatch WatchKit Extension/DataFlow.swift | 1 + .../Views/BolusConfirmationView.swift | 2 +- FreeAPSWatch WatchKit Extension/WatchStateModel.swift | 2 ++ 8 files changed, 15 insertions(+), 1 deletion(-) diff --git a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json index 05e85190c9..fde30ed99b 100644 --- a/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json +++ b/FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json @@ -44,6 +44,7 @@ "rulerMarks" : false, "maxCarbs": 1000, "displayFatAndProteinOnWatch": false, + "confirmBolusFaster": false, "overrideFactor": 0.8, "useCalc": false, "fattyMeals": false, diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index 74f2182b4e..5a2d3f9cc7 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -44,6 +44,7 @@ struct FreeAPSSettings: JSON, Equatable { var rulerMarks: Bool = false var maxCarbs: Decimal = 1000 var displayFatAndProteinOnWatch: Bool = false + var confirmBolusFaster: Bool = false var onlyAutotuneBasals: Bool = false var overrideFactor: Decimal = 0.8 var useCalc: Bool = false @@ -255,6 +256,10 @@ extension FreeAPSSettings: Decodable { settings.displayFatAndProteinOnWatch = displayFatAndProteinOnWatch } + if let confirmBolusFaster = try? container.decode(Bool.self, forKey: .confirmBolusFaster) { + settings.confirmBolusFaster = confirmBolusFaster + } + if let onlyAutotuneBasals = try? container.decode(Bool.self, forKey: .onlyAutotuneBasals) { settings.onlyAutotuneBasals = onlyAutotuneBasals } diff --git a/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift b/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift index fad8456157..eaaf5c90a2 100644 --- a/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift +++ b/FreeAPS/Sources/Modules/WatchConfig/View/WatchConfigRootView.swift @@ -21,6 +21,8 @@ extension WatchConfig { Toggle("Display Protein & Fat", isOn: $state.displayFatAndProteinOnWatch) + Toggle("Confirm Bolus Faster", isOn: $state.confirmBolusFaster) + Section(header: Text("Garmin Watch")) { List { ForEach(state.devices, id: \.uuid) { device in diff --git a/FreeAPS/Sources/Modules/WatchConfig/WatchConfigStateModel.swift b/FreeAPS/Sources/Modules/WatchConfig/WatchConfigStateModel.swift index 825fe20024..a4f52b0a69 100644 --- a/FreeAPS/Sources/Modules/WatchConfig/WatchConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/WatchConfig/WatchConfigStateModel.swift @@ -31,6 +31,7 @@ extension WatchConfig { @Published var devices: [IQDevice] = [] @Published var selectedAwConfig: AwConfig = .HR @Published var displayFatAndProteinOnWatch = false + @Published var confirmBolusFaster = false private(set) var preferences = Preferences() @@ -38,6 +39,7 @@ extension WatchConfig { preferences = provider.preferences subscribeSetting(\.displayFatAndProteinOnWatch, on: $displayFatAndProteinOnWatch) { displayFatAndProteinOnWatch = $0 } + subscribeSetting(\.confirmBolusFaster, on: $confirmBolusFaster) { confirmBolusFaster = $0 } subscribeSetting(\.displayOnWatch, on: $selectedAwConfig) { selectedAwConfig = $0 } didSet: { [weak self] value in // for compatibility with old displayHR diff --git a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift index f5e5a580e9..74e3f4b3b4 100644 --- a/FreeAPS/Sources/Services/WatchManager/WatchManager.swift +++ b/FreeAPS/Sources/Services/WatchManager/WatchManager.swift @@ -118,6 +118,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable { self.state.bolusAfterCarbs = !self.settingsManager.settings.skipBolusScreenAfterCarbs self.state.displayOnWatch = self.settingsManager.settings.displayOnWatch self.state.displayFatAndProteinOnWatch = self.settingsManager.settings.displayFatAndProteinOnWatch + self.state.confirmBolusFaster = self.settingsManager.settings.confirmBolusFaster let eBG = self.eventualBGString() self.state.eventualBG = eBG.map { "⇢ " + $0 } diff --git a/FreeAPSWatch WatchKit Extension/DataFlow.swift b/FreeAPSWatch WatchKit Extension/DataFlow.swift index d6f7848c13..0b02b0ef4a 100644 --- a/FreeAPSWatch WatchKit Extension/DataFlow.swift +++ b/FreeAPSWatch WatchKit Extension/DataFlow.swift @@ -22,6 +22,7 @@ struct WatchState: Codable { var eventualBGRaw: String? var displayOnWatch: AwConfig? var displayFatAndProteinOnWatch: Bool? + var confirmBolusFaster: Bool? var useNewCalc: Bool? var isf: Decimal? var override: String? diff --git a/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift b/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift index 23a9d4cc48..aa85dff411 100644 --- a/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift +++ b/FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift @@ -75,7 +75,7 @@ struct BolusConfirmationView: View { $crownProgress, from: 0.0, through: 100.0, - by: 0.5, + by: state.confirmBolusFaster ? 5 : 0.5, sensitivity: .high, isContinuous: false, isHapticFeedbackEnabled: true diff --git a/FreeAPSWatch WatchKit Extension/WatchStateModel.swift b/FreeAPSWatch WatchKit Extension/WatchStateModel.swift index 387e0920be..dbbdac667f 100644 --- a/FreeAPSWatch WatchKit Extension/WatchStateModel.swift +++ b/FreeAPSWatch WatchKit Extension/WatchStateModel.swift @@ -34,6 +34,7 @@ class WatchStateModel: NSObject, ObservableObject { @Published var isBolusViewActive = false @Published var displayOnWatch: AwConfig = .BGTarget @Published var displayFatAndProteinOnWatch = false + @Published var confirmBolusFaster = false @Published var useNewCalc = false @Published var eventualBG = "" @Published var isConfirmationViewActive = false { @@ -175,6 +176,7 @@ class WatchStateModel: NSObject, ObservableObject { eventualBG = state.eventualBG ?? "" displayOnWatch = state.displayOnWatch ?? .BGTarget displayFatAndProteinOnWatch = state.displayFatAndProteinOnWatch ?? false + confirmBolusFaster = state.confirmBolusFaster ?? false useNewCalc = state.useNewCalc ?? false isf = state.isf override = state.override From 17aeb2bd5d0ab0ccc02c6b86c640ffa625b18763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:24:55 +0100 Subject: [PATCH 399/405] Remote meals and Overrides (#509) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add meals and overrides as remote commands from Nightscout. For meals type all arguments (carbs: Decimal, fat: Decimal, protein: Decimal) Example 1: announce 10 grams of carbs: "meal: 10, 0, 0" Example 2: announce 23 g of protein and 5 g of fat: "meal: 0, 5, 23" For Overrides type the exact name of an existing override preset: Example 3: Activate the override preset "Cycling 🚴‍♂️": "Override: Cycling 🚴‍♂️" Example 4: Cancel an active override: "Override: Cancel" --- Config.xcconfig | 2 +- FreeAPS/Sources/APS/APSManager.swift | 48 +++++++++++++++- .../APS/FetchAnnouncementsManager.swift | 20 ++++++- .../Sources/APS/Storage/CarbsStorage.swift | 25 ++++++--- .../Sources/APS/Storage/CoreDataStorage.swift | 56 +++++++++++++++++++ .../Main/en.lproj/Localizable.strings | 15 +++++ .../Main/sv.lproj/Localizable.strings | 12 ++++ FreeAPS/Sources/Models/Announcement.swift | 16 ++++++ FreeAPS/Sources/Models/CarbsEntry.swift | 1 + .../Modules/Bolus/BolusStateModel.swift | 9 ++- .../View/AlternativeBolusCalcRootView.swift | 1 + .../Bolus/View/DefaultBolusCalcRootView.swift | 13 +++-- .../Sources/Modules/Home/HomeStateModel.swift | 1 + .../Home/View/Chart/MainChartView.swift | 34 +++++++---- .../Services/HealthKit/HealthKitManager.swift | 2 +- .../Services/Network/NightscoutAPI.swift | 28 ++++++++++ .../Services/Network/NightscoutManager.swift | 28 +++++++++- 17 files changed, 273 insertions(+), 38 deletions(-) diff --git a/Config.xcconfig b/Config.xcconfig index 2a491a828b..f4a20abcf5 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.7.6 +APP_VERSION = 2.8.0 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index ee8407eb91..fd4b0a00eb 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -558,7 +558,10 @@ final class BaseAPSManager: APSManager, Injectable { } } else { - debug(.apsManager, "Announcement Bolus succeeded") + debug( + .apsManager, + "Announcement Bolus succeeded." + ) self.announcementsStorage.storeAnnouncements([announcement], enacted: true) self.bolusProgress.send(0) self.bolusAmount.send(Decimal(roundedAmount)) @@ -616,10 +619,51 @@ final class BaseAPSManager: APSManager, Injectable { if let error = error { warning(.apsManager, "Announcement TempBasal failed with error: \(error.localizedDescription)") } else { - debug(.apsManager, "Announcement TempBasal succeeded") + debug( + .apsManager, + "Announcement TempBasal succeeded." + ) self.announcementsStorage.storeAnnouncements([announcement], enacted: true) } } + case let .meal(carbs, fat, protein): + let date = announcement.createdAt.date + + guard carbs > 0 || fat > 0 || protein > 0 else { + return + } + + carbsStorage.storeCarbs([CarbsEntry( + id: UUID().uuidString, + createdAt: date, + actualDate: date, + carbs: carbs, + fat: fat, + protein: protein, + note: "Remote", + enteredBy: "Nightscout operator", + isFPU: fat > 0 || protein > 0, + fpuID: (fat > 0 || protein > 0) ? UUID().uuidString : nil + )]) + + announcementsStorage.storeAnnouncements([announcement], enacted: true) + debug( + .apsManager, + "Remote Meal by Announcement succeeded. Carbs: \(carbs), fat: \(fat), protein: \(protein)." + ) + case let .override(name): + guard !name.isEmpty else { return } + if name.lowercased() == "cancel" { + OverrideStorage().cancelProfile() + announcementsStorage.storeAnnouncements([announcement], enacted: true) + debug(.apsManager, "Override Canceled by Announcement succeeded.") + return + } + + guard let override = CoreDataStorage().fetchProfile(name) else { return } + CoreDataStorage().activateOverride(override) + announcementsStorage.storeAnnouncements([announcement], enacted: true) + debug(.apsManager, "Remote Override by Announcement succeeded.") } } diff --git a/FreeAPS/Sources/APS/FetchAnnouncementsManager.swift b/FreeAPS/Sources/APS/FetchAnnouncementsManager.swift index 79110cd1a1..4bc35f8dd9 100644 --- a/FreeAPS/Sources/APS/FetchAnnouncementsManager.swift +++ b/FreeAPS/Sources/APS/FetchAnnouncementsManager.swift @@ -28,11 +28,22 @@ final class BaseFetchAnnouncementsManager: FetchAnnouncementsManager, Injectable return Just([]).eraseToAnyPublisher() } debug(.nightscout, "FetchAnnouncementsManager heartbeat") - debug(.nightscout, "Start fetching announcements") + debug( + .nightscout, + "Start fetching announcements, time: \(Date.now.formatted(date: .omitted, time: .shortened))" + ) // Add timestamp for debugging of the remote command delay return self.nightscoutManager.fetchAnnouncements() } .sink { announcements in - guard let last = announcements.filter({ $0.createdAt > self.announcementsStorage.syncDate() }) + let futureEntries = announcements.filter({ $0.createdAt > Date.now }) + // Delete future entries + if !futureEntries.isEmpty { + debug(.nightscout, "Future Announcements found") + self.nightscoutManager.deleteAnnouncements() + } + + guard let last = announcements + .filter({ $0.createdAt < Date.now && $0.createdAt > self.announcementsStorage.syncDate() }) .sorted(by: { $0.createdAt < $1.createdAt }) .last else { return } @@ -41,7 +52,10 @@ final class BaseFetchAnnouncementsManager: FetchAnnouncementsManager, Injectable if self.settingsManager.settings.allowAnnouncements, let recent = self.announcementsStorage.recent(), recent.action != nil { - debug(.nightscout, "New announcements found") + debug( + .nightscout, + "New announcements found, time: \(Date.now.formatted(date: .omitted, time: .shortened))" + ) // Add timestamp for debugging of remote commnand delay self.apsManager.enactAnnouncement(recent) } } diff --git a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift index 86f64cac2f..501bf98ad1 100644 --- a/FreeAPS/Sources/APS/Storage/CarbsStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CarbsStorage.swift @@ -116,12 +116,23 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { fpuID: "" ) - self.storage.transaction { storage in - storage.append(onlyCarbs, to: file, uniqBy: \.id) - uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? - .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } - .sorted { $0.createdAt > $1.createdAt } ?? [] - storage.save(Array(uniqEvents), as: file) + // If fetched en masse from NS + if entries.filter({ $0.carbs > 0 }).count > 1 { + self.storage.transaction { storage in + storage.append(entries, to: file, uniqBy: \.createdAt) + uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? + .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } + .sorted { $0.createdAt > $1.createdAt } ?? [] + storage.save(Array(uniqEvents), as: file) + } + } else { + self.storage.transaction { storage in + storage.append(onlyCarbs, to: file, uniqBy: \.id) + uniqEvents = storage.retrieve(file, as: [CarbsEntry].self)? + .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() } + .sorted { $0.createdAt > $1.createdAt } ?? [] + storage.save(Array(uniqEvents), as: file) + } } } @@ -190,7 +201,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable { func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] { let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCarbs, as: [NigtscoutTreatment].self) ?? [] - let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual } + let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual || $0.enteredBy == CarbsEntry.remote } let treatments = eventsManual.map { NigtscoutTreatment( duration: nil, diff --git a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift index c0caa2fd7d..23ba2073d0 100644 --- a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift @@ -31,4 +31,60 @@ final class CoreDataStorage { } return overrideArray } + + func fetchProfile(_ name: String) -> Override? { + var presetsArray = [OverridePresets]() + var overrideArray = [Override]() + var override: Override? + coredataContext.performAndWait { + let requestPresets = OverridePresets.fetchRequest() as NSFetchRequest + requestPresets.predicate = NSPredicate( + format: "name == %@", name + ) + try? presetsArray = self.coredataContext.fetch(requestPresets) + + guard let preset = presetsArray.first else { + return + } + guard let id = preset.id else { + return + } + let requestOverrides = Override.fetchRequest() as NSFetchRequest + requestOverrides.predicate = NSPredicate( + format: "id == %@", id + ) + try? overrideArray = self.coredataContext.fetch(requestOverrides) + + guard let override_ = overrideArray.first else { + return + } + override = override_ + } + return override + } + + func activateOverride(_ override: Override) { + var overrideArray = [Override]() + coredataContext.performAndWait { + let save = Override(context: coredataContext) + save.date = Date.now + save.id = override.id + save.end = override.end + save.start = override.start + save.advancedSettings = override.advancedSettings + save.cr = override.cr + save.duration = override.duration + save.enabled = override.enabled + save.indefinite = override.indefinite + save.isPreset = override.isPreset + save.isf = override.isf + save.isfAndCr = override.isfAndCr + save.percentage = override.percentage + save.smbIsAlwaysOff = override.smbIsAlwaysOff + save.smbMinutes = override.smbMinutes + save.uamMinutes = override.uamMinutes + save.target = override.target + try? coredataContext.save() + } + } } diff --git a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings index 5eaa9a3c6c..5cb6d99ef8 100644 --- a/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings @@ -49,6 +49,18 @@ /* Bolus progress view */ "of" = "of"; +/* Remote Bolus Alert, Part 1 */ +"A Remote Bolus " = "A Remote Bolus "; + +/* Remote Bolus Alert, Part 2 */ +"was delivered" = "was delivered"; + +/* Remote Bolus Alert, Part 3 */ +" minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?\n\nPredicted eventual glucose, if you don't bolus, is: " = " minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?\n\nPredicted eventual glucose, if you don't bolus, is: "; + +/* Remote Bolus Alert, Title */ +"A Remote Bolus Was Just Delivered!" = "A Remote Bolus Was Just Delivered!"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Enacted at"; @@ -359,6 +371,9 @@ Enact a temp Basal or a temp target */ /* Allow remote control from NS */ "Remote control" = "Remote control"; +/* Allow remote control from NS */ +"Allow Remote control of iAPS" = "Allow Remote control of iAPS"; + /* Imported Profiles Alert */ "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects." = "\nNow please verify all of your new settings thoroughly:\n\n* Basal Settings\n * Carb Ratios\n * Glucose Targets\n * Insulin Sensitivities\n * DIA\n\n in iAPS Settings > Configuration.\n\nBad or invalid profile settings could have disatrous effects."; diff --git a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings index c06ae5454b..9c87047a28 100644 --- a/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings +++ b/FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings @@ -49,6 +49,18 @@ /* Bolus progress view */ "of" = "av"; +/* Remote Bolus Alert, Part 1 */ +"A Remote Bolus " = "En fjärrstyrd bolus "; + +/* Remote Bolus Alert, Part 2 */ +"was delivered" = "gavs för"; + +/* Remote Bolus Alert, Part 3 */ +" minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?\n\nPredicted eventual glucose, if you don't bolus, is: " = " minuter sedan, aktiverad från Nightscout, av en assistent eller förälder. Vill du fortfarande ge en ny bolus?\n\nBeräknad blodsockerprognos, om du inte ger bolus, är: "; + +/* Remote Bolus Alert, Title */ +"A Remote Bolus Was Just Delivered!" = "En fjärrstyrd bolus gavs precis!"; + /* Headline in enacted pop up (at: at what time) */ "Enacted at" = "Utfört klockan"; diff --git a/FreeAPS/Sources/Models/Announcement.swift b/FreeAPS/Sources/Models/Announcement.swift index bc4cc172e6..f2fd46f0e3 100644 --- a/FreeAPS/Sources/Models/Announcement.swift +++ b/FreeAPS/Sources/Models/Announcement.swift @@ -12,6 +12,7 @@ struct Announcement: JSON, Equatable, Hashable { guard components.count == 2 else { return nil } + var name = String(notes.split(separator: ":")[1]) let command = String(components[0]).lowercased() let arguments = String(components[1]).lowercased() switch command { @@ -31,6 +32,19 @@ struct Announcement: JSON, Equatable, Hashable { let durationArg = String(basalComponents[1]) guard let rate = Decimal(from: rateArg), let duration = Decimal(from: durationArg) else { return nil } return .tempbasal(rate: rate, duration: duration) + case "meal": + let mealComponents = arguments.split(separator: ",") + guard mealComponents.count == 3 else { return nil } + let carbsArg = String(mealComponents[0]) + let fatArg = String(mealComponents[1]) + let proteinArg = String(mealComponents[2]) + guard let carbs = Decimal(from: carbsArg), let fat = Decimal(from: fatArg), + let protein = Decimal(from: proteinArg) else { return nil } + return .meal(carbs: carbs, fat: fat, protein: protein) + case "override": + guard !name.isEmpty else { return nil } + if name.prefix(1) == " " { name = String(name.dropFirst()) } + return .override(name: name) default: return nil } } @@ -49,6 +63,8 @@ enum AnnouncementAction { case pump(PumpAction) case looping(Bool) case tempbasal(rate: Decimal, duration: Decimal) + case meal(carbs: Decimal, fat: Decimal, protein: Decimal) + case override(name: String) } enum PumpAction: String { diff --git a/FreeAPS/Sources/Models/CarbsEntry.swift b/FreeAPS/Sources/Models/CarbsEntry.swift index e74643b519..0394644edb 100644 --- a/FreeAPS/Sources/Models/CarbsEntry.swift +++ b/FreeAPS/Sources/Models/CarbsEntry.swift @@ -13,6 +13,7 @@ struct CarbsEntry: JSON, Equatable, Hashable { let fpuID: String? static let manual = "iAPS" + static let remote = "Nightscout operator" static let appleHealth = "applehealth" static func == (lhs: CarbsEntry, rhs: CarbsEntry) -> Bool { diff --git a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift index bf605708be..83042de3ba 100644 --- a/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift +++ b/FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift @@ -267,18 +267,17 @@ extension Bolus { .formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) : evBG.formatted() if command == "bolus" { - return "\n" + NSLocalizedString("A Bolus of ", comment: "Remote Bolus Alert, part 1") + arguments + - NSLocalizedString("U was delivered ", comment: "Remote Bolus Alert, part 2") + ( + return "\n" + NSLocalizedString("A Remote Bolus ", comment: "Remote Bolus Alert, part 1") + + NSLocalizedString("was delivered", comment: "Remote Bolus Alert, part 2") + ( -1 * enactedAnnouncement.createdAt .timeIntervalSinceNow .minutes ) .formatted(.number.grouping(.never).rounded().precision(.fractionLength(0))) + NSLocalizedString( - " minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?" + - "\n\n" + "Predicted eventual glucose, if you don't bolus, is: " + eventual + " " + units.rawValue, + " minutes ago, triggered remotely from Nightscout, by a caregiver or a parent. Do you still want to bolus?\n\nPredicted eventual glucose, if you don't bolus, is: ", comment: "Remote Bolus Alert, part 3" - ) + ) + eventual + " " + units.rawValue } } return nil diff --git a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift index d9fa2d7178..5c922f51a0 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/AlternativeBolusCalcRootView.swift @@ -301,6 +301,7 @@ extension Bolus { .padding(.bottom, 20) } .font(.footnote) + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .background( RoundedRectangle(cornerRadius: 10, style: .continuous) .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4).opacity(0.9)) diff --git a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift index dbf8fa62d4..ad42446220 100644 --- a/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift +++ b/FreeAPS/Sources/Modules/Bolus/View/DefaultBolusCalcRootView.swift @@ -128,7 +128,6 @@ extension Bolus { secondaryButton: .cancel() ) isRemoteBolusAlertPresented = true - } else { keepForNextWiew = true state.add() @@ -140,6 +139,9 @@ extension Bolus { .listRowBackground(!disabled ? Color(.systemBlue) : Color(.systemGray4)) .tint(.white) } + .alert(isPresented: $isRemoteBolusAlertPresented) { + remoteBolusAlert! + } } if state.amount <= 0 { @@ -152,10 +154,6 @@ extension Bolus { } } } - .dynamicTypeSize(...DynamicTypeSize.xxLarge) - .alert(isPresented: $isRemoteBolusAlertPresented) { - remoteBolusAlert! - } .alert(isPresented: $displayError) { Alert( title: Text("Warning!"), @@ -169,7 +167,9 @@ extension Bolus { ), secondaryButton: .cancel() ) - }.onAppear { + } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) + .onAppear { configureView { state.waitForSuggestionInitial = waitForSuggestion state.waitForSuggestion = waitForSuggestion @@ -358,6 +358,7 @@ extension Bolus { .foregroundColor(.blue) }.padding(.bottom, 10) } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .background( RoundedRectangle(cornerRadius: 8, style: .continuous) .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4)) diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index 8f600f141f..4c9ec62064 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -512,6 +512,7 @@ extension Home.StateModel: func carbsDidUpdate(_: [CarbsEntry]) { setupCarbs() + setupAnnouncements() } func enactedSuggestionDidUpdate(_ suggestion: Suggestion) { diff --git a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift index 9f3171d967..09c3959c26 100644 --- a/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift +++ b/FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift @@ -47,7 +47,7 @@ struct MainChartView: View { static let fpuScale: CGFloat = 1 static let announcementSize: CGFloat = 8 static let announcementScale: CGFloat = 2.5 - static let owlSeize: CGFloat = 25 + static let owlSeize: CGFloat = 20 static let owlOffset: CGFloat = 80 } @@ -58,6 +58,8 @@ struct MainChartView: View { static let resume = "✅" static let tempbasal = "basal" static let bolus = "💧" + static let meal = "🍴" + static let override = "👤" } @Binding var glucose: [BloodGlucose] @@ -476,21 +478,33 @@ struct MainChartView: View { private func announcementView(fullSize: CGSize) -> some View { ZStack { ForEach(announcementDots, id: \.rect.minX) { info -> AnyView in - let position = CGPoint(x: info.rect.midX + 5, y: info.rect.maxY - Config.owlOffset) + let position = CGPoint(x: info.rect.midX, y: info.rect.maxY - Config.owlOffset) + let command = info.note.lowercased() let type: String = - info.note.contains("true") ? - Command.open : - info.note.contains("false") ? + command.contains("true") ? Command.closed : - info.note.contains("suspend") ? + command.contains("false") ? + Command.open : + command.contains("suspend") ? Command.suspend : - info.note.contains("resume") ? + command.contains("resume") ? Command.resume : - info.note.contains("tempbasal") ? - Command.tempbasal : Command.bolus + command.contains("tempbasal") ? + Command.tempbasal : + command.contains("override") ? + Command.override : + command.contains("meal") ? + Command.meal : + command.contains("bolus") ? + Command.bolus : "" + VStack { - Text(type).font(.announcementSymbolFont).foregroundStyle(.orange) Image("owl").resizable().frame(maxWidth: Config.owlSeize, maxHeight: Config.owlSeize).scaledToFill() + .overlay { + Text(type).font(.announcementSymbolFont).foregroundStyle(.orange) + .offset(x: 0, y: -15) + } + // Image("owl").resizable().frame(maxWidth: Config.owlSeize, maxHeight: Config.owlSeize).scaledToFill() }.position(position).asAny() } } diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 0600c43a6b..fef08e73c9 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -616,7 +616,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P if let error = error { warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error) } else if success { - debug(.service, "\(int) carb entries with ID: " + syncID + " deleted from Health Store", printToConsole: true) + debug(.service, "\(int) carb entries with ID: " + fpuID + " deleted from Health Store", printToConsole: true) } } } diff --git a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift index 393710043f..326fc9e58b 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutAPI.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutAPI.swift @@ -313,6 +313,34 @@ extension NightscoutAPI { .eraseToAnyPublisher() } + func deleteAnnouncements() -> AnyPublisher { + var components = URLComponents() + components.scheme = url.scheme + components.host = url.host + components.port = url.port + components.path = Config.treatmentsPath + components.queryItems = [ + URLQueryItem(name: "find[eventType]", value: "Announcement"), + URLQueryItem( + name: "find[created_at][$gte]", + value: Formatter.iso8601withFractionalSeconds + .string(from: Date.now) + ) + ] + var request = URLRequest(url: components.url!) + request.allowsConstrainedNetworkAccess = false + request.timeoutInterval = Config.timeout + request.httpMethod = "DELETE" + + if let secret = secret { + request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret") + } + return service.run(request) + .retry(Config.retryCount) + .map { _ in () } + .eraseToAnyPublisher() + } + func uploadTreatments(_ treatments: [NigtscoutTreatment]) -> AnyPublisher { var components = URLComponents() components.scheme = url.scheme diff --git a/FreeAPS/Sources/Services/Network/NightscoutManager.swift b/FreeAPS/Sources/Services/Network/NightscoutManager.swift index 1f8a6c1432..3800e1440a 100644 --- a/FreeAPS/Sources/Services/Network/NightscoutManager.swift +++ b/FreeAPS/Sources/Services/Network/NightscoutManager.swift @@ -20,6 +20,7 @@ protocol NightscoutManager: GlucoseSource { func uploadStatistics(dailystat: Statistics) func uploadPreferences(_ preferences: Preferences) func uploadProfileAndSettings(_: Bool) + func deleteAnnouncements() var cgmURL: URL? { get } } @@ -172,7 +173,6 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { guard let nightscout = nightscoutAPI, isNetworkReachable else { return Just([]).eraseToAnyPublisher() } - let since = announcementsStorage.syncDate() return nightscout.fetchAnnouncement(sinceDate: since) .replaceError(with: []) @@ -280,6 +280,28 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { } } + func deleteAnnouncements() { + guard let nightscout = nightscoutAPI, isUploadEnabled else { + return + } + nightscout.deleteAnnouncements() + .collect() + .sink { completion in + switch completion { + case .finished: + debug(.nightscout, "Annuncement(s) deleted from NS.") + + case let .failure(error): + info( + .nightscout, + "Deletion of Announcements not possible \(error.localizedDescription)", + type: MessageType.warning + ) + } + } receiveValue: { _ in } + .store(in: &lifetime) + } + func deleteNormalCarbs(_ treatement: DataTable.Treatment) { guard let nightscout = nightscoutAPI, isUploadEnabled else { carbsStorage.deleteCarbs(at: treatement.id, fpuID: "", complex: false) @@ -313,10 +335,10 @@ final class BaseNightscoutManager: NightscoutManager, Injectable { return } - carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) - healthkitManager.deleteCarbs(syncID: "", fpuID: treatement.fpuID ?? "") + carbsStorage.deleteCarbs(at: "", fpuID: treatement.fpuID ?? "", complex: false) + nightscout.deleteCarbs(treatement, _isFPU: true) .collect() .sink { completion in From 2470c145c754f133048e2788ae0a1cab60dd094a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 9 Feb 2024 20:33:53 +0100 Subject: [PATCH 400/405] Version 3.0.0 --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index f4a20abcf5..8f3914e096 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 2.8.0 +APP_VERSION = 3.0.0 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 250038268be6281c6756d1ff9c5bded3794e9239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 9 Feb 2024 20:35:04 +0100 Subject: [PATCH 401/405] Dev version uneven numbers --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index 8f3914e096..e46e9e041d 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 3.0.0 +APP_VERSION = 3.1.0 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From 60ba1f5a443f248fb5e3f56392aa00df34627c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 9 Feb 2024 22:40:54 +0100 Subject: [PATCH 402/405] Update UI when replacing active override with a new override 8by remote). --- FreeAPS/Sources/APS/APSManager.swift | 5 +++++ FreeAPS/Sources/APS/Storage/CoreDataStorage.swift | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/FreeAPS/Sources/APS/APSManager.swift b/FreeAPS/Sources/APS/APSManager.swift index fd4b0a00eb..e863660b48 100644 --- a/FreeAPS/Sources/APS/APSManager.swift +++ b/FreeAPS/Sources/APS/APSManager.swift @@ -661,6 +661,11 @@ final class BaseAPSManager: APSManager, Injectable { } guard let override = CoreDataStorage().fetchProfile(name) else { return } + + // Cancel current active first (for the UI to update) + if CoreDataStorage().isActive() { + OverrideStorage().cancelProfile() + } CoreDataStorage().activateOverride(override) announcementsStorage.storeAnnouncements([announcement], enacted: true) debug(.apsManager, "Remote Override by Announcement succeeded.") diff --git a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift index 23ba2073d0..8a92cc41a2 100644 --- a/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift +++ b/FreeAPS/Sources/APS/Storage/CoreDataStorage.swift @@ -87,4 +87,19 @@ final class CoreDataStorage { try? coredataContext.save() } } + + func isActive() -> Bool { + var overrideArray = [Override]() + coredataContext.performAndWait { + let requestOverrides = Override.fetchRequest() as NSFetchRequest + let sortOverride = NSSortDescriptor(key: "date", ascending: false) + requestOverrides.sortDescriptors = [sortOverride] + requestOverrides.fetchLimit = 1 + try? overrideArray = self.coredataContext.fetch(requestOverrides) + } + guard let lastOverride = overrideArray.first else { + return false + } + return lastOverride.enabled + } } From 56565bb53df27b3f499a66e342a80e1c643ceae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Sat, 10 Feb 2024 13:40:08 +0100 Subject: [PATCH 403/405] Version update --- Config.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config.xcconfig b/Config.xcconfig index e46e9e041d..3afdf01290 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 3.1.0 +APP_VERSION = 3.1.1 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## From d5566a6a5ab7e012c5a93a4370d5a2e5a562eba7 Mon Sep 17 00:00:00 2001 From: dsnallfot <72826201+dsnallfot@users.noreply.github.com> Date: Fri, 16 Feb 2024 15:04:38 +0100 Subject: [PATCH 404/405] Revert commit 3f2eddc (Due to potential crash when cancelling ongoing bolus) (#534) Fix for a critical bug when writing insulin to Health store. --- .../Services/HealthKit/HealthKitManager.swift | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index fef08e73c9..4696fb2e24 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -234,23 +234,24 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P events.isNotEmpty else { return } - func save(bolusToModify: [InsulinBolus], bolus: [InsulinBolus], basal: [InsulinBasal]) { - // first step : delete the HK value - // second step : recreate with the new value ! - bolusToModify.forEach { syncID in + func delete(syncIds: [String]?) { + syncIds?.forEach { syncID in let predicate = HKQuery.predicateForObjects( withMetadataKey: HKMetadataKeySyncIdentifier, operatorType: .equalTo, value: syncID ) + self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in if let error = error { warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error) } } } - let bolusTotal = bolus + bolusToModify - let bolusSamples = bolusTotal + } + + func save(bolus: [InsulinBolus], basal: [InsulinBasal]) { + let bolusSamples = bolus .map { HKQuantitySample( type: sampleType, @@ -290,22 +291,30 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P } } } - + // delete existing event in HK where the amount is not the last value in the pumphistory loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) .receive(on: processQueue) - .compactMap { samples -> ([InsulinBolus], [InsulinBolus], [InsulinBasal]) in + .compactMap { samples -> [String] in let sampleIDs = samples.compactMap(\.syncIdentifier) - let bolusToModify = events + let bolusToDelete = events .filter { $0.type == .bolus && sampleIDs.contains($0.id) } - .compactMap { event -> InsulinBolus? in + .compactMap { event -> String? in guard let amount = event.amount else { return nil } guard let sampleAmount = samples.first(where: { $0.syncIdentifier == event.id }) as? HKQuantitySample else { return nil } if Double(amount) != sampleAmount.quantity.doubleValue(for: .internationalUnit()) { - return InsulinBolus(id: sampleAmount.syncIdentifier!, amount: amount, date: event.timestamp) + return sampleAmount.syncIdentifier } else { return nil } } + return bolusToDelete + } + .sink(receiveValue: delete) + .store(in: &lifetime) + loadSamplesFromHealth(sampleType: sampleType, withIDs: events.map(\.id)) + .receive(on: processQueue) + .compactMap { samples -> ([InsulinBolus], [InsulinBasal]) in + let sampleIDs = samples.compactMap(\.syncIdentifier) let bolus = events .filter { $0.type == .bolus && !sampleIDs.contains($0.id) } .compactMap { event -> InsulinBolus? in @@ -350,7 +359,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P endDelivery: nextBasalEvent.timestamp ) } - return (bolusToModify, bolus, basal) + return (bolus, basal) } .sink(receiveValue: save) .store(in: &lifetime) @@ -409,14 +418,13 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P /// Try to load samples from Health store private func loadSamplesFromHealth( - sampleType: HKQuantityType, - limit: Int = 100 + sampleType: HKQuantityType ) -> Future<[HKSample], Never> { Future { promise in let query = HKSampleQuery( sampleType: sampleType, predicate: nil, - limit: limit, + limit: 1000, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? [])) @@ -428,8 +436,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P /// Try to load samples from Health store with id and do some work private func loadSamplesFromHealth( sampleType: HKQuantityType, - withIDs ids: [String], - limit: Int = 100 + withIDs ids: [String] ) -> Future<[HKSample], Never> { Future { promise in let predicate = HKQuery.predicateForObjects( @@ -440,7 +447,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, - limit: limit, + limit: 1000, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? [])) From 4e800c3b5cbbc8410d063da6540c02fc1f11d347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20M=C3=A5rtensson?= Date: Fri, 16 Feb 2024 17:34:28 +0100 Subject: [PATCH 405/405] Limit Query to Health Store to 100 entries. Part of a previous commit which needed to reverted, due to a fatal error. --- FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift index 4696fb2e24..fbd2d35595 100644 --- a/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift +++ b/FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift @@ -424,7 +424,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let query = HKSampleQuery( sampleType: sampleType, predicate: nil, - limit: 1000, + limit: 100, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? [])) @@ -447,7 +447,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, - limit: 1000, + limit: 100, sortDescriptors: nil ) { _, results, _ in promise(.success((results as? [HKQuantitySample]) ?? []))